| Index: third_party/WebKit/Source/devtools/front_end/services/ServiceManager.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/services/ServiceManager.js b/third_party/WebKit/Source/devtools/front_end/services/ServiceManager.js
|
| index 6ca03f052ae4b13b2e4cfb59d4438a4fecc7a0df..0439d4fb207c5c541d47937ac92e817a5f535248 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/services/ServiceManager.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/services/ServiceManager.js
|
| @@ -1,57 +1,54 @@
|
| // Copyright 2016 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.
|
| -
|
| /**
|
| - * @constructor
|
| + * @unrestricted
|
| */
|
| -WebInspector.ServiceManager = function()
|
| -{
|
| -};
|
| -
|
| -WebInspector.ServiceManager.prototype = {
|
| - /**
|
| - * @param {string} serviceName
|
| - * @return {!Promise<?WebInspector.ServiceManager.Service>}
|
| - */
|
| - createRemoteService: function(serviceName)
|
| - {
|
| - if (!this._remoteConnection) {
|
| - var url = Runtime.queryParam("service-backend");
|
| - if (!url) {
|
| - console.error("No endpoint address specified");
|
| - return /** @type {!Promise<?WebInspector.ServiceManager.Service>} */ (Promise.resolve(null));
|
| - }
|
| - this._remoteConnection = new WebInspector.ServiceManager.Connection(new WebInspector.ServiceManager.RemoteServicePort(url));
|
| - }
|
| - return this._remoteConnection._createService(serviceName);
|
| - },
|
| -
|
| - /**
|
| - * @param {string} appName
|
| - * @param {string} serviceName
|
| - * @param {boolean} isSharedWorker
|
| - * @return {!Promise<?WebInspector.ServiceManager.Service>}
|
| - */
|
| - createAppService: function(appName, serviceName, isSharedWorker)
|
| - {
|
| - var url = appName + ".js";
|
| - var remoteBase = Runtime.queryParam("remoteBase");
|
| - if (remoteBase)
|
| - url += "?remoteBase=" + remoteBase;
|
| -
|
| - var worker = isSharedWorker ? new SharedWorker(url, appName) : new Worker(url);
|
| - var connection = new WebInspector.ServiceManager.Connection(new WebInspector.ServiceManager.WorkerServicePort(worker));
|
| - return connection._createService(serviceName);
|
| +WebInspector.ServiceManager = class {
|
| + /**
|
| + * @param {string} serviceName
|
| + * @return {!Promise<?WebInspector.ServiceManager.Service>}
|
| + */
|
| + createRemoteService(serviceName) {
|
| + if (!this._remoteConnection) {
|
| + var url = Runtime.queryParam('service-backend');
|
| + if (!url) {
|
| + console.error('No endpoint address specified');
|
| + return /** @type {!Promise<?WebInspector.ServiceManager.Service>} */ (Promise.resolve(null));
|
| + }
|
| + this._remoteConnection =
|
| + new WebInspector.ServiceManager.Connection(new WebInspector.ServiceManager.RemoteServicePort(url));
|
| }
|
| + return this._remoteConnection._createService(serviceName);
|
| + }
|
| +
|
| + /**
|
| + * @param {string} appName
|
| + * @param {string} serviceName
|
| + * @param {boolean} isSharedWorker
|
| + * @return {!Promise<?WebInspector.ServiceManager.Service>}
|
| + */
|
| + createAppService(appName, serviceName, isSharedWorker) {
|
| + var url = appName + '.js';
|
| + var remoteBase = Runtime.queryParam('remoteBase');
|
| + if (remoteBase)
|
| + url += '?remoteBase=' + remoteBase;
|
| +
|
| + var worker = isSharedWorker ? new SharedWorker(url, appName) : new Worker(url);
|
| + var connection =
|
| + new WebInspector.ServiceManager.Connection(new WebInspector.ServiceManager.WorkerServicePort(worker));
|
| + return connection._createService(serviceName);
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @param {!ServicePort} port
|
| + * @unrestricted
|
| */
|
| -WebInspector.ServiceManager.Connection = function(port)
|
| -{
|
| +WebInspector.ServiceManager.Connection = class {
|
| + /**
|
| + * @param {!ServicePort} port
|
| + */
|
| + constructor(port) {
|
| this._port = port;
|
| this._port.setHandlers(this._onMessage.bind(this), this._connectionClosed.bind(this));
|
|
|
| @@ -60,266 +57,253 @@ WebInspector.ServiceManager.Connection = function(port)
|
| this._callbacks = new Map();
|
| /** @type {!Map<string, !WebInspector.ServiceManager.Service>}*/
|
| this._services = new Map();
|
| -};
|
| -
|
| -WebInspector.ServiceManager.Connection.prototype = {
|
| - /**
|
| - * @param {string} serviceName
|
| - * @return {!Promise<?WebInspector.ServiceManager.Service>}
|
| - */
|
| - _createService: function(serviceName)
|
| - {
|
| - return this._sendCommand(serviceName + ".create").then(result => {
|
| - if (!result) {
|
| - console.error("Could not initialize service: " + serviceName);
|
| - return null;
|
| - }
|
| - var service = new WebInspector.ServiceManager.Service(this, serviceName, result.id);
|
| - this._services.set(serviceName + ":" + result.id, service);
|
| - return service;
|
| - });
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.ServiceManager.Service} service
|
| - */
|
| - _serviceDisposed: function(service)
|
| - {
|
| - this._services.delete(service._serviceName + ":" + service._objectId);
|
| - if (!this._services.size) {
|
| - // Terminate the connection since it is no longer used.
|
| - this._port.close();
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {string} method
|
| - * @param {!Object=} params
|
| - * @return {!Promise<?Object>}
|
| - */
|
| - _sendCommand: function(method, params)
|
| - {
|
| - var id = this._lastId++;
|
| - var message = JSON.stringify({id: id, method: method, params: params || {}});
|
| - return this._port.send(message).then(success => {
|
| - if (!success)
|
| - return Promise.resolve(null);
|
| - return new Promise(fulfill => this._callbacks.set(id, fulfill));
|
| - });
|
| - },
|
| -
|
| - /**
|
| - * @param {string} data
|
| - */
|
| - _onMessage: function(data)
|
| - {
|
| - var object;
|
| - try {
|
| - object = JSON.parse(data);
|
| - } catch (e) {
|
| - console.error(e);
|
| - return;
|
| - }
|
| - if (object.id) {
|
| - if (object.error)
|
| - console.error("Service error: " + object.error);
|
| - this._callbacks.get(object.id)(object.error ? null : object.result);
|
| - this._callbacks.delete(object.id);
|
| - return;
|
| - }
|
| -
|
| - var tokens = object.method.split(".");
|
| - var serviceName = tokens[0];
|
| - var methodName = tokens[1];
|
| - var service = this._services.get(serviceName + ":" + object.params.id);
|
| - if (!service) {
|
| - console.error("Unable to lookup stub for " + serviceName + ":" + object.params.id);
|
| - return;
|
| - }
|
| - service._dispatchNotification(methodName, object.params);
|
| - },
|
| + }
|
| +
|
| + /**
|
| + * @param {string} serviceName
|
| + * @return {!Promise<?WebInspector.ServiceManager.Service>}
|
| + */
|
| + _createService(serviceName) {
|
| + return this._sendCommand(serviceName + '.create').then(result => {
|
| + if (!result) {
|
| + console.error('Could not initialize service: ' + serviceName);
|
| + return null;
|
| + }
|
| + var service = new WebInspector.ServiceManager.Service(this, serviceName, result.id);
|
| + this._services.set(serviceName + ':' + result.id, service);
|
| + return service;
|
| + });
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.ServiceManager.Service} service
|
| + */
|
| + _serviceDisposed(service) {
|
| + this._services.delete(service._serviceName + ':' + service._objectId);
|
| + if (!this._services.size) {
|
| + // Terminate the connection since it is no longer used.
|
| + this._port.close();
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {string} method
|
| + * @param {!Object=} params
|
| + * @return {!Promise<?Object>}
|
| + */
|
| + _sendCommand(method, params) {
|
| + var id = this._lastId++;
|
| + var message = JSON.stringify({id: id, method: method, params: params || {}});
|
| + return this._port.send(message).then(success => {
|
| + if (!success)
|
| + return Promise.resolve(null);
|
| + return new Promise(fulfill => this._callbacks.set(id, fulfill));
|
| + });
|
| + }
|
| +
|
| + /**
|
| + * @param {string} data
|
| + */
|
| + _onMessage(data) {
|
| + var object;
|
| + try {
|
| + object = JSON.parse(data);
|
| + } catch (e) {
|
| + console.error(e);
|
| + return;
|
| + }
|
| + if (object.id) {
|
| + if (object.error)
|
| + console.error('Service error: ' + object.error);
|
| + this._callbacks.get(object.id)(object.error ? null : object.result);
|
| + this._callbacks.delete(object.id);
|
| + return;
|
| + }
|
|
|
| - _connectionClosed: function()
|
| - {
|
| - for (var callback of this._callbacks.values())
|
| - callback(null);
|
| - this._callbacks.clear();
|
| - for (var service of this._services.values())
|
| - service._dispatchNotification("disposed");
|
| - this._services.clear();
|
| + var tokens = object.method.split('.');
|
| + var serviceName = tokens[0];
|
| + var methodName = tokens[1];
|
| + var service = this._services.get(serviceName + ':' + object.params.id);
|
| + if (!service) {
|
| + console.error('Unable to lookup stub for ' + serviceName + ':' + object.params.id);
|
| + return;
|
| }
|
| + service._dispatchNotification(methodName, object.params);
|
| + }
|
| +
|
| + _connectionClosed() {
|
| + for (var callback of this._callbacks.values())
|
| + callback(null);
|
| + this._callbacks.clear();
|
| + for (var service of this._services.values())
|
| + service._dispatchNotification('disposed');
|
| + this._services.clear();
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @param {!WebInspector.ServiceManager.Connection} connection
|
| - * @param {string} serviceName
|
| - * @param {string} objectId
|
| + * @unrestricted
|
| */
|
| -WebInspector.ServiceManager.Service = function(connection, serviceName, objectId)
|
| -{
|
| +WebInspector.ServiceManager.Service = class {
|
| + /**
|
| + * @param {!WebInspector.ServiceManager.Connection} connection
|
| + * @param {string} serviceName
|
| + * @param {string} objectId
|
| + */
|
| + constructor(connection, serviceName, objectId) {
|
| this._connection = connection;
|
| this._serviceName = serviceName;
|
| this._objectId = objectId;
|
| /** @type {!Map<string, function(!Object=)>}*/
|
| this._notificationHandlers = new Map();
|
| -};
|
| -
|
| -WebInspector.ServiceManager.Service.prototype = {
|
| - /**
|
| - * @return {!Promise}
|
| - */
|
| - dispose: function()
|
| - {
|
| - var params = { id: this._objectId };
|
| - return this._connection._sendCommand(this._serviceName + ".dispose", params).then(() => {
|
| - this._connection._serviceDisposed(this);
|
| - });
|
| - },
|
| -
|
| - /**
|
| - * @param {string} methodName
|
| - * @param {function(!Object=)} handler
|
| - */
|
| - on: function(methodName, handler)
|
| - {
|
| - this._notificationHandlers.set(methodName, handler);
|
| - },
|
| -
|
| - /**
|
| - * @param {string} methodName
|
| - * @param {!Object=} params
|
| - * @return {!Promise}
|
| - */
|
| - send: function(methodName, params)
|
| - {
|
| - params = params || {};
|
| - params.id = this._objectId;
|
| - return this._connection._sendCommand(this._serviceName + "." + methodName, params);
|
| - },
|
| -
|
| - /**
|
| - * @param {string} methodName
|
| - * @param {!Object=} params
|
| - */
|
| - _dispatchNotification: function(methodName, params)
|
| - {
|
| - var handler = this._notificationHandlers.get(methodName);
|
| - if (!handler) {
|
| - console.error("Could not report notification '" + methodName + "' on '" + this._objectId + "'");
|
| - return;
|
| - }
|
| - handler(params);
|
| + }
|
| +
|
| + /**
|
| + * @return {!Promise}
|
| + */
|
| + dispose() {
|
| + var params = {id: this._objectId};
|
| + return this._connection._sendCommand(this._serviceName + '.dispose', params).then(() => {
|
| + this._connection._serviceDisposed(this);
|
| + });
|
| + }
|
| +
|
| + /**
|
| + * @param {string} methodName
|
| + * @param {function(!Object=)} handler
|
| + */
|
| + on(methodName, handler) {
|
| + this._notificationHandlers.set(methodName, handler);
|
| + }
|
| +
|
| + /**
|
| + * @param {string} methodName
|
| + * @param {!Object=} params
|
| + * @return {!Promise}
|
| + */
|
| + send(methodName, params) {
|
| + params = params || {};
|
| + params.id = this._objectId;
|
| + return this._connection._sendCommand(this._serviceName + '.' + methodName, params);
|
| + }
|
| +
|
| + /**
|
| + * @param {string} methodName
|
| + * @param {!Object=} params
|
| + */
|
| + _dispatchNotification(methodName, params) {
|
| + var handler = this._notificationHandlers.get(methodName);
|
| + if (!handler) {
|
| + console.error('Could not report notification \'' + methodName + '\' on \'' + this._objectId + '\'');
|
| + return;
|
| }
|
| + handler(params);
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| * @implements {ServicePort}
|
| - * @param {string} url
|
| + * @unrestricted
|
| */
|
| -WebInspector.ServiceManager.RemoteServicePort = function(url)
|
| -{
|
| +WebInspector.ServiceManager.RemoteServicePort = class {
|
| + /**
|
| + * @param {string} url
|
| + */
|
| + constructor(url) {
|
| this._url = url;
|
| -};
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {function(string)} messageHandler
|
| + * @param {function(string)} closeHandler
|
| + */
|
| + setHandlers(messageHandler, closeHandler) {
|
| + this._messageHandler = messageHandler;
|
| + this._closeHandler = closeHandler;
|
| + }
|
| +
|
| + /**
|
| + * @return {!Promise<boolean>}
|
| + */
|
| + _open() {
|
| + if (!this._connectionPromise)
|
| + this._connectionPromise = new Promise(promiseBody.bind(this));
|
| + return this._connectionPromise;
|
|
|
| -WebInspector.ServiceManager.RemoteServicePort.prototype = {
|
| /**
|
| - * @override
|
| - * @param {function(string)} messageHandler
|
| - * @param {function(string)} closeHandler
|
| + * @param {function(boolean)} fulfill
|
| + * @this {WebInspector.ServiceManager.RemoteServicePort}
|
| */
|
| - setHandlers: function(messageHandler, closeHandler)
|
| - {
|
| - this._messageHandler = messageHandler;
|
| - this._closeHandler = closeHandler;
|
| - },
|
| -
|
| - /**
|
| - * @return {!Promise<boolean>}
|
| - */
|
| - _open: function()
|
| - {
|
| - if (!this._connectionPromise)
|
| - this._connectionPromise = new Promise(promiseBody.bind(this));
|
| - return this._connectionPromise;
|
| -
|
| - /**
|
| - * @param {function(boolean)} fulfill
|
| - * @this {WebInspector.ServiceManager.RemoteServicePort}
|
| - */
|
| - function promiseBody(fulfill)
|
| - {
|
| - var socket;
|
| - try {
|
| - socket = new WebSocket(/** @type {string} */(this._url));
|
| - socket.onmessage = onMessage.bind(this);
|
| - socket.onclose = this._closeHandler;
|
| - socket.onopen = onConnect.bind(this);
|
| - } catch (e) {
|
| - fulfill(false);
|
| - }
|
| -
|
| - /**
|
| - * @this {WebInspector.ServiceManager.RemoteServicePort}
|
| - */
|
| - function onConnect()
|
| - {
|
| - this._socket = socket;
|
| - fulfill(true);
|
| - }
|
| -
|
| - /**
|
| - * @param {!Event} event
|
| - * @this {WebInspector.ServiceManager.RemoteServicePort}
|
| - */
|
| - function onMessage(event)
|
| - {
|
| - this._messageHandler(event.data);
|
| - }
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {string} message
|
| - * @return {!Promise<boolean>}
|
| - */
|
| - send: function(message)
|
| - {
|
| - return this._open().then(() => {
|
| - if (this._socket) {
|
| - this._socket.send(message);
|
| - return true;
|
| - }
|
| - return false;
|
| - });
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!Promise}
|
| - */
|
| - close: function()
|
| - {
|
| - return this._open().then(() => {
|
| - if (this._socket) {
|
| - this._socket.close();
|
| - this._socket = null;
|
| - delete this._connectionPromise;
|
| - }
|
| - return true;
|
| - });
|
| - },
|
| + function promiseBody(fulfill) {
|
| + var socket;
|
| + try {
|
| + socket = new WebSocket(/** @type {string} */ (this._url));
|
| + socket.onmessage = onMessage.bind(this);
|
| + socket.onclose = this._closeHandler;
|
| + socket.onopen = onConnect.bind(this);
|
| + } catch (e) {
|
| + fulfill(false);
|
| + }
|
| +
|
| + /**
|
| + * @this {WebInspector.ServiceManager.RemoteServicePort}
|
| + */
|
| + function onConnect() {
|
| + this._socket = socket;
|
| + fulfill(true);
|
| + }
|
| +
|
| + /**
|
| + * @param {!Event} event
|
| + * @this {WebInspector.ServiceManager.RemoteServicePort}
|
| + */
|
| + function onMessage(event) {
|
| + this._messageHandler(event.data);
|
| + }
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {string} message
|
| + * @return {!Promise<boolean>}
|
| + */
|
| + send(message) {
|
| + return this._open().then(() => {
|
| + if (this._socket) {
|
| + this._socket.send(message);
|
| + return true;
|
| + }
|
| + return false;
|
| + });
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!Promise}
|
| + */
|
| + close() {
|
| + return this._open().then(() => {
|
| + if (this._socket) {
|
| + this._socket.close();
|
| + this._socket = null;
|
| + delete this._connectionPromise;
|
| + }
|
| + return true;
|
| + });
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| * @implements {ServicePort}
|
| - * @param {!Worker|!SharedWorker} worker
|
| + * @unrestricted
|
| */
|
| -WebInspector.ServiceManager.WorkerServicePort = function(worker)
|
| -{
|
| +WebInspector.ServiceManager.WorkerServicePort = class {
|
| + /**
|
| + * @param {!Worker|!SharedWorker} worker
|
| + */
|
| + constructor(worker) {
|
| this._worker = worker;
|
|
|
| var fulfill;
|
| @@ -327,71 +311,66 @@ WebInspector.ServiceManager.WorkerServicePort = function(worker)
|
| this._isSharedWorker = worker instanceof SharedWorker;
|
|
|
| if (this._isSharedWorker) {
|
| - this._worker.port.onmessage = onMessage.bind(this);
|
| - this._worker.port.onclose = this._closeHandler;
|
| + this._worker.port.onmessage = onMessage.bind(this);
|
| + this._worker.port.onclose = this._closeHandler;
|
| } else {
|
| - this._worker.onmessage = onMessage.bind(this);
|
| - this._worker.onclose = this._closeHandler;
|
| + this._worker.onmessage = onMessage.bind(this);
|
| + this._worker.onclose = this._closeHandler;
|
| }
|
|
|
| /**
|
| * @param {!Event} event
|
| * @this {WebInspector.ServiceManager.WorkerServicePort}
|
| */
|
| - function onMessage(event)
|
| - {
|
| - if (event.data === "workerReady") {
|
| - fulfill(true);
|
| - return;
|
| - }
|
| - this._messageHandler(event.data);
|
| - }
|
| -};
|
| -
|
| -WebInspector.ServiceManager.WorkerServicePort.prototype = {
|
| - /**
|
| - * @override
|
| - * @param {function(string)} messageHandler
|
| - * @param {function(string)} closeHandler
|
| - */
|
| - setHandlers: function(messageHandler, closeHandler)
|
| - {
|
| - this._messageHandler = messageHandler;
|
| - this._closeHandler = closeHandler;
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @param {string} message
|
| - * @return {!Promise<boolean>}
|
| - */
|
| - send: function(message)
|
| - {
|
| - return this._workerPromise.then(() => {
|
| - try {
|
| - if (this._isSharedWorker)
|
| - this._worker.port.postMessage(message);
|
| - else
|
| - this._worker.postMessage(message);
|
| - return true;
|
| - } catch (e) {
|
| - return false;
|
| - }
|
| - });
|
| - },
|
| -
|
| - /**
|
| - * @override
|
| - * @return {!Promise}
|
| - */
|
| - close: function()
|
| - {
|
| - return this._workerPromise.then(() => {
|
| - if (this._worker)
|
| - this._worker.terminate();
|
| - return false;
|
| - });
|
| + function onMessage(event) {
|
| + if (event.data === 'workerReady') {
|
| + fulfill(true);
|
| + return;
|
| + }
|
| + this._messageHandler(event.data);
|
| }
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {function(string)} messageHandler
|
| + * @param {function(string)} closeHandler
|
| + */
|
| + setHandlers(messageHandler, closeHandler) {
|
| + this._messageHandler = messageHandler;
|
| + this._closeHandler = closeHandler;
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @param {string} message
|
| + * @return {!Promise<boolean>}
|
| + */
|
| + send(message) {
|
| + return this._workerPromise.then(() => {
|
| + try {
|
| + if (this._isSharedWorker)
|
| + this._worker.port.postMessage(message);
|
| + else
|
| + this._worker.postMessage(message);
|
| + return true;
|
| + } catch (e) {
|
| + return false;
|
| + }
|
| + });
|
| + }
|
| +
|
| + /**
|
| + * @override
|
| + * @return {!Promise}
|
| + */
|
| + close() {
|
| + return this._workerPromise.then(() => {
|
| + if (this._worker)
|
| + this._worker.terminate();
|
| + return false;
|
| + });
|
| + }
|
| };
|
|
|
| WebInspector.serviceManager = new WebInspector.ServiceManager();
|
|
|