Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 #!/usr/bin/python | |
| 2 # | |
| 3 # Copyright 2017 The Chromium Authors. All rights reserved. | |
| 4 # Use of this source code is governed by a BSD-style license that can be | |
| 5 # found in the LICENSE file. | |
| 6 | |
| 7 """Helper script to launch Chrome on device and WebPageReplay on host.""" | |
| 8 | |
| 9 import logging | |
| 10 import optparse | |
| 11 import os | |
| 12 import subprocess | |
| 13 import sys | |
| 14 import time | |
| 15 | |
| 16 _SRC_PATH = os.path.abspath(os.path.join( | |
| 17 os.path.dirname(__file__), os.pardir, os.pardir, os.pardir)) | |
| 18 | |
| 19 sys.path.append(os.path.join(_SRC_PATH, 'third_party', 'catapult', 'devil')) | |
| 20 from devil.android import device_utils | |
| 21 from devil.android.constants import chrome | |
| 22 from devil.android.perf import cache_control | |
| 23 from devil.android.sdk import intent | |
| 24 | |
| 25 sys.path.append(os.path.join(_SRC_PATH, 'build', 'android')) | |
| 26 import devil_chromium | |
| 27 | |
| 28 sys.path.append(os.path.join(_SRC_PATH, 'tools', 'android', 'loading')) | |
|
Benoit L
2017/02/13 10:13:44
Is this really necessary?
I think that . is in the
droger
2017/02/17 13:36:57
Done.
| |
| 29 import device_setup | |
| 30 | |
| 31 | |
| 32 # Command line arguments for Chrome. | |
| 33 _CHROME_ARGS = [ | |
| 34 # Disable backgound network requests that may pollute WPR archive, pollute | |
|
Benoit L
2017/02/13 10:13:43
We are duplicating this in a few places now.
Can y
droger
2017/02/17 13:36:57
Done.
| |
| 35 # HTTP cache generation, and introduce noise in loading performance. | |
| 36 '--disable-background-networking', | |
| 37 '--disable-default-apps', | |
| 38 '--no-proxy-server', | |
| 39 # TODO(droger): Remove once crbug.com/354743 is fixed. | |
| 40 '--safebrowsing-disable-auto-update', | |
| 41 | |
| 42 # Disables actions that chrome performs only on first run or each launches, | |
| 43 # which can interfere with page load performance, or even block its | |
| 44 # execution by waiting for user input. | |
| 45 '--disable-fre', | |
| 46 '--no-default-browser-check', | |
| 47 '--no-first-run', | |
| 48 ] | |
| 49 | |
| 50 | |
| 51 def ResetChromeLocalState(device, package): | |
|
Benoit L
2017/02/13 10:13:43
ditto, can this be merged with the matching functi
droger
2017/02/17 13:36:57
Done.
| |
| 52 """Remove the Chrome Profile and the various disk caches.""" | |
| 53 profile_dirs = ['app_chrome/Default', 'cache', 'app_chrome/ShaderCache', | |
| 54 'app_tabs'] | |
| 55 cmd = ['rm', '-rf'] | |
| 56 cmd.extend( | |
| 57 '/data/data/{}/{}'.format(package, d) for d in profile_dirs) | |
| 58 device.adb.Shell(subprocess.list2cmdline(cmd)) | |
| 59 | |
| 60 | |
| 61 def RunChrome(device, cold, chrome_args, package_info): | |
| 62 """Runs Chrome on the device. | |
| 63 | |
| 64 Args: | |
| 65 device: (DeviceUtils) device to run the tests on. | |
| 66 cold: (bool) Whether caches should be dropped. | |
| 67 chrome_args: ([str]) List of arguments to pass to Chrome. | |
| 68 package_info: (PackageInfo) Chrome package info. | |
| 69 """ | |
| 70 if not device.HasRoot(): | |
| 71 device.EnableRoot() | |
| 72 | |
| 73 cmdline_file = package_info.cmdline_file | |
| 74 package = package_info.package | |
| 75 with device_setup.FlagReplacer(device, cmdline_file, chrome_args): | |
| 76 device.ForceStop(package) | |
| 77 | |
| 78 if cold: | |
| 79 ResetChromeLocalState(device, package) | |
| 80 cache_control.CacheControl(device).DropRamCaches() | |
| 81 | |
| 82 start_intent = intent.Intent(package=package, data='about:blank', | |
| 83 activity=package_info.activity) | |
| 84 try: | |
| 85 device.StartActivity(start_intent, blocking=True) | |
| 86 print( | |
|
Benoit L
2017/02/13 10:13:44
incredibly tiny nit: add a space before '(', as pr
droger
2017/02/17 13:36:57
Done.
| |
| 87 '\n\n' | |
| 88 ' +---------------------------------------------+\n' | |
| 89 ' | Chrome launched, press Ctrl-C to interrupt. |\n' | |
| 90 ' +---------------------------------------------+') | |
| 91 while True: | |
| 92 time.sleep(1) | |
| 93 except KeyboardInterrupt: | |
| 94 pass | |
| 95 finally: | |
| 96 device.ForceStop(package) | |
| 97 | |
| 98 | |
| 99 def _CreateOptionParser(): | |
| 100 description = 'Launches Chrome on a device, connected to a WebPageReplay ' \ | |
| 101 'instance running on the host. The WPR archive must be ' \ | |
| 102 'passed as parameter.' | |
| 103 parser = optparse.OptionParser(description=description, | |
| 104 usage='Usage: %prog [options] wpr_archive') | |
| 105 | |
| 106 # Device-related options. | |
| 107 d = optparse.OptionGroup(parser, 'Device options') | |
| 108 d.add_option('--device', help='Device ID') | |
| 109 d.add_option('--cold', help='Purge all caches before running Chrome.', | |
| 110 default=False, action='store_true') | |
| 111 d.add_option('--chrome_package_name', | |
| 112 help='Chrome package name (e.g. "chrome" or "chromium") ' | |
| 113 '[default: %default].', default='chrome') | |
| 114 parser.add_option_group(d) | |
| 115 | |
| 116 # WebPageReplay-related options. | |
| 117 w = optparse.OptionGroup(parser, 'WebPageReplay options') | |
| 118 w.add_option('--record', | |
| 119 help='Enable this to record a new WPR archive.', | |
| 120 action='store_true', default=False) | |
| 121 w.add_option('--wpr_log', help='WPR log path.') | |
| 122 w.add_option('--network_condition', help='Network condition for emulation.') | |
| 123 parser.add_option_group(w) | |
| 124 | |
| 125 return parser | |
| 126 | |
| 127 | |
| 128 def main(): | |
| 129 parser = _CreateOptionParser() | |
| 130 options, args = parser.parse_args() | |
| 131 if len(args) != 1: | |
| 132 parser.error("Incorrect number of arguments.") | |
| 133 devil_chromium.Initialize() | |
| 134 devices = device_utils.DeviceUtils.HealthyDevices() | |
| 135 device = devices[0] | |
| 136 if len(devices) != 1 and options.device is None: | |
| 137 logging.error('Several devices attached, must specify one with --device.') | |
| 138 sys.exit(0) | |
| 139 if options.device is not None: | |
| 140 matching_devices = [d for d in devices if str(d) == options.device] | |
| 141 if not matching_devices: | |
| 142 logging.error('Device not found.') | |
| 143 sys.exit(0) | |
| 144 device = matching_devices[0] | |
| 145 | |
| 146 with device_setup.RemoteWprHost(device, args[0], options.record, | |
| 147 options.network_condition, | |
| 148 out_log_path=options.wpr_log) as wpr_attr: | |
| 149 RunChrome(device, options.cold, _CHROME_ARGS + wpr_attr.chrome_args, | |
| 150 chrome.PACKAGE_INFO[options.chrome_package_name]) | |
| 151 | |
| 152 | |
| 153 if __name__ == '__main__': | |
| 154 main() | |
| OLD | NEW |