OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
| 6 * @typedef {Array<{object: !WebInspector.RemoteObject, eventListeners: ?Array<!W
ebInspector.EventListener>, frameworkEventListeners: ?{eventListeners: ?Array<!W
ebInspector.EventListener>, internalHandlers: ?WebInspector.RemoteArray}, isInte
rnal: ?Array<boolean>}>} |
| 7 */ |
| 8 WebInspector.EventListenersResult; |
| 9 |
| 10 /** |
6 * @constructor | 11 * @constructor |
7 * @param {!Element} element | 12 * @param {!Element} element |
8 */ | 13 */ |
9 WebInspector.EventListenersView = function(element) | 14 WebInspector.EventListenersView = function(element) |
10 { | 15 { |
11 this._element = element; | 16 this._element = element; |
12 this._treeOutline = new TreeOutlineInShadow("event-listener-tree"); | 17 this._treeOutline = new TreeOutlineInShadow("event-listener-tree"); |
13 this._treeOutline.registerRequiredCSS("components/objectValue.css"); | 18 this._treeOutline.registerRequiredCSS("components/objectValue.css"); |
14 this._treeOutline.registerRequiredCSS("components/eventListenersView.css"); | 19 this._treeOutline.registerRequiredCSS("components/eventListenersView.css"); |
15 this._treeOutline.setComparator(WebInspector.EventListenersTreeElement.compa
rator); | 20 this._treeOutline.setComparator(WebInspector.EventListenersTreeElement.compa
rator); |
16 this._treeOutline.element.classList.add("monospace"); | 21 this._treeOutline.element.classList.add("monospace"); |
17 this._element.appendChild(this._treeOutline.element) | 22 this._element.appendChild(this._treeOutline.element) |
18 this._emptyHolder = createElementWithClass("div", "info"); | 23 this._emptyHolder = createElementWithClass("div", "info"); |
19 this._emptyHolder.textContent = WebInspector.UIString("No Event Listeners"); | 24 this._emptyHolder.textContent = WebInspector.UIString("No Event Listeners"); |
20 this._linkifier = new WebInspector.Linkifier(); | 25 this._linkifier = new WebInspector.Linkifier(); |
21 /** @type {!Map<string, !WebInspector.EventListenersTreeElement>} */ | 26 /** @type {!Map<string, !WebInspector.EventListenersTreeElement>} */ |
22 this._treeItemMap = new Map(); | 27 this._treeItemMap = new Map(); |
23 } | 28 } |
24 | 29 |
25 WebInspector.EventListenersView.prototype = { | 30 WebInspector.EventListenersView.prototype = { |
26 /** | 31 /** |
27 * @param {!Array<!WebInspector.RemoteObject>} objects | 32 * @param {!Array<!WebInspector.RemoteObject>} objects |
28 * @return {!Promise<undefined>} | 33 * @return {!Promise<undefined>} |
29 */ | 34 */ |
30 addObjects: function(objects) | 35 addObjects: function(objects) |
31 { | 36 { |
| 37 this.reset(); |
32 var promises = []; | 38 var promises = []; |
33 for (var i = 0; i < objects.length; ++i) | 39 for (var object of objects) |
34 promises.push(objects[i].eventListeners()); | 40 promises.push(this._addObject(object)); |
35 return Promise.all(promises).then(listenersCallback.bind(this)); | 41 return Promise.all(promises).then(this.addEmptyHolderIfNeeded.bind(this)
).then(this._eventListenersArrivedForTest.bind(this)); |
| 42 }, |
| 43 |
| 44 /** |
| 45 * @param {!WebInspector.RemoteObject} object |
| 46 * @return {!Promise<undefined>} |
| 47 */ |
| 48 _addObject: function(object) |
| 49 { |
| 50 /** @type {?Array<!WebInspector.EventListener>} */ |
| 51 var eventListeners = null; |
| 52 /** @type {?WebInspector.FrameworkEventListenersObject}*/ |
| 53 var frameworkEventListenersObject = null; |
| 54 |
| 55 var promises = []; |
| 56 promises.push(object.eventListeners().then(storeEventListeners)); |
| 57 promises.push(WebInspector.EventListener.frameworkEventListeners(object)
.then(storeFrameworkEventListenersObject)); |
| 58 return Promise.all(promises).then(markInternalEventListeners).then(addEv
entListeners.bind(this)); |
| 59 |
36 /** | 60 /** |
37 * @param {!Array<?Array<!WebInspector.EventListener>>} listeners | 61 * @param {?Array<!WebInspector.EventListener>} result |
| 62 */ |
| 63 function storeEventListeners(result) |
| 64 { |
| 65 eventListeners = result; |
| 66 } |
| 67 |
| 68 /** |
| 69 * @param {?WebInspector.FrameworkEventListenersObject} result |
| 70 */ |
| 71 function storeFrameworkEventListenersObject(result) |
| 72 { |
| 73 frameworkEventListenersObject = result; |
| 74 } |
| 75 |
| 76 /** |
| 77 * @return {!Promise<undefined>} |
| 78 */ |
| 79 function markInternalEventListeners() |
| 80 { |
| 81 if (!eventListeners || !frameworkEventListenersObject.internalHandle
rs) |
| 82 return Promise.resolve(undefined); |
| 83 return frameworkEventListenersObject.internalHandlers.object().callF
unctionJSONPromise(isInternalEventListener, eventListeners.map(handlerArgument))
.then(setIsInternal); |
| 84 |
| 85 /** |
| 86 * @param {!WebInspector.EventListener} listener |
| 87 * @return {!RuntimeAgent.CallArgument} |
| 88 */ |
| 89 function handlerArgument(listener) |
| 90 { |
| 91 return WebInspector.RemoteObject.toCallArgument(listener.handler
()); |
| 92 } |
| 93 |
| 94 /** |
| 95 * @suppressReceiverCheck |
| 96 * @return {!Array<boolean>} |
| 97 * @this {Array<*>} |
| 98 */ |
| 99 function isInternalEventListener() |
| 100 { |
| 101 var isInternal = []; |
| 102 var internalHandlersSet = new Set(this); |
| 103 for (var handler of arguments) |
| 104 isInternal.push(internalHandlersSet.has(handler)); |
| 105 return isInternal; |
| 106 } |
| 107 |
| 108 /** |
| 109 * @param {!Array<boolean>} isInternal |
| 110 */ |
| 111 function setIsInternal(isInternal) |
| 112 { |
| 113 for (var i = 0; i < eventListeners.length; ++i) { |
| 114 if (isInternal[i]) |
| 115 eventListeners[i].setListenerType("frameworkInternal"); |
| 116 } |
| 117 } |
| 118 } |
| 119 |
| 120 /** |
38 * @this {WebInspector.EventListenersView} | 121 * @this {WebInspector.EventListenersView} |
39 */ | 122 */ |
40 function listenersCallback(listeners) | 123 function addEventListeners() |
41 { | 124 { |
42 this.reset(); | 125 this._addObjectEventListeners(object, eventListeners); |
43 for (var i = 0; i < listeners.length; ++i) | 126 this._addObjectEventListeners(object, frameworkEventListenersObject.
eventListeners); |
44 this._addObjectEventListeners(objects[i], listeners[i]); | |
45 this.addEmptyHolderIfNeeded(); | |
46 this._eventListenersArrivedForTest(); | |
47 } | 127 } |
48 }, | 128 }, |
49 | 129 |
50 /** | 130 /** |
51 * @param {!WebInspector.RemoteObject} object | 131 * @param {!WebInspector.RemoteObject} object |
52 * @param {?Array<!WebInspector.EventListener>} eventListeners | 132 * @param {?Array<!WebInspector.EventListener>} eventListeners |
53 */ | 133 */ |
54 _addObjectEventListeners: function(object, eventListeners) | 134 _addObjectEventListeners: function(object, eventListeners) |
55 { | 135 { |
56 if (!eventListeners) | 136 if (!eventListeners) |
57 return; | 137 return; |
58 for (var eventListener of eventListeners) { | 138 for (var eventListener of eventListeners) { |
59 var treeItem = this._getOrCreateTreeElementForType(eventListener.typ
e()); | 139 var treeItem = this._getOrCreateTreeElementForType(eventListener.typ
e()); |
60 treeItem.addObjectEventListener(eventListener, object); | 140 treeItem.addObjectEventListener(eventListener, object); |
61 } | 141 } |
62 }, | 142 }, |
63 | 143 |
64 /** | 144 /** |
| 145 * @param {boolean} showFramework |
| 146 */ |
| 147 showFrameworkListeners: function(showFramework) |
| 148 { |
| 149 var eventTypes = this._treeOutline.rootElement().children(); |
| 150 for (var eventType of eventTypes) { |
| 151 for (var listenerElement of eventType.children()) { |
| 152 var listenerType = listenerElement.eventListener().listenerType(
); |
| 153 var hidden = false; |
| 154 if (listenerType === "frameworkUser" && !showFramework) |
| 155 hidden = true; |
| 156 if (listenerType === "frameworkInternal" && showFramework) |
| 157 hidden = true; |
| 158 listenerElement.hidden = hidden; |
| 159 } |
| 160 } |
| 161 }, |
| 162 |
| 163 /** |
65 * @param {string} type | 164 * @param {string} type |
66 * @return {!WebInspector.EventListenersTreeElement} | 165 * @return {!WebInspector.EventListenersTreeElement} |
67 */ | 166 */ |
68 _getOrCreateTreeElementForType: function(type) | 167 _getOrCreateTreeElementForType: function(type) |
69 { | 168 { |
70 var treeItem = this._treeItemMap.get(type); | 169 var treeItem = this._treeItemMap.get(type); |
71 if (!treeItem) { | 170 if (!treeItem) { |
72 treeItem = new WebInspector.EventListenersTreeElement(type, this._li
nkifier); | 171 treeItem = new WebInspector.EventListenersTreeElement(type, this._li
nkifier); |
73 this._treeItemMap.set(type, treeItem); | 172 this._treeItemMap.set(type, treeItem); |
74 this._treeOutline.appendChild(treeItem); | 173 this._treeOutline.appendChild(treeItem); |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 * @param {!WebInspector.Linkifier} linkifier | 266 * @param {!WebInspector.Linkifier} linkifier |
168 */ | 267 */ |
169 _setTitle: function(object, linkifier) | 268 _setTitle: function(object, linkifier) |
170 { | 269 { |
171 var title = this.listItemElement.createChild("span"); | 270 var title = this.listItemElement.createChild("span"); |
172 var subtitle = this.listItemElement.createChild("span", "event-listener-
tree-subtitle"); | 271 var subtitle = this.listItemElement.createChild("span", "event-listener-
tree-subtitle"); |
173 subtitle.appendChild(linkifier.linkifyRawLocation(this._eventListener.lo
cation(), this._eventListener.sourceURL())); | 272 subtitle.appendChild(linkifier.linkifyRawLocation(this._eventListener.lo
cation(), this._eventListener.sourceURL())); |
174 title.appendChild(WebInspector.ObjectPropertiesSection.createValueElemen
t(object, false)); | 273 title.appendChild(WebInspector.ObjectPropertiesSection.createValueElemen
t(object, false)); |
175 }, | 274 }, |
176 | 275 |
| 276 /** |
| 277 * @return {!WebInspector.EventListener} |
| 278 */ |
| 279 eventListener: function() |
| 280 { |
| 281 return this._eventListener; |
| 282 }, |
| 283 |
177 __proto__: TreeElement.prototype | 284 __proto__: TreeElement.prototype |
178 } | 285 } |
OLD | NEW |