Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(117)

Side by Side Diff: Source/devtools/front_end/components/EventListenersView.js

Issue 1268353005: [DevTools] Support JQuery event listeners (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Implemented in frontend code Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698