Index: tools/telemetry/telemetry/internal/backends/chrome_inspector/inspector_websocket.py |
diff --git a/tools/telemetry/telemetry/internal/backends/chrome_inspector/inspector_websocket.py b/tools/telemetry/telemetry/internal/backends/chrome_inspector/inspector_websocket.py |
deleted file mode 100644 |
index 03237e622339f3908d7effc55fb0aaaef2932b1d..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/telemetry/internal/backends/chrome_inspector/inspector_websocket.py |
+++ /dev/null |
@@ -1,184 +0,0 @@ |
-# 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. |
- |
-import errno |
-import json |
-import logging |
-import socket |
-import time |
- |
-from telemetry.core import exceptions |
-from telemetry.internal.backends.chrome_inspector import websocket |
- |
-class WebSocketDisconnected(exceptions.Error): |
- """An attempt was made to use a web socket after it had been disconnected.""" |
- pass |
- |
- |
-class InspectorWebsocket(object): |
- |
- # See http://www.jsonrpc.org/specification#error_object. |
- METHOD_NOT_FOUND_CODE = -32601 |
- |
- def __init__(self): |
- """Create a websocket handler for communicating with Inspectors.""" |
- self._socket = None |
- self._cur_socket_timeout = 0 |
- self._next_request_id = 0 |
- self._domain_handlers = {} |
- self._pending_callbacks = dict() |
- |
- def RegisterDomain(self, domain_name, notification_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'] |
- inspector_backend.RegisterDomain('Console', OnConsoleNotification) |
- |
- Args: |
- domain_name: The devtools domain name. E.g., 'Tracing', 'Memory', 'Page'. |
- notification_handler: Handler for devtools notification. Will be |
- called if a devtools notification with matching domain is received |
- via DispatchNotifications. The handler accepts a single paramater: |
- the JSON object representing the notification. |
- """ |
- assert domain_name not in self._domain_handlers |
- self._domain_handlers[domain_name] = notification_handler |
- |
- def UnregisterDomain(self, domain_name): |
- """Unregisters a previously registered domain.""" |
- assert domain_name in self._domain_handlers |
- del self._domain_handlers[domain_name] |
- |
- def Connect(self, url, timeout=10): |
- """Connects the websocket. |
- |
- Raises: |
- websocket.WebSocketException |
- socket.error |
- """ |
- assert not self._socket |
- self._socket = websocket.create_connection(url, timeout=timeout) |
- self._cur_socket_timeout = 0 |
- self._next_request_id = 0 |
- |
- def Disconnect(self): |
- """Disconnects the inspector websocket. |
- |
- Raises: |
- websocket.WebSocketException |
- socket.error |
- """ |
- if self._socket: |
- self._socket.close() |
- self._socket = None |
- |
- def SendAndIgnoreResponse(self, req): |
- """Sends a request without waiting for a response. |
- |
- Raises: |
- websocket.WebSocketException: Error from websocket library. |
- socket.error: Error from websocket library. |
- exceptions.WebSocketDisconnected: The socket was disconnected. |
- """ |
- self._SendRequest(req) |
- |
- def _SendRequest(self, req): |
- if not self._socket: |
- raise WebSocketDisconnected() |
- req['id'] = self._next_request_id |
- self._next_request_id += 1 |
- data = json.dumps(req) |
- self._socket.send(data) |
- if logging.getLogger().isEnabledFor(logging.DEBUG): |
- logging.debug('sent [%s]', json.dumps(req, indent=2, sort_keys=True)) |
- |
- def SyncRequest(self, req, timeout=10): |
- """Sends a request and waits for a response. |
- |
- Raises: |
- websocket.WebSocketException: Error from websocket library. |
- socket.error: Error from websocket library. |
- exceptions.WebSocketDisconnected: The socket was disconnected. |
- """ |
- self._SendRequest(req) |
- |
- while True: |
- res = self._Receive(timeout) |
- if 'id' in res and res['id'] == req['id']: |
- return res |
- |
- def AsyncRequest(self, req, callback): |
- """Sends an async request and returns immediately. |
- |
- Response will be handled in the |callback| later when DispatchNotifications |
- is invoked. |
- |
- Args: |
- callback: a function that takes inspector's response as the argument. |
- """ |
- self._SendRequest(req) |
- self._pending_callbacks[req['id']] = callback |
- |
- def DispatchNotifications(self, timeout=10): |
- """Waits for responses from the websocket, dispatching them as necessary. |
- |
- Raises: |
- websocket.WebSocketException: Error from websocket library. |
- socket.error: Error from websocket library. |
- exceptions.WebSocketDisconnected: The socket was disconnected. |
- """ |
- self._Receive(timeout) |
- |
- def _SetTimeout(self, timeout): |
- if self._cur_socket_timeout != timeout: |
- self._socket.settimeout(timeout) |
- self._cur_socket_timeout = timeout |
- |
- def _Receive(self, timeout=10): |
- if not self._socket: |
- raise WebSocketDisconnected() |
- |
- self._SetTimeout(timeout) |
- |
- while True: |
- try: |
- data = self._socket.recv() |
- except socket.error, e: |
- if e.errno == errno.EAGAIN: |
- # Resource is temporarily unavailable. Try again. |
- # See https://code.google.com/p/chromium/issues/detail?id=545853#c3 |
- # for more details. |
- time.sleep(0.1) |
- else: |
- raise |
- else: |
- break |
- |
- result = json.loads(data) |
- if logging.getLogger().isEnabledFor(logging.DEBUG): |
- logging.debug( |
- 'got [%s]', json.dumps(result, indent=2, sort_keys=True)) |
- if 'method' in result: |
- self._HandleNotification(result) |
- elif 'id' in result: |
- self._HandleAsyncResponse(result) |
- return result |
- |
- def _HandleNotification(self, result): |
- mname = result['method'] |
- dot_pos = mname.find('.') |
- domain_name = mname[:dot_pos] |
- if not domain_name in self._domain_handlers: |
- logging.warn('Unhandled inspector message: %s', result) |
- return |
- |
- self._domain_handlers[domain_name](result) |
- |
- def _HandleAsyncResponse(self, result): |
- callback = self._pending_callbacks.pop(result['id'], None) |
- if callback: |
- callback(result) |