Chromium Code Reviews| 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 * @constructor | 6 * @constructor |
| 7 * @param {!Element} element | 7 * @param {!Element} element |
| 8 */ | 8 */ |
| 9 WebInspector.EventListenersView = function(element) | 9 WebInspector.EventListenersView = function(element) |
| 10 { | 10 { |
| 11 this._element = element; | 11 this._element = element; |
| 12 this._treeOutline = new TreeOutlineInShadow("event-listener-tree"); | 12 this._treeOutline = new TreeOutlineInShadow("event-listener-tree"); |
| 13 this._treeOutline.registerRequiredCSS("components/objectValue.css"); | 13 this._treeOutline.registerRequiredCSS("components/objectValue.css"); |
| 14 this._treeOutline.registerRequiredCSS("components/eventListenersView.css"); | 14 this._treeOutline.registerRequiredCSS("components/eventListenersView.css"); |
| 15 this._treeOutline.setComparator(WebInspector.EventListenersTreeElement.compa rator); | 15 this._treeOutline.setComparator(WebInspector.EventListenersTreeElement.compa rator); |
| 16 this._treeOutline.element.classList.add("monospace"); | 16 this._treeOutline.element.classList.add("monospace"); |
| 17 this._element.appendChild(this._treeOutline.element) | 17 this._element.appendChild(this._treeOutline.element) |
| 18 this._emptyHolder = createElementWithClass("div", "info"); | 18 this._emptyHolder = createElementWithClass("div", "info"); |
| 19 this._emptyHolder.textContent = WebInspector.UIString("No Event Listeners"); | 19 this._emptyHolder.textContent = WebInspector.UIString("No Event Listeners"); |
| 20 this._linkifier = new WebInspector.Linkifier(); | 20 this._linkifier = new WebInspector.Linkifier(); |
| 21 /** @type {!Map<string, !WebInspector.EventListenersTreeElement>} */ | 21 /** @type {!Map<string, !WebInspector.EventListenersTreeElement>} */ |
| 22 this._treeItemMap = new Map(); | 22 this._treeItemMap = new Map(); |
| 23 /** @type {!Array<!TreeElement>} */ | |
| 24 this._listenerTreeElements = []; | |
| 23 } | 25 } |
| 24 | 26 |
| 25 WebInspector.EventListenersView.prototype = { | 27 WebInspector.EventListenersView.prototype = { |
| 26 /** | 28 /** |
| 27 * @param {!Array<!WebInspector.RemoteObject>} objects | 29 * @param {!Array<!WebInspector.RemoteObject>} objects |
| 28 * @return {!Promise<undefined>} | 30 * @return {!Promise<undefined>} |
| 29 */ | 31 */ |
| 30 addObjects: function(objects) | 32 addObjects: function(objects) |
| 31 { | 33 { |
| 32 var promises = []; | 34 var promises = []; |
| 33 for (var i = 0; i < objects.length; ++i) | 35 for (var i = 0; i < objects.length; ++i) { |
| 34 promises.push(objects[i].eventListeners()); | 36 promises.push(objects[i].eventListeners()); |
| 37 promises.push(objects[i].frameworkEventListeners(devtoolsFrameworkEv entListeners)); | |
|
pfeldman
2015/08/24 23:29:43
Where is this global method defined?
| |
| 38 promises.push(objects[i].frameworkInternalEventHandlers(devtoolsFram eworkInternalHandlers)); | |
|
pfeldman
2015/08/24 23:29:43
ditto
| |
| 39 } | |
| 35 return Promise.all(promises).then(listenersCallback.bind(this)); | 40 return Promise.all(promises).then(listenersCallback.bind(this)); |
| 36 /** | 41 /** |
| 37 * @param {!Array<?Array<!WebInspector.EventListener>>} listeners | 42 * @param {!Array<?Array<!WebInspector.EventListener>|!WebInspector.Remo teObject>} listeners |
| 38 * @this {WebInspector.EventListenersView} | 43 * @this {WebInspector.EventListenersView} |
| 39 */ | 44 */ |
| 40 function listenersCallback(listeners) | 45 function listenersCallback(listeners) |
| 41 { | 46 { |
| 42 this.reset(); | 47 this.reset(); |
| 43 for (var i = 0; i < listeners.length; ++i) | 48 var promises = []; |
| 44 this._addObjectEventListeners(objects[i], listeners[i]); | 49 for (var i = 0; i < listeners.length / 3; ++i) |
| 45 this.addEmptyHolderIfNeeded(); | 50 promises.push(this._addObjectPromise.call(this, objects[i], |
|
pfeldman
2015/08/24 23:29:43
How do you encode the listeners? Please provide sc
| |
| 46 this._eventListenersArrivedForTest(); | 51 /** @type {?Array<!WebInspector.EventListener>} */(listeners [i * 3]), |
| 52 /** @type {?Array<!WebInspector.EventListener>} */(listeners [i * 3 + 1]), | |
| 53 /** @type {?WebInspector.RemoteObject} */(listeners[i * 3 + 2]))); | |
| 54 | |
| 55 return Promise.all(promises).then(finish.bind(this)); | |
| 56 | |
| 57 /** | |
| 58 * @this {WebInspector.EventListenersView} | |
| 59 */ | |
| 60 function finish() | |
| 61 { | |
| 62 this.addEmptyHolderIfNeeded(); | |
| 63 this._eventListenersArrivedForTest(); | |
| 64 } | |
| 47 } | 65 } |
| 48 }, | 66 }, |
| 49 | 67 |
| 50 /** | 68 /** |
| 51 * @param {!WebInspector.RemoteObject} object | 69 * @param {!WebInspector.RemoteObject} object |
| 52 * @param {?Array<!WebInspector.EventListener>} eventListeners | 70 * @param {?Array<!WebInspector.EventListener>} listeners |
| 71 * @param {?Array<!WebInspector.EventListener>} frameworkListeners | |
| 72 * @param {?WebInspector.RemoteObject} frameworkInternalHandlers | |
| 73 * @return {!Promise<undefined>} | |
| 53 */ | 74 */ |
| 54 _addObjectEventListeners: function(object, eventListeners) | 75 _addObjectPromise: function(object, listeners, frameworkListeners, framework InternalHandlers) |
| 55 { | 76 { |
| 56 if (!eventListeners) | 77 return new Promise(promiseConstructor.bind(this)); |
| 57 return; | 78 |
| 58 for (var eventListener of eventListeners) { | 79 /** |
| 59 var treeItem = this._getOrCreateTreeElementForType(eventListener.typ e()); | 80 * @param {function(?)} fulfill |
| 60 treeItem.addObjectEventListener(eventListener, object); | 81 * @param {function(*)} reject |
| 82 * @this {WebInspector.EventListenersView} | |
| 83 */ | |
| 84 function promiseConstructor(fulfill, reject) | |
| 85 { | |
| 86 var promises = []; | |
| 87 for (var i = 0; i < listeners.length; ++i) | |
| 88 promises.push(frameworkInternalHandlers.callFunctionJSONPromise( hasInSet, [WebInspector.RemoteObject.toCallArgument(listeners[i].handler())]).th en(add.bind(this, "normal", listeners[i]))); | |
|
pfeldman
2015/08/24 23:29:43
This is hard to parse, could you refactor this? It
| |
| 89 for (var i = 0; i < frameworkListeners.length; ++i) | |
| 90 promises.push(Promise.resolve().then(add.bind(this, "frameworkUs er", frameworkListeners[i]))); | |
| 91 Promise.all(promises).then(fulfill); | |
| 92 | |
| 93 /** | |
| 94 * @suppressReceiverCheck | |
| 95 * @this {Object} | |
| 96 */ | |
| 97 function hasInSet(f) | |
| 98 { | |
| 99 return this.has(f); | |
| 100 } | |
| 101 | |
| 102 /** | |
| 103 * @param {string} type | |
| 104 * @param {!WebInspector.EventListener} listener | |
| 105 * @param {*} isInternal | |
| 106 * @this {WebInspector.EventListenersView} | |
| 107 */ | |
| 108 function add(type, listener, isInternal) | |
| 109 { | |
| 110 var treeItem = this._getOrCreateTreeElementForType(listener.type ()); | |
| 111 this._listenerTreeElements.push(treeItem.addObjectEventListener( listener, object, !isInternal ? type : "frameworkInternal")); | |
| 112 return treeItem; | |
| 113 } | |
| 61 } | 114 } |
| 62 }, | 115 }, |
| 63 | 116 |
| 117 /** | |
| 118 * @param {boolean} showUserListeners | |
| 119 */ | |
| 120 showFrameworkUserEventListeners: function(showUserListeners) | |
| 121 { | |
| 122 for (var listenerTreeElement of this._listenerTreeElements) { | |
| 123 var listenerType = listenerTreeElement.listenerType(); | |
| 124 var hidden = false; | |
| 125 if (listenerType === "frameworkUser" && !showUserListeners) | |
| 126 hidden = true; | |
| 127 if (listenerType === "frameworkInternal" && showUserListeners) | |
| 128 hidden = true; | |
| 129 listenerTreeElement.hidden = hidden; | |
| 130 } | |
| 131 }, | |
| 132 | |
| 64 /** | 133 /** |
| 65 * @param {string} type | 134 * @param {string} type |
| 66 * @return {!WebInspector.EventListenersTreeElement} | 135 * @return {!WebInspector.EventListenersTreeElement} |
| 67 */ | 136 */ |
| 68 _getOrCreateTreeElementForType: function(type) | 137 _getOrCreateTreeElementForType: function(type) |
| 69 { | 138 { |
| 70 var treeItem = this._treeItemMap.get(type); | 139 var treeItem = this._treeItemMap.get(type); |
| 71 if (!treeItem) { | 140 if (!treeItem) { |
| 72 treeItem = new WebInspector.EventListenersTreeElement(type, this._li nkifier); | 141 treeItem = new WebInspector.EventListenersTreeElement(type, this._li nkifier); |
| 73 this._treeItemMap.set(type, treeItem); | 142 this._treeItemMap.set(type, treeItem); |
| 74 this._treeOutline.appendChild(treeItem); | 143 this._treeOutline.appendChild(treeItem); |
| 75 this._emptyHolder.remove(); | 144 this._emptyHolder.remove(); |
| 76 } | 145 } |
| 77 return treeItem; | 146 return treeItem; |
| 78 }, | 147 }, |
| 79 | 148 |
| 80 addEmptyHolderIfNeeded: function() | 149 addEmptyHolderIfNeeded: function() |
| 81 { | 150 { |
| 82 if (!this._treeOutline.firstChild() && !this._emptyHolder.parentNode) | 151 if (!this._treeOutline.firstChild() && !this._emptyHolder.parentNode) |
| 83 this._element.appendChild(this._emptyHolder); | 152 this._element.appendChild(this._emptyHolder); |
| 84 }, | 153 }, |
| 85 | 154 |
| 86 reset: function() | 155 reset: function() |
| 87 { | 156 { |
| 88 this._treeItemMap = new Map(); | 157 this._treeItemMap = new Map(); |
| 158 this._listenerTreeElements = []; | |
| 89 this._treeOutline.removeChildren(); | 159 this._treeOutline.removeChildren(); |
| 90 this._linkifier.reset(); | 160 this._linkifier.reset(); |
| 91 }, | 161 }, |
| 92 | 162 |
| 93 _eventListenersArrivedForTest: function() | 163 _eventListenersArrivedForTest: function() |
| 94 { | 164 { |
| 95 } | 165 } |
| 96 } | 166 } |
| 97 | 167 |
| 98 /** | 168 /** |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 117 WebInspector.EventListenersTreeElement.comparator = function(element1, element2) { | 187 WebInspector.EventListenersTreeElement.comparator = function(element1, element2) { |
| 118 if (element1.title === element2.title) | 188 if (element1.title === element2.title) |
| 119 return 0; | 189 return 0; |
| 120 return element1.title > element2.title ? 1 : -1; | 190 return element1.title > element2.title ? 1 : -1; |
| 121 } | 191 } |
| 122 | 192 |
| 123 WebInspector.EventListenersTreeElement.prototype = { | 193 WebInspector.EventListenersTreeElement.prototype = { |
| 124 /** | 194 /** |
| 125 * @param {!WebInspector.EventListener} eventListener | 195 * @param {!WebInspector.EventListener} eventListener |
| 126 * @param {!WebInspector.RemoteObject} object | 196 * @param {!WebInspector.RemoteObject} object |
| 197 * @param {string} listenerType | |
| 198 * @return {!WebInspector.ObjectEventListenerBar} | |
| 127 */ | 199 */ |
| 128 addObjectEventListener: function(eventListener, object) | 200 addObjectEventListener: function(eventListener, object, listenerType) |
| 129 { | 201 { |
| 130 var treeElement = new WebInspector.ObjectEventListenerBar(eventListener, object, this._linkifier); | 202 var treeElement = new WebInspector.ObjectEventListenerBar(eventListener, object, this._linkifier, listenerType); |
| 131 this.appendChild(/** @type {!TreeElement} */ (treeElement)); | 203 this.appendChild(/** @type {!TreeElement} */ (treeElement)); |
| 204 return treeElement; | |
| 132 }, | 205 }, |
| 133 | 206 |
| 134 __proto__: TreeElement.prototype | 207 __proto__: TreeElement.prototype |
| 135 } | 208 } |
| 136 | 209 |
| 137 /** | 210 /** |
| 138 * @constructor | 211 * @constructor |
| 139 * @extends {TreeElement} | 212 * @extends {TreeElement} |
| 140 * @param {!WebInspector.EventListener} eventListener | 213 * @param {!WebInspector.EventListener} eventListener |
| 141 * @param {!WebInspector.RemoteObject} object | 214 * @param {!WebInspector.RemoteObject} object |
| 142 * @param {!WebInspector.Linkifier} linkifier | 215 * @param {!WebInspector.Linkifier} linkifier |
| 216 * @param {string} listenerType | |
| 143 */ | 217 */ |
| 144 WebInspector.ObjectEventListenerBar = function(eventListener, object, linkifier) | 218 WebInspector.ObjectEventListenerBar = function(eventListener, object, linkifier, listenerType) |
| 145 { | 219 { |
| 146 TreeElement.call(this, "", true); | 220 TreeElement.call(this, "", true); |
| 147 this._eventListener = eventListener; | 221 this._eventListener = eventListener; |
| 148 this.editable = false; | 222 this.editable = false; |
| 149 this.selectable = false; | 223 this.selectable = false; |
| 224 this._listenerType = listenerType; | |
| 150 this._setTitle(object, linkifier); | 225 this._setTitle(object, linkifier); |
| 151 } | 226 } |
| 152 | 227 |
| 153 WebInspector.ObjectEventListenerBar.prototype = { | 228 WebInspector.ObjectEventListenerBar.prototype = { |
| 154 onpopulate: function() | 229 onpopulate: function() |
| 155 { | 230 { |
| 156 var properties = []; | 231 var properties = []; |
| 157 var eventListener = this._eventListener; | 232 var eventListener = this._eventListener; |
| 158 var runtimeModel = eventListener.target().runtimeModel; | 233 var runtimeModel = eventListener.target().runtimeModel; |
| 159 properties.push(runtimeModel.createRemotePropertyFromPrimitiveValue("use Capture", eventListener.useCapture())); | 234 properties.push(runtimeModel.createRemotePropertyFromPrimitiveValue("use Capture", eventListener.useCapture())); |
| 160 if (typeof eventListener.handler() !== "undefined") | 235 if (typeof eventListener.handler() !== "undefined") |
| 161 properties.push(new WebInspector.RemoteObjectProperty("handler", eve ntListener.handler())); | 236 properties.push(new WebInspector.RemoteObjectProperty("handler", eve ntListener.handler())); |
| 162 WebInspector.ObjectPropertyTreeElement.populateWithProperties(this, prop erties, [], true, null); | 237 WebInspector.ObjectPropertyTreeElement.populateWithProperties(this, prop erties, [], true, null); |
| 163 }, | 238 }, |
| 164 | 239 |
| 165 /** | 240 /** |
| 166 * @param {!WebInspector.RemoteObject} object | 241 * @param {!WebInspector.RemoteObject} object |
| 167 * @param {!WebInspector.Linkifier} linkifier | 242 * @param {!WebInspector.Linkifier} linkifier |
| 168 */ | 243 */ |
| 169 _setTitle: function(object, linkifier) | 244 _setTitle: function(object, linkifier) |
| 170 { | 245 { |
| 171 var title = this.listItemElement.createChild("span"); | 246 var title = this.listItemElement.createChild("span"); |
| 172 var subtitle = this.listItemElement.createChild("span", "event-listener- tree-subtitle"); | 247 var subtitle = this.listItemElement.createChild("span", "event-listener- tree-subtitle"); |
| 173 subtitle.appendChild(linkifier.linkifyRawLocation(this._eventListener.lo cation(), this._eventListener.sourceName())); | 248 subtitle.appendChild(linkifier.linkifyRawLocation(this._eventListener.lo cation(), this._eventListener.sourceName())); |
| 174 title.appendChild(WebInspector.ObjectPropertiesSection.createValueElemen t(object, false)); | 249 title.appendChild(WebInspector.ObjectPropertiesSection.createValueElemen t(object, false)); |
| 175 }, | 250 }, |
| 176 | 251 |
| 252 /** | |
| 253 * @return {string} | |
| 254 */ | |
| 255 listenerType: function() | |
| 256 { | |
| 257 return this._listenerType; | |
| 258 }, | |
| 259 | |
| 177 __proto__: TreeElement.prototype | 260 __proto__: TreeElement.prototype |
| 178 } | 261 } |
| OLD | NEW |