blob: 319c2c34cee0eb47aee45da16120ab323cc7b4d0 [file] [log] [blame]
# Copyright 2014 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.
"""Finds iOS browsers that can be controlled by telemetry."""
import logging
import re
from telemetry.core import platform
from telemetry.internal.backends.chrome import ios_browser_backend
from telemetry.internal.backends.chrome_inspector import inspector_backend
from telemetry.internal.browser import browser
from telemetry.internal.browser import possible_browser
from telemetry.internal.platform import ios_device
from telemetry.internal.platform import ios_platform_backend
# Key matches output from ios-webkit-debug-proxy and the value is a readable
# description of the browser.
IOS_BROWSERS = {'CriOS': 'ios-chrome', 'Version': 'ios-safari'}
DEVICE_LIST_URL = 'http://127.0.0.1:9221/json'
IOS_WEBKIT_DEBUG_PROXY = 'ios_webkit_debug_proxy'
class PossibleIOSBrowser(possible_browser.PossibleBrowser):
"""A running iOS browser instance."""
def __init__(self, browser_type, _):
super(PossibleIOSBrowser, self).__init__(browser_type, 'ios', True)
# TODO(baxley): Implement the following methods for iOS.
def Create(self, finder_options):
browser_backend = ios_browser_backend.IosBrowserBackend(
self._platform_backend, finder_options.browser_options)
return browser.Browser(
browser_backend, self._platform_backend, self._credentials_path)
def SupportsOptions(self, finder_options):
#TODO(baxley): Implement me.
return True
def UpdateExecutableIfNeeded(self):
#TODO(baxley): Implement me.
pass
def _InitPlatformIfNeeded(self):
if self._platform:
return
self._platform_backend = ios_platform_backend.IosPlatformBackend()
self._platform = platform.Platform(self._platform_backend)
def SelectDefaultBrowser(_):
return None # TODO(baxley): Implement me.
def CanFindAvailableBrowsers():
# TODO(baxley): Add support for all platforms possible. Probably Linux,
# probably not Windows.
return platform.GetHostPlatform().GetOSName() == 'mac'
def FindAllBrowserTypes(_):
return IOS_BROWSERS.values()
def FindAllAvailableBrowsers(finder_options, device):
"""Find all running iOS browsers on connected devices."""
if not isinstance(device, ios_device.IOSDevice):
return []
if not CanFindAvailableBrowsers():
return []
options = finder_options.browser_options
options.browser_type = 'ios-chrome'
host = platform.GetHostPlatform()
backend = ios_browser_backend.IosBrowserBackend(host, options)
# TODO(baxley): Use idevice to wake up device or log debug statement.
if not host.IsApplicationRunning(IOS_WEBKIT_DEBUG_PROXY):
host.LaunchApplication(IOS_WEBKIT_DEBUG_PROXY)
if not host.IsApplicationRunning(IOS_WEBKIT_DEBUG_PROXY):
return []
device_urls = backend.GetDeviceUrls()
if not device_urls:
logging.debug('Could not find any devices over %s.'
% IOS_WEBKIT_DEBUG_PROXY)
return []
debug_urls = backend.GetWebSocketDebuggerUrls(device_urls)
# Get the userAgent for each UIWebView to find the browsers.
browser_pattern = (r'\)\s(%s)\/(\d+[\.\d]*)\sMobile'
% '|'.join(IOS_BROWSERS.keys()))
browser_types = set()
for url in debug_urls:
context = {'webSocketDebuggerUrl': url, 'id': 1}
try:
inspector = inspector_backend.InspectorBackend(
backend.app, backend.devtools_client, context)
res = inspector.EvaluateJavaScript("navigator.userAgent")
finally:
inspector.Disconnect()
match_browsers = re.search(browser_pattern, res)
if match_browsers:
browser_types.add(match_browsers.group(1))
browsers = []
for browser_type in browser_types:
browsers.append(PossibleIOSBrowser(IOS_BROWSERS[browser_type],
finder_options))
return list(browsers)