Chromium Code Reviews| 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 |
| -} |
| +} |