| Index: third_party/WebKit/Source/devtools/front_end/components/EventListenersUtils.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/components/EventListenersUtils.js b/third_party/WebKit/Source/devtools/front_end/components/EventListenersUtils.js
|
| index e4089987d4eaafef6f4231af83e774d8b4796429..6b9aeba338cb0f17f4e056587c694110922ae03f 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/components/EventListenersUtils.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/components/EventListenersUtils.js
|
| @@ -1,7 +1,6 @@
|
| // Copyright 2015 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.
|
| -
|
| /** @typedef {{eventListeners:!Array<!WebInspector.EventListener>, internalHandlers:?WebInspector.RemoteArray}} */
|
| WebInspector.FrameworkEventListenersObject;
|
|
|
| @@ -12,261 +11,254 @@ WebInspector.EventListenerObjectInInspectedPage;
|
| * @param {!WebInspector.RemoteObject} object
|
| * @return {!Promise<!WebInspector.FrameworkEventListenersObject>}
|
| */
|
| -WebInspector.EventListener.frameworkEventListeners = function(object)
|
| -{
|
| - if (!object.target().hasDOMCapability()) {
|
| - // TODO(kozyatinskiy): figure out how this should work for |window|.
|
| - return Promise.resolve(/** @type {!WebInspector.FrameworkEventListenersObject} */ ({eventListeners: [], internalHandlers: null}));
|
| - }
|
| -
|
| - var listenersResult = /** @type {!WebInspector.FrameworkEventListenersObject} */({eventListeners: []});
|
| - return object.callFunctionPromise(frameworkEventListeners, undefined)
|
| - .then(assertCallFunctionResult)
|
| - .then(getOwnProperties)
|
| - .then(createEventListeners)
|
| - .then(returnResult)
|
| - .catchException(listenersResult);
|
| -
|
| - /**
|
| - * @param {!WebInspector.RemoteObject} object
|
| - * @return {!Promise<!{properties: ?Array.<!WebInspector.RemoteObjectProperty>, internalProperties: ?Array.<!WebInspector.RemoteObjectProperty>}>}
|
| - */
|
| - function getOwnProperties(object)
|
| - {
|
| - return object.getOwnPropertiesPromise();
|
| +WebInspector.EventListener.frameworkEventListeners = function(object) {
|
| + if (!object.target().hasDOMCapability()) {
|
| + // TODO(kozyatinskiy): figure out how this should work for |window|.
|
| + return Promise.resolve(
|
| + /** @type {!WebInspector.FrameworkEventListenersObject} */ ({eventListeners: [], internalHandlers: null}));
|
| + }
|
| +
|
| + var listenersResult = /** @type {!WebInspector.FrameworkEventListenersObject} */ ({eventListeners: []});
|
| + return object.callFunctionPromise(frameworkEventListeners, undefined)
|
| + .then(assertCallFunctionResult)
|
| + .then(getOwnProperties)
|
| + .then(createEventListeners)
|
| + .then(returnResult)
|
| + .catchException(listenersResult);
|
| +
|
| + /**
|
| + * @param {!WebInspector.RemoteObject} object
|
| + * @return {!Promise<!{properties: ?Array.<!WebInspector.RemoteObjectProperty>, internalProperties: ?Array.<!WebInspector.RemoteObjectProperty>}>}
|
| + */
|
| + function getOwnProperties(object) {
|
| + return object.getOwnPropertiesPromise();
|
| + }
|
| +
|
| + /**
|
| + * @param {!{properties: ?Array<!WebInspector.RemoteObjectProperty>, internalProperties: ?Array<!WebInspector.RemoteObjectProperty>}} result
|
| + * @return {!Promise<undefined>}
|
| + */
|
| + function createEventListeners(result) {
|
| + if (!result.properties)
|
| + throw new Error('Object properties is empty');
|
| + var promises = [];
|
| + for (var property of result.properties) {
|
| + if (property.name === 'eventListeners' && property.value)
|
| + promises.push(convertToEventListeners(property.value).then(storeEventListeners));
|
| + if (property.name === 'internalHandlers' && property.value)
|
| + promises.push(convertToInternalHandlers(property.value).then(storeInternalHandlers));
|
| + if (property.name === 'errorString' && property.value)
|
| + printErrorString(property.value);
|
| }
|
| + return /** @type {!Promise<undefined>} */ (Promise.all(promises));
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.RemoteObject} pageEventListenersObject
|
| + * @return {!Promise<!Array<!WebInspector.EventListener>>}
|
| + */
|
| + function convertToEventListeners(pageEventListenersObject) {
|
| + return WebInspector.RemoteArray.objectAsArray(pageEventListenersObject)
|
| + .map(toEventListener)
|
| + .then(filterOutEmptyObjects);
|
|
|
| /**
|
| - * @param {!{properties: ?Array<!WebInspector.RemoteObjectProperty>, internalProperties: ?Array<!WebInspector.RemoteObjectProperty>}} result
|
| - * @return {!Promise<undefined>}
|
| + * @param {!WebInspector.RemoteObject} listenerObject
|
| + * @return {!Promise<?WebInspector.EventListener>}
|
| */
|
| - function createEventListeners(result)
|
| - {
|
| - if (!result.properties)
|
| - throw new Error("Object properties is empty");
|
| - var promises = [];
|
| - for (var property of result.properties) {
|
| - if (property.name === "eventListeners" && property.value)
|
| - promises.push(convertToEventListeners(property.value).then(storeEventListeners));
|
| - if (property.name === "internalHandlers" && property.value)
|
| - promises.push(convertToInternalHandlers(property.value).then(storeInternalHandlers));
|
| - if (property.name === "errorString" && property.value)
|
| - printErrorString(property.value);
|
| - }
|
| - return /** @type {!Promise<undefined>} */(Promise.all(promises));
|
| + function toEventListener(listenerObject) {
|
| + /** @type {string} */
|
| + var type;
|
| + /** @type {boolean} */
|
| + var useCapture;
|
| + /** @type {boolean} */
|
| + var passive;
|
| + /** @type {?WebInspector.RemoteObject} */
|
| + var handler = null;
|
| + /** @type {?WebInspector.RemoteObject} */
|
| + var originalHandler = null;
|
| + /** @type {?WebInspector.DebuggerModel.Location} */
|
| + var location = null;
|
| + /** @type {?WebInspector.RemoteObject} */
|
| + var removeFunctionObject = null;
|
| +
|
| + var promises = [];
|
| + promises.push(
|
| + listenerObject.callFunctionJSONPromise(truncatePageEventListener, undefined).then(storeTruncatedListener));
|
| +
|
| + /**
|
| + * @suppressReceiverCheck
|
| + * @this {WebInspector.EventListenerObjectInInspectedPage}
|
| + * @return {!{type:string, useCapture:boolean, passive:boolean}}
|
| + */
|
| + function truncatePageEventListener() {
|
| + return {type: this.type, useCapture: this.useCapture, passive: this.passive};
|
| + }
|
| +
|
| + /**
|
| + * @param {!{type:string, useCapture: boolean, passive: boolean}} truncatedListener
|
| + */
|
| + function storeTruncatedListener(truncatedListener) {
|
| + type = truncatedListener.type;
|
| + useCapture = truncatedListener.useCapture;
|
| + passive = truncatedListener.passive;
|
| + }
|
| +
|
| + promises.push(listenerObject.callFunctionPromise(handlerFunction)
|
| + .then(assertCallFunctionResult)
|
| + .then(storeOriginalHandler)
|
| + .then(toTargetFunction)
|
| + .then(storeFunctionWithDetails));
|
| +
|
| + /**
|
| + * @suppressReceiverCheck
|
| + * @return {function()}
|
| + * @this {WebInspector.EventListenerObjectInInspectedPage}
|
| + */
|
| + function handlerFunction() {
|
| + return this.handler;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.RemoteObject} functionObject
|
| + * @return {!WebInspector.RemoteObject}
|
| + */
|
| + function storeOriginalHandler(functionObject) {
|
| + originalHandler = functionObject;
|
| + return originalHandler;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.RemoteObject} functionObject
|
| + * @return {!Promise<undefined>}
|
| + */
|
| + function storeFunctionWithDetails(functionObject) {
|
| + handler = functionObject;
|
| + return /** @type {!Promise<undefined>} */ (
|
| + functionObject.debuggerModel().functionDetailsPromise(functionObject).then(storeFunctionDetails));
|
| + }
|
| +
|
| + /**
|
| + * @param {?WebInspector.DebuggerModel.FunctionDetails} functionDetails
|
| + */
|
| + function storeFunctionDetails(functionDetails) {
|
| + location = functionDetails ? functionDetails.location : null;
|
| + }
|
| +
|
| + promises.push(listenerObject.callFunctionPromise(getRemoveFunction)
|
| + .then(assertCallFunctionResult)
|
| + .then(storeRemoveFunction));
|
| +
|
| + /**
|
| + * @suppressReceiverCheck
|
| + * @return {function()}
|
| + * @this {WebInspector.EventListenerObjectInInspectedPage}
|
| + */
|
| + function getRemoveFunction() {
|
| + return this.remove;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.RemoteObject} functionObject
|
| + */
|
| + function storeRemoveFunction(functionObject) {
|
| + if (functionObject.type !== 'function')
|
| + return;
|
| + removeFunctionObject = functionObject;
|
| + }
|
| +
|
| + return Promise.all(promises)
|
| + .then(createEventListener)
|
| + .catchException(/** @type {?WebInspector.EventListener} */ (null));
|
| +
|
| + /**
|
| + * @return {!WebInspector.EventListener}
|
| + */
|
| + function createEventListener() {
|
| + if (!location)
|
| + throw new Error('Empty event listener\'s location');
|
| + return new WebInspector.EventListener(
|
| + handler._target, object, type, useCapture, passive, handler, originalHandler, location,
|
| + removeFunctionObject, 'frameworkUser');
|
| + }
|
| }
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.RemoteObject} pageInternalHandlersObject
|
| + * @return {!Promise<!WebInspector.RemoteArray>}
|
| + */
|
| + function convertToInternalHandlers(pageInternalHandlersObject) {
|
| + return WebInspector.RemoteArray.objectAsArray(pageInternalHandlersObject)
|
| + .map(toTargetFunction)
|
| + .then(WebInspector.RemoteArray.createFromRemoteObjects);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.RemoteObject} functionObject
|
| + * @return {!Promise<!WebInspector.RemoteObject>}
|
| + */
|
| + function toTargetFunction(functionObject) {
|
| + return WebInspector.RemoteFunction.objectAsFunction(functionObject).targetFunction();
|
| + }
|
| +
|
| + /**
|
| + * @param {!Array<!WebInspector.EventListener>} eventListeners
|
| + */
|
| + function storeEventListeners(eventListeners) {
|
| + listenersResult.eventListeners = eventListeners;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.RemoteArray} internalHandlers
|
| + */
|
| + function storeInternalHandlers(internalHandlers) {
|
| + listenersResult.internalHandlers = internalHandlers;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.RemoteObject} errorString
|
| + */
|
| + function printErrorString(errorString) {
|
| + WebInspector.console.error(errorString.value);
|
| + }
|
| +
|
| + /**
|
| + * @return {!WebInspector.FrameworkEventListenersObject}
|
| + */
|
| + function returnResult() {
|
| + return listenersResult;
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.CallFunctionResult} result
|
| + * @return {!WebInspector.RemoteObject}
|
| + */
|
| + function assertCallFunctionResult(result) {
|
| + if (result.wasThrown || !result.object)
|
| + throw new Error('Exception in callFunction or empty result');
|
| + return result.object;
|
| + }
|
| +
|
| + /**
|
| + * @param {!Array<?T>} objects
|
| + * @return {!Array<!T>}
|
| + * @template T
|
| + */
|
| + function filterOutEmptyObjects(objects) {
|
| + return objects.filter(filterOutEmpty);
|
|
|
| /**
|
| - * @param {!WebInspector.RemoteObject} pageEventListenersObject
|
| - * @return {!Promise<!Array<!WebInspector.EventListener>>}
|
| - */
|
| - function convertToEventListeners(pageEventListenersObject)
|
| - {
|
| - return WebInspector.RemoteArray.objectAsArray(pageEventListenersObject).map(toEventListener).then(filterOutEmptyObjects);
|
| -
|
| - /**
|
| - * @param {!WebInspector.RemoteObject} listenerObject
|
| - * @return {!Promise<?WebInspector.EventListener>}
|
| - */
|
| - function toEventListener(listenerObject)
|
| - {
|
| - /** @type {string} */
|
| - var type;
|
| - /** @type {boolean} */
|
| - var useCapture;
|
| - /** @type {boolean} */
|
| - var passive;
|
| - /** @type {?WebInspector.RemoteObject} */
|
| - var handler = null;
|
| - /** @type {?WebInspector.RemoteObject} */
|
| - var originalHandler = null;
|
| - /** @type {?WebInspector.DebuggerModel.Location} */
|
| - var location = null;
|
| - /** @type {?WebInspector.RemoteObject} */
|
| - var removeFunctionObject = null;
|
| -
|
| - var promises = [];
|
| - promises.push(listenerObject.callFunctionJSONPromise(truncatePageEventListener, undefined).then(storeTruncatedListener));
|
| -
|
| - /**
|
| - * @suppressReceiverCheck
|
| - * @this {WebInspector.EventListenerObjectInInspectedPage}
|
| - * @return {!{type:string, useCapture:boolean, passive:boolean}}
|
| - */
|
| - function truncatePageEventListener()
|
| - {
|
| - return {type: this.type, useCapture: this.useCapture, passive: this.passive};
|
| - }
|
| -
|
| - /**
|
| - * @param {!{type:string, useCapture: boolean, passive: boolean}} truncatedListener
|
| - */
|
| - function storeTruncatedListener(truncatedListener)
|
| - {
|
| - type = truncatedListener.type;
|
| - useCapture = truncatedListener.useCapture;
|
| - passive = truncatedListener.passive;
|
| - }
|
| -
|
| - promises.push(listenerObject.callFunctionPromise(handlerFunction).then(assertCallFunctionResult).then(storeOriginalHandler).then(toTargetFunction).then(storeFunctionWithDetails));
|
| -
|
| - /**
|
| - * @suppressReceiverCheck
|
| - * @return {function()}
|
| - * @this {WebInspector.EventListenerObjectInInspectedPage}
|
| - */
|
| - function handlerFunction()
|
| - {
|
| - return this.handler;
|
| - }
|
| -
|
| - /**
|
| - * @param {!WebInspector.RemoteObject} functionObject
|
| - * @return {!WebInspector.RemoteObject}
|
| - */
|
| - function storeOriginalHandler(functionObject)
|
| - {
|
| - originalHandler = functionObject;
|
| - return originalHandler;
|
| - }
|
| -
|
| - /**
|
| - * @param {!WebInspector.RemoteObject} functionObject
|
| - * @return {!Promise<undefined>}
|
| - */
|
| - function storeFunctionWithDetails(functionObject)
|
| - {
|
| - handler = functionObject;
|
| - return /** @type {!Promise<undefined>} */(functionObject.debuggerModel().functionDetailsPromise(functionObject).then(storeFunctionDetails));
|
| - }
|
| -
|
| - /**
|
| - * @param {?WebInspector.DebuggerModel.FunctionDetails} functionDetails
|
| - */
|
| - function storeFunctionDetails(functionDetails)
|
| - {
|
| - location = functionDetails ? functionDetails.location : null;
|
| - }
|
| -
|
| - promises.push(listenerObject.callFunctionPromise(getRemoveFunction).then(assertCallFunctionResult).then(storeRemoveFunction));
|
| -
|
| - /**
|
| - * @suppressReceiverCheck
|
| - * @return {function()}
|
| - * @this {WebInspector.EventListenerObjectInInspectedPage}
|
| - */
|
| - function getRemoveFunction()
|
| - {
|
| - return this.remove;
|
| - }
|
| -
|
| - /**
|
| - * @param {!WebInspector.RemoteObject} functionObject
|
| - */
|
| - function storeRemoveFunction(functionObject)
|
| - {
|
| - if (functionObject.type !== "function")
|
| - return;
|
| - removeFunctionObject = functionObject;
|
| - }
|
| -
|
| - return Promise.all(promises).then(createEventListener).catchException(/** @type {?WebInspector.EventListener} */(null));
|
| -
|
| - /**
|
| - * @return {!WebInspector.EventListener}
|
| - */
|
| - function createEventListener()
|
| - {
|
| - if (!location)
|
| - throw new Error("Empty event listener's location");
|
| - return new WebInspector.EventListener(handler._target, object, type, useCapture, passive, handler, originalHandler, location, removeFunctionObject, "frameworkUser");
|
| - }
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * @param {!WebInspector.RemoteObject} pageInternalHandlersObject
|
| - * @return {!Promise<!WebInspector.RemoteArray>}
|
| - */
|
| - function convertToInternalHandlers(pageInternalHandlersObject)
|
| - {
|
| - return WebInspector.RemoteArray.objectAsArray(pageInternalHandlersObject).map(toTargetFunction)
|
| - .then(WebInspector.RemoteArray.createFromRemoteObjects);
|
| - }
|
| -
|
| - /**
|
| - * @param {!WebInspector.RemoteObject} functionObject
|
| - * @return {!Promise<!WebInspector.RemoteObject>}
|
| - */
|
| - function toTargetFunction(functionObject)
|
| - {
|
| - return WebInspector.RemoteFunction.objectAsFunction(functionObject).targetFunction();
|
| - }
|
| -
|
| - /**
|
| - * @param {!Array<!WebInspector.EventListener>} eventListeners
|
| - */
|
| - function storeEventListeners(eventListeners)
|
| - {
|
| - listenersResult.eventListeners = eventListeners;
|
| - }
|
| -
|
| - /**
|
| - * @param {!WebInspector.RemoteArray} internalHandlers
|
| - */
|
| - function storeInternalHandlers(internalHandlers)
|
| - {
|
| - listenersResult.internalHandlers = internalHandlers;
|
| - }
|
| -
|
| - /**
|
| - * @param {!WebInspector.RemoteObject} errorString
|
| - */
|
| - function printErrorString(errorString)
|
| - {
|
| - WebInspector.console.error(errorString.value);
|
| - }
|
| -
|
| - /**
|
| - * @return {!WebInspector.FrameworkEventListenersObject}
|
| - */
|
| - function returnResult()
|
| - {
|
| - return listenersResult;
|
| - }
|
| -
|
| - /**
|
| - * @param {!WebInspector.CallFunctionResult} result
|
| - * @return {!WebInspector.RemoteObject}
|
| - */
|
| - function assertCallFunctionResult(result)
|
| - {
|
| - if (result.wasThrown || !result.object)
|
| - throw new Error("Exception in callFunction or empty result");
|
| - return result.object;
|
| - }
|
| -
|
| - /**
|
| - * @param {!Array<?T>} objects
|
| - * @return {!Array<!T>}
|
| + * @param {?T} object
|
| + * @return {boolean}
|
| * @template T
|
| */
|
| - function filterOutEmptyObjects(objects)
|
| - {
|
| - return objects.filter(filterOutEmpty);
|
| -
|
| - /**
|
| - * @param {?T} object
|
| - * @return {boolean}
|
| - * @template T
|
| - */
|
| - function filterOutEmpty(object)
|
| - {
|
| - return !!object;
|
| - }
|
| + function filterOutEmpty(object) {
|
| + return !!object;
|
| }
|
| + }
|
|
|
| - /*
|
| + /*
|
| frameworkEventListeners fetcher functions should produce following output:
|
| {
|
| // framework event listeners
|
| @@ -288,210 +280,199 @@ WebInspector.EventListener.frameworkEventListeners = function(object)
|
| ]
|
| }
|
| */
|
| - /**
|
| - * @suppressReceiverCheck
|
| - * @return {!{eventListeners:!Array<!WebInspector.EventListenerObjectInInspectedPage>, internalHandlers:?Array<function()>}}
|
| - * @this {Object}
|
| - */
|
| - function frameworkEventListeners()
|
| - {
|
| - var errorLines = [];
|
| - var eventListeners = [];
|
| - var internalHandlers = [];
|
| - var fetchers = [jQueryFetcher];
|
| - try {
|
| - if (self.devtoolsFrameworkEventListeners && isArrayLike(self.devtoolsFrameworkEventListeners))
|
| - fetchers = fetchers.concat(self.devtoolsFrameworkEventListeners);
|
| - } catch (e) {
|
| - errorLines.push("devtoolsFrameworkEventListeners call produced error: " + toString(e));
|
| - }
|
| + /**
|
| + * @suppressReceiverCheck
|
| + * @return {!{eventListeners:!Array<!WebInspector.EventListenerObjectInInspectedPage>, internalHandlers:?Array<function()>}}
|
| + * @this {Object}
|
| + */
|
| + function frameworkEventListeners() {
|
| + var errorLines = [];
|
| + var eventListeners = [];
|
| + var internalHandlers = [];
|
| + var fetchers = [jQueryFetcher];
|
| + try {
|
| + if (self.devtoolsFrameworkEventListeners && isArrayLike(self.devtoolsFrameworkEventListeners))
|
| + fetchers = fetchers.concat(self.devtoolsFrameworkEventListeners);
|
| + } catch (e) {
|
| + errorLines.push('devtoolsFrameworkEventListeners call produced error: ' + toString(e));
|
| + }
|
|
|
| - for (var i = 0; i < fetchers.length; ++i) {
|
| - try {
|
| - var fetcherResult = fetchers[i](this);
|
| - if (fetcherResult.eventListeners && isArrayLike(fetcherResult.eventListeners)) {
|
| - eventListeners = eventListeners.concat(fetcherResult.eventListeners.map(checkEventListener).filter(nonEmptyObject));
|
| - }
|
| - if (fetcherResult.internalHandlers && isArrayLike(fetcherResult.internalHandlers))
|
| - internalHandlers = internalHandlers.concat(fetcherResult.internalHandlers.map(checkInternalHandler).filter(nonEmptyObject));
|
| - } catch (e) {
|
| - errorLines.push("fetcher call produced error: " + toString(e));
|
| - }
|
| - }
|
| - var result = {eventListeners: eventListeners};
|
| - if (internalHandlers.length)
|
| - result.internalHandlers = internalHandlers;
|
| - if (errorLines.length) {
|
| - var errorString = "Framework Event Listeners API Errors:\n\t" + errorLines.join("\n\t");
|
| - errorString = errorString.substr(0, errorString.length - 1);
|
| - result.errorString = errorString;
|
| + for (var i = 0; i < fetchers.length; ++i) {
|
| + try {
|
| + var fetcherResult = fetchers[i](this);
|
| + if (fetcherResult.eventListeners && isArrayLike(fetcherResult.eventListeners)) {
|
| + eventListeners =
|
| + eventListeners.concat(fetcherResult.eventListeners.map(checkEventListener).filter(nonEmptyObject));
|
| }
|
| - return result;
|
| + if (fetcherResult.internalHandlers && isArrayLike(fetcherResult.internalHandlers))
|
| + internalHandlers =
|
| + internalHandlers.concat(fetcherResult.internalHandlers.map(checkInternalHandler).filter(nonEmptyObject));
|
| + } catch (e) {
|
| + errorLines.push('fetcher call produced error: ' + toString(e));
|
| + }
|
| + }
|
| + var result = {eventListeners: eventListeners};
|
| + if (internalHandlers.length)
|
| + result.internalHandlers = internalHandlers;
|
| + if (errorLines.length) {
|
| + var errorString = 'Framework Event Listeners API Errors:\n\t' + errorLines.join('\n\t');
|
| + errorString = errorString.substr(0, errorString.length - 1);
|
| + result.errorString = errorString;
|
| + }
|
| + return result;
|
|
|
| - /**
|
| - * @param {?Object} obj
|
| - * @return {boolean}
|
| - */
|
| - function isArrayLike(obj)
|
| - {
|
| - if (!obj || typeof obj !== "object")
|
| - return false;
|
| - try {
|
| - if (typeof obj.splice === "function") {
|
| - var len = obj.length;
|
| - return typeof len === "number" && (len >>> 0 === len && (len > 0 || 1 / len > 0));
|
| - }
|
| - } catch (e) {
|
| - }
|
| - return false;
|
| + /**
|
| + * @param {?Object} obj
|
| + * @return {boolean}
|
| + */
|
| + function isArrayLike(obj) {
|
| + if (!obj || typeof obj !== 'object')
|
| + return false;
|
| + try {
|
| + if (typeof obj.splice === 'function') {
|
| + var len = obj.length;
|
| + return typeof len === 'number' && (len >>> 0 === len && (len > 0 || 1 / len > 0));
|
| }
|
| + } catch (e) {
|
| + }
|
| + return false;
|
| + }
|
|
|
| - /**
|
| - * @param {*} eventListener
|
| - * @return {?WebInspector.EventListenerObjectInInspectedPage}
|
| - */
|
| - function checkEventListener(eventListener)
|
| - {
|
| - try {
|
| - var errorString = "";
|
| - if (!eventListener)
|
| - errorString += "empty event listener, ";
|
| - var type = eventListener.type;
|
| - if (!type || (typeof type !== "string"))
|
| - errorString += "event listener's type isn't string or empty, ";
|
| - var useCapture = eventListener.useCapture;
|
| - if (typeof useCapture !== "boolean")
|
| - errorString += "event listener's useCapture isn't boolean or undefined, ";
|
| - var passive = eventListener.passive;
|
| - if (typeof passive !== "boolean")
|
| - errorString += "event listener's passive isn't boolean or undefined, ";
|
| - var handler = eventListener.handler;
|
| - if (!handler || (typeof handler !== "function"))
|
| - errorString += "event listener's handler isn't a function or empty, ";
|
| - var remove = eventListener.remove;
|
| - if (remove && (typeof remove !== "function"))
|
| - errorString += "event listener's remove isn't a function, ";
|
| - if (!errorString){
|
| - return {type: type, useCapture: useCapture, passive: passive, handler: handler, remove: remove};
|
| - } else {
|
| - errorLines.push(errorString.substr(0, errorString.length - 2));
|
| - return null;
|
| - }
|
| - } catch (e) {
|
| - errorLines.push(toString(e));
|
| - return null;
|
| - }
|
| + /**
|
| + * @param {*} eventListener
|
| + * @return {?WebInspector.EventListenerObjectInInspectedPage}
|
| + */
|
| + function checkEventListener(eventListener) {
|
| + try {
|
| + var errorString = '';
|
| + if (!eventListener)
|
| + errorString += 'empty event listener, ';
|
| + var type = eventListener.type;
|
| + if (!type || (typeof type !== 'string'))
|
| + errorString += 'event listener\'s type isn\'t string or empty, ';
|
| + var useCapture = eventListener.useCapture;
|
| + if (typeof useCapture !== 'boolean')
|
| + errorString += 'event listener\'s useCapture isn\'t boolean or undefined, ';
|
| + var passive = eventListener.passive;
|
| + if (typeof passive !== 'boolean')
|
| + errorString += 'event listener\'s passive isn\'t boolean or undefined, ';
|
| + var handler = eventListener.handler;
|
| + if (!handler || (typeof handler !== 'function'))
|
| + errorString += 'event listener\'s handler isn\'t a function or empty, ';
|
| + var remove = eventListener.remove;
|
| + if (remove && (typeof remove !== 'function'))
|
| + errorString += 'event listener\'s remove isn\'t a function, ';
|
| + if (!errorString) {
|
| + return {type: type, useCapture: useCapture, passive: passive, handler: handler, remove: remove};
|
| + } else {
|
| + errorLines.push(errorString.substr(0, errorString.length - 2));
|
| + return null;
|
| }
|
| + } catch (e) {
|
| + errorLines.push(toString(e));
|
| + return null;
|
| + }
|
| + }
|
|
|
| - /**
|
| - * @param {*} handler
|
| - * @return {function()|null}
|
| - */
|
| - function checkInternalHandler(handler)
|
| - {
|
| - if (handler && (typeof handler === "function"))
|
| - return handler;
|
| - errorLines.push("internal handler isn't a function or empty");
|
| - return null;
|
| - }
|
| + /**
|
| + * @param {*} handler
|
| + * @return {function()|null}
|
| + */
|
| + function checkInternalHandler(handler) {
|
| + if (handler && (typeof handler === 'function'))
|
| + return handler;
|
| + errorLines.push('internal handler isn\'t a function or empty');
|
| + return null;
|
| + }
|
|
|
| - /**
|
| - * @param {*} obj
|
| - * @return {string}
|
| - * @suppress {uselessCode}
|
| - */
|
| - function toString(obj)
|
| - {
|
| - try {
|
| - return "" + obj;
|
| - } catch (e) {
|
| - return "<error>";
|
| - }
|
| - }
|
| + /**
|
| + * @param {*} obj
|
| + * @return {string}
|
| + * @suppress {uselessCode}
|
| + */
|
| + function toString(obj) {
|
| + try {
|
| + return '' + obj;
|
| + } catch (e) {
|
| + return '<error>';
|
| + }
|
| + }
|
|
|
| - /**
|
| - * @param {*} obj
|
| - * @return {boolean}
|
| - */
|
| - function nonEmptyObject(obj)
|
| - {
|
| - return !!obj;
|
| - }
|
| + /**
|
| + * @param {*} obj
|
| + * @return {boolean}
|
| + */
|
| + function nonEmptyObject(obj) {
|
| + return !!obj;
|
| + }
|
|
|
| - function jQueryFetcher(node)
|
| - {
|
| - if (!node || !(node instanceof Node))
|
| - return {eventListeners: []};
|
| - var jQuery = /** @type {?{fn,data,_data}}*/(window["jQuery"]);
|
| - if (!jQuery || !jQuery.fn)
|
| - return {eventListeners: []};
|
| - var jQueryFunction = /** @type {function(!Node)} */(jQuery);
|
| - var data = jQuery._data || jQuery.data;
|
| -
|
| - var eventListeners = [];
|
| - var internalHandlers = [];
|
| -
|
| - if (typeof data === "function") {
|
| - var events = data(node, "events");
|
| - for (var type in events) {
|
| - for (var key in events[type]) {
|
| - var frameworkListener = events[type][key];
|
| - if (typeof frameworkListener === "object" || typeof frameworkListener === "function") {
|
| - var listener = {
|
| - handler: frameworkListener.handler || frameworkListener,
|
| - useCapture: true,
|
| - passive: false,
|
| - type: type
|
| - };
|
| - listener.remove = jQueryRemove.bind(node, frameworkListener.selector);
|
| - eventListeners.push(listener);
|
| - }
|
| - }
|
| - }
|
| - var nodeData = data(node);
|
| - if (nodeData && typeof nodeData.handle === "function")
|
| - internalHandlers.push(nodeData.handle);
|
| + function jQueryFetcher(node) {
|
| + if (!node || !(node instanceof Node))
|
| + return {eventListeners: []};
|
| + var jQuery = /** @type {?{fn,data,_data}}*/ (window['jQuery']);
|
| + if (!jQuery || !jQuery.fn)
|
| + return {eventListeners: []};
|
| + var jQueryFunction = /** @type {function(!Node)} */ (jQuery);
|
| + var data = jQuery._data || jQuery.data;
|
| +
|
| + var eventListeners = [];
|
| + var internalHandlers = [];
|
| +
|
| + if (typeof data === 'function') {
|
| + var events = data(node, 'events');
|
| + for (var type in events) {
|
| + for (var key in events[type]) {
|
| + var frameworkListener = events[type][key];
|
| + if (typeof frameworkListener === 'object' || typeof frameworkListener === 'function') {
|
| + var listener = {
|
| + handler: frameworkListener.handler || frameworkListener,
|
| + useCapture: true,
|
| + passive: false,
|
| + type: type
|
| + };
|
| + listener.remove = jQueryRemove.bind(node, frameworkListener.selector);
|
| + eventListeners.push(listener);
|
| }
|
| - var entry = jQueryFunction(node)[0];
|
| - if (entry) {
|
| - var entryEvents = entry["$events"];
|
| - for (var type in entryEvents) {
|
| - var events = entryEvents[type];
|
| - for (var key in events) {
|
| - if (typeof events[key] === "function") {
|
| - var listener = {
|
| - handler: events[key],
|
| - useCapture: true,
|
| - passive: false,
|
| - type: type
|
| - };
|
| - // We don't support removing for old version < 1.4 of jQuery because it doesn't provide API for getting "selector".
|
| - eventListeners.push(listener);
|
| - }
|
| - }
|
| - }
|
| - if (entry && entry["$handle"])
|
| - internalHandlers.push(entry["$handle"]);
|
| + }
|
| + }
|
| + var nodeData = data(node);
|
| + if (nodeData && typeof nodeData.handle === 'function')
|
| + internalHandlers.push(nodeData.handle);
|
| + }
|
| + var entry = jQueryFunction(node)[0];
|
| + if (entry) {
|
| + var entryEvents = entry['$events'];
|
| + for (var type in entryEvents) {
|
| + var events = entryEvents[type];
|
| + for (var key in events) {
|
| + if (typeof events[key] === 'function') {
|
| + var listener = {handler: events[key], useCapture: true, passive: false, type: type};
|
| + // We don't support removing for old version < 1.4 of jQuery because it doesn't provide API for getting "selector".
|
| + eventListeners.push(listener);
|
| }
|
| - return {eventListeners: eventListeners, internalHandlers: internalHandlers};
|
| + }
|
| }
|
| + if (entry && entry['$handle'])
|
| + internalHandlers.push(entry['$handle']);
|
| + }
|
| + return {eventListeners: eventListeners, internalHandlers: internalHandlers};
|
| + }
|
|
|
| - /**
|
| - * @param {string} selector
|
| - * @param {string} type
|
| - * @param {function()} handler
|
| - * @this {?Object}
|
| - */
|
| - function jQueryRemove(selector, type, handler)
|
| - {
|
| - if (!this || !(this instanceof Node))
|
| - return;
|
| - var node = /** @type {!Node} */(this);
|
| - var jQuery = /** @type {?{fn,data,_data}}*/(window["jQuery"]);
|
| - if (!jQuery || !jQuery.fn)
|
| - return;
|
| - var jQueryFunction = /** @type {function(!Node)} */(jQuery);
|
| - jQueryFunction(node).off(type, selector, handler);
|
| - }
|
| + /**
|
| + * @param {string} selector
|
| + * @param {string} type
|
| + * @param {function()} handler
|
| + * @this {?Object}
|
| + */
|
| + function jQueryRemove(selector, type, handler) {
|
| + if (!this || !(this instanceof Node))
|
| + return;
|
| + var node = /** @type {!Node} */ (this);
|
| + var jQuery = /** @type {?{fn,data,_data}}*/ (window['jQuery']);
|
| + if (!jQuery || !jQuery.fn)
|
| + return;
|
| + var jQueryFunction = /** @type {function(!Node)} */ (jQuery);
|
| + jQueryFunction(node).off(type, selector, handler);
|
| }
|
| + }
|
| };
|
|
|