Index: third_party/WebKit/Source/devtools/front_end/sdk/InspectorBackend.js |
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/InspectorBackend.js b/third_party/WebKit/Source/devtools/front_end/sdk/InspectorBackend.js |
deleted file mode 100644 |
index d9bef3c3c1bea1cbf615d3adf83f1a1b8932e210..0000000000000000000000000000000000000000 |
--- a/third_party/WebKit/Source/devtools/front_end/sdk/InspectorBackend.js |
+++ /dev/null |
@@ -1,728 +0,0 @@ |
-/* |
- * Copyright (C) 2011 Google Inc. All rights reserved. |
- * |
- * Redistribution and use in source and binary forms, with or without |
- * modification, are permitted provided that the following conditions are |
- * met: |
- * |
- * * Redistributions of source code must retain the above copyright |
- * notice, this list of conditions and the following disclaimer. |
- * * Redistributions in binary form must reproduce the above |
- * copyright notice, this list of conditions and the following disclaimer |
- * in the documentation and/or other materials provided with the |
- * distribution. |
- * * Neither the name of Google Inc. nor the names of its |
- * contributors may be used to endorse or promote products derived from |
- * this software without specific prior written permission. |
- * |
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- */ |
- |
-var Protocol = {}; |
- |
-/** @typedef {string} */ |
-Protocol.Error; |
- |
-/** |
- * @unrestricted |
- */ |
-var InspectorBackendClass = class { |
- constructor() { |
- this._agentPrototypes = {}; |
- this._dispatcherPrototypes = {}; |
- this._initialized = false; |
- } |
- |
- /** |
- * @param {string} error |
- * @param {!Object} messageObject |
- */ |
- static reportProtocolError(error, messageObject) { |
- console.error(error + ': ' + JSON.stringify(messageObject)); |
- } |
- |
- /** |
- * @return {boolean} |
- */ |
- isInitialized() { |
- return this._initialized; |
- } |
- |
- /** |
- * @param {string} domain |
- */ |
- _addAgentGetterMethodToProtocolTargetPrototype(domain) { |
- var upperCaseLength = 0; |
- while (upperCaseLength < domain.length && domain[upperCaseLength].toLowerCase() !== domain[upperCaseLength]) |
- ++upperCaseLength; |
- |
- var methodName = domain.substr(0, upperCaseLength).toLowerCase() + domain.slice(upperCaseLength) + 'Agent'; |
- |
- /** |
- * @this {Protocol.TargetBase} |
- */ |
- function agentGetter() { |
- return this._agents[domain]; |
- } |
- |
- Protocol.TargetBase.prototype[methodName] = agentGetter; |
- |
- /** |
- * @this {Protocol.TargetBase} |
- */ |
- function registerDispatcher(dispatcher) { |
- this.registerDispatcher(domain, dispatcher); |
- } |
- |
- Protocol.TargetBase.prototype['register' + domain + 'Dispatcher'] = registerDispatcher; |
- } |
- |
- /** |
- * @param {string} domain |
- * @return {!InspectorBackendClass._AgentPrototype} |
- */ |
- _agentPrototype(domain) { |
- if (!this._agentPrototypes[domain]) { |
- this._agentPrototypes[domain] = new InspectorBackendClass._AgentPrototype(domain); |
- this._addAgentGetterMethodToProtocolTargetPrototype(domain); |
- } |
- |
- return this._agentPrototypes[domain]; |
- } |
- |
- /** |
- * @param {string} domain |
- * @return {!InspectorBackendClass._DispatcherPrototype} |
- */ |
- _dispatcherPrototype(domain) { |
- if (!this._dispatcherPrototypes[domain]) |
- this._dispatcherPrototypes[domain] = new InspectorBackendClass._DispatcherPrototype(); |
- return this._dispatcherPrototypes[domain]; |
- } |
- |
- /** |
- * @param {string} method |
- * @param {!Array.<!Object>} signature |
- * @param {!Array.<string>} replyArgs |
- * @param {boolean} hasErrorData |
- */ |
- registerCommand(method, signature, replyArgs, hasErrorData) { |
- var domainAndMethod = method.split('.'); |
- this._agentPrototype(domainAndMethod[0]).registerCommand(domainAndMethod[1], signature, replyArgs, hasErrorData); |
- this._initialized = true; |
- } |
- |
- /** |
- * @param {string} type |
- * @param {!Object} values |
- */ |
- registerEnum(type, values) { |
- var domainAndName = type.split('.'); |
- var domain = domainAndName[0]; |
- if (!Protocol[domain]) |
- Protocol[domain] = {}; |
- |
- Protocol[domain][domainAndName[1]] = values; |
- this._initialized = true; |
- } |
- |
- /** |
- * @param {string} eventName |
- * @param {!Object} params |
- */ |
- registerEvent(eventName, params) { |
- var domain = eventName.split('.')[0]; |
- this._dispatcherPrototype(domain).registerEvent(eventName, params); |
- this._initialized = true; |
- } |
- |
- /** |
- * @param {function(T)} clientCallback |
- * @param {string} errorPrefix |
- * @param {function(new:T,S)=} constructor |
- * @param {T=} defaultValue |
- * @return {function(?string, S)} |
- * @template T,S |
- */ |
- wrapClientCallback(clientCallback, errorPrefix, constructor, defaultValue) { |
- /** |
- * @param {?string} error |
- * @param {S} value |
- * @template S |
- */ |
- function callbackWrapper(error, value) { |
- if (error) { |
- console.error(errorPrefix + error); |
- clientCallback(defaultValue); |
- return; |
- } |
- if (constructor) |
- clientCallback(new constructor(value)); |
- else |
- clientCallback(value); |
- } |
- return callbackWrapper; |
- } |
-}; |
- |
-InspectorBackendClass._ConnectionClosedErrorCode = -32000; |
-InspectorBackendClass.DevToolsStubErrorCode = -32015; |
- |
- |
-var InspectorBackend = new InspectorBackendClass(); |
- |
-/** |
- * @interface |
- */ |
-InspectorBackendClass.Connection = function() {}; |
- |
-InspectorBackendClass.Connection.prototype = { |
- /** |
- * @param {string} message |
- */ |
- sendMessage(message) {}, |
- |
- /** |
- * @return {!Promise} |
- */ |
- disconnect() {}, |
-}; |
- |
-/** |
- * @typedef {!{ |
- * onMessage: function((!Object|string)), |
- * onDisconnect: function(string) |
- * }} |
- */ |
-InspectorBackendClass.Connection.Params; |
- |
-/** |
- * @typedef {function(!InspectorBackendClass.Connection.Params):!InspectorBackendClass.Connection} |
- */ |
-InspectorBackendClass.Connection.Factory; |
- |
-/** |
- * @unrestricted |
- */ |
-Protocol.TargetBase = class { |
- /** |
- * @param {!InspectorBackendClass.Connection.Factory} connectionFactory |
- */ |
- constructor(connectionFactory) { |
- this._connection = |
- connectionFactory({onMessage: this._onMessage.bind(this), onDisconnect: this._onDisconnect.bind(this)}); |
- this._lastMessageId = 1; |
- this._pendingResponsesCount = 0; |
- this._agents = {}; |
- this._dispatchers = {}; |
- this._callbacks = {}; |
- this._initialize(InspectorBackend._agentPrototypes, InspectorBackend._dispatcherPrototypes); |
- if (!InspectorBackendClass.deprecatedRunAfterPendingDispatches) |
- InspectorBackendClass.deprecatedRunAfterPendingDispatches = this._deprecatedRunAfterPendingDispatches.bind(this); |
- if (!InspectorBackendClass.sendRawMessageForTesting) |
- InspectorBackendClass.sendRawMessageForTesting = this._sendRawMessageForTesting.bind(this); |
- } |
- |
- /** |
- * @param {!Object.<string, !InspectorBackendClass._AgentPrototype>} agentPrototypes |
- * @param {!Object.<string, !InspectorBackendClass._DispatcherPrototype>} dispatcherPrototypes |
- */ |
- _initialize(agentPrototypes, dispatcherPrototypes) { |
- for (var domain in agentPrototypes) { |
- this._agents[domain] = Object.create(agentPrototypes[domain]); |
- this._agents[domain].setTarget(this); |
- } |
- |
- for (var domain in dispatcherPrototypes) |
- this._dispatchers[domain] = Object.create(dispatcherPrototypes[domain]); |
- } |
- |
- /** |
- * @return {number} |
- */ |
- _nextMessageId() { |
- return this._lastMessageId++; |
- } |
- |
- /** |
- * @param {string} domain |
- * @return {!InspectorBackendClass._AgentPrototype} |
- */ |
- _agent(domain) { |
- return this._agents[domain]; |
- } |
- |
- /** |
- * @param {string} domain |
- * @param {string} method |
- * @param {?Object} params |
- * @param {?function(*)} callback |
- */ |
- _wrapCallbackAndSendMessageObject(domain, method, params, callback) { |
- if (!this._connection) { |
- if (callback) |
- this._dispatchConnectionErrorResponse(domain, method, callback); |
- return; |
- } |
- |
- var messageObject = {}; |
- var messageId = this._nextMessageId(); |
- messageObject.id = messageId; |
- messageObject.method = method; |
- if (params) |
- messageObject.params = params; |
- |
- var wrappedCallback = this._wrap(callback, domain, method); |
- var message = JSON.stringify(messageObject); |
- |
- if (InspectorBackendClass.Options.dumpInspectorProtocolMessages) |
- this._dumpProtocolMessage('frontend: ' + message); |
- |
- this._connection.sendMessage(message); |
- ++this._pendingResponsesCount; |
- this._callbacks[messageId] = wrappedCallback; |
- } |
- |
- /** |
- * @param {?function(*)} callback |
- * @param {string} method |
- * @param {string} domain |
- * @return {function(*)} |
- */ |
- _wrap(callback, domain, method) { |
- if (!callback) |
- callback = function() {}; |
- |
- callback.methodName = method; |
- callback.domain = domain; |
- if (InspectorBackendClass.Options.dumpInspectorTimeStats) |
- callback.sendRequestTime = Date.now(); |
- |
- return callback; |
- } |
- |
- /** |
- * @param {string} method |
- * @param {?Object} params |
- * @param {?function(...*)} callback |
- */ |
- _sendRawMessageForTesting(method, params, callback) { |
- var domain = method.split('.')[0]; |
- this._wrapCallbackAndSendMessageObject(domain, method, params, callback); |
- } |
- |
- /** |
- * @param {!Object|string} message |
- */ |
- _onMessage(message) { |
- if (InspectorBackendClass.Options.dumpInspectorProtocolMessages) |
- this._dumpProtocolMessage('backend: ' + ((typeof message === 'string') ? message : JSON.stringify(message))); |
- |
- var messageObject = /** @type {!Object} */ ((typeof message === 'string') ? JSON.parse(message) : message); |
- |
- if ('id' in messageObject) { // just a response for some request |
- var callback = this._callbacks[messageObject.id]; |
- if (!callback) { |
- InspectorBackendClass.reportProtocolError('Protocol Error: the message with wrong id', messageObject); |
- return; |
- } |
- |
- var timingLabel = 'time-stats: ' + callback.methodName; |
- if (InspectorBackendClass.Options.dumpInspectorTimeStats) |
- console.time(timingLabel); |
- |
- this._agent(callback.domain).dispatchResponse(messageObject, callback.methodName, callback); |
- --this._pendingResponsesCount; |
- delete this._callbacks[messageObject.id]; |
- |
- if (InspectorBackendClass.Options.dumpInspectorTimeStats) |
- console.timeEnd(timingLabel); |
- |
- if (this._scripts && !this._pendingResponsesCount) |
- this._deprecatedRunAfterPendingDispatches(); |
- } else { |
- if (!('method' in messageObject)) { |
- InspectorBackendClass.reportProtocolError('Protocol Error: the message without method', messageObject); |
- return; |
- } |
- |
- var method = messageObject.method.split('.'); |
- var domainName = method[0]; |
- if (!(domainName in this._dispatchers)) { |
- InspectorBackendClass.reportProtocolError( |
- 'Protocol Error: the message ' + messageObject.method + ' is for non-existing domain \'' + domainName + |
- '\'', |
- messageObject); |
- return; |
- } |
- |
- this._dispatchers[domainName].dispatch(method[1], messageObject); |
- } |
- } |
- |
- /** |
- * @param {string} domain |
- * @param {!Object} dispatcher |
- */ |
- registerDispatcher(domain, dispatcher) { |
- if (!this._dispatchers[domain]) |
- return; |
- |
- this._dispatchers[domain].setDomainDispatcher(dispatcher); |
- } |
- |
- /** |
- * @param {function()=} script |
- */ |
- _deprecatedRunAfterPendingDispatches(script) { |
- if (!this._scripts) |
- this._scripts = []; |
- |
- if (script) |
- this._scripts.push(script); |
- |
- // Execute all promises. |
- setTimeout(function() { |
- if (!this._pendingResponsesCount) |
- this._executeAfterPendingDispatches(); |
- else |
- this._deprecatedRunAfterPendingDispatches(); |
- }.bind(this), 0); |
- } |
- |
- _executeAfterPendingDispatches() { |
- if (!this._pendingResponsesCount) { |
- var scripts = this._scripts; |
- this._scripts = []; |
- for (var id = 0; id < scripts.length; ++id) |
- scripts[id].call(this); |
- } |
- } |
- |
- /** |
- * @param {string} message |
- */ |
- _dumpProtocolMessage(message) { |
- console.log(message); // eslint-disable-line no-console |
- } |
- |
- /** |
- * @param {string} reason |
- */ |
- _onDisconnect(reason) { |
- this._connection = null; |
- this._runPendingCallbacks(); |
- this.dispose(); |
- } |
- |
- /** |
- * @protected |
- */ |
- dispose() { |
- } |
- |
- /** |
- * @return {boolean} |
- */ |
- isDisposed() { |
- return !this._connection; |
- } |
- |
- _runPendingCallbacks() { |
- var keys = Object.keys(this._callbacks).map(function(num) { |
- return parseInt(num, 10); |
- }); |
- for (var i = 0; i < keys.length; ++i) { |
- var callback = this._callbacks[keys[i]]; |
- this._dispatchConnectionErrorResponse(callback.domain, callback.methodName, callback); |
- } |
- this._callbacks = {}; |
- } |
- |
- /** |
- * @param {string} domain |
- * @param {string} methodName |
- * @param {function(*)} callback |
- */ |
- _dispatchConnectionErrorResponse(domain, methodName, callback) { |
- var error = { |
- message: 'Connection is closed, can\'t dispatch pending ' + methodName, |
- code: InspectorBackendClass._ConnectionClosedErrorCode, |
- data: null |
- }; |
- var messageObject = {error: error}; |
- setTimeout( |
- InspectorBackendClass._AgentPrototype.prototype.dispatchResponse.bind( |
- this._agent(domain), messageObject, methodName, callback), |
- 0); |
- } |
-}; |
- |
-/** |
- * @unrestricted |
- */ |
-InspectorBackendClass._AgentPrototype = class { |
- /** |
- * @param {string} domain |
- */ |
- constructor(domain) { |
- this._replyArgs = {}; |
- this._hasErrorData = {}; |
- this._domain = domain; |
- } |
- |
- /** |
- * @param {!Protocol.TargetBase} target |
- */ |
- setTarget(target) { |
- this._target = target; |
- } |
- |
- /** |
- * @param {string} methodName |
- * @param {!Array.<!Object>} signature |
- * @param {!Array.<string>} replyArgs |
- * @param {boolean} hasErrorData |
- */ |
- registerCommand(methodName, signature, replyArgs, hasErrorData) { |
- var domainAndMethod = this._domain + '.' + methodName; |
- |
- /** |
- * @param {...*} vararg |
- * @this {InspectorBackendClass._AgentPrototype} |
- * @return {!Promise.<*>} |
- */ |
- function sendMessagePromise(vararg) { |
- var params = Array.prototype.slice.call(arguments); |
- return InspectorBackendClass._AgentPrototype.prototype._sendMessageToBackendPromise.call( |
- this, domainAndMethod, signature, params); |
- } |
- |
- this[methodName] = sendMessagePromise; |
- |
- /** |
- * @param {...*} vararg |
- * @this {InspectorBackendClass._AgentPrototype} |
- */ |
- function invoke(vararg) { |
- var params = [domainAndMethod].concat(Array.prototype.slice.call(arguments)); |
- InspectorBackendClass._AgentPrototype.prototype._invoke.apply(this, params); |
- } |
- |
- this['invoke_' + methodName] = invoke; |
- |
- this._replyArgs[domainAndMethod] = replyArgs; |
- if (hasErrorData) |
- this._hasErrorData[domainAndMethod] = true; |
- } |
- |
- /** |
- * @param {string} method |
- * @param {!Array.<!Object>} signature |
- * @param {!Array.<*>} args |
- * @param {boolean} allowExtraUndefinedArg |
- * @param {function(string)} errorCallback |
- * @return {?Object} |
- */ |
- _prepareParameters(method, signature, args, allowExtraUndefinedArg, errorCallback) { |
- var params = {}; |
- var hasParams = false; |
- for (var i = 0; i < signature.length; ++i) { |
- var param = signature[i]; |
- var paramName = param['name']; |
- var typeName = param['type']; |
- var optionalFlag = param['optional']; |
- |
- if (!args.length && !optionalFlag) { |
- errorCallback( |
- 'Protocol Error: Invalid number of arguments for method \'' + method + |
- '\' call. It must have the following arguments \'' + JSON.stringify(signature) + '\'.'); |
- return null; |
- } |
- |
- var value = args.shift(); |
- if (optionalFlag && typeof value === 'undefined') |
- continue; |
- |
- if (typeof value !== typeName) { |
- errorCallback( |
- 'Protocol Error: Invalid type of argument \'' + paramName + '\' for method \'' + method + |
- '\' call. It must be \'' + typeName + '\' but it is \'' + typeof value + '\'.'); |
- return null; |
- } |
- |
- params[paramName] = value; |
- hasParams = true; |
- } |
- |
- if (args.length === 1 && (!allowExtraUndefinedArg || (typeof args[0] !== 'undefined'))) { |
- errorCallback( |
- 'Protocol Error: Optional callback argument for method \'' + method + |
- '\' call must be a function but its type is \'' + typeof args[0] + '\'.'); |
- return null; |
- } |
- |
- if (args.length > 1) { |
- errorCallback('Protocol Error: Extra ' + args.length + ' arguments in a call to method \'' + method + '\'.'); |
- return null; |
- } |
- |
- return hasParams ? params : null; |
- } |
- |
- /** |
- * @param {string} method |
- * @param {!Array.<!Object>} signature |
- * @param {!Array.<*>} args |
- * @return {!Promise.<*>} |
- */ |
- _sendMessageToBackendPromise(method, signature, args) { |
- var errorMessage; |
- /** |
- * @param {string} message |
- */ |
- function onError(message) { |
- console.error(message); |
- errorMessage = message; |
- } |
- var userCallback = (args.length && typeof args.peekLast() === 'function') ? args.pop() : null; |
- var params = this._prepareParameters(method, signature, args, !userCallback, onError); |
- if (errorMessage) |
- return Promise.reject(new Error(errorMessage)); |
- else |
- return new Promise(promiseAction.bind(this)); |
- |
- /** |
- * @param {function(?)} resolve |
- * @param {function(!Error)} reject |
- * @this {InspectorBackendClass._AgentPrototype} |
- */ |
- function promiseAction(resolve, reject) { |
- /** |
- * @param {...*} vararg |
- */ |
- function callback(vararg) { |
- var result = userCallback ? userCallback.apply(null, arguments) : undefined; |
- resolve(result); |
- } |
- this._target._wrapCallbackAndSendMessageObject(this._domain, method, params, callback); |
- } |
- } |
- |
- /** |
- * @param {string} method |
- * @param {?Object} args |
- * @param {?function(*)} callback |
- */ |
- _invoke(method, args, callback) { |
- this._target._wrapCallbackAndSendMessageObject(this._domain, method, args, callback); |
- } |
- |
- /** |
- * @param {!Object} messageObject |
- * @param {string} methodName |
- * @param {function(*)|function(?Protocol.Error, ?Object)} callback |
- */ |
- dispatchResponse(messageObject, methodName, callback) { |
- if (messageObject.error && messageObject.error.code !== InspectorBackendClass._ConnectionClosedErrorCode && |
- messageObject.error.code !== InspectorBackendClass.DevToolsStubErrorCode && |
- !InspectorBackendClass.Options.suppressRequestErrors) { |
- var id = InspectorBackendClass.Options.dumpInspectorProtocolMessages ? ' with id = ' + messageObject.id : ''; |
- console.error('Request ' + methodName + id + ' failed. ' + JSON.stringify(messageObject.error)); |
- } |
- |
- var argumentsArray = []; |
- argumentsArray[0] = messageObject.error ? messageObject.error.message : null; |
- |
- if (this._hasErrorData[methodName]) |
- argumentsArray[1] = messageObject.error ? messageObject.error.data : null; |
- |
- if (messageObject.result) { |
- var paramNames = this._replyArgs[methodName] || []; |
- for (var i = 0; i < paramNames.length; ++i) |
- argumentsArray.push(messageObject.result[paramNames[i]]); |
- } |
- |
- callback.apply(null, argumentsArray); |
- } |
-}; |
- |
-/** |
- * @unrestricted |
- */ |
-InspectorBackendClass._DispatcherPrototype = class { |
- constructor() { |
- this._eventArgs = {}; |
- this._dispatcher = null; |
- } |
- |
- /** |
- * @param {string} eventName |
- * @param {!Object} params |
- */ |
- registerEvent(eventName, params) { |
- this._eventArgs[eventName] = params; |
- } |
- |
- /** |
- * @param {!Object} dispatcher |
- */ |
- setDomainDispatcher(dispatcher) { |
- this._dispatcher = dispatcher; |
- } |
- |
- /** |
- * @param {string} functionName |
- * @param {!Object} messageObject |
- */ |
- dispatch(functionName, messageObject) { |
- if (!this._dispatcher) |
- return; |
- |
- if (!(functionName in this._dispatcher)) { |
- InspectorBackendClass.reportProtocolError( |
- 'Protocol Error: Attempted to dispatch an unimplemented method \'' + messageObject.method + '\'', |
- messageObject); |
- return; |
- } |
- |
- if (!this._eventArgs[messageObject.method]) { |
- InspectorBackendClass.reportProtocolError( |
- 'Protocol Error: Attempted to dispatch an unspecified method \'' + messageObject.method + '\'', |
- messageObject); |
- return; |
- } |
- |
- var params = []; |
- if (messageObject.params) { |
- var paramNames = this._eventArgs[messageObject.method]; |
- for (var i = 0; i < paramNames.length; ++i) |
- params.push(messageObject.params[paramNames[i]]); |
- } |
- |
- var timingLabel = 'time-stats: ' + messageObject.method; |
- if (InspectorBackendClass.Options.dumpInspectorTimeStats) |
- console.time(timingLabel); |
- |
- this._dispatcher[functionName].apply(this._dispatcher, params); |
- |
- if (InspectorBackendClass.Options.dumpInspectorTimeStats) |
- console.timeEnd(timingLabel); |
- } |
-}; |
- |
-InspectorBackendClass.Options = { |
- dumpInspectorTimeStats: false, |
- dumpInspectorProtocolMessages: false, |
- suppressRequestErrors: false |
-}; |