browser_options.py revision a3f7b4e666c476898878fa745f637129375cd889
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file. 4a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 5a3f7b4e666c476898878fa745f637129375cd889Ben Murdochimport copy 6a3f7b4e666c476898878fa745f637129375cd889Ben Murdochimport logging 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import optparse 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import shlex 9a3f7b4e666c476898878fa745f637129375cd889Ben Murdochimport sys 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.core import browser_finder 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.core import profile_types 13a3f7b4e666c476898878fa745f637129375cd889Ben Murdochfrom telemetry.core import repeat_options 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.core import wpr_modes 15b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)from telemetry.core.platform.profiler import profiler_finder 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserOptions(optparse.Values): 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Options to be used for discovering and launching a browser.""" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def __init__(self, browser_type=None): 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optparse.Values.__init__(self) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.browser_type = browser_type 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.browser_executable = None 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.chrome_root = None 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.android_device = None 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.cros_ssh_identity = None 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) # When set to True, the browser will use the default profile. Telemetry 3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) # will not provide an alternate profile directory. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.dont_override_profile = False 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.profile_dir = None 33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) self.profile_type = None 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.extra_browser_args = [] 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.extra_wpr_args = [] 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.show_stdout = False 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.extensions_to_load = [] 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.cros_remote = None 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.wpr_mode = wpr_modes.WPR_OFF 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.browser_user_agent_type = None 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch self.profiler = None 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.verbosity = 0 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.page_filter = None 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.page_filter_exclude = None 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch self.no_proxy_server = False 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 52a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch self.repeat_options = repeat_options.RepeatOptions() 53a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def Copy(self): 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return copy.deepcopy(self) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def CreateParser(self, *args, **kwargs): 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parser = optparse.OptionParser(*args, **kwargs) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Selection group 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group = optparse.OptionGroup(parser, 'Which browser to use') 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group.add_option('--browser', 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest='browser_type', 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default=None, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) help='Browser type to run, ' 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'in order of priority. Supported values: list,%s' % 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_finder.ALL_BROWSER_TYPES) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group.add_option('--browser-executable', 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest='browser_executable', 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) help='The exact browser to run.') 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group.add_option('--chrome-root', 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest='chrome_root', 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) help='Where to look for chrome builds.' 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'Defaults to searching parent dirs by default.') 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group.add_option('--device', 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest='android_device', 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) help='The android device ID to use' 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'If not specified, only 0 or 1 connected devcies are supported.') 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) group.add_option('--keep_test_server_ports', action='store_true', 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) help='Indicates the test server ports must be ' 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'kept. When this is run via a sharder ' 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'the test server ports should be kept and ' 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'should not be reset.') 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group.add_option( 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) '--remote', 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest='cros_remote', 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) help='The IP address of a remote ChromeOS device to use.') 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group.add_option('--identity', 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest='cros_ssh_identity', 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default=None, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) help='The identity file to use when ssh\'ing into the ChromeOS device') 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parser.add_option_group(group) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Browser options 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group = optparse.OptionGroup(parser, 'Browser options') 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) profile_choices = profile_types.GetProfileTypes() 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) group.add_option('--profile-type', 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dest='profile_type', 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type='choice', 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default='clean', 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) choices=profile_choices, 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) help=('The user profile to use. A clean profile is used by default. ' 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'Supported values: ' + ', '.join(profile_choices))) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group.add_option('--extra-browser-args', 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest='extra_browser_args_as_string', 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) help='Additional arguments to pass to the browser when it starts') 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) group.add_option('--extra-wpr-args', 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dest='extra_wpr_args_as_string', 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) help=('Additional arguments to pass to Web Page Replay. ' 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'See third_party/webpagereplay/replay.py for usage.')) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group.add_option('--show-stdout', 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) action='store_true', 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) help='When possible, will display the stdout of the process') 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parser.add_option_group(group) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Page set options 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group = optparse.OptionGroup(parser, 'Page set options') 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) group.add_option('--pageset-shuffle', action='store_true', 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dest='pageset_shuffle', 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) help='Shuffle the order of pages within a pageset.') 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) group.add_option('--pageset-shuffle-order-file', 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dest='pageset_shuffle_order_file', default=None, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) help='Filename of an output of a previously run test on the current ' + 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'pageset. The tests will run in the same order again, overriding ' + 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'what is specified by --page-repeat and --pageset-repeat.') 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parser.add_option_group(group) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) group = optparse.OptionGroup(parser, 'Web Page Replay options') 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) group.add_option('--allow-live-sites', 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dest='allow_live_sites', action='store_true', 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) help='Run against live sites if the Web Page Replay archives don\'t ' 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 'exist. Without this flag, the test will just fail instead ' 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'of running against live sites.') 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parser.add_option_group(group) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Debugging options 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group = optparse.OptionGroup(parser, 'When things go wrong') 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group.add_option( 139ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch '--profiler', default=None, type='choice', 140b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) choices=profiler_finder.GetAllAvailableProfilers(), 141ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch help=('Record profiling data using this tool. Supported values: ' + 142b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ', '.join(profiler_finder.GetAllAvailableProfilers()))) 143b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) group.add_option( 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) '-v', '--verbose', action='count', dest='verbosity', 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) help='Increase verbosity level (repeat as needed)') 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) group.add_option('--print-bootstrap-deps', 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) action='store_true', 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) help='Output bootstrap deps list.') 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parser.add_option_group(group) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) # Platform options 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) group = optparse.OptionGroup(parser, 'Platform options') 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) group.add_option('--no-performance-mode', action='store_true', 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) help='Some platforms run on "full performance mode" where the ' 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 'test is executed at maximum CPU speed in order to minimize noise ' 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '(specially important for dashboards / continuous builds). ' 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'This option prevents Telemetry from tweaking such platform settings.') 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parser.add_option_group(group) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 160a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch # Repeat options 161a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch repeat_options.RepeatOptions.AddCommandLineOptions(parser) 162a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) real_parse = parser.parse_args 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def ParseArgs(args=None): 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) defaults = parser.get_default_values() 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for k, v in defaults.__dict__.items(): 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if k in self.__dict__ and self.__dict__[k] != None: 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.__dict__[k] = v 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = real_parse(args, self) # pylint: disable=E1121 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if self.verbosity >= 2: 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logging.basicConfig(level=logging.DEBUG) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elif self.verbosity: 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logging.basicConfig(level=logging.INFO) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logging.basicConfig(level=logging.WARNING) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if self.browser_executable and not self.browser_type: 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.browser_type = 'exact' 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if not self.browser_executable and not self.browser_type: 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sys.stderr.write('Must provide --browser=<type>. ' + 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'Use --browser=list for valid options.\n') 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sys.exit(1) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if self.browser_type == 'list': 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) try: 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) types = browser_finder.GetAllAvailableBrowserTypes(self) 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) except browser_finder.BrowserFinderException, ex: 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sys.stderr.write('ERROR: ' + str(ex)) 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sys.exit(1) 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sys.stdout.write('Available browsers:\n') 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sys.stdout.write(' %s\n' % '\n '.join(types)) 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sys.exit(0) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if self.extra_browser_args_as_string: # pylint: disable=E1101 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = shlex.split( 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.extra_browser_args_as_string) # pylint: disable=E1101 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.extra_browser_args.extend(tmp) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delattr(self, 'extra_browser_args_as_string') 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self.extra_wpr_args_as_string: # pylint: disable=E1101 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tmp = shlex.split( 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.extra_wpr_args_as_string) # pylint: disable=E1101 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.extra_wpr_args.extend(tmp) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delattr(self, 'extra_wpr_args_as_string') 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if self.profile_type == 'default': 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.dont_override_profile = True 206a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 207a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch # Parse repeat options 208a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch self.repeat_options.UpdateFromParseResults(self, parser) 209a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) self.profile_dir = profile_types.GetProfileDir(self.profile_type) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ret 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parser.parse_args = ParseArgs 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return parser 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def AppendExtraBrowserArg(self, arg): 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if arg not in self.extra_browser_args: 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self.extra_browser_args.append(arg) 218