1 # Copyright 2012 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
5 """Finds browsers that can be controlled by telemetry."""
10 from telemetry import decorators
11 from telemetry.core.backends.chrome import android_browser_finder
12 from telemetry.core.backends.chrome import cros_browser_finder
13 from telemetry.core.backends.chrome import desktop_browser_finder
14 from telemetry.core.backends.chrome import ios_browser_finder
15 from telemetry.core.backends.webdriver import webdriver_desktop_browser_finder
18 desktop_browser_finder,
19 android_browser_finder,
22 webdriver_desktop_browser_finder,
26 class BrowserTypeRequiredException(Exception):
30 class BrowserFinderException(Exception):
35 def FindAllBrowserTypes():
36 return reduce(operator.add,
37 [bf.FindAllBrowserTypes() for bf in BROWSER_FINDERS])
41 def FindBrowser(options):
42 """Finds the best PossibleBrowser object given a BrowserOptions object.
45 A BrowserOptions object.
48 A PossibleBrowser object.
51 BrowserFinderException: Options improperly set, or an error occurred.
53 if options.browser_type == 'exact' and options.browser_executable == None:
54 raise BrowserFinderException(
55 '--browser=exact requires --browser-executable to be set.')
56 if options.browser_type != 'exact' and options.browser_executable != None:
57 raise BrowserFinderException(
58 '--browser-executable requires --browser=exact.')
60 if options.browser_type == 'cros-chrome' and options.cros_remote == None:
61 raise BrowserFinderException(
62 'browser_type=cros-chrome requires cros_remote be set.')
63 if (options.browser_type != 'cros-chrome' and
64 options.browser_type != 'cros-chrome-guest' and
65 options.cros_remote != None):
66 raise BrowserFinderException(
67 '--remote requires --browser=cros-chrome or cros-chrome-guest.')
71 for finder in BROWSER_FINDERS:
72 if (options.browser_type and options.browser_type != 'any' and
73 options.browser_type not in finder.FindAllBrowserTypes()):
75 curr_browsers = finder.FindAllAvailableBrowsers(options)
76 new_default_browser = finder.SelectDefaultBrowser(curr_browsers)
77 if new_default_browser:
78 default_browsers.append(new_default_browser)
79 browsers.extend(curr_browsers)
81 if options.browser_type == None:
83 default_browser = sorted(default_browsers,
84 key=lambda b: b.last_modification_time())[-1]
86 logging.warning('--browser omitted. Using most recent local build: %s' %
87 default_browser.browser_type)
88 default_browser.UpdateExecutableIfNeeded()
89 return default_browser
91 if len(browsers) == 1:
92 logging.warning('--browser omitted. Using only available browser: %s' %
93 browsers[0].browser_type)
94 browsers[0].UpdateExecutableIfNeeded()
97 raise BrowserTypeRequiredException(
98 '--browser must be specified. Available browsers:\n%s' %
99 '\n'.join(sorted(set([b.browser_type for b in browsers]))))
101 if options.browser_type == 'any':
102 types = FindAllBrowserTypes()
103 def CompareBrowsersOnTypePriority(x, y):
104 x_idx = types.index(x.browser_type)
105 y_idx = types.index(y.browser_type)
107 browsers.sort(CompareBrowsersOnTypePriority)
108 if len(browsers) >= 1:
109 browsers[0].UpdateExecutableIfNeeded()
114 matching_browsers = [b for b in browsers
115 if b.browser_type == options.browser_type and b.SupportsOptions(options)]
117 chosen_browser = None
118 if len(matching_browsers) == 1:
119 chosen_browser = matching_browsers[0]
120 elif len(matching_browsers) > 1:
121 logging.warning('Multiple browsers of the same type found: %s' % (
122 repr(matching_browsers)))
123 chosen_browser = sorted(matching_browsers,
124 key=lambda b: b.last_modification_time())[-1]
127 logging.info('Chose browser: %s' % (repr(chosen_browser)))
128 chosen_browser.UpdateExecutableIfNeeded()
130 return chosen_browser
134 def GetAllAvailableBrowserTypes(options):
135 """Returns a list of available browser types.
138 options: A BrowserOptions object.
141 A list of browser type strings.
144 BrowserFinderException: Options are improperly set, or an error occurred.
147 for finder in BROWSER_FINDERS:
148 browsers.extend(finder.FindAllAvailableBrowsers(options))
150 type_list = set([browser.browser_type for browser in browsers])
151 type_list = list(type_list)