| Index: tools/chrome_remote_control/chrome_remote_control/browser_finder.py
|
| diff --git a/tools/chrome_remote_control/chrome_remote_control/browser_finder.py b/tools/chrome_remote_control/chrome_remote_control/browser_finder.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1144bca139e90ad939afde8816bf6b9946964e22
|
| --- /dev/null
|
| +++ b/tools/chrome_remote_control/chrome_remote_control/browser_finder.py
|
| @@ -0,0 +1,136 @@
|
| +# Copyright (c) 2012 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.
|
| +import os as real_os
|
| +import sys as real_sys
|
| +import subprocess as real_subprocess
|
| +
|
| +import browser
|
| +import desktop_browser_backend
|
| +
|
| +"""Finds browsers that can be controlled by chrome_remote_control."""
|
| +
|
| +ALL_BROWSER_TYPES = "exact,release,debug,canary,system"
|
| +DEFAULT_BROWSER_TYPES_TO_RUN = "exact,release,canary,system"
|
| +
|
| +class PossibleBrowser(object):
|
| + """A browser that can be controlled.
|
| +
|
| + Call connect() to launch the browser and begin manipulating it..
|
| + """
|
| +
|
| + def __init__(self, type, options, executable):
|
| + self.type = type
|
| + self._options = options
|
| + self._local_executable = executable
|
| +
|
| + def __repr__(self):
|
| + return "PossibleBrowser(type=%s)" % self.type
|
| +
|
| + def Create(self):
|
| + if self._local_executable:
|
| + backend = desktop_browser_backend.DesktopBrowserBackend(
|
| + self._local_executable, self._options)
|
| + return browser.Browser(backend)
|
| + raise Exception("Not implemented.")
|
| +
|
| +def FindBestPossibleBrowser(options,
|
| + os = real_os,
|
| + sys = real_sys,
|
| + subprocess = real_subprocess):
|
| + """Finds the best PossibleBrowser object to run given the provided
|
| + BrowserOptions object. The returned possiblity object can then be used to
|
| + connect to and control the located browser."""
|
| +
|
| + browsers = FindAllPossibleBrowsers(options, os, sys, subprocess)
|
| + if len(browsers):
|
| + return browsers[0]
|
| + return None
|
| +
|
| +def GetAllAvailableBrowserTypes(options):
|
| + """Returns an array of browser types supported on this system."""
|
| + browsers = FindAllPossibleBrowsers(options)
|
| + type_set = set([browser.type for browser in browsers])
|
| + type_list = list(type_list)
|
| + type_list.sort()
|
| + return type_list
|
| +
|
| +def FindAllPossibleBrowsers(options,
|
| + os = real_os,
|
| + sys = real_sys,
|
| + subprocess = real_subprocess):
|
| + """Finds all browsers that can be created given the options. Returns an array
|
| + of PossibleBrowser objects, sorted and filtered by
|
| + options.browser_types_to_use."""
|
| + browsers = _UnsortedFindAllLocalBrowserPossibilities(options,
|
| + os, sys, subprocess)
|
| + selected_browsers = [browser
|
| + for browser in browsers
|
| + if browser.type in options.browser_types_to_use]
|
| + def compare_browsers_on_priority(x, y):
|
| + x_idx = options.browser_types_to_use.index(x.type)
|
| + y_idx = options.browser_types_to_use.index(y.type)
|
| + return x_idx - y_idx
|
| + selected_browsers.sort(compare_browsers_on_priority)
|
| + return selected_browsers
|
| +
|
| +def _UnsortedFindAllLocalBrowserPossibilities(options,
|
| + os = real_os,
|
| + sys = real_sys,
|
| + subprocess = real_subprocess):
|
| + browsers = []
|
| +
|
| + # Add the explicit browser executable if given.
|
| + if options.browser_executable:
|
| + if os.path.exists(options.browser_executable):
|
| + browsers.append(PossibleBrowser("exact", options,
|
| + options.browser_executable))
|
| +
|
| + # Look for a browser in the standard chrome build locations.
|
| + if options.chrome_root:
|
| + chrome_root = options.chrome_root
|
| + else:
|
| + chrome_root = os.path.join(os.path.dirname(__file__), "../../../")
|
| +
|
| + if sys.platform == 'darwin':
|
| + app_name = "Chromium.app/Contents/MacOS/Chromium"
|
| + elif sys.platform.startswith('linux'):
|
| + app_name = "chrome"
|
| + elif sys.platform == 'win':
|
| + app_name = "chrome.exe"
|
| + else:
|
| + raise Exception("Platform not recognized")
|
| +
|
| + debug_app = os.path.join(chrome_root, "out", "Debug", app_name)
|
| + if os.path.exists(debug_app):
|
| + browsers.append(PossibleBrowser("debug", options, debug_app))
|
| +
|
| + release_app = os.path.join(chrome_root, "out", "Release", app_name)
|
| + if os.path.exists(release_app):
|
| + browsers.append(PossibleBrowser("release", options, release_app))
|
| +
|
| + # Mac-specific options.
|
| + if sys.platform == 'darwin':
|
| + mac_canary = ("/Applications/Google Chrome Canary.app/"
|
| + "Contents/MacOS/Google Chrome Canary")
|
| + mac_stable = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
|
| + if os.path.exists(mac_canary):
|
| + browsers.append(PossibleBrowser("canary", options, mac_canary))
|
| +
|
| + if os.path.exists(mac_stable):
|
| + browsers.append(PossibleBrowser("system", options, mac_stable))
|
| +
|
| + # Linux specific options.
|
| + if sys.platform.startswith('linux'):
|
| + # Look for a google-chrome instance.
|
| + found = False
|
| + try:
|
| + with open(real_os.devnull, 'w') as devnull:
|
| + found = subprocess.call(['google-chrome', '--version'],
|
| + stdout=devnull, stderr=devnull) == 0
|
| + except OSError:
|
| + pass
|
| + if found:
|
| + browsers.append(PossibleBrowser("system", options, 'google-chrome'))
|
| +
|
| + return browsers
|
|
|