Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(181)

Unified Diff: tools/telemetry/telemetry/core/backends/chrome/ios_browser_finder.py

Issue 253903004: Make iOS browsers searchable by telemetry. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: remove unit test Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | tools/telemetry/telemetry/core/browser_finder.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/telemetry/telemetry/core/backends/chrome/ios_browser_finder.py
diff --git a/tools/telemetry/telemetry/core/backends/chrome/ios_browser_finder.py b/tools/telemetry/telemetry/core/backends/chrome/ios_browser_finder.py
new file mode 100644
index 0000000000000000000000000000000000000000..e909e32d344d7dab1927d49cf32087f95a26f6a0
--- /dev/null
+++ b/tools/telemetry/telemetry/core/backends/chrome/ios_browser_finder.py
@@ -0,0 +1,131 @@
+# 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 contextlib
+import json
+import logging
+import re
+import subprocess
+import urllib2
+
+from telemetry.core import platform
+from telemetry.core import possible_browser
+from telemetry.core import util
+from telemetry.core.backends.chrome import inspector_backend
+
+
+class PossibleIOSBrowser(possible_browser.PossibleBrowser):
+
+ """A running iOS browser instance."""
+ def __init__(self, browser_type, finder_options):
+ super(PossibleIOSBrowser, self).__init__(browser_type, 'ios',
+ finder_options)
+
+ # TODO(baxley): Implement the following methods for iOS.
+ def Create(self):
+ raise NotImplementedError()
+
+ def SupportOptions(self, finder_options):
+ raise NotImplementedError()
+
+# 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'}
+
+ALL_BROWSER_TYPES = IOS_BROWSERS.values()
+
+DEVICE_LIST_URL = 'http://localhost:9221/json'
+
+IOS_WEBKIT_DEBUG_PROXY = 'ios_webkit_debug_proxy'
+
+
+def FindAllAvailableBrowsers(finder_options):
+ """Find all running iOS browsers on connected devices."""
+ ios_device_attached = False
+ host = platform.GetHostPlatform()
+ if host.GetOSName() == 'mac':
+ devices = subprocess.check_output(
+ 'system_profiler SPUSBDataType', shell=True)
+ ios_devices = 'iPod|iPhone|iPad'
+ for line in devices.split('\n'):
+ if line:
+ m = re.match('\s*(%s):' % ios_devices, line)
+ if m:
+ ios_device_attached = True
+ break
+ else:
+ # TODO(baxley): Add support for all platforms possible. Probably Linux,
+ # probably not Windows.
+ return []
+
+ if ios_device_attached:
+ # 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 []
+ else:
+ return []
+
+ try:
+ # TODO(baxley): Refactor this into a backend file.
+ with contextlib.closing(urllib2.urlopen(DEVICE_LIST_URL)) as device_list:
+ json_urls = device_list.read()
+ device_urls = json.loads(json_urls)
+ if not device_urls:
+ logging.debug('No iOS devices found. Will not try searching for iOS '
+ 'browsers.')
+ return []
+ except urllib2.URLError as e:
+ logging.debug('Error communicating with devices over %s.'
+ % IOS_WEBKIT_DEBUG_PROXY)
+ logging.debug(e)
+ return []
+
+ # TODO(baxley): Move to ios-webkit-debug-proxy command class, similar
+ # to GetAttachedDevices() in adb_commands.
+ data = []
+ # Loop through all devices.
+ for d in device_urls:
+ # Retry a few times since it can take a few seconds for this API to be
+ # ready, if ios_webkit_debug_proxy is just launched.
+ def GetData():
+ try:
+ with contextlib.closing(
+ urllib2.urlopen('http://%s/json' % d['url'])) as f:
+ json_result = f.read()
+ data = json.loads(json_result)
+ return data
+ except urllib2.URLError as e:
+ logging.debug('Error communicating with device over %s.'
+ % IOS_WEBKIT_DEBUG_PROXY)
+ logging.debug(e)
+ return False
+ try:
+ data = util.WaitFor(GetData, 5)
+ except util.TimeoutException as e:
+ return []
+
+ # Find all running UIWebViews.
+ debug_urls = []
+ for j in data:
+ debug_urls.append(j['webSocketDebuggerUrl'])
+
+ # Get the userAgent for each UIWebView to find the browsers.
+ browser_pattern = ('\)\s(%s)\/(\d+[\.\d]*)\sMobile'
+ % '|'.join(IOS_BROWSERS.keys()))
+ browsers = []
+ for url in debug_urls:
+ context = {'webSocketDebuggerUrl':url , 'id':1}
+ # TODO(baxley): Replace None with ios_browser_backend, once implemented.
+ inspector_alt = inspector_backend.InspectorBackend(None, context)
+ res = inspector_alt.EvaluateJavaScript("navigator.userAgent")
+ match_browsers = re.search(browser_pattern, res)
+ if match_browsers:
+ browsers.append(PossibleIOSBrowser(IOS_BROWSERS[match_browsers.group(1)],
+ finder_options))
+
+ return browsers
« no previous file with comments | « no previous file | tools/telemetry/telemetry/core/browser_finder.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698