diff options
author | chrisgao@chromium.org <chrisgao@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-02 19:12:34 +0000 |
---|---|---|
committer | chrisgao@chromium.org <chrisgao@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-02 19:12:34 +0000 |
commit | 66aa3815d8e7745580d928c7c39eed68a6eb8222 (patch) | |
tree | 700afbe3318ac488c950095d4d71764de536886f /tools/telemetry | |
parent | 75147f5e8bba70b224050852d23a22d26edcb57e (diff) | |
download | chromium_src-66aa3815d8e7745580d928c7c39eed68a6eb8222.zip chromium_src-66aa3815d8e7745580d928c7c39eed68a6eb8222.tar.gz chromium_src-66aa3815d8e7745580d928c7c39eed68a6eb8222.tar.bz2 |
[telemetry] Refactoring of telemetry for the webdriver backend to land in.
1. Create telemetry.core.backends.browser_backend that can be shared by both chrome and webdriver.
2. Move telemetry.core.chrome.browser_backend to telemetry.core.backends.chrome.chrome_browser_backend.
3. Move DoNothingForwarder to telemetry.core.backends.browser_backend.
4. Add CreatePlatformBackendForCurrentOS to telemetry/core/platform/__init__.py
5. Add a hook browser_backend.AddReplayServerOptions.
6. Override webpagereplay.ReplayServer._AddDefaultReplayOptions because '--no-dns_forwarding' is added by default in webpagereplay.ReplayServer while webdriver-based backends need dns forwarding.
BUG=267219
Review URL: https://chromiumcodereview.appspot.com/21406004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@215340 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'tools/telemetry')
-rw-r--r-- | tools/telemetry/telemetry/core/backends/__init__.py | 3 | ||||
-rw-r--r-- | tools/telemetry/telemetry/core/backends/browser_backend.py | 96 | ||||
-rw-r--r-- | tools/telemetry/telemetry/core/backends/chrome/__init__.py | 3 | ||||
-rw-r--r-- | tools/telemetry/telemetry/core/backends/chrome/chrome_browser_backend.py (renamed from tools/telemetry/telemetry/core/chrome/browser_backend.py) | 84 | ||||
-rw-r--r-- | tools/telemetry/telemetry/core/browser.py | 2 | ||||
-rw-r--r-- | tools/telemetry/telemetry/core/chrome/android_browser_backend.py | 5 | ||||
-rw-r--r-- | tools/telemetry/telemetry/core/chrome/cros_browser_backend.py | 5 | ||||
-rw-r--r-- | tools/telemetry/telemetry/core/chrome/desktop_browser_backend.py | 5 | ||||
-rw-r--r-- | tools/telemetry/telemetry/core/chrome/desktop_browser_finder.py | 16 | ||||
-rw-r--r-- | tools/telemetry/telemetry/core/platform/__init__.py | 17 | ||||
-rw-r--r-- | tools/telemetry/telemetry/core/wpr_server.py | 14 |
11 files changed, 161 insertions, 89 deletions
diff --git a/tools/telemetry/telemetry/core/backends/__init__.py b/tools/telemetry/telemetry/core/backends/__init__.py new file mode 100644 index 0000000..9228df8 --- /dev/null +++ b/tools/telemetry/telemetry/core/backends/__init__.py @@ -0,0 +1,3 @@ +# 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. diff --git a/tools/telemetry/telemetry/core/backends/browser_backend.py b/tools/telemetry/telemetry/core/backends/browser_backend.py new file mode 100644 index 0000000..bb120bd --- /dev/null +++ b/tools/telemetry/telemetry/core/backends/browser_backend.py @@ -0,0 +1,96 @@ +# 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. + +from telemetry.core import util +from telemetry.core import web_contents + + +class ExtensionsNotSupportedException(Exception): + pass + +class BrowserBackend(object): + """A base class for browser backends.""" + + WEBPAGEREPLAY_HOST = '127.0.0.1' + + def __init__(self, is_content_shell, supports_extensions, options, + tab_list_backend): + self.browser_type = options.browser_type + self.is_content_shell = is_content_shell + self._supports_extensions = supports_extensions + self.options = options + self._browser = None + self._tab_list_backend = tab_list_backend(self) + + def AddReplayServerOptions(self, options): + pass + + def SetBrowser(self, browser): + self._browser = browser + self._tab_list_backend.Init() + + @property + def browser(self): + return self._browser + + @property + def supports_extensions(self): + """True if this browser backend supports extensions.""" + return self._supports_extensions + + @property + def wpr_mode(self): + return self.options.wpr_mode + + @property + def supports_tab_control(self): + raise NotImplementedError() + + @property + def tab_list_backend(self): + return self._tab_list_backend + + @property + def supports_tracing(self): + raise NotImplementedError() + + def StartTracing(self, custom_categories=None, + timeout=web_contents.DEFAULT_WEB_CONTENTS_TIMEOUT): + raise NotImplementedError() + + def StopTracing(self): + raise NotImplementedError() + + def GetTraceResultAndReset(self): + raise NotImplementedError() + + def GetRemotePort(self, _): + return util.GetAvailableLocalPort() + + def Start(self): + raise NotImplementedError() + + def CreateForwarder(self, *port_pairs): + raise NotImplementedError() + + def IsBrowserRunning(self): + raise NotImplementedError() + + def GetStandardOutput(self): + raise NotImplementedError() + + def GetStackTrace(self): + raise NotImplementedError() + +class DoNothingForwarder(object): + def __init__(self, *port_pairs): + self._host_port = port_pairs[0].local_port + + @property + def url(self): + assert self._host_port + return 'http://127.0.0.1:%i' % self._host_port + + def Close(self): + self._host_port = None diff --git a/tools/telemetry/telemetry/core/backends/chrome/__init__.py b/tools/telemetry/telemetry/core/backends/chrome/__init__.py new file mode 100644 index 0000000..9228df8 --- /dev/null +++ b/tools/telemetry/telemetry/core/backends/chrome/__init__.py @@ -0,0 +1,3 @@ +# 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. diff --git a/tools/telemetry/telemetry/core/chrome/browser_backend.py b/tools/telemetry/telemetry/core/backends/chrome/chrome_browser_backend.py index c875f2a..13bb286 100644 --- a/tools/telemetry/telemetry/core/chrome/browser_backend.py +++ b/tools/telemetry/telemetry/core/backends/chrome/chrome_browser_backend.py @@ -1,41 +1,38 @@ -# Copyright (c) 2012 The Chromium Authors. All rights reserved. +# 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 urllib2 import httplib -import socket import json import re +import socket import sys +import urllib2 -from telemetry.core import util from telemetry.core import exceptions from telemetry.core import user_agent +from telemetry.core import util from telemetry.core import web_contents from telemetry.core import wpr_modes from telemetry.core import wpr_server +from telemetry.core.backends import browser_backend from telemetry.core.chrome import extension_dict_backend +from telemetry.core.chrome import misc_web_contents_backend from telemetry.core.chrome import tab_list_backend from telemetry.core.chrome import tracing_backend -from telemetry.core.chrome import misc_web_contents_backend from telemetry.unittest import options_for_unittests -class ExtensionsNotSupportedException(Exception): - pass - -class BrowserBackend(object): - """A base class for browser backends. Provides basic functionality +class ChromeBrowserBackend(browser_backend.BrowserBackend): + """An abstract class for chrome browser backends. Provides basic functionality once a remote-debugger port has been established.""" - - WEBPAGEREPLAY_HOST = '127.0.0.1' + # It is OK to have abstract methods. pylint: disable=W0223 def __init__(self, is_content_shell, supports_extensions, options): - self.browser_type = options.browser_type - self.is_content_shell = is_content_shell - self._supports_extensions = supports_extensions - self.options = options - self._browser = None + super(ChromeBrowserBackend, self).__init__( + is_content_shell=is_content_shell, + supports_extensions=supports_extensions, + options=options, + tab_list_backend=tab_list_backend.TabListBackend) self._port = None self._inspector_protocol_version = 0 @@ -54,24 +51,13 @@ class BrowserBackend(object): 'extensions.\n') self._misc_web_contents_backend = ( misc_web_contents_backend.MiscWebContentsBackend(self)) - self._tab_list_backend = tab_list_backend.TabListBackend(self) self._extension_dict_backend = None if supports_extensions: self._extension_dict_backend = ( extension_dict_backend.ExtensionDictBackend(self)) - def SetBrowser(self, browser): - self._browser = browser - self._tab_list_backend.Init() - - @property - def browser(self): - return self._browser - - @property - def supports_extensions(self): - """True if this browser backend supports extensions.""" - return self._supports_extensions + def AddReplayServerOptions(self, options): + options.append('--no-dns_forwarding') @property def misc_web_contents_backend(self): @@ -80,10 +66,6 @@ class BrowserBackend(object): return self._misc_web_contents_backend @property - def tab_list_backend(self): - return self._tab_list_backend - - @property def extension_dict_backend(self): return self._extension_dict_backend @@ -118,10 +100,6 @@ class BrowserBackend(object): return args - @property - def wpr_mode(self): - return self.options.wpr_mode - def _WaitForBrowserToComeUp(self, timeout=None): def IsBrowserUp(): try: @@ -239,37 +217,7 @@ class BrowserBackend(object): return 'browser' return m.group(1) - def GetRemotePort(self, _): - return util.GetAvailableLocalPort() - - def Start(self): - raise NotImplementedError() - def Close(self): if self._tracing_backend: self._tracing_backend.Close() self._tracing_backend = None - - def CreateForwarder(self, *port_pairs): - raise NotImplementedError() - - def IsBrowserRunning(self): - raise NotImplementedError() - - def GetStandardOutput(self): - raise NotImplementedError() - - def GetStackTrace(self): - raise NotImplementedError() - -class DoNothingForwarder(object): - def __init__(self, *port_pairs): - self._host_port = port_pairs[0].local_port - - @property - def url(self): - assert self._host_port - return 'http://127.0.0.1:%i' % self._host_port - - def Close(self): - self._host_port = None diff --git a/tools/telemetry/telemetry/core/browser.py b/tools/telemetry/telemetry/core/browser.py index a069976..f8dbb39 100644 --- a/tools/telemetry/telemetry/core/browser.py +++ b/tools/telemetry/telemetry/core/browser.py @@ -11,7 +11,7 @@ from telemetry.core import tab_list from telemetry.core import temporary_http_server from telemetry.core import wpr_modes from telemetry.core import wpr_server -from telemetry.core.chrome import browser_backend +from telemetry.core.backends import browser_backend from telemetry.core.platform.profiler import profiler_finder class Browser(object): diff --git a/tools/telemetry/telemetry/core/chrome/android_browser_backend.py b/tools/telemetry/telemetry/core/chrome/android_browser_backend.py index 4b72d99..839bbc2 100644 --- a/tools/telemetry/telemetry/core/chrome/android_browser_backend.py +++ b/tools/telemetry/telemetry/core/chrome/android_browser_backend.py @@ -10,8 +10,9 @@ import time from telemetry.core import exceptions from telemetry.core import util +from telemetry.core.backends import browser_backend +from telemetry.core.backends.chrome import chrome_browser_backend from telemetry.core.chrome import adb_commands -from telemetry.core.chrome import browser_backend class AndroidBrowserBackendSettings(object): @@ -142,7 +143,7 @@ class WebviewBackendSettings(AndroidBrowserBackendSettings): return '/data/data/%s/app_webview/' % self.package -class AndroidBrowserBackend(browser_backend.BrowserBackend): +class AndroidBrowserBackend(chrome_browser_backend.ChromeBrowserBackend): """The backend for controlling a browser instance running on Android. """ def __init__(self, options, backend_settings): diff --git a/tools/telemetry/telemetry/core/chrome/cros_browser_backend.py b/tools/telemetry/telemetry/core/chrome/cros_browser_backend.py index ca27e49..a3daeee 100644 --- a/tools/telemetry/telemetry/core/chrome/cros_browser_backend.py +++ b/tools/telemetry/telemetry/core/chrome/cros_browser_backend.py @@ -7,9 +7,10 @@ import subprocess from telemetry.core import exceptions from telemetry.core import util -from telemetry.core.chrome import browser_backend +from telemetry.core.backends import browser_backend +from telemetry.core.backends.chrome import chrome_browser_backend -class CrOSBrowserBackend(browser_backend.BrowserBackend): +class CrOSBrowserBackend(chrome_browser_backend.ChromeBrowserBackend): # Some developers' workflow includes running the Chrome process from # /usr/local/... instead of the default location. We have to check for both # paths in order to support this workflow. diff --git a/tools/telemetry/telemetry/core/chrome/desktop_browser_backend.py b/tools/telemetry/telemetry/core/chrome/desktop_browser_backend.py index ea2b6c1..0e90658 100644 --- a/tools/telemetry/telemetry/core/chrome/desktop_browser_backend.py +++ b/tools/telemetry/telemetry/core/chrome/desktop_browser_backend.py @@ -9,9 +9,10 @@ import sys import tempfile from telemetry.core import util -from telemetry.core.chrome import browser_backend +from telemetry.core.backends import browser_backend +from telemetry.core.backends.chrome import chrome_browser_backend -class DesktopBrowserBackend(browser_backend.BrowserBackend): +class DesktopBrowserBackend(chrome_browser_backend.ChromeBrowserBackend): """The backend for controlling a locally-executed browser instance, on Linux, Mac or Windows. """ diff --git a/tools/telemetry/telemetry/core/chrome/desktop_browser_finder.py b/tools/telemetry/telemetry/core/chrome/desktop_browser_finder.py index 3dfc8b5..c2f625e 100644 --- a/tools/telemetry/telemetry/core/chrome/desktop_browser_finder.py +++ b/tools/telemetry/telemetry/core/chrome/desktop_browser_finder.py @@ -11,14 +11,12 @@ import subprocess import sys from telemetry.core import browser +from telemetry.core import platform as core_platform from telemetry.core import possible_browser from telemetry.core import profile_types from telemetry.core import util from telemetry.core.chrome import cros_interface from telemetry.core.chrome import desktop_browser_backend -from telemetry.core.platform import linux_platform_backend -from telemetry.core.platform import mac_platform_backend -from telemetry.core.platform import win_platform_backend ALL_BROWSER_TYPES = ','.join([ 'exact', @@ -52,16 +50,8 @@ class PossibleDesktopBrowser(possible_browser.PossibleBrowser): self._options, self._local_executable, self._flash_path, self._is_content_shell, delete_profile_dir_after_run=delete_profile_dir_after_run) - if sys.platform.startswith('linux'): - p = linux_platform_backend.LinuxPlatformBackend() - elif sys.platform == 'darwin': - p = mac_platform_backend.MacPlatformBackend() - elif sys.platform == 'win32': - p = win_platform_backend.WinPlatformBackend() - else: - raise NotImplementedError() - - b = browser.Browser(backend, p) + b = browser.Browser(backend, + core_platform.CreatePlatformBackendForCurrentOS()) return b def Create(self): diff --git a/tools/telemetry/telemetry/core/platform/__init__.py b/tools/telemetry/telemetry/core/platform/__init__.py index 5b88286..3729159 100644 --- a/tools/telemetry/telemetry/core/platform/__init__.py +++ b/tools/telemetry/telemetry/core/platform/__init__.py @@ -2,6 +2,12 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import sys + +from telemetry.core.platform import linux_platform_backend +from telemetry.core.platform import mac_platform_backend +from telemetry.core.platform import win_platform_backend + class Platform(object): """The platform that the target browser is running on. @@ -104,3 +110,14 @@ class Platform(object): This function does not require root or administrator access.""" return self._platform_backend.FlushSystemCacheForDirectory( directory, ignoring=ignoring) + + +def CreatePlatformBackendForCurrentOS(): + if sys.platform.startswith('linux'): + return linux_platform_backend.LinuxPlatformBackend() + elif sys.platform == 'darwin': + return mac_platform_backend.MacPlatformBackend() + elif sys.platform == 'win32': + return win_platform_backend.WinPlatformBackend() + else: + raise NotImplementedError() diff --git a/tools/telemetry/telemetry/core/wpr_server.py b/tools/telemetry/telemetry/core/wpr_server.py index 6904d98..88abc5b 100644 --- a/tools/telemetry/telemetry/core/wpr_server.py +++ b/tools/telemetry/telemetry/core/wpr_server.py @@ -17,6 +17,17 @@ import webpagereplay # pylint: disable=F0401 def GetChromeFlags(replay_host, http_port, https_port): return webpagereplay.GetChromeFlags(replay_host, http_port, https_port) +class _WebPageReplayServer(webpagereplay.ReplayServer): # pylint: disable=W0232 + def _AddDefaultReplayOptions(self): + """Override. Because '--no-dns_forwarding' is added by default in parent + while webdriver-based backends need dns forwarding.""" + self.replay_options += [ + '--port', str(self._http_port), + '--ssl_port', str(self._https_port), + '--use_closest_match', + '--log_level', 'warning' + ] + class ReplayServer(object): def __init__(self, browser_backend, path, is_record_mode, is_append_mode, make_javascript_deterministic, webpagereplay_host, @@ -47,7 +58,8 @@ class ReplayServer(object): options.append('--record') if not make_javascript_deterministic: options.append('--inject_scripts=') - self._web_page_replay = webpagereplay.ReplayServer( + browser_backend.AddReplayServerOptions(options) + self._web_page_replay = _WebPageReplayServer( path, self._webpagereplay_host, self._webpagereplay_local_http_port, |