Index: tools/telemetry/telemetry/cros_browser_backend.py |
diff --git a/tools/telemetry/telemetry/cros_browser_backend.py b/tools/telemetry/telemetry/cros_browser_backend.py |
deleted file mode 100644 |
index 28b3bceef1759c55b96530e7b9adc8814790cd61..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/telemetry/cros_browser_backend.py |
+++ /dev/null |
@@ -1,224 +0,0 @@ |
-# 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 logging |
-import os |
-import subprocess |
- |
-from telemetry import browser_backend |
-from telemetry import util |
- |
-class CrOSBrowserBackend(browser_backend.BrowserBackend): |
- def __init__(self, browser_type, options, cri): |
- super(CrOSBrowserBackend, self).__init__(is_content_shell=False, |
- supports_extensions=True, options=options) |
- # Initialize fields so that an explosion during init doesn't break in Close. |
- self._options = options |
- self._cri = cri |
- self._browser_type = browser_type |
- |
- self._remote_debugging_port = self._cri.GetRemotePort() |
- self._login_ext_dir = '/tmp/chromeos_login_ext' |
- |
- # Ensure the UI is running and logged out. |
- self._RestartUI() |
- |
- # Delete test@test.test's cryptohome vault (user data directory). |
- if not options.dont_override_profile: |
- logging.info('Deleting user\'s cryptohome vault (the user data dir)') |
- self._cri.GetCmdOutput( |
- ['cryptohome', '--action=remove', '--force', '--user=test@test.test']) |
- |
- # Push a dummy login extension to the device. |
- # This extension automatically logs in as test@test.test |
- logging.info('Copying dummy login extension to the device') |
- cri.PushFile( |
- os.path.join(os.path.dirname(__file__), 'chromeos_login_ext'), '/tmp/') |
- cri.GetCmdOutput(['chown', '-R', 'chronos:chronos', self._login_ext_dir]) |
- |
- # Restart Chrome with the login extension and remote debugging. |
- logging.info('Restarting Chrome with flags and login') |
- args = ['dbus-send', '--system', '--type=method_call', |
- '--dest=org.chromium.SessionManager', |
- '/org/chromium/SessionManager', |
- 'org.chromium.SessionManagerInterface.EnableChromeTesting', |
- 'boolean:true', |
- 'array:string:"%s"' % '","'.join(self.GetBrowserStartupArgs())] |
- cri.GetCmdOutput(args) |
- |
- # Find a free local port. |
- self._port = util.GetAvailableLocalPort() |
- |
- # Forward the remote debugging port. |
- logging.info('Forwarding remote debugging port') |
- self._forwarder = SSHForwarder( |
- cri, 'L', |
- util.PortPair(self._port, self._remote_debugging_port)) |
- |
- # Wait for the browser to come up. |
- logging.info('Waiting for browser to be ready') |
- try: |
- self._WaitForBrowserToComeUp() |
- self._PostBrowserStartupInitialization() |
- except: |
- import traceback |
- traceback.print_exc() |
- self.Close() |
- raise |
- |
- |
- logging.info('Browser is up!') |
- |
- def GetBrowserStartupArgs(self): |
- self.webpagereplay_remote_http_port = self._cri.GetRemotePort() |
- self.webpagereplay_remote_https_port = self._cri.GetRemotePort() |
- |
- args = super(CrOSBrowserBackend, self).GetBrowserStartupArgs() |
- |
- args.extend([ |
- '--allow-webui-compositing', |
- '--aura-host-window-use-fullscreen', |
- '--enable-smooth-scrolling', |
- '--enable-threaded-compositing', |
- '--enable-per-tile-painting', |
- '--enable-gpu-sandboxing', |
- '--force-compositing-mode', |
- '--remote-debugging-port=%i' % self._remote_debugging_port, |
- '--auth-ext-path=%s' % self._login_ext_dir, |
- '--start-maximized']) |
- |
- return args |
- |
- def GetRemotePort(self, _): |
- return self._cri.GetRemotePort() |
- |
- def SetBrowser(self, browser): |
- super(CrOSBrowserBackend, self).SetBrowser(browser) |
- |
- # TODO(hartmanng): crbug.com/166886 (Remove these temporary hacks when |
- # _ListTabs is fixed) |
- |
- # Wait for the oobe login screen to disappear. Unfortunately, once it does, |
- # our TabList needs to be refreshed to point at the new non-login tab. |
- tab_url = None |
- |
- # When tab_url is None, we have to create or refresh the TabList |
- # and wait for the oobe login screen to disappear. |
- while tab_url is None: |
- self._tab_list_backend.Reset() |
- |
- # Wait for the login screen to disappear. This can cause tab_url to be |
- # None or to not be 'chrome://oobe/login'. |
- def IsTabNoneOrOobeLogin(): |
- tab = self._tab_list_backend.Get(0, None) |
- if tab is not None: |
- tab_url = tab.url |
- else: |
- return False |
- return tab_url is None or tab_url != 'chrome://oobe/login' |
- |
- # TODO(hartmanng): find a better way to detect the getting started window |
- # (crbug.com/171520) |
- try: |
- util.WaitFor(lambda: IsTabNoneOrOobeLogin(), 20) # pylint: disable=W0108 |
- except util.TimeoutException: |
- break |
- |
- # Refresh our tab_url variable with the current tab[0].url. If it is None |
- # at this point, we need to continue the loop to refresh TabController. |
- tab = self._tab_list_backend.Get(0, None) |
- if tab is not None: |
- tab_url = tab.url |
- else: |
- tab_url = None |
- |
- # Once we're sure that the login screen is gone, we can close all open tabs |
- # to make sure the first-start window doesn't interfere. |
- while len(self._tab_list_backend) > 1: |
- tab = self._tab_list_backend.Get(0, None) |
- if tab is not None: |
- tab.Close() |
- |
- # Finally open one regular tab. Normally page_runner takes care of this, |
- # but page_runner isn't necesarily always used (for example, in some unit |
- # tests). |
- self._tab_list_backend.New(20) |
- |
- def __del__(self): |
- self.Close() |
- |
- def Close(self): |
- super(CrOSBrowserBackend, self).Close() |
- |
- self._RestartUI() # Logs out. |
- |
- if self._forwarder: |
- self._forwarder.Close() |
- self._forwarder = None |
- |
- if self._login_ext_dir: |
- self._cri.RmRF(self._login_ext_dir) |
- self._login_ext_dir = None |
- |
- self._cri = None |
- |
- def IsBrowserRunning(self): |
- # On ChromeOS, there should always be a browser running. |
- for _, process in self._cri.ListProcesses(): |
- if process.startswith('/opt/google/chrome/chrome'): |
- return True |
- return False |
- |
- def GetStandardOutput(self): |
- return 'Cannot get standard output on CrOS' |
- |
- def CreateForwarder(self, *port_pairs): |
- assert self._cri |
- return SSHForwarder(self._cri, 'R', *port_pairs) |
- |
- def _RestartUI(self): |
- if self._cri: |
- logging.info('(Re)starting the ui (logs the user out)') |
- if self._cri.IsServiceRunning('ui'): |
- self._cri.GetCmdOutput(['restart', 'ui']) |
- else: |
- self._cri.GetCmdOutput(['start', 'ui']) |
- |
- |
-class SSHForwarder(object): |
- def __init__(self, cri, forwarding_flag, *port_pairs): |
- self._proc = None |
- |
- if forwarding_flag == 'R': |
- self._host_port = port_pairs[0].remote_port |
- command_line = ['-%s%i:localhost:%i' % (forwarding_flag, |
- port_pair.remote_port, |
- port_pair.local_port) |
- for port_pair in port_pairs] |
- else: |
- self._host_port = port_pairs[0].local_port |
- command_line = ['-%s%i:localhost:%i' % (forwarding_flag, |
- port_pair.local_port, |
- port_pair.remote_port) |
- for port_pair in port_pairs] |
- |
- self._device_port = port_pairs[0].remote_port |
- |
- self._proc = subprocess.Popen( |
- cri.FormSSHCommandLine(['sleep', '999999999'], command_line), |
- stdout=subprocess.PIPE, |
- stderr=subprocess.PIPE, |
- stdin=subprocess.PIPE, |
- shell=False) |
- |
- util.WaitFor(lambda: cri.IsHTTPServerRunningOnPort(self._device_port), 60) |
- |
- @property |
- def url(self): |
- assert self._proc |
- return 'http://localhost:%i' % self._host_port |
- |
- def Close(self): |
- if self._proc: |
- self._proc.kill() |
- self._proc = None |