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

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/components/DOMBreakpointsSidebarPane.js

Issue 2191183003: DevTools: extract model from DOMBreakpointsSidebarPane (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address CL feedback from PS6 Created 4 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 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 18 matching lines...) Expand all
29 */ 29 */
30 30
31 /** 31 /**
32 * @constructor 32 * @constructor
33 * @extends {WebInspector.BreakpointsSidebarPaneBase} 33 * @extends {WebInspector.BreakpointsSidebarPaneBase}
34 * @implements {WebInspector.ContextFlavorListener} 34 * @implements {WebInspector.ContextFlavorListener}
35 */ 35 */
36 WebInspector.DOMBreakpointsSidebarPane = function() 36 WebInspector.DOMBreakpointsSidebarPane = function()
37 { 37 {
38 WebInspector.BreakpointsSidebarPaneBase.call(this); 38 WebInspector.BreakpointsSidebarPaneBase.call(this);
39 this.registerRequiredCSS("components/breakpointsList.css");
39 this._domBreakpointsSetting = WebInspector.settings.createLocalSetting("domB reakpoints", []); 40 this._domBreakpointsSetting = WebInspector.settings.createLocalSetting("domB reakpoints", []);
40 this.listElement.classList.add("dom-breakpoints-list"); 41 this.listElement.classList.add("dom-breakpoints-list");
41 42
42 this._breakpointElements = {}; 43 /** @type {!Map<string, !Element>} */
44 this._breakpointElements = new Map();
43 45
44 this._breakpointTypes = { 46 WebInspector.domBreakpointManager.addEventListener(WebInspector.DOMBreakpoin tManager.Events.BreakpointsChanged, this._reloadBreakpointElements, this);
45 SubtreeModified: "subtree-modified",
46 AttributeModified: "attribute-modified",
47 NodeRemoved: "node-removed"
48 };
49 this._breakpointTypeLabels = {};
50 this._breakpointTypeLabels[this._breakpointTypes.SubtreeModified] = WebInspe ctor.UIString("Subtree Modified");
51 this._breakpointTypeLabels[this._breakpointTypes.AttributeModified] = WebIns pector.UIString("Attribute Modified");
52 this._breakpointTypeLabels[this._breakpointTypes.NodeRemoved] = WebInspector .UIString("Node Removed");
53
54 this._contextMenuLabels = {};
55 this._contextMenuLabels[this._breakpointTypes.SubtreeModified] = WebInspecto r.UIString.capitalize("Subtree ^modifications");
56 this._contextMenuLabels[this._breakpointTypes.AttributeModified] = WebInspec tor.UIString.capitalize("Attributes ^modifications");
57 this._contextMenuLabels[this._breakpointTypes.NodeRemoved] = WebInspector.UI String.capitalize("Node ^removal");
58
59 WebInspector.targetManager.addModelListener(WebInspector.DOMModel, WebInspec tor.DOMModel.Events.NodeRemoved, this._nodeRemoved, this);
60 WebInspector.targetManager.addEventListener(WebInspector.TargetManager.Event s.InspectedURLChanged, this._inspectedURLChanged, this);
61 this._inspectedURL = WebInspector.targetManager.inspectedURL();
62 this._update(); 47 this._update();
48 this._reloadBreakpointElements();
63 } 49 }
64 50
65 WebInspector.DOMBreakpointsSidebarPane.Marker = "breakpoint-marker";
66
67 WebInspector.DOMBreakpointsSidebarPane.prototype = { 51 WebInspector.DOMBreakpointsSidebarPane.prototype = {
68 _inspectedURLChanged: function() 52 _reloadBreakpointElements: function()
69 { 53 {
70 this._breakpointElements = {}; 54 this._breakpointElements.clear();
71 this.reset(); 55 this.reset();
72 this._inspectedURL = WebInspector.targetManager.inspectedURL(); 56 var breakpoints = WebInspector.domBreakpointManager.domBreakpoints();
73 }, 57 for (var breakpoint of breakpoints) {
74 58 var id = this._createBreakpointId(breakpoint.node.id, breakpoint.typ e);
75 /** 59 this._breakpointElements.set(id, this._createBreakpointElement(break point.node, breakpoint.type, breakpoint.enabled));
76 * @param {!WebInspector.DOMNode} node
77 * @param {!WebInspector.ContextMenu} contextMenu
78 * @param {boolean} createSubMenu
79 */
80 populateNodeContextMenu: function(node, contextMenu, createSubMenu)
81 {
82 if (node.pseudoType())
83 return;
84
85 var nodeBreakpoints = this._nodeBreakpoints(node);
86
87 /**
88 * @param {!DOMDebuggerAgent.DOMBreakpointType} type
89 * @this {WebInspector.DOMBreakpointsSidebarPane}
90 */
91 function toggleBreakpoint(type)
92 {
93 if (!nodeBreakpoints[type])
94 this._setBreakpoint(node, type, true);
95 else
96 this._removeBreakpoint(node, type);
97 this._saveBreakpoints();
98 }
99
100 var breakpointsMenu = createSubMenu ? contextMenu.appendSubMenuItem(WebI nspector.UIString("Break on...")) : contextMenu;
101 for (var key in this._breakpointTypes) {
102 var type = this._breakpointTypes[key];
103 var label = this._contextMenuLabels[type];
104 breakpointsMenu.appendCheckboxItem(label, toggleBreakpoint.bind(this , type), nodeBreakpoints[type]);
105 } 60 }
106 }, 61 },
107 62
108 /**
109 * @param {!WebInspector.DOMNode} node
110 * @return {!Object<string, boolean>}
111 */
112 _nodeBreakpoints: function(node)
113 {
114 var nodeBreakpoints = {};
115 for (var id in this._breakpointElements) {
116 var element = this._breakpointElements[id];
117 if (element._node === node && element._checkboxElement.checked)
118 nodeBreakpoints[element._type] = true;
119 }
120 return nodeBreakpoints;
121 },
122
123 /**
124 * @param {!WebInspector.DOMNode} node
125 * @return {boolean}
126 */
127 hasBreakpoints: function(node)
128 {
129 for (var id in this._breakpointElements) {
130 var element = this._breakpointElements[id];
131 if (element._node === node && element._checkboxElement.checked)
132 return true;
133 }
134 return false;
135 },
136
137 /**
138 * @param {!WebInspector.DebuggerPausedDetails} details
139 * @return {!Element}
140 */
141 createBreakpointHitStatusMessage: function(details)
142 {
143 var auxData = /** @type {!Object} */ (details.auxData);
144 var message = "Paused on a \"%s\" breakpoint.";
145 var substitutions = [];
146 substitutions.push(this._breakpointTypeLabels[auxData["type"]]);
147
148 var domModel = WebInspector.DOMModel.fromTarget(details.target());
149 if (!domModel)
150 return WebInspector.formatLocalized(message, substitutions);
151
152 var node = domModel.nodeForId(auxData["nodeId"]);
153 var linkifiedNode = WebInspector.DOMPresentationUtils.linkifyNodeReferen ce(node);
154 substitutions.push(linkifiedNode);
155
156 var targetNode = auxData["targetNodeId"] ? domModel.nodeForId(auxData["t argetNodeId"]) : null;
157 var targetNodeLink = targetNode ? WebInspector.DOMPresentationUtils.link ifyNodeReference(targetNode) : "";
158
159 if (auxData.type === this._breakpointTypes.SubtreeModified) {
160 if (auxData["insertion"]) {
161 if (targetNode !== node) {
162 message = "Paused on a \"%s\" breakpoint set on %s, because a new child was added to its descendant %s.";
163 substitutions.push(targetNodeLink);
164 } else
165 message = "Paused on a \"%s\" breakpoint set on %s, because a new child was added to that node.";
166 } else {
167 message = "Paused on a \"%s\" breakpoint set on %s, because its descendant %s was removed.";
168 substitutions.push(targetNodeLink);
169 }
170 } else {
171 message = "Paused on a \"%s\" breakpoint set on %s.";
172 }
173
174 return WebInspector.formatLocalized(message, substitutions);
175 },
176
177 _nodeRemoved: function(event)
178 {
179 var node = event.data.node;
180 this._removeBreakpointsForNode(event.data.node);
181 var children = node.children();
182 if (!children)
183 return;
184 for (var i = 0; i < children.length; ++i)
185 this._removeBreakpointsForNode(children[i]);
186 this._saveBreakpoints();
187 },
188
189 /**
190 * @param {!WebInspector.DOMNode} node
191 */
192 _removeBreakpointsForNode: function(node)
193 {
194 for (var id in this._breakpointElements) {
195 var element = this._breakpointElements[id];
196 if (element._node === node)
197 this._removeBreakpoint(element._node, element._type);
198 }
199 },
200
201 /** 63 /**
202 * @param {!WebInspector.DOMNode} node 64 * @param {!WebInspector.DOMNode} node
203 * @param {!DOMDebuggerAgent.DOMBreakpointType} type 65 * @param {!DOMDebuggerAgent.DOMBreakpointType} type
204 * @param {boolean} enabled 66 * @param {boolean} enabled
205 */ 67 */
206 _setBreakpoint: function(node, type, enabled)
207 {
208 var breakpointId = this._createBreakpointId(node.id, type);
209 var breakpointElement = this._breakpointElements[breakpointId];
210 if (!breakpointElement) {
211 breakpointElement = this._createBreakpointElement(node, type, enable d);
212 this._breakpointElements[breakpointId] = breakpointElement;
213 } else {
214 breakpointElement._checkboxElement.checked = enabled;
215 }
216 if (enabled)
217 node.target().domdebuggerAgent().setDOMBreakpoint(node.id, type);
218 node.setMarker(WebInspector.DOMBreakpointsSidebarPane.Marker, true);
219 },
220
221 /**
222 * @param {!WebInspector.DOMNode} node
223 * @param {!DOMDebuggerAgent.DOMBreakpointType} type
224 * @param {boolean} enabled
225 */
226 _createBreakpointElement: function(node, type, enabled) 68 _createBreakpointElement: function(node, type, enabled)
227 { 69 {
228 var element = createElement("li"); 70 var element = createElement("li");
229 element._node = node; 71 element._node = node;
230 element._type = type; 72 element._type = type;
231 element.addEventListener("contextmenu", this._contextMenu.bind(this, nod e, type), true); 73 element.addEventListener("contextmenu", this._contextMenu.bind(this, nod e, type), true);
232 74
233 var checkboxLabel = createCheckboxLabel("", enabled); 75 var checkboxLabel = createCheckboxLabel("", enabled);
234 checkboxLabel.addEventListener("click", this._checkboxClicked.bind(this, node, type), false); 76 checkboxLabel.addEventListener("click", this._checkboxClicked.bind(this, node, type), false);
235 element._checkboxElement = checkboxLabel.checkboxElement; 77 element._checkboxElement = checkboxLabel.checkboxElement;
236 element.appendChild(checkboxLabel); 78 element.appendChild(checkboxLabel);
237 79
238 var labelElement = createElementWithClass("div", "dom-breakpoint"); 80 var labelElement = createElementWithClass("div", "dom-breakpoint");
239 element.appendChild(labelElement); 81 element.appendChild(labelElement);
240 82
241 var linkifiedNode = WebInspector.DOMPresentationUtils.linkifyNodeReferen ce(node); 83 var linkifiedNode = WebInspector.DOMPresentationUtils.linkifyNodeReferen ce(node);
242 linkifiedNode.classList.add("monospace"); 84 linkifiedNode.classList.add("monospace");
243 linkifiedNode.style.display = "block"; 85 linkifiedNode.style.display = "block";
244 labelElement.appendChild(linkifiedNode); 86 labelElement.appendChild(linkifiedNode);
245 87
246 var description = createElement("div"); 88 var description = createElement("div");
247 description.textContent = this._breakpointTypeLabels[type]; 89 description.textContent = WebInspector.DOMBreakpointsSidebarPane.Breakpo intTypeLabels[type];
248 labelElement.appendChild(description); 90 labelElement.appendChild(description);
249 91
250 var currentElement = this.listElement.firstChild; 92 var currentElement = this.listElement.firstChild;
251 while (currentElement) { 93 while (currentElement) {
252 if (currentElement._type && currentElement._type < element._type) 94 if (currentElement._type && currentElement._type < element._type)
253 break; 95 break;
254 currentElement = currentElement.nextSibling; 96 currentElement = currentElement.nextSibling;
255 } 97 }
256 this.addListElement(element, currentElement); 98 this.addListElement(element, currentElement);
257 return element; 99 return element;
258 }, 100 },
259 101
260 _removeAllBreakpoints: function()
261 {
262 for (var id in this._breakpointElements) {
263 var element = this._breakpointElements[id];
264 this._removeBreakpoint(element._node, element._type);
265 }
266 this._saveBreakpoints();
267 },
268
269 /** 102 /**
270 * @param {!WebInspector.DOMNode} node 103 * @param {!WebInspector.DOMNode} node
271 * @param {!DOMDebuggerAgent.DOMBreakpointType} type 104 * @param {!DOMDebuggerAgent.DOMBreakpointType} type
105 * @param {!Event} event
272 */ 106 */
273 _removeBreakpoint: function(node, type) 107 _checkboxClicked: function(node, type, event)
274 { 108 {
275 var breakpointId = this._createBreakpointId(node.id, type); 109 WebInspector.domBreakpointManager.setBreakpoint(node, type, event.target ["checkboxElement"].checked);
276 var element = this._breakpointElements[breakpointId];
277 if (!element)
278 return;
279
280 this.removeListElement(element);
281 delete this._breakpointElements[breakpointId];
282 if (element._checkboxElement.checked)
283 node.target().domdebuggerAgent().removeDOMBreakpoint(node.id, type);
284 node.setMarker(WebInspector.DOMBreakpointsSidebarPane.Marker, this.hasBr eakpoints(node) ? true : null);
285 }, 110 },
286 111
287 /** 112 /**
288 * @param {!WebInspector.DOMNode} node 113 * @param {!WebInspector.DOMNode} node
289 * @param {!DOMDebuggerAgent.DOMBreakpointType} type 114 * @param {!DOMDebuggerAgent.DOMBreakpointType} type
290 * @param {!Event} event 115 * @param {!Event} event
291 */ 116 */
292 _contextMenu: function(node, type, event) 117 _contextMenu: function(node, type, event)
293 { 118 {
294 var contextMenu = new WebInspector.ContextMenu(event); 119 var contextMenu = new WebInspector.ContextMenu(event);
295 120 var removeBreakpoint = () => WebInspector.domBreakpointManager.removeBre akpoint(node, type);
296 /** 121 contextMenu.appendItem(WebInspector.UIString.capitalize("Remove ^breakpo int"), removeBreakpoint);
297 * @this {WebInspector.DOMBreakpointsSidebarPane} 122 var removeAllBreakpoints = () => WebInspector.domBreakpointManager.remov eAllBreakpoints();
298 */ 123 contextMenu.appendItem(WebInspector.UIString.capitalize("Remove ^all DOM breakpoints"), removeAllBreakpoints);
299 function removeBreakpoint()
300 {
301 this._removeBreakpoint(node, type);
302 this._saveBreakpoints();
303 }
304 contextMenu.appendItem(WebInspector.UIString.capitalize("Remove ^breakpo int"), removeBreakpoint.bind(this));
305 contextMenu.appendItem(WebInspector.UIString.capitalize("Remove ^all DOM breakpoints"), this._removeAllBreakpoints.bind(this));
306 contextMenu.show(); 124 contextMenu.show();
307 }, 125 },
308 126
309 /** 127 /**
310 * @param {!WebInspector.DOMNode} node
311 * @param {!DOMDebuggerAgent.DOMBreakpointType} type
312 * @param {!Event} event
313 */
314 _checkboxClicked: function(node, type, event)
315 {
316 if (event.target.checked)
317 node.target().domdebuggerAgent().setDOMBreakpoint(node.id, type);
318 else
319 node.target().domdebuggerAgent().removeDOMBreakpoint(node.id, type);
320 this._saveBreakpoints();
321 },
322
323 /**
324 * @override 128 * @override
325 * @param {?Object} object 129 * @param {?Object} object
326 */ 130 */
327 flavorChanged: function(object) 131 flavorChanged: function(object)
328 { 132 {
329 this._update(); 133 this._update();
330 }, 134 },
331 135
332 _update: function() 136 _update: function()
333 { 137 {
334 var details = WebInspector.context.flavor(WebInspector.DebuggerPausedDet ails); 138 var details = WebInspector.context.flavor(WebInspector.DebuggerPausedDet ails);
335 if (!details || details.reason !== WebInspector.DebuggerModel.BreakReaso n.DOM) { 139 if (!details || details.reason !== WebInspector.DebuggerModel.BreakReaso n.DOM) {
336 if (this._highlightedElement) { 140 if (this._highlightedElement) {
337 this._highlightedElement.classList.remove("breakpoint-hit"); 141 this._highlightedElement.classList.remove("breakpoint-hit");
338 delete this._highlightedElement; 142 delete this._highlightedElement;
339 } 143 }
340 return; 144 return;
341 } 145 }
342 var auxData = details.auxData; 146 var auxData = details.auxData;
343 var breakpointId = this._createBreakpointId(auxData.nodeId, auxData.type ); 147 var breakpointId = this._createBreakpointId(auxData.nodeId, auxData.type );
344 var element = this._breakpointElements[breakpointId]; 148 var element = this._breakpointElements.get(breakpointId);
345 if (!element) 149 if (!element)
346 return; 150 return;
347 WebInspector.viewManager.showView("sources.domBreakpoints"); 151 WebInspector.viewManager.showView("sources.domBreakpoints");
348 element.classList.add("breakpoint-hit"); 152 element.classList.add("breakpoint-hit");
349 this._highlightedElement = element; 153 this._highlightedElement = element;
350 }, 154 },
351 155
352 /** 156 /**
353 * @param {number} nodeId 157 * @param {number} nodeId
354 * @param {!DOMDebuggerAgent.DOMBreakpointType} type 158 * @param {!DOMDebuggerAgent.DOMBreakpointType} type
159 * @return {string}
355 */ 160 */
356 _createBreakpointId: function(nodeId, type) 161 _createBreakpointId: function(nodeId, type)
357 { 162 {
358 return nodeId + ":" + type; 163 return nodeId + ":" + type;
359 }, 164 },
360 165
361 _saveBreakpoints: function()
362 {
363 var breakpoints = [];
364 var storedBreakpoints = this._domBreakpointsSetting.get();
365 for (var i = 0; i < storedBreakpoints.length; ++i) {
366 var breakpoint = storedBreakpoints[i];
367 if (breakpoint.url !== this._inspectedURL)
368 breakpoints.push(breakpoint);
369 }
370 for (var id in this._breakpointElements) {
371 var element = this._breakpointElements[id];
372 breakpoints.push({ url: this._inspectedURL, path: element._node.path (), type: element._type, enabled: element._checkboxElement.checked });
373 }
374 this._domBreakpointsSetting.set(breakpoints);
375 },
376
377 /**
378 * @param {!WebInspector.DOMModel} domModel
379 */
380 restoreBreakpoints: function(domModel)
381 {
382 var pathToBreakpoints = {};
383
384 /**
385 * @param {string} path
386 * @param {?DOMAgent.NodeId} nodeId
387 * @this {WebInspector.DOMBreakpointsSidebarPane}
388 */
389 function didPushNodeByPathToFrontend(path, nodeId)
390 {
391 var node = nodeId ? domModel.nodeForId(nodeId) : null;
392 if (!node)
393 return;
394
395 var breakpoints = pathToBreakpoints[path];
396 for (var i = 0; i < breakpoints.length; ++i)
397 this._setBreakpoint(node, breakpoints[i].type, breakpoints[i].en abled);
398 }
399
400 var breakpoints = this._domBreakpointsSetting.get();
401 for (var i = 0; i < breakpoints.length; ++i) {
402 var breakpoint = breakpoints[i];
403 if (breakpoint.url !== this._inspectedURL)
404 continue;
405 var path = breakpoint.path;
406 if (!pathToBreakpoints[path]) {
407 pathToBreakpoints[path] = [];
408 domModel.pushNodeByPathToFrontend(path, didPushNodeByPathToFront end.bind(this, path));
409 }
410 pathToBreakpoints[path].push(breakpoint);
411 }
412 },
413
414 __proto__: WebInspector.BreakpointsSidebarPaneBase.prototype 166 __proto__: WebInspector.BreakpointsSidebarPaneBase.prototype
415 } 167 }
416 168
417 /** 169 WebInspector.DOMBreakpointsSidebarPane.BreakpointTypes = {
418 * @constructor 170 SubtreeModified: "subtree-modified",
419 * @extends {WebInspector.VBox} 171 AttributeModified: "attribute-modified",
420 */ 172 NodeRemoved: "node-removed"
421 WebInspector.DOMBreakpointsSidebarPane.Proxy = function()
422 {
423 WebInspector.VBox.call(this);
424 this.registerRequiredCSS("components/breakpointsList.css");
425 } 173 }
426 174
427 WebInspector.DOMBreakpointsSidebarPane.Proxy.prototype = { 175 WebInspector.DOMBreakpointsSidebarPane.ContextMenuLabels = {
428 wasShown: function() 176 [WebInspector.DOMBreakpointsSidebarPane.BreakpointTypes.SubtreeModified]: We bInspector.UIString.capitalize("Subtree ^modifications"),
429 { 177 [WebInspector.DOMBreakpointsSidebarPane.BreakpointTypes.AttributeModified]: WebInspector.UIString.capitalize("Attributes ^modifications"),
430 WebInspector.SimpleView.prototype.wasShown.call(this); 178 [WebInspector.DOMBreakpointsSidebarPane.BreakpointTypes.NodeRemoved]: WebIns pector.UIString.capitalize("Node ^removal")
431 var pane = WebInspector.domBreakpointsSidebarPane;
432 if (pane.element.parentNode !== this.element)
433 pane.show(this.element);
434 },
435
436 __proto__: WebInspector.VBox.prototype
437 } 179 }
438 180
439 /** 181 WebInspector.DOMBreakpointsSidebarPane.BreakpointTypeLabels = {
440 * @type {!WebInspector.DOMBreakpointsSidebarPane} 182 [WebInspector.DOMBreakpointsSidebarPane.BreakpointTypes.AttributeModified]: WebInspector.UIString("Attribute Modified"),
441 */ 183 [WebInspector.DOMBreakpointsSidebarPane.BreakpointTypes.SubtreeModified]: We bInspector.UIString("Subtree Modified"),
442 WebInspector.domBreakpointsSidebarPane; 184 [WebInspector.DOMBreakpointsSidebarPane.BreakpointTypes.NodeRemoved]: WebIns pector.UIString("Node Removed")
185 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698