Index: Source/devtools/front_end/components/EventListenersView.js |
diff --git a/Source/devtools/front_end/components/EventListenersView.js b/Source/devtools/front_end/components/EventListenersView.js |
index 0a7abf6be8a35aeba01d567696c7eea0be0409d9..91cef6126bfe53c3c85a8bdd8a86f62222198684 100644 |
--- a/Source/devtools/front_end/components/EventListenersView.js |
+++ b/Source/devtools/front_end/components/EventListenersView.js |
@@ -3,6 +3,11 @@ |
// found in the LICENSE file. |
/** |
+* @typedef {Array<{object: !WebInspector.RemoteObject, eventListeners: ?Array<!WebInspector.EventListener>, frameworkEventListeners: ?{eventListeners: ?Array<!WebInspector.EventListener>, internalHandlers: ?WebInspector.RemoteArray}, isInternal: ?Array<boolean>}>} |
+*/ |
+WebInspector.EventListenersResult; |
+ |
+/** |
* @constructor |
* @param {!Element} element |
*/ |
@@ -29,21 +34,96 @@ WebInspector.EventListenersView.prototype = { |
*/ |
addObjects: function(objects) |
{ |
+ this.reset(); |
var promises = []; |
- for (var i = 0; i < objects.length; ++i) |
- promises.push(objects[i].eventListeners()); |
- return Promise.all(promises).then(listenersCallback.bind(this)); |
+ for (var object of objects) |
+ promises.push(this._addObject(object)); |
+ return Promise.all(promises).then(this.addEmptyHolderIfNeeded.bind(this)).then(this._eventListenersArrivedForTest.bind(this)); |
+ }, |
+ |
+ /** |
+ * @param {!WebInspector.RemoteObject} object |
+ * @return {!Promise<undefined>} |
+ */ |
+ _addObject: function(object) |
+ { |
+ /** @type {?Array<!WebInspector.EventListener>} */ |
+ var eventListeners = null; |
+ /** @type {?WebInspector.FrameworkEventListenersObject}*/ |
+ var frameworkEventListenersObject = null; |
+ |
+ var promises = []; |
+ promises.push(object.eventListeners().then(storeEventListeners)); |
+ promises.push(WebInspector.EventListener.frameworkEventListeners(object).then(storeFrameworkEventListenersObject)); |
+ return Promise.all(promises).then(markInternalEventListeners).then(addEventListeners.bind(this)); |
+ |
+ /** |
+ * @param {?Array<!WebInspector.EventListener>} result |
+ */ |
+ function storeEventListeners(result) |
+ { |
+ eventListeners = result; |
+ } |
+ |
+ /** |
+ * @param {?WebInspector.FrameworkEventListenersObject} result |
+ */ |
+ function storeFrameworkEventListenersObject(result) |
+ { |
+ frameworkEventListenersObject = result; |
+ } |
+ |
+ /** |
+ * @return {!Promise<undefined>} |
+ */ |
+ function markInternalEventListeners() |
+ { |
+ if (!eventListeners || !frameworkEventListenersObject.internalHandlers) |
+ return Promise.resolve(undefined); |
+ return frameworkEventListenersObject.internalHandlers.object().callFunctionJSONPromise(isInternalEventListener, eventListeners.map(handlerArgument)).then(setIsInternal); |
+ |
+ /** |
+ * @param {!WebInspector.EventListener} listener |
+ * @return {!RuntimeAgent.CallArgument} |
+ */ |
+ function handlerArgument(listener) |
+ { |
+ return WebInspector.RemoteObject.toCallArgument(listener.handler()); |
+ } |
+ |
+ /** |
+ * @suppressReceiverCheck |
+ * @return {!Array<boolean>} |
+ * @this {Array<*>} |
+ */ |
+ function isInternalEventListener() |
+ { |
+ var isInternal = []; |
+ var internalHandlersSet = new Set(this); |
+ for (var handler of arguments) |
+ isInternal.push(internalHandlersSet.has(handler)); |
+ return isInternal; |
+ } |
+ |
+ /** |
+ * @param {!Array<boolean>} isInternal |
+ */ |
+ function setIsInternal(isInternal) |
+ { |
+ for (var i = 0; i < eventListeners.length; ++i) { |
+ if (isInternal[i]) |
+ eventListeners[i].setListenerType("frameworkInternal"); |
+ } |
+ } |
+ } |
+ |
/** |
- * @param {!Array<?Array<!WebInspector.EventListener>>} listeners |
* @this {WebInspector.EventListenersView} |
*/ |
- function listenersCallback(listeners) |
+ function addEventListeners() |
{ |
- this.reset(); |
- for (var i = 0; i < listeners.length; ++i) |
- this._addObjectEventListeners(objects[i], listeners[i]); |
- this.addEmptyHolderIfNeeded(); |
- this._eventListenersArrivedForTest(); |
+ this._addObjectEventListeners(object, eventListeners); |
+ this._addObjectEventListeners(object, frameworkEventListenersObject.eventListeners); |
} |
}, |
@@ -62,6 +142,25 @@ WebInspector.EventListenersView.prototype = { |
}, |
/** |
+ * @param {boolean} showFramework |
+ */ |
+ showFrameworkListeners: function(showFramework) |
+ { |
+ var eventTypes = this._treeOutline.rootElement().children(); |
+ for (var eventType of eventTypes) { |
+ for (var listenerElement of eventType.children()) { |
+ var listenerType = listenerElement.eventListener().listenerType(); |
+ var hidden = false; |
+ if (listenerType === "frameworkUser" && !showFramework) |
+ hidden = true; |
+ if (listenerType === "frameworkInternal" && showFramework) |
+ hidden = true; |
+ listenerElement.hidden = hidden; |
+ } |
+ } |
+ }, |
+ |
+ /** |
* @param {string} type |
* @return {!WebInspector.EventListenersTreeElement} |
*/ |
@@ -174,5 +273,13 @@ WebInspector.ObjectEventListenerBar.prototype = { |
title.appendChild(WebInspector.ObjectPropertiesSection.createValueElement(object, false)); |
}, |
+ /** |
+ * @return {!WebInspector.EventListener} |
+ */ |
+ eventListener: function() |
+ { |
+ return this._eventListener; |
+ }, |
+ |
__proto__: TreeElement.prototype |
-} |
+} |