blob: f8b25f54a57d4c8b06d097cf25513fb5b5d8e52c [file] [log] [blame]
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Functions that configure the shell before it is run manipulating its argument
list."""
import urlparse
# When spinning up servers for local origins, we want to use predictable ports
# so that caching works between subsequent runs with the same command line.
_LOCAL_ORIGIN_PORT = 31840
_MAP_ORIGIN_BASE_PORT = 31841
_MAP_ORIGIN_PREFIX = '--map-origin='
# Port on which the mojo:debugger http server will be available on the host
# machine.
_MOJO_DEBUGGER_PORT = 7777
def _IsMapOrigin(arg):
"""Returns whether |arg| is a --map-origin argument."""
return arg.startswith(_MAP_ORIGIN_PREFIX)
def _Split(l, pred):
positive = []
negative = []
for v in l:
if pred(v):
positive.append(v)
else:
negative.append(v)
return (positive, negative)
def _RewriteMapOriginParameter(shell, mapping, device_port):
parts = mapping[len(_MAP_ORIGIN_PREFIX):].split('=')
if len(parts) != 2:
return mapping
dest = parts[1]
# If the destination is a url, don't map it.
if urlparse.urlparse(dest)[0]:
return mapping
# Assume the destination is a local directory and serve it.
localUrl = shell.ServeLocalDirectory(dest, device_port)
print 'started server at %s for %s' % (dest, localUrl)
return _MAP_ORIGIN_PREFIX + parts[0] + '=' + localUrl
def RewriteMapOriginParameters(shell, original_arguments):
"""Spawns a server for each local destination indicated in a map-origin
argument in |original_arguments| and rewrites it to point to the server url.
The arguments other than "map-origin" and "map-origin" arguments pointing to
web urls are left intact.
Args:
shell: The shell that is being configured.
original_arguments: List of arguments to be rewritten.
Returns:
The updated argument list.
"""
map_arguments, other_arguments = _Split(original_arguments, _IsMapOrigin)
arguments = other_arguments
next_port = _MAP_ORIGIN_BASE_PORT
for mapping in sorted(map_arguments):
arguments.append(_RewriteMapOriginParameter(shell, mapping, next_port))
next_port += 1
return arguments
def ConfigureDebugger(shell):
"""Configures mojo:debugger to run and sets up port forwarding for its http
server if the shell is running on a device.
Returns:
Arguments that need to be appended to the shell argument list in order to
run with the debugger.
"""
shell.ForwardHostPortToShell(_MOJO_DEBUGGER_PORT)
return ['mojo:debugger %d' % _MOJO_DEBUGGER_PORT]
def ConfigureLocalOrigin(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.
Returns:
The list of arguments to be appended to the shell argument list.
"""
origin_url = shell.ServeLocalDirectory(
local_dir, _LOCAL_ORIGIN_PORT if fixed_port else 0)
return ["--origin=" + origin_url]
def AppendToArgument(arguments, key, value, delimiter=","):
"""Looks for an argument of the form "key=val1,val2" within |arguments| and
appends |value| to it.
If the argument is not present in |arguments| it is added.
Args:
arguments: List of arguments for the shell.
key: Identifier of the argument, including the equal sign, eg.
"--content-handlers=".
value: The value to be appended, after |delimeter|, to the argument.
delimiter: The string used to separate values within the argument.
Returns:
The updated argument list.
"""
assert key and key.endswith('=')
assert value
for i, argument in enumerate(arguments):
if not argument.startswith(key):
continue
arguments[i] = argument + delimiter + value
break
else:
arguments.append(key + value)
return arguments