• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2013 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.
4
5"""Finds CrOS browsers that can be controlled by telemetry."""
6
7import logging
8
9from telemetry.core import cros_interface
10from telemetry.core import platform as platform_module
11from telemetry.internal.backends.chrome import cros_browser_backend
12from telemetry.internal.backends.chrome import cros_browser_with_oobe
13from telemetry.internal.browser import browser
14from telemetry.internal.browser import browser_finder_exceptions
15from telemetry.internal.browser import possible_browser
16from telemetry.internal.platform import cros_device
17
18
19class PossibleCrOSBrowser(possible_browser.PossibleBrowser):
20  """A launchable CrOS browser instance."""
21  def __init__(self, browser_type, finder_options, cros_platform, is_guest):
22    super(PossibleCrOSBrowser, self).__init__(browser_type, 'cros', True)
23    assert browser_type in FindAllBrowserTypes(finder_options), (
24        'Please add %s to cros_browser_finder.FindAllBrowserTypes()' %
25         browser_type)
26    self._platform = cros_platform
27    self._platform_backend = (
28        cros_platform._platform_backend)  # pylint: disable=protected-access
29    self._is_guest = is_guest
30
31  def __repr__(self):
32    return 'PossibleCrOSBrowser(browser_type=%s)' % self.browser_type
33
34  def _InitPlatformIfNeeded(self):
35    pass
36
37  def Create(self, finder_options):
38    if finder_options.browser_options.output_profile_path:
39      raise NotImplementedError(
40          'Profile generation is not yet supported on CrOS.')
41
42    browser_options = finder_options.browser_options
43    browser_backend = cros_browser_backend.CrOSBrowserBackend(
44        self._platform_backend, browser_options, self._platform_backend.cri,
45        self._is_guest)
46    if browser_options.create_browser_with_oobe:
47      return cros_browser_with_oobe.CrOSBrowserWithOOBE(
48          browser_backend,
49          self._platform_backend,
50          self._credentials_path)
51    return browser.Browser(
52        browser_backend, self._platform_backend, self._credentials_path)
53
54  def SupportsOptions(self, browser_options):
55    return (len(browser_options.extensions_to_load) == 0) or not self._is_guest
56
57  def UpdateExecutableIfNeeded(self):
58    pass
59
60def SelectDefaultBrowser(possible_browsers):
61  if cros_device.IsRunningOnCrOS():
62    for b in possible_browsers:
63      if b.browser_type == 'system':
64        return b
65  return None
66
67def CanFindAvailableBrowsers(finder_options):
68  return (cros_device.IsRunningOnCrOS() or
69          finder_options.cros_remote or
70          cros_interface.HasSSH())
71
72def FindAllBrowserTypes(_):
73  return [
74      'cros-chrome',
75      'cros-chrome-guest',
76      'system',
77      'system-guest',
78  ]
79
80def FindAllAvailableBrowsers(finder_options, device):
81  """Finds all available CrOS browsers, locally and remotely."""
82  browsers = []
83  if not isinstance(device, cros_device.CrOSDevice):
84    return browsers
85
86  if cros_device.IsRunningOnCrOS():
87    browsers = [PossibleCrOSBrowser('system', finder_options,
88                                    platform_module.GetHostPlatform(),
89                                    is_guest=False),
90                PossibleCrOSBrowser('system-guest', finder_options,
91                                    platform_module.GetHostPlatform(),
92                                    is_guest=True)]
93
94  # Check ssh
95  try:
96    platform = platform_module.GetPlatformForDevice(device, finder_options)
97  except cros_interface.LoginException, ex:
98    if isinstance(ex, cros_interface.KeylessLoginRequiredException):
99      logging.warn('Could not ssh into %s. Your device must be configured',
100                   finder_options.cros_remote)
101      logging.warn('to allow passwordless login as root.')
102      logging.warn('For a test-build device, pass this to your script:')
103      logging.warn('   --identity $(CHROMITE)/ssh_keys/testing_rsa')
104      logging.warn('')
105      logging.warn('For a developer-mode device, the steps are:')
106      logging.warn(' - Ensure you have an id_rsa.pub (etc) on this computer')
107      logging.warn(' - On the chromebook:')
108      logging.warn('   -  Control-Alt-T; shell; sudo -s')
109      logging.warn('   -  openssh-server start')
110      logging.warn('   -  scp <this machine>:.ssh/id_rsa.pub /tmp/')
111      logging.warn('   -  mkdir /root/.ssh')
112      logging.warn('   -  chown go-rx /root/.ssh')
113      logging.warn('   -  cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys')
114      logging.warn('   -  chown 0600 /root/.ssh/authorized_keys')
115    raise browser_finder_exceptions.BrowserFinderException(str(ex))
116
117  browsers.extend([PossibleCrOSBrowser('cros-chrome', finder_options,
118                                       platform, is_guest=False),
119                   PossibleCrOSBrowser('cros-chrome-guest',
120                                       finder_options, platform,
121                                       is_guest=True)])
122  return browsers
123