Index: tools/telemetry/telemetry/inspector_backend.py |
diff --git a/tools/telemetry/telemetry/inspector_backend.py b/tools/telemetry/telemetry/inspector_backend.py |
deleted file mode 100644 |
index b2ec53c993a7286a6089cffb2a630f4776b27436..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/telemetry/inspector_backend.py |
+++ /dev/null |
@@ -1,298 +0,0 @@ |
-# Copyright (c) 2012 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 json |
-import logging |
-import socket |
-import sys |
- |
-from telemetry import inspector_console |
-from telemetry import inspector_page |
-from telemetry import inspector_runtime |
-from telemetry import inspector_timeline |
-from telemetry import png_bitmap |
-from telemetry import tab_crash_exception |
-from telemetry import util |
-from telemetry import websocket |
- |
-class InspectorException(Exception): |
- pass |
- |
-class InspectorBackend(object): |
- def __init__(self, browser, browser_backend, debugger_url): |
- assert debugger_url |
- self._browser = browser |
- self._browser_backend = browser_backend |
- self._debugger_url = debugger_url |
- self._socket = None |
- self._domain_handlers = {} |
- self._cur_socket_timeout = 0 |
- self._next_request_id = 0 |
- |
- self._console = inspector_console.InspectorConsole(self) |
- self._page = inspector_page.InspectorPage(self) |
- self._runtime = inspector_runtime.InspectorRuntime(self) |
- self._timeline = inspector_timeline.InspectorTimeline(self) |
- |
- def __del__(self): |
- self.Disconnect() |
- |
- def _Connect(self): |
- if self._socket: |
- return |
- self._socket = websocket.create_connection(self._debugger_url) |
- self._cur_socket_timeout = 0 |
- self._next_request_id = 0 |
- |
- def Disconnect(self): |
- for _, handlers in self._domain_handlers.items(): |
- _, will_close_handler = handlers |
- will_close_handler() |
- self._domain_handlers = {} |
- |
- if self._socket: |
- self._socket.close() |
- self._socket = None |
- |
- # General public methods. |
- |
- @property |
- def browser(self): |
- return self._browser |
- |
- @property |
- def url(self): |
- self.Disconnect() |
- return self._browser_backend.tab_list_backend.GetTabUrl(self._debugger_url) |
- |
- def Activate(self): |
- self._Connect() |
- self._browser_backend.tab_list_backend.ActivateTab(self._debugger_url) |
- |
- def Close(self): |
- self.Disconnect() |
- self._browser_backend.tab_list_backend.CloseTab(self._debugger_url) |
- |
- # Public methods implemented in JavaScript. |
- |
- def WaitForDocumentReadyStateToBeComplete(self, timeout): |
- util.WaitFor( |
- lambda: self._runtime.Evaluate('document.readyState') == 'complete', |
- timeout) |
- |
- def WaitForDocumentReadyStateToBeInteractiveOrBetter( |
- self, timeout): |
- def IsReadyStateInteractiveOrBetter(): |
- rs = self._runtime.Evaluate('document.readyState') |
- return rs == 'complete' or rs == 'interactive' |
- util.WaitFor(IsReadyStateInteractiveOrBetter, timeout) |
- |
- @property |
- def screenshot_supported(self): |
- if self._runtime.Evaluate( |
- 'window.chrome.gpuBenchmarking === undefined'): |
- return False |
- |
- if self._runtime.Evaluate( |
- 'window.chrome.gpuBenchmarking.beginWindowSnapshotPNG === undefined'): |
- return False |
- |
- # TODO(dtu): Also check for Chrome branch number, because of a bug in |
- # beginWindowSnapshotPNG in older versions. crbug.com/171592 |
- |
- return True |
- |
- def Screenshot(self, timeout): |
- if self._runtime.Evaluate( |
- 'window.chrome.gpuBenchmarking === undefined'): |
- raise Exception("Browser was not started with --enable-gpu-benchmarking") |
- |
- if self._runtime.Evaluate( |
- 'window.chrome.gpuBenchmarking.beginWindowSnapshotPNG === undefined'): |
- raise Exception("Browser does not support window snapshot API.") |
- |
- self._runtime.Evaluate(""" |
- if(!window.__telemetry) { |
- window.__telemetry = {} |
- } |
- window.__telemetry.snapshotComplete = false; |
- window.__telemetry.snapshotData = null; |
- window.chrome.gpuBenchmarking.beginWindowSnapshotPNG( |
- function(snapshot) { |
- window.__telemetry.snapshotData = snapshot; |
- window.__telemetry.snapshotComplete = true; |
- } |
- ); |
- """) |
- |
- def IsSnapshotComplete(): |
- return self._runtime.Evaluate('window.__telemetry.snapshotComplete') |
- |
- util.WaitFor(IsSnapshotComplete, timeout) |
- |
- snap = self._runtime.Evaluate(""" |
- (function() { |
- var data = window.__telemetry.snapshotData; |
- delete window.__telemetry.snapshotComplete; |
- delete window.__telemetry.snapshotData; |
- return data; |
- })() |
- """) |
- if snap: |
- return png_bitmap.PngBitmap(snap['data']) |
- return None |
- |
- # Console public methods. |
- |
- @property |
- def message_output_stream(self): # pylint: disable=E0202 |
- return self._console.message_output_stream |
- |
- @message_output_stream.setter |
- def message_output_stream(self, stream): # pylint: disable=E0202 |
- self._console.message_output_stream = stream |
- |
- # Page public methods. |
- |
- def PerformActionAndWaitForNavigate(self, action_function, timeout): |
- self._page.PerformActionAndWaitForNavigate(action_function, timeout) |
- |
- def Navigate(self, url, timeout): |
- self._page.Navigate(url, timeout) |
- |
- def GetCookieByName(self, name, timeout): |
- return self._page.GetCookieByName(name, timeout) |
- |
- # Runtime public methods. |
- |
- def ExecuteJavaScript(self, expr, timeout): |
- self._runtime.Execute(expr, timeout) |
- |
- def EvaluateJavaScript(self, expr, timeout): |
- return self._runtime.Evaluate(expr, timeout) |
- |
- # Timeline public methods. |
- |
- @property |
- def timeline_model(self): |
- return self._timeline.timeline_model |
- |
- def StartTimelineRecording(self): |
- self._timeline.Start() |
- |
- def StopTimelineRecording(self): |
- self._timeline.Stop() |
- |
- # Methods used internally by other backends. |
- |
- def DispatchNotifications(self, timeout=10): |
- self._Connect() |
- self._SetTimeout(timeout) |
- |
- try: |
- data = self._socket.recv() |
- except (socket.error, websocket.WebSocketException): |
- if self._browser_backend.tab_list_backend.DoesDebuggerUrlExist( |
- self._debugger_url): |
- return |
- raise tab_crash_exception.TabCrashException() |
- |
- res = json.loads(data) |
- logging.debug('got [%s]', data) |
- if 'method' in res: |
- self._HandleNotification(res) |
- |
- def _HandleNotification(self, res): |
- if (res['method'] == 'Inspector.detached' and |
- res.get('params', {}).get('reason','') == 'replaced_with_devtools'): |
- self._WaitForInspectorToGoAwayAndReconnect() |
- return |
- |
- mname = res['method'] |
- dot_pos = mname.find('.') |
- domain_name = mname[:dot_pos] |
- if domain_name in self._domain_handlers: |
- try: |
- self._domain_handlers[domain_name][0](res) |
- except Exception: |
- import traceback |
- traceback.print_exc() |
- else: |
- logging.debug('Unhandled inspector message: %s', res) |
- |
- def SendAndIgnoreResponse(self, req): |
- self._Connect() |
- req['id'] = self._next_request_id |
- self._next_request_id += 1 |
- data = json.dumps(req) |
- self._socket.send(data) |
- logging.debug('sent [%s]', data) |
- |
- def _SetTimeout(self, timeout): |
- if self._cur_socket_timeout != timeout: |
- self._socket.settimeout(timeout) |
- self._cur_socket_timeout = timeout |
- |
- def _WaitForInspectorToGoAwayAndReconnect(self): |
- sys.stderr.write('The connection to Chrome was lost to the Inspector UI.\n') |
- sys.stderr.write('Telemetry is waiting for the inspector to be closed...\n') |
- self._socket.close() |
- self._socket = None |
- def IsBack(): |
- return self._browser_backend.tab_list_backend.DoesDebuggerUrlExist( |
- self._debugger_url) |
- util.WaitFor(IsBack, 512, 0.5) |
- sys.stderr.write('\n') |
- sys.stderr.write('Inspector\'s UI closed. Telemetry will now resume.\n') |
- self._Connect() |
- |
- def SyncRequest(self, req, timeout=10): |
- self._Connect() |
- # TODO(nduca): Listen to the timeout argument |
- # pylint: disable=W0613 |
- self._SetTimeout(timeout) |
- self.SendAndIgnoreResponse(req) |
- |
- while True: |
- try: |
- data = self._socket.recv() |
- except (socket.error, websocket.WebSocketException): |
- if self._browser_backend.tab_list_backend.DoesDebuggerUrlExist( |
- self._debugger_url): |
- raise util.TimeoutException( |
- 'Timed out waiting for reply. This is unusual.') |
- raise tab_crash_exception.TabCrashException() |
- |
- res = json.loads(data) |
- logging.debug('got [%s]', data) |
- if 'method' in res: |
- self._HandleNotification(res) |
- continue |
- |
- if res['id'] != req['id']: |
- logging.debug('Dropped reply: %s', json.dumps(res)) |
- continue |
- return res |
- |
- def RegisterDomain(self, |
- domain_name, notification_handler, will_close_handler): |
- """Registers a given domain for handling notification methods. |
- |
- For example, given inspector_backend: |
- def OnConsoleNotification(msg): |
- if msg['method'] == 'Console.messageAdded': |
- print msg['params']['message'] |
- return |
- def OnConsoleClose(self): |
- pass |
- inspector_backend.RegisterDomain('Console', |
- OnConsoleNotification, OnConsoleClose) |
- """ |
- assert domain_name not in self._domain_handlers |
- self._domain_handlers[domain_name] = (notification_handler, |
- will_close_handler) |
- |
- def UnregisterDomain(self, domain_name): |
- """Unregisters a previously registered domain.""" |
- assert domain_name in self._domain_handlers |
- self._domain_handlers.pop(domain_name) |