| Index: tools/telemetry/telemetry/core/backends/chrome/inspector_backend.py
|
| diff --git a/tools/telemetry/telemetry/core/backends/chrome/inspector_backend.py b/tools/telemetry/telemetry/core/backends/chrome/inspector_backend.py
|
| index 7714f0af36fe57fa1233a34dc7b0d5f53d3ad3c2..1637ac9578e2688095f457cbcc662441e2a65c90 100644
|
| --- a/tools/telemetry/telemetry/core/backends/chrome/inspector_backend.py
|
| +++ b/tools/telemetry/telemetry/core/backends/chrome/inspector_backend.py
|
| @@ -29,11 +29,12 @@
|
|
|
| class InspectorBackend(inspector_websocket.InspectorWebsocket):
|
| def __init__(self, browser_backend, context, timeout=60):
|
| - super(InspectorBackend, self).__init__(self._HandleError)
|
| - self.RegisterDomain('Inspector', self._HandleInspectorDomainNotification)
|
| + super(InspectorBackend, self).__init__(self._HandleNotification,
|
| + self._HandleError)
|
|
|
| self._browser_backend = browser_backend
|
| self._context = context
|
| + self._domain_handlers = {}
|
|
|
| logging.debug('InspectorBackend._Connect() to %s', self.debugger_url)
|
| try:
|
| @@ -57,6 +58,14 @@
|
|
|
| def __del__(self):
|
| self.Disconnect()
|
| +
|
| + def Disconnect(self):
|
| + for _, handlers in self._domain_handlers.items():
|
| + _, will_close_handler = handlers
|
| + will_close_handler()
|
| + self._domain_handlers = {}
|
| +
|
| + super(InspectorBackend, self).Disconnect()
|
|
|
| @property
|
| def browser(self):
|
| @@ -212,13 +221,25 @@
|
| contexts = self._browser_backend.ListInspectableContexts()
|
| return self._context['id'] in [c['id'] for c in contexts]
|
|
|
| - def _HandleInspectorDomainNotification(self, res):
|
| + def _HandleNotification(self, res):
|
| if (res['method'] == 'Inspector.detached' and
|
| res.get('params', {}).get('reason', '') == 'replaced_with_devtools'):
|
| self._WaitForInspectorToGoAwayAndReconnect()
|
| return
|
| if res['method'] == 'Inspector.targetCrashed':
|
| raise exceptions.TabCrashException(self.browser)
|
| +
|
| + 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.warn('Unhandled inspector message: %s', res)
|
|
|
| def _HandleError(self, elapsed_time):
|
| if self._IsInspectable():
|
| @@ -250,6 +271,29 @@
|
| sys.stderr.write('\n')
|
| sys.stderr.write('Inspector\'s UI closed. Telemetry will now resume.\n')
|
|
|
| + 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)
|
| +
|
| def CollectGarbage(self):
|
| self._page.CollectGarbage()
|
|
|
|
|