Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(433)

Side by Side Diff: tools/chrome_remote_control/chrome_remote_control/inspector_backend.py

Issue 11361165: [chrome_remote_control] Rename chrome_remote_control to telemetry. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4 import json
5 import logging
6 import socket
7
8 from chrome_remote_control import tab_crash_exception
9 from chrome_remote_control import util
10 from chrome_remote_control import websocket
11
12 class InspectorException(Exception):
13 pass
14
15 class InspectorBackend(object):
16 def __init__(self, backend, descriptor):
17 self._backend = backend
18 self._descriptor = descriptor
19 self._socket_url = descriptor['webSocketDebuggerUrl']
20 self._socket = websocket.create_connection(
21 descriptor['webSocketDebuggerUrl'])
22 self._next_request_id = 0
23 self._domain_handlers = {}
24 self._cur_socket_timeout = 0
25
26 def Close(self):
27 for _, handlers in self._domain_handlers.items():
28 _, will_close_handler = handlers
29 will_close_handler()
30 self._domain_handlers = {}
31 self._socket.close()
32 self._socket = None
33 self._backend = None
34
35 def DispatchNotifications(self, timeout=10):
36 self._SetTimeout(timeout)
37 try:
38 data = self._socket.recv()
39 except socket.error:
40 if self._backend.DoesDebuggerUrlExist(self._socket_url):
41 return
42 raise tab_crash_exception.TabCrashException()
43
44 res = json.loads(data)
45 logging.debug('got [%s]', data)
46 if 'method' not in res:
47 return
48
49 mname = res['method']
50 dot_pos = mname.find('.')
51 domain_name = mname[:dot_pos]
52 if domain_name in self._domain_handlers:
53 try:
54 self._domain_handlers[domain_name][0](res)
55 except Exception:
56 import traceback
57 traceback.print_exc()
58
59 def SendAndIgnoreResponse(self, req):
60 req['id'] = self._next_request_id
61 self._next_request_id += 1
62 data = json.dumps(req)
63 self._socket.send(data)
64 logging.debug('sent [%s]', data)
65
66 def _SetTimeout(self, timeout):
67 if self._cur_socket_timeout != timeout:
68 self._socket.settimeout(timeout)
69 self._cur_socket_timeout = timeout
70
71 def SyncRequest(self, req, timeout=10):
72 # TODO(nduca): Listen to the timeout argument
73 # pylint: disable=W0613
74 self._SetTimeout(timeout)
75 self.SendAndIgnoreResponse(req)
76
77 while True:
78 try:
79 data = self._socket.recv()
80 except socket.error:
81 if self._backend.DoesDebuggerUrlExist(self._socket_url):
82 raise util.TimeoutException(
83 "TimedOut waiting for reply. This is unusual.")
84 raise tab_crash_exception.TabCrashException()
85
86 res = json.loads(data)
87 logging.debug('got [%s]', data)
88 if 'method' in res:
89 mname = res['method']
90 dot_pos = mname.find('.')
91 domain_name = mname[:dot_pos]
92 if domain_name in self._domain_handlers:
93 try:
94 self._domain_handlers[domain_name][0](res)
95 except Exception:
96 import traceback
97 traceback.print_exc()
98 else:
99 logging.debug('Unhandled inspector mesage: %s', data)
100 continue
101
102 if res['id'] != req['id']:
103 logging.debug('Dropped reply: %s', json.dumps(res))
104 continue
105 return res
106
107 def RegisterDomain(self,
108 domain_name, notification_handler, will_close_handler):
109 """Registers a given domain for handling notification methods.
110
111 For example, given inspector_backend:
112 def OnConsoleNotification(msg):
113 if msg['method'] == 'Console.messageAdded':
114 print msg['params']['message']
115 return
116 def OnConsoleClose(self):
117 pass
118 inspector_backend.RegisterDomain('Console',
119 OnConsoleNotification, OnConsoleClose)
120 """
121 assert domain_name not in self._domain_handlers
122 self._domain_handlers[domain_name] = (notification_handler,
123 will_close_handler)
124
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698