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

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/services/ServiceManager.js

Issue 2466123002: DevTools: reformat front-end code to match chromium style. (Closed)
Patch Set: all done Created 4 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
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 /**
5 * @unrestricted
6 */
7 WebInspector.ServiceManager = class {
8 /**
9 * @param {string} serviceName
10 * @return {!Promise<?WebInspector.ServiceManager.Service>}
11 */
12 createRemoteService(serviceName) {
13 if (!this._remoteConnection) {
14 var url = Runtime.queryParam('service-backend');
15 if (!url) {
16 console.error('No endpoint address specified');
17 return /** @type {!Promise<?WebInspector.ServiceManager.Service>} */ (Pr omise.resolve(null));
18 }
19 this._remoteConnection =
20 new WebInspector.ServiceManager.Connection(new WebInspector.ServiceMan ager.RemoteServicePort(url));
21 }
22 return this._remoteConnection._createService(serviceName);
23 }
4 24
5 /** 25 /**
6 * @constructor 26 * @param {string} appName
7 */ 27 * @param {string} serviceName
8 WebInspector.ServiceManager = function() 28 * @param {boolean} isSharedWorker
9 { 29 * @return {!Promise<?WebInspector.ServiceManager.Service>}
10 }; 30 */
31 createAppService(appName, serviceName, isSharedWorker) {
32 var url = appName + '.js';
33 var remoteBase = Runtime.queryParam('remoteBase');
34 if (remoteBase)
35 url += '?remoteBase=' + remoteBase;
11 36
12 WebInspector.ServiceManager.prototype = { 37 var worker = isSharedWorker ? new SharedWorker(url, appName) : new Worker(ur l);
13 /** 38 var connection =
14 * @param {string} serviceName 39 new WebInspector.ServiceManager.Connection(new WebInspector.ServiceManag er.WorkerServicePort(worker));
15 * @return {!Promise<?WebInspector.ServiceManager.Service>} 40 return connection._createService(serviceName);
16 */ 41 }
17 createRemoteService: function(serviceName)
18 {
19 if (!this._remoteConnection) {
20 var url = Runtime.queryParam("service-backend");
21 if (!url) {
22 console.error("No endpoint address specified");
23 return /** @type {!Promise<?WebInspector.ServiceManager.Service> } */ (Promise.resolve(null));
24 }
25 this._remoteConnection = new WebInspector.ServiceManager.Connection( new WebInspector.ServiceManager.RemoteServicePort(url));
26 }
27 return this._remoteConnection._createService(serviceName);
28 },
29
30 /**
31 * @param {string} appName
32 * @param {string} serviceName
33 * @param {boolean} isSharedWorker
34 * @return {!Promise<?WebInspector.ServiceManager.Service>}
35 */
36 createAppService: function(appName, serviceName, isSharedWorker)
37 {
38 var url = appName + ".js";
39 var remoteBase = Runtime.queryParam("remoteBase");
40 if (remoteBase)
41 url += "?remoteBase=" + remoteBase;
42
43 var worker = isSharedWorker ? new SharedWorker(url, appName) : new Worke r(url);
44 var connection = new WebInspector.ServiceManager.Connection(new WebInspe ctor.ServiceManager.WorkerServicePort(worker));
45 return connection._createService(serviceName);
46 }
47 }; 42 };
48 43
49 /** 44 /**
50 * @constructor 45 * @unrestricted
51 * @param {!ServicePort} port
52 */ 46 */
53 WebInspector.ServiceManager.Connection = function(port) 47 WebInspector.ServiceManager.Connection = class {
54 { 48 /**
49 * @param {!ServicePort} port
50 */
51 constructor(port) {
55 this._port = port; 52 this._port = port;
56 this._port.setHandlers(this._onMessage.bind(this), this._connectionClosed.bi nd(this)); 53 this._port.setHandlers(this._onMessage.bind(this), this._connectionClosed.bi nd(this));
57 54
58 this._lastId = 1; 55 this._lastId = 1;
59 /** @type {!Map<number, function(?Object)>}*/ 56 /** @type {!Map<number, function(?Object)>}*/
60 this._callbacks = new Map(); 57 this._callbacks = new Map();
61 /** @type {!Map<string, !WebInspector.ServiceManager.Service>}*/ 58 /** @type {!Map<string, !WebInspector.ServiceManager.Service>}*/
62 this._services = new Map(); 59 this._services = new Map();
60 }
61
62 /**
63 * @param {string} serviceName
64 * @return {!Promise<?WebInspector.ServiceManager.Service>}
65 */
66 _createService(serviceName) {
67 return this._sendCommand(serviceName + '.create').then(result => {
68 if (!result) {
69 console.error('Could not initialize service: ' + serviceName);
70 return null;
71 }
72 var service = new WebInspector.ServiceManager.Service(this, serviceName, r esult.id);
73 this._services.set(serviceName + ':' + result.id, service);
74 return service;
75 });
76 }
77
78 /**
79 * @param {!WebInspector.ServiceManager.Service} service
80 */
81 _serviceDisposed(service) {
82 this._services.delete(service._serviceName + ':' + service._objectId);
83 if (!this._services.size) {
84 // Terminate the connection since it is no longer used.
85 this._port.close();
86 }
87 }
88
89 /**
90 * @param {string} method
91 * @param {!Object=} params
92 * @return {!Promise<?Object>}
93 */
94 _sendCommand(method, params) {
95 var id = this._lastId++;
96 var message = JSON.stringify({id: id, method: method, params: params || {}}) ;
97 return this._port.send(message).then(success => {
98 if (!success)
99 return Promise.resolve(null);
100 return new Promise(fulfill => this._callbacks.set(id, fulfill));
101 });
102 }
103
104 /**
105 * @param {string} data
106 */
107 _onMessage(data) {
108 var object;
109 try {
110 object = JSON.parse(data);
111 } catch (e) {
112 console.error(e);
113 return;
114 }
115 if (object.id) {
116 if (object.error)
117 console.error('Service error: ' + object.error);
118 this._callbacks.get(object.id)(object.error ? null : object.result);
119 this._callbacks.delete(object.id);
120 return;
121 }
122
123 var tokens = object.method.split('.');
124 var serviceName = tokens[0];
125 var methodName = tokens[1];
126 var service = this._services.get(serviceName + ':' + object.params.id);
127 if (!service) {
128 console.error('Unable to lookup stub for ' + serviceName + ':' + object.pa rams.id);
129 return;
130 }
131 service._dispatchNotification(methodName, object.params);
132 }
133
134 _connectionClosed() {
135 for (var callback of this._callbacks.values())
136 callback(null);
137 this._callbacks.clear();
138 for (var service of this._services.values())
139 service._dispatchNotification('disposed');
140 this._services.clear();
141 }
63 }; 142 };
64 143
65 WebInspector.ServiceManager.Connection.prototype = {
66 /**
67 * @param {string} serviceName
68 * @return {!Promise<?WebInspector.ServiceManager.Service>}
69 */
70 _createService: function(serviceName)
71 {
72 return this._sendCommand(serviceName + ".create").then(result => {
73 if (!result) {
74 console.error("Could not initialize service: " + serviceName);
75 return null;
76 }
77 var service = new WebInspector.ServiceManager.Service(this, serviceN ame, result.id);
78 this._services.set(serviceName + ":" + result.id, service);
79 return service;
80 });
81 },
82
83 /**
84 * @param {!WebInspector.ServiceManager.Service} service
85 */
86 _serviceDisposed: function(service)
87 {
88 this._services.delete(service._serviceName + ":" + service._objectId);
89 if (!this._services.size) {
90 // Terminate the connection since it is no longer used.
91 this._port.close();
92 }
93 },
94
95 /**
96 * @param {string} method
97 * @param {!Object=} params
98 * @return {!Promise<?Object>}
99 */
100 _sendCommand: function(method, params)
101 {
102 var id = this._lastId++;
103 var message = JSON.stringify({id: id, method: method, params: params || {}});
104 return this._port.send(message).then(success => {
105 if (!success)
106 return Promise.resolve(null);
107 return new Promise(fulfill => this._callbacks.set(id, fulfill));
108 });
109 },
110
111 /**
112 * @param {string} data
113 */
114 _onMessage: function(data)
115 {
116 var object;
117 try {
118 object = JSON.parse(data);
119 } catch (e) {
120 console.error(e);
121 return;
122 }
123 if (object.id) {
124 if (object.error)
125 console.error("Service error: " + object.error);
126 this._callbacks.get(object.id)(object.error ? null : object.result);
127 this._callbacks.delete(object.id);
128 return;
129 }
130
131 var tokens = object.method.split(".");
132 var serviceName = tokens[0];
133 var methodName = tokens[1];
134 var service = this._services.get(serviceName + ":" + object.params.id);
135 if (!service) {
136 console.error("Unable to lookup stub for " + serviceName + ":" + obj ect.params.id);
137 return;
138 }
139 service._dispatchNotification(methodName, object.params);
140 },
141
142 _connectionClosed: function()
143 {
144 for (var callback of this._callbacks.values())
145 callback(null);
146 this._callbacks.clear();
147 for (var service of this._services.values())
148 service._dispatchNotification("disposed");
149 this._services.clear();
150 }
151 };
152
153 /** 144 /**
154 * @constructor 145 * @unrestricted
155 * @param {!WebInspector.ServiceManager.Connection} connection
156 * @param {string} serviceName
157 * @param {string} objectId
158 */ 146 */
159 WebInspector.ServiceManager.Service = function(connection, serviceName, objectId ) 147 WebInspector.ServiceManager.Service = class {
160 { 148 /**
149 * @param {!WebInspector.ServiceManager.Connection} connection
150 * @param {string} serviceName
151 * @param {string} objectId
152 */
153 constructor(connection, serviceName, objectId) {
161 this._connection = connection; 154 this._connection = connection;
162 this._serviceName = serviceName; 155 this._serviceName = serviceName;
163 this._objectId = objectId; 156 this._objectId = objectId;
164 /** @type {!Map<string, function(!Object=)>}*/ 157 /** @type {!Map<string, function(!Object=)>}*/
165 this._notificationHandlers = new Map(); 158 this._notificationHandlers = new Map();
159 }
160
161 /**
162 * @return {!Promise}
163 */
164 dispose() {
165 var params = {id: this._objectId};
166 return this._connection._sendCommand(this._serviceName + '.dispose', params) .then(() => {
167 this._connection._serviceDisposed(this);
168 });
169 }
170
171 /**
172 * @param {string} methodName
173 * @param {function(!Object=)} handler
174 */
175 on(methodName, handler) {
176 this._notificationHandlers.set(methodName, handler);
177 }
178
179 /**
180 * @param {string} methodName
181 * @param {!Object=} params
182 * @return {!Promise}
183 */
184 send(methodName, params) {
185 params = params || {};
186 params.id = this._objectId;
187 return this._connection._sendCommand(this._serviceName + '.' + methodName, p arams);
188 }
189
190 /**
191 * @param {string} methodName
192 * @param {!Object=} params
193 */
194 _dispatchNotification(methodName, params) {
195 var handler = this._notificationHandlers.get(methodName);
196 if (!handler) {
197 console.error('Could not report notification \'' + methodName + '\' on \'' + this._objectId + '\'');
198 return;
199 }
200 handler(params);
201 }
166 }; 202 };
167 203
168 WebInspector.ServiceManager.Service.prototype = { 204 /**
205 * @implements {ServicePort}
206 * @unrestricted
207 */
208 WebInspector.ServiceManager.RemoteServicePort = class {
209 /**
210 * @param {string} url
211 */
212 constructor(url) {
213 this._url = url;
214 }
215
216 /**
217 * @override
218 * @param {function(string)} messageHandler
219 * @param {function(string)} closeHandler
220 */
221 setHandlers(messageHandler, closeHandler) {
222 this._messageHandler = messageHandler;
223 this._closeHandler = closeHandler;
224 }
225
226 /**
227 * @return {!Promise<boolean>}
228 */
229 _open() {
230 if (!this._connectionPromise)
231 this._connectionPromise = new Promise(promiseBody.bind(this));
232 return this._connectionPromise;
233
169 /** 234 /**
170 * @return {!Promise} 235 * @param {function(boolean)} fulfill
236 * @this {WebInspector.ServiceManager.RemoteServicePort}
171 */ 237 */
172 dispose: function() 238 function promiseBody(fulfill) {
173 { 239 var socket;
174 var params = { id: this._objectId }; 240 try {
175 return this._connection._sendCommand(this._serviceName + ".dispose", par ams).then(() => { 241 socket = new WebSocket(/** @type {string} */ (this._url));
176 this._connection._serviceDisposed(this); 242 socket.onmessage = onMessage.bind(this);
177 }); 243 socket.onclose = this._closeHandler;
178 }, 244 socket.onopen = onConnect.bind(this);
179 245 } catch (e) {
180 /** 246 fulfill(false);
181 * @param {string} methodName 247 }
182 * @param {function(!Object=)} handler 248
183 */ 249 /**
184 on: function(methodName, handler) 250 * @this {WebInspector.ServiceManager.RemoteServicePort}
185 { 251 */
186 this._notificationHandlers.set(methodName, handler); 252 function onConnect() {
187 }, 253 this._socket = socket;
188 254 fulfill(true);
189 /** 255 }
190 * @param {string} methodName 256
191 * @param {!Object=} params 257 /**
192 * @return {!Promise} 258 * @param {!Event} event
193 */ 259 * @this {WebInspector.ServiceManager.RemoteServicePort}
194 send: function(methodName, params) 260 */
195 { 261 function onMessage(event) {
196 params = params || {}; 262 this._messageHandler(event.data);
197 params.id = this._objectId; 263 }
198 return this._connection._sendCommand(this._serviceName + "." + methodNam e, params); 264 }
199 }, 265 }
200 266
201 /** 267 /**
202 * @param {string} methodName 268 * @override
203 * @param {!Object=} params 269 * @param {string} message
204 */ 270 * @return {!Promise<boolean>}
205 _dispatchNotification: function(methodName, params) 271 */
206 { 272 send(message) {
207 var handler = this._notificationHandlers.get(methodName); 273 return this._open().then(() => {
208 if (!handler) { 274 if (this._socket) {
209 console.error("Could not report notification '" + methodName + "' on '" + this._objectId + "'"); 275 this._socket.send(message);
210 return; 276 return true;
211 } 277 }
212 handler(params); 278 return false;
213 } 279 });
280 }
281
282 /**
283 * @override
284 * @return {!Promise}
285 */
286 close() {
287 return this._open().then(() => {
288 if (this._socket) {
289 this._socket.close();
290 this._socket = null;
291 delete this._connectionPromise;
292 }
293 return true;
294 });
295 }
214 }; 296 };
215 297
216 /** 298 /**
217 * @constructor
218 * @implements {ServicePort} 299 * @implements {ServicePort}
219 * @param {string} url 300 * @unrestricted
220 */ 301 */
221 WebInspector.ServiceManager.RemoteServicePort = function(url) 302 WebInspector.ServiceManager.WorkerServicePort = class {
222 { 303 /**
223 this._url = url; 304 * @param {!Worker|!SharedWorker} worker
224 }; 305 */
225 306 constructor(worker) {
226 WebInspector.ServiceManager.RemoteServicePort.prototype = {
227 /**
228 * @override
229 * @param {function(string)} messageHandler
230 * @param {function(string)} closeHandler
231 */
232 setHandlers: function(messageHandler, closeHandler)
233 {
234 this._messageHandler = messageHandler;
235 this._closeHandler = closeHandler;
236 },
237
238 /**
239 * @return {!Promise<boolean>}
240 */
241 _open: function()
242 {
243 if (!this._connectionPromise)
244 this._connectionPromise = new Promise(promiseBody.bind(this));
245 return this._connectionPromise;
246
247 /**
248 * @param {function(boolean)} fulfill
249 * @this {WebInspector.ServiceManager.RemoteServicePort}
250 */
251 function promiseBody(fulfill)
252 {
253 var socket;
254 try {
255 socket = new WebSocket(/** @type {string} */(this._url));
256 socket.onmessage = onMessage.bind(this);
257 socket.onclose = this._closeHandler;
258 socket.onopen = onConnect.bind(this);
259 } catch (e) {
260 fulfill(false);
261 }
262
263 /**
264 * @this {WebInspector.ServiceManager.RemoteServicePort}
265 */
266 function onConnect()
267 {
268 this._socket = socket;
269 fulfill(true);
270 }
271
272 /**
273 * @param {!Event} event
274 * @this {WebInspector.ServiceManager.RemoteServicePort}
275 */
276 function onMessage(event)
277 {
278 this._messageHandler(event.data);
279 }
280 }
281 },
282
283 /**
284 * @override
285 * @param {string} message
286 * @return {!Promise<boolean>}
287 */
288 send: function(message)
289 {
290 return this._open().then(() => {
291 if (this._socket) {
292 this._socket.send(message);
293 return true;
294 }
295 return false;
296 });
297 },
298
299 /**
300 * @override
301 * @return {!Promise}
302 */
303 close: function()
304 {
305 return this._open().then(() => {
306 if (this._socket) {
307 this._socket.close();
308 this._socket = null;
309 delete this._connectionPromise;
310 }
311 return true;
312 });
313 },
314 };
315
316 /**
317 * @constructor
318 * @implements {ServicePort}
319 * @param {!Worker|!SharedWorker} worker
320 */
321 WebInspector.ServiceManager.WorkerServicePort = function(worker)
322 {
323 this._worker = worker; 307 this._worker = worker;
324 308
325 var fulfill; 309 var fulfill;
326 this._workerPromise = new Promise(resolve => fulfill = resolve); 310 this._workerPromise = new Promise(resolve => fulfill = resolve);
327 this._isSharedWorker = worker instanceof SharedWorker; 311 this._isSharedWorker = worker instanceof SharedWorker;
328 312
329 if (this._isSharedWorker) { 313 if (this._isSharedWorker) {
330 this._worker.port.onmessage = onMessage.bind(this); 314 this._worker.port.onmessage = onMessage.bind(this);
331 this._worker.port.onclose = this._closeHandler; 315 this._worker.port.onclose = this._closeHandler;
332 } else { 316 } else {
333 this._worker.onmessage = onMessage.bind(this); 317 this._worker.onmessage = onMessage.bind(this);
334 this._worker.onclose = this._closeHandler; 318 this._worker.onclose = this._closeHandler;
335 } 319 }
336 320
337 /** 321 /**
338 * @param {!Event} event 322 * @param {!Event} event
339 * @this {WebInspector.ServiceManager.WorkerServicePort} 323 * @this {WebInspector.ServiceManager.WorkerServicePort}
340 */ 324 */
341 function onMessage(event) 325 function onMessage(event) {
342 { 326 if (event.data === 'workerReady') {
343 if (event.data === "workerReady") { 327 fulfill(true);
344 fulfill(true); 328 return;
345 return; 329 }
346 } 330 this._messageHandler(event.data);
347 this._messageHandler(event.data);
348 } 331 }
349 }; 332 }
350 333
351 WebInspector.ServiceManager.WorkerServicePort.prototype = { 334 /**
352 /** 335 * @override
353 * @override 336 * @param {function(string)} messageHandler
354 * @param {function(string)} messageHandler 337 * @param {function(string)} closeHandler
355 * @param {function(string)} closeHandler 338 */
356 */ 339 setHandlers(messageHandler, closeHandler) {
357 setHandlers: function(messageHandler, closeHandler) 340 this._messageHandler = messageHandler;
358 { 341 this._closeHandler = closeHandler;
359 this._messageHandler = messageHandler; 342 }
360 this._closeHandler = closeHandler;
361 },
362 343
363 /** 344 /**
364 * @override 345 * @override
365 * @param {string} message 346 * @param {string} message
366 * @return {!Promise<boolean>} 347 * @return {!Promise<boolean>}
367 */ 348 */
368 send: function(message) 349 send(message) {
369 { 350 return this._workerPromise.then(() => {
370 return this._workerPromise.then(() => { 351 try {
371 try { 352 if (this._isSharedWorker)
372 if (this._isSharedWorker) 353 this._worker.port.postMessage(message);
373 this._worker.port.postMessage(message); 354 else
374 else 355 this._worker.postMessage(message);
375 this._worker.postMessage(message); 356 return true;
376 return true; 357 } catch (e) {
377 } catch (e) { 358 return false;
378 return false; 359 }
379 } 360 });
380 }); 361 }
381 },
382 362
383 /** 363 /**
384 * @override 364 * @override
385 * @return {!Promise} 365 * @return {!Promise}
386 */ 366 */
387 close: function() 367 close() {
388 { 368 return this._workerPromise.then(() => {
389 return this._workerPromise.then(() => { 369 if (this._worker)
390 if (this._worker) 370 this._worker.terminate();
391 this._worker.terminate(); 371 return false;
392 return false; 372 });
393 }); 373 }
394 }
395 }; 374 };
396 375
397 WebInspector.serviceManager = new WebInspector.ServiceManager(); 376 WebInspector.serviceManager = new WebInspector.ServiceManager();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698