| Index: tools/telemetry/telemetry/internal/backends/chrome/cros_browser_backend.py
|
| diff --git a/tools/telemetry/telemetry/internal/backends/chrome/cros_browser_backend.py b/tools/telemetry/telemetry/internal/backends/chrome/cros_browser_backend.py
|
| deleted file mode 100644
|
| index 1231daa3ebf956b7a3aa7da44ba8d6b297c588ae..0000000000000000000000000000000000000000
|
| --- a/tools/telemetry/telemetry/internal/backends/chrome/cros_browser_backend.py
|
| +++ /dev/null
|
| @@ -1,239 +0,0 @@
|
| -# Copyright 2013 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
|
| -
|
| -from telemetry.core import exceptions
|
| -from telemetry.core import util
|
| -from telemetry import decorators
|
| -from telemetry.internal.backends.chrome import chrome_browser_backend
|
| -from telemetry.internal.backends.chrome import misc_web_contents_backend
|
| -from telemetry.internal import forwarders
|
| -
|
| -
|
| -class CrOSBrowserBackend(chrome_browser_backend.ChromeBrowserBackend):
|
| - def __init__(self, cros_platform_backend, browser_options, cri, is_guest,
|
| - extensions_to_load):
|
| - super(CrOSBrowserBackend, self).__init__(
|
| - cros_platform_backend, supports_tab_control=True,
|
| - supports_extensions=not is_guest,
|
| - browser_options=browser_options,
|
| - output_profile_path=None, extensions_to_load=extensions_to_load)
|
| - assert browser_options.IsCrosBrowserOptions()
|
| - # Initialize fields so that an explosion during init doesn't break in Close.
|
| - self._cri = cri
|
| - self._is_guest = is_guest
|
| - self._forwarder = None
|
| - self.wpr_port_pairs = forwarders.PortPairs(
|
| - http=forwarders.PortPair(self.wpr_port_pairs.http.local_port,
|
| - self._platform_backend.GetRemotePort(
|
| - self.wpr_port_pairs.http.local_port)),
|
| - https=forwarders.PortPair(self.wpr_port_pairs.https.local_port,
|
| - self._platform_backend.GetRemotePort(
|
| - self.wpr_port_pairs.http.local_port)),
|
| - dns=None)
|
| - self._remote_debugging_port = self._cri.GetRemotePort()
|
| - self._port = self._remote_debugging_port
|
| -
|
| - # Copy extensions to temp directories on the device.
|
| - # Note that we also perform this copy locally to ensure that
|
| - # the owner of the extensions is set to chronos.
|
| - for e in extensions_to_load:
|
| - extension_dir = cri.RunCmdOnDevice(
|
| - ['mktemp', '-d', '/tmp/extension_XXXXX'])[0].rstrip()
|
| - e.local_path = os.path.join(extension_dir, os.path.basename(e.path))
|
| - cri.PushFile(e.path, extension_dir)
|
| - cri.Chown(extension_dir)
|
| -
|
| - self._cri.RestartUI(self.browser_options.clear_enterprise_policy)
|
| - util.WaitFor(self.IsBrowserRunning, 20)
|
| -
|
| - # Delete test user's cryptohome vault (user data directory).
|
| - if not self.browser_options.dont_override_profile:
|
| - self._cri.RunCmdOnDevice(['cryptohome', '--action=remove', '--force',
|
| - '--user=%s' % self._username])
|
| -
|
| - @property
|
| - def log_file_path(self):
|
| - return None
|
| -
|
| - def GetBrowserStartupArgs(self):
|
| - args = super(CrOSBrowserBackend, self).GetBrowserStartupArgs()
|
| - args.extend([
|
| - '--enable-smooth-scrolling',
|
| - '--enable-threaded-compositing',
|
| - # Allow devtools to connect to chrome.
|
| - '--remote-debugging-port=%i' % self._remote_debugging_port,
|
| - # Open a maximized window.
|
| - '--start-maximized',
|
| - # Disable system startup sound.
|
| - '--ash-disable-system-sounds',
|
| - # Skip user image selection screen, and post login screens.
|
| - '--oobe-skip-postlogin',
|
| - # Debug logging.
|
| - '--vmodule=*/chromeos/net/*=2,*/chromeos/login/*=2'])
|
| -
|
| - # Disable GAIA services unless we're using GAIA login, or if there's an
|
| - # explicit request for it.
|
| - if (self.browser_options.disable_gaia_services and
|
| - not self.browser_options.gaia_login):
|
| - args.append('--disable-gaia-services')
|
| -
|
| - return args
|
| -
|
| - @property
|
| - def pid(self):
|
| - return self._cri.GetChromePid()
|
| -
|
| - @property
|
| - def browser_directory(self):
|
| - result = self._cri.GetChromeProcess()
|
| - if result and 'path' in result:
|
| - return os.path.dirname(result['path'])
|
| - return None
|
| -
|
| - @property
|
| - def profile_directory(self):
|
| - return '/home/chronos/Default'
|
| -
|
| - def __del__(self):
|
| - self.Close()
|
| -
|
| - def Start(self):
|
| - # Escape all commas in the startup arguments we pass to Chrome
|
| - # because dbus-send delimits array elements by commas
|
| - startup_args = [a.replace(',', '\\,') for a in self.GetBrowserStartupArgs()]
|
| -
|
| - # 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(startup_args)]
|
| - self._cri.RunCmdOnDevice(args)
|
| -
|
| - if not self._cri.local:
|
| - self._port = util.GetUnreservedAvailableLocalPort()
|
| - self._forwarder = self._platform_backend.forwarder_factory.Create(
|
| - forwarders.PortPairs(
|
| - http=forwarders.PortPair(self._port, self._remote_debugging_port),
|
| - https=None,
|
| - dns=None), use_remote_port_forwarding=False)
|
| -
|
| - # Wait for oobe.
|
| - self._WaitForBrowserToComeUp()
|
| - self._InitDevtoolsClientBackend(
|
| - remote_devtools_port=self._remote_debugging_port)
|
| - util.WaitFor(lambda: self.oobe_exists, 10)
|
| -
|
| - if self.browser_options.auto_login:
|
| - try:
|
| - if self._is_guest:
|
| - pid = self.pid
|
| - self.oobe.NavigateGuestLogin()
|
| - # Guest browsing shuts down the current browser and launches an
|
| - # incognito browser in a separate process, which we need to wait for.
|
| - util.WaitFor(lambda: pid != self.pid, 10)
|
| - elif self.browser_options.gaia_login:
|
| - self.oobe.NavigateGaiaLogin(self._username, self._password)
|
| - else:
|
| - self.oobe.NavigateFakeLogin(self._username, self._password,
|
| - self._gaia_id)
|
| -
|
| - self._WaitForLogin()
|
| - except exceptions.TimeoutException:
|
| - self._cri.TakeScreenShot('login-screen')
|
| - raise exceptions.LoginException('Timed out going through login screen. '
|
| - + self._GetLoginStatus())
|
| -
|
| - logging.info('Browser is up!')
|
| -
|
| - def Close(self):
|
| - super(CrOSBrowserBackend, self).Close()
|
| -
|
| - if self._cri:
|
| - self._cri.RestartUI(False) # Logs out.
|
| - self._cri.CloseConnection()
|
| -
|
| - util.WaitFor(lambda: not self._IsCryptohomeMounted(), 180)
|
| -
|
| - if self._forwarder:
|
| - self._forwarder.Close()
|
| - self._forwarder = None
|
| -
|
| - if self._cri:
|
| - for e in self._extensions_to_load:
|
| - self._cri.RmRF(os.path.dirname(e.local_path))
|
| -
|
| - self._cri = None
|
| -
|
| - def IsBrowserRunning(self):
|
| - return bool(self.pid)
|
| -
|
| - def GetStandardOutput(self):
|
| - return 'Cannot get standard output on CrOS'
|
| -
|
| - def GetStackTrace(self):
|
| - return 'Cannot get stack trace on CrOS'
|
| -
|
| - @property
|
| - @decorators.Cache
|
| - def misc_web_contents_backend(self):
|
| - """Access to chrome://oobe/login page."""
|
| - return misc_web_contents_backend.MiscWebContentsBackend(self)
|
| -
|
| - @property
|
| - def oobe(self):
|
| - return self.misc_web_contents_backend.GetOobe()
|
| -
|
| - @property
|
| - def oobe_exists(self):
|
| - return self.misc_web_contents_backend.oobe_exists
|
| -
|
| - @property
|
| - def _username(self):
|
| - return self.browser_options.username
|
| -
|
| - @property
|
| - def _password(self):
|
| - return self.browser_options.password
|
| -
|
| - @property
|
| - def _gaia_id(self):
|
| - return self.browser_options.gaia_id
|
| -
|
| - def _IsCryptohomeMounted(self):
|
| - username = '$guest' if self._is_guest else self._username
|
| - return self._cri.IsCryptohomeMounted(username, self._is_guest)
|
| -
|
| - def _GetLoginStatus(self):
|
| - """Returns login status. If logged in, empty string is returned."""
|
| - status = ''
|
| - if not self._IsCryptohomeMounted():
|
| - status += 'Cryptohome not mounted. '
|
| - if not self.HasBrowserFinishedLaunching():
|
| - status += 'Browser didn\'t launch. '
|
| - if self.oobe_exists:
|
| - status += 'OOBE not dismissed.'
|
| - return status
|
| -
|
| - def _IsLoggedIn(self):
|
| - """Returns True if cryptohome has mounted, the browser is
|
| - responsive to devtools requests, and the oobe has been dismissed."""
|
| - return not self._GetLoginStatus()
|
| -
|
| - def _WaitForLogin(self):
|
| - # Wait for cryptohome to mount.
|
| - util.WaitFor(self._IsLoggedIn, 60)
|
| -
|
| - # For incognito mode, the session manager actually relaunches chrome with
|
| - # new arguments, so we have to wait for the browser to come up.
|
| - self._WaitForBrowserToComeUp()
|
| -
|
| - # Wait for extensions to load.
|
| - if self._supports_extensions:
|
| - self._WaitForExtensionsToLoad()
|
|
|