Support running w/ Sky from a local checkout through a config file.

This adds an alternative config file that one can use to run Sky apps
using sky_viewer and SDK packages from a local sky_engine checkout.

To use this you need to check out sky_engine
(https://github.com/domokit/sky_engine ) and build for Android.

Then, run the lengthy command-line:

  mojo/devtools/common/mojo_run \
    --android \
    --config-file mojo/tools/configs/sky \
    --config-alias SKY_SRC=/path_to_your_checkout/sky_engine/src \
    "mojo:window_manager https://sky/examples/hello_world/lib/main.dart"

The sky apps are served from the Sky checkout, so all of
sky/packages/sky/example is available under https://sky/examples .

This replaces the old support for '--sky' flag, which was not enough to
run w/ sky after the repo split anyway.

R=qsr@chromium.org

Review URL: https://codereview.chromium.org/1268323003 .

Cr-Mirrored-From: https://github.com/domokit/mojo
Cr-Mirrored-Commit: a2bc80458262f5a9b1edabbae294ea0d8d67cdb8
diff --git a/README.md b/README.md
index eb7d5c6..5bcd6b9 100644
--- a/README.md
+++ b/README.md
@@ -50,27 +50,6 @@
 By default, `mojo_run` uses `mojo:kiosk_wm` as the default window manager. It
 can be changed using the `--window-manager` flag.
 
-#### Sky apps
-
-To run a [Sky](https://github.com/domokit/sky_engine) app, you need to build
-`sky_viewer.mojo` in a Sky checkout, and indicate the path to the binary using
-the `--map-url` parameter:
-
-```sh
-mojo_run --map-url mojo:sky_viewer=/path/to/sky/viewer "mojo:window_manager APP_URL"
-```
-
-If the app does not declare a shebang indicating that it needs to be run in
-`sky_viewer`, pass `--sky` to map `sky_viewer` as a default content handler for
-dart apps:
-
-```sh
-mojo_run --map-url mojo:sky_viewer=/path/to/sky/viewer "mojo:window_manager APP_URL" --sky
-```
-
-Note that Sky apps will need the --use-osmesa flag to run
-over [chromoting](https://support.google.com/chrome/answer/1649523?hl=en):
-
 ### Debugger
 
 `mojo_debug` allows you to interactively inspect a running shell, collect
diff --git a/devtoolslib/shell_arguments.py b/devtoolslib/shell_arguments.py
index 3863935..20f512e 100644
--- a/devtoolslib/shell_arguments.py
+++ b/devtoolslib/shell_arguments.py
@@ -102,27 +102,6 @@
   return args
 
 
-def _configure_sky(shell_args):
-  """Maps mojo:sky_viewer as a content handler for dart applications.
-  app.
-
-  Args:
-    shell_args: Current list of shell arguments.
-
-  Returns:
-    Updated list of shell arguments.
-  """
-  # Configure the content type mappings for the sky_viewer. This is needed
-  # only for the Sky apps that do not declare mojo:sky_viewer in a shebang.
-  # TODO(ppi): drop this part once we can rely on the Sky files declaring
-  # correct shebang.
-  shell_args = append_to_argument(shell_args, '--content-handlers=',
-                                            'text/sky,mojo:sky_viewer')
-  shell_args = append_to_argument(shell_args, '--content-handlers=',
-                                            'application/dart,mojo:sky_viewer')
-  return shell_args
-
-
 def configure_local_origin(shell, local_dir, fixed_port=True):
   """Sets up a local http server to serve files in |local_dir| along with
   device port forwarding if needed.
@@ -234,8 +213,12 @@
       shell_args.extend(configure_local_origin(shell, shell_config.origin,
                                                fixed_port=True))
 
-  if shell_config.sky:
-    shell_args = _configure_sky(shell_args)
+  if shell_config.content_handlers:
+    for (mime_type,
+         content_handler_url) in shell_config.content_handlers.iteritems():
+      shell_args = append_to_argument(shell_args, '--content-handlers=',
+                                      '%s,%s' % (mime_type,
+                                                 content_handler_url))
 
   for dev_server_config in shell_config.dev_servers:
     shell_args = _configure_dev_server(shell, shell_args, dev_server_config)
diff --git a/devtoolslib/shell_config.py b/devtoolslib/shell_config.py
index 2b55d54..20d2e23 100644
--- a/devtoolslib/shell_config.py
+++ b/devtoolslib/shell_config.py
@@ -29,7 +29,7 @@
     self.map_url_list = []
     self.map_origin_list = []
     self.dev_servers = []
-    self.sky = None
+    self.content_handlers = dict()
     self.verbose = None
 
     # Android-only.
@@ -66,9 +66,6 @@
   parser.add_argument('--map-origin', action='append',
                       help='Define a mapping for a url origin in the format '
                       '<origin>=<url-or-local-file-path>')
-  parser.add_argument('--sky', action='store_true',
-                      help='Maps mojo:sky_viewer as the content handler for '
-                           'dart apps.')
   parser.add_argument('-v', '--verbose', action="store_true",
                       help="Increase output verbosity")
 
@@ -90,6 +87,11 @@
       'file.')
   config_file_group.add_argument('--config-file', type=file,
                                  help='Path of the configuration file to use.')
+  config_file_group.add_argument('--config-alias', action='append',
+                                 dest='config_aliases',
+                                 help='Alias to substitute in the config file '
+                                 'of the form ALIAS=<value>. Can be passed '
+                                 'more than once.')
   config_file_group.add_argument('--no-config-file', action='store_true',
                                  help='Pass to skip automatic discovery of the '
                                  'mojoconfig file.')
@@ -145,7 +147,6 @@
   shell_config.origin = script_args.origin
   shell_config.map_url_list = script_args.map_url
   shell_config.map_origin_list = script_args.map_origin
-  shell_config.sky = script_args.sky
   shell_config.verbose = script_args.verbose
 
   # Android-only.
@@ -168,6 +169,11 @@
   if config_file:
     with config_file:
       config_file_aliases = []
+      if script_args.config_aliases:
+        for alias_spec in script_args.config_aliases:
+          alias_from, alias_to = alias_spec.split('=')
+          config_file_aliases.append(('@{%s}' % alias_from, alias_to))
+
       if inferred_paths['build_dir_path']:
         config_file_aliases.append(('@{BUILD_DIR}',
                                     inferred_paths['build_dir_path']))
@@ -192,5 +198,14 @@
           shell_config.dev_servers.append(dev_server_config)
       except (ValueError, KeyError):
         raise ShellConfigurationException('Failed to parse dev_servers in '
-                                          'the mojoconfig file.')
+                                          'the config file.')
+
+    if 'content_handlers' in config:
+      try:
+        for (mime_type,
+             content_handler_url) in config['content_handlers'].iteritems():
+          shell_config.content_handlers[mime_type] = content_handler_url
+      except (ValueError, KeyError):
+        raise ShellConfigurationException('Failed to parse content_handlers in '
+                                          'the config file.')
   return shell_config