| Index: tools/telemetry/telemetry/core/backends/chrome_inspector/inspector_websocket.py
|
| diff --git a/tools/telemetry/telemetry/core/backends/chrome_inspector/inspector_websocket.py b/tools/telemetry/telemetry/core/backends/chrome_inspector/inspector_websocket.py
|
| index db12c17cc65ac03122cb310408f0e053cca72040..9e039ed32ace774bbbc3af19b87cfe48dcd0fc3f 100644
|
| --- a/tools/telemetry/telemetry/core/backends/chrome_inspector/inspector_websocket.py
|
| +++ b/tools/telemetry/telemetry/core/backends/chrome_inspector/inspector_websocket.py
|
| @@ -11,54 +11,30 @@ import time
|
| from telemetry.core.backends.chrome_inspector import websocket
|
|
|
|
|
| -class DispatchNotificationsUntilDoneTimeoutException(Exception):
|
| - """Exception that can be thrown from DispatchNotificationsUntilDone to
|
| - indicate timeout exception of the function.
|
| - """
|
| -
|
| - def __init__(self, elapsed_time):
|
| - super(DispatchNotificationsUntilDoneTimeoutException, self).__init__()
|
| - self.elapsed_time = elapsed_time
|
| -
|
| -
|
| class InspectorWebsocket(object):
|
|
|
| - def __init__(self, error_handler=None):
|
| - """Create a websocket handler for communicating with Inspectors.
|
| -
|
| - Args:
|
| - error_handler: A callback for errors in communicating with the Inspector.
|
| - Must accept a single numeric parameter indicated the time elapsed before
|
| - the error.
|
| - """
|
| + 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._error_handler = error_handler
|
| - self._all_data_received = False
|
| self._domain_handlers = {}
|
|
|
| def RegisterDomain(self, domain_name, notification_handler):
|
| """Registers a given domain for handling notification methods.
|
|
|
| - When used as handler for DispatchNotificationsUntilDone,
|
| - notification handler should return a boolean, where True indicates
|
| - that we should stop listening for more notifications.
|
| -
|
| For example, given inspector_backend:
|
| def OnConsoleNotification(msg):
|
| if msg['method'] == 'Console.messageAdded':
|
| print msg['params']['message']
|
| - return True
|
| 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 and DispatchNotificationsUntilDone).
|
| - The handler accepts a single paramater: the JSON object representing
|
| - the notification.
|
| + 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
|
| @@ -99,38 +75,6 @@ class InspectorWebsocket(object):
|
| def DispatchNotifications(self, timeout=10):
|
| self._Receive(timeout)
|
|
|
| - def DispatchNotificationsUntilDone(self, timeout):
|
| - """Dispatch notifications until notification_handler return True.
|
| -
|
| - Args:
|
| - timeout: a number that respresents the timeout in seconds.
|
| -
|
| - Raises:
|
| - DispatchNotificationsUntilDoneTimeoutException if more than |timeout| has
|
| - seconds has passed since the last time any data is received or since this
|
| - function is called, whichever happens later, to when the next attempt to
|
| - receive data fails due to some WebSocketException.
|
| - """
|
| - self._all_data_received = False
|
| - if timeout < self._cur_socket_timeout:
|
| - self._SetTimeout(timeout)
|
| - timeout_start_time = time.time()
|
| - while self._socket:
|
| - try:
|
| - if self._Receive(timeout):
|
| - timeout_start_time = time.time()
|
| - if self._all_data_received:
|
| - break
|
| - except websocket.WebSocketTimeoutException:
|
| - # TODO(chrishenry): Since we always call settimeout in
|
| - # _Receive, we should be able to rip manual logic of tracking
|
| - # elapsed time and simply throw
|
| - # DispatchNotificationsUntilDoneTimeoutException from here.
|
| - pass
|
| - elapsed_time = time.time() - timeout_start_time
|
| - if elapsed_time > timeout:
|
| - raise DispatchNotificationsUntilDoneTimeoutException(elapsed_time)
|
| -
|
| def _SetTimeout(self, timeout):
|
| if self._cur_socket_timeout != timeout:
|
| self._socket.settimeout(timeout)
|
| @@ -138,29 +82,22 @@ class InspectorWebsocket(object):
|
|
|
| def _Receive(self, timeout=10):
|
| self._SetTimeout(timeout)
|
| - start_time = time.time()
|
| - try:
|
| - if self._socket:
|
| - self._all_data_received = False
|
| - data = self._socket.recv()
|
| - 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 and self._HandleNotification(result):
|
| - self._all_data_received = True
|
| - return None
|
| - return result
|
| - except (socket.error, websocket.WebSocketException):
|
| - elapsed_time = time.time() - start_time
|
| - self._error_handler(elapsed_time)
|
| + if not self._socket:
|
| + return None
|
| + data = self._socket.recv()
|
| + 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)
|
| + return result
|
|
|
| def _HandleNotification(self, result):
|
| mname = result['method']
|
| dot_pos = mname.find('.')
|
| domain_name = mname[:dot_pos]
|
| if domain_name in self._domain_handlers:
|
| - return self._domain_handlers[domain_name](result)
|
| + self._domain_handlers[domain_name](result)
|
|
|
| logging.warn('Unhandled inspector message: %s', result)
|
| - return False
|
|
|