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