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..e97e6b63039b8894dfb2b9c782562e5da3d9fd31 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 |
*/ |
@@ -30,20 +35,104 @@ WebInspector.EventListenersView.prototype = { |
addObjects: function(objects) |
{ |
var promises = []; |
- for (var i = 0; i < objects.length; ++i) |
- promises.push(objects[i].eventListeners()); |
- return Promise.all(promises).then(listenersCallback.bind(this)); |
- /** |
- * @param {!Array<?Array<!WebInspector.EventListener>>} listeners |
+ var results = []; |
+ for (var i = 0; i < objects.length; ++i) { |
+ var result = {object: objects[i]}; |
pfeldman
2015/09/03 18:56:35
Why are you creating these one-time objects? Is th
|
+ results.push(result); |
+ // Fill result object with eventListeners and frameworkEventListeners. |
+ promises.push(objects[i].eventListeners().then(storeResultTo.bind(null, result, "eventListeners"))); |
pfeldman
2015/09/03 18:56:35
Please delete this utility function and do not use
|
+ promises.push(WebInspector.EventListener.frameworkEventListeners(objects[i]) |
+ .then(storeResultTo.bind(null, result, "frameworkEventListeners"))); |
+ } |
+ return Promise.all(promises).then(listenersCallback.bind(this, results)); |
+ /** |
+ * @param {!WebInspector.EventListenersResult} results |
* @this {WebInspector.EventListenersView} |
*/ |
- function listenersCallback(listeners) |
+ function listenersCallback(results) |
pfeldman
2015/09/03 18:56:35
Please do not append "Callback" to the end of ever
|
{ |
this.reset(); |
- for (var i = 0; i < listeners.length; ++i) |
- this._addObjectEventListeners(objects[i], listeners[i]); |
+ |
+ // set isInternal flag for framework internal event listeners |
+ var promises = []; |
+ for (var result of results) { |
+ var frameworkInternalHandlers = result.frameworkEventListeners.internalHandlers; |
+ if (frameworkInternalHandlers) { |
+ var listenersHandler = result.eventListeners.map(handlerArgument); |
+ promises.push(frameworkInternalHandlers.object().callFunctionJSONPromise(internalFlags, listenersHandler) |
pfeldman
2015/09/03 18:56:35
Why is there asynchrony even after you have event
|
+ .then(setIsInternal.bind(null, result.eventListeners))); |
+ } |
+ } |
+ |
+ /** |
+ * @param {!WebInspector.EventListener} listener |
+ * @return {!RuntimeAgent.CallArgument} |
+ */ |
+ function handlerArgument(listener) |
+ { |
+ return WebInspector.RemoteObject.toCallArgument(listener.handler()); |
pfeldman
2015/09/03 18:56:35
Why do we have to do this again?
|
+ } |
+ |
+ /** |
+ * @suppressReceiverCheck |
+ * @return {!Array<boolean>} |
+ * @this {Array<*>} |
+ */ |
+ function internalFlags() |
+ { |
+ var isInternal = []; |
+ var internalHandlersSet = new Set(this); |
+ for (var handler of arguments) |
+ isInternal.push(internalHandlersSet.has(handler)); |
+ return isInternal; |
+ } |
+ |
+ /** |
+ * @param {!Array<!WebInspector.EventListener>} eventListeners |
+ * @param {!Array<boolean>} isInternal |
+ */ |
+ function setIsInternal(eventListeners, isInternal) |
+ { |
+ for (var i = 0; i < eventListeners.length; ++i) { |
+ if (isInternal[i]) |
+ eventListeners[i].setListenerType("frameworkInternal"); |
+ } |
+ } |
+ |
+ return Promise.all(promises).then(addResults.bind(this, results)); |
+ } |
+ |
+ /** |
+ * @param {!WebInspector.EventListenersResult} results |
+ * @this {WebInspector.EventListenersView} |
+ */ |
+ function addResults(results) |
+ { |
+ for (var result of results) { |
+ this._addObjectEventListeners(result.object, result.eventListeners); |
+ this._addObjectEventListeners(result.object, result.frameworkEventListeners.eventListeners); |
+ } |
this.addEmptyHolderIfNeeded(); |
this._eventListenersArrivedForTest(); |
+ } |
+ }, |
+ |
+ /** |
+ * @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; |
+ } |
} |
}, |
@@ -174,5 +263,13 @@ WebInspector.ObjectEventListenerBar.prototype = { |
title.appendChild(WebInspector.ObjectPropertiesSection.createValueElement(object, false)); |
}, |
+ /** |
+ * @return {!WebInspector.EventListener} |
+ */ |
+ eventListener: function() |
+ { |
+ return this._eventListener; |
+ }, |
+ |
__proto__: TreeElement.prototype |
-} |
+} |