Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 21 matching lines...) Expand all Loading... | |
| 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._domBreakpointsSetting = WebInspector.settings.createLocalSetting("domB reakpoints", []); | 39 this._domBreakpointsSetting = WebInspector.settings.createLocalSetting("domB reakpoints", []); |
| 40 this.listElement.classList.add("dom-breakpoints-list"); | 40 this.listElement.classList.add("dom-breakpoints-list"); |
| 41 | 41 |
| 42 this._breakpointElements = {}; | 42 /** @type {!Map<string, !Element>} */ |
| 43 this._breakpointElements = new Map(); | |
| 43 | 44 |
| 44 this._breakpointTypes = { | 45 this._breakpointTypes = { |
| 45 SubtreeModified: "subtree-modified", | 46 SubtreeModified: "subtree-modified", |
| 46 AttributeModified: "attribute-modified", | 47 AttributeModified: "attribute-modified", |
| 47 NodeRemoved: "node-removed" | 48 NodeRemoved: "node-removed" |
| 48 }; | 49 }; |
| 49 this._breakpointTypeLabels = {}; | 50 this._breakpointTypeLabels = {}; |
| 50 this._breakpointTypeLabels[this._breakpointTypes.SubtreeModified] = WebInspe ctor.UIString("Subtree Modified"); | 51 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.AttributeModified] = WebIns pector.UIString("Attribute Modified"); |
| 52 this._breakpointTypeLabels[this._breakpointTypes.NodeRemoved] = WebInspector .UIString("Node Removed"); | 53 this._breakpointTypeLabels[this._breakpointTypes.NodeRemoved] = WebInspector .UIString("Node Removed"); |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 74 return; | 75 return; |
| 75 | 76 |
| 76 var nodeBreakpoints = this._nodeBreakpoints(node); | 77 var nodeBreakpoints = this._nodeBreakpoints(node); |
| 77 | 78 |
| 78 /** | 79 /** |
| 79 * @param {!DOMDebuggerAgent.DOMBreakpointType} type | 80 * @param {!DOMDebuggerAgent.DOMBreakpointType} type |
| 80 * @this {WebInspector.DOMBreakpointsSidebarPane} | 81 * @this {WebInspector.DOMBreakpointsSidebarPane} |
| 81 */ | 82 */ |
| 82 function toggleBreakpoint(type) | 83 function toggleBreakpoint(type) |
| 83 { | 84 { |
| 84 if (!nodeBreakpoints[type]) | 85 if (!nodeBreakpoints.has(type)) |
| 85 this._setBreakpoint(node, type, true); | 86 this._setBreakpoint(node, type, true); |
| 86 else | 87 else |
| 87 this._removeBreakpoint(node, type); | 88 this._removeBreakpoint(node, type); |
| 88 this._saveBreakpoints(); | 89 this._saveBreakpoints(); |
| 89 } | 90 } |
| 90 | 91 |
| 91 var breakpointsMenu = createSubMenu ? contextMenu.appendSubMenuItem(WebI nspector.UIString("Break on...")) : contextMenu; | 92 var breakpointsMenu = createSubMenu ? contextMenu.appendSubMenuItem(WebI nspector.UIString("Break on...")) : contextMenu; |
| 92 for (var key in this._breakpointTypes) { | 93 for (var key in this._breakpointTypes) { |
| 93 var type = this._breakpointTypes[key]; | 94 var type = this._breakpointTypes[key]; |
| 94 var label = this._contextMenuLabels[type]; | 95 var label = this._contextMenuLabels[type]; |
| 95 breakpointsMenu.appendCheckboxItem(label, toggleBreakpoint.bind(this , type), nodeBreakpoints[type]); | 96 breakpointsMenu.appendCheckboxItem(label, toggleBreakpoint.bind(this , type), nodeBreakpoints.has(type)); |
| 96 } | 97 } |
| 97 }, | 98 }, |
| 98 | 99 |
| 99 /** | 100 /** |
| 100 * @param {!WebInspector.DOMNode} node | 101 * @param {!WebInspector.DOMNode} node |
| 101 * @return {!Object<string, boolean>} | 102 * @return {!Set<!DOMDebuggerAgent.DOMBreakpointType>} |
| 102 */ | 103 */ |
| 103 _nodeBreakpoints: function(node) | 104 _nodeBreakpoints: function(node) |
| 104 { | 105 { |
| 105 var nodeBreakpoints = {}; | 106 /** @type {!Set<!DOMDebuggerAgent.DOMBreakpointType>} */ |
| 106 for (var id in this._breakpointElements) { | 107 var nodeBreakpoints = new Set(); |
| 107 var element = this._breakpointElements[id]; | 108 for (var element of this._breakpointElements.values()) { |
| 108 if (element._node === node && element._checkboxElement.checked) | 109 if (element._node === node && element._checkboxElement.checked) |
| 109 nodeBreakpoints[element._type] = true; | 110 nodeBreakpoints.add(element._type); |
| 110 } | 111 } |
| 111 return nodeBreakpoints; | 112 return nodeBreakpoints; |
| 112 }, | 113 }, |
| 113 | 114 |
| 114 /** | 115 /** |
| 115 * @param {!WebInspector.DOMNode} node | 116 * @param {!WebInspector.DOMNode} node |
| 116 * @return {boolean} | 117 * @return {boolean} |
| 117 */ | 118 */ |
| 118 hasBreakpoints: function(node) | 119 hasBreakpoints: function(node) |
| 119 { | 120 { |
| 120 for (var id in this._breakpointElements) { | 121 for (var element of this._breakpointElements.values()) { |
| 121 var element = this._breakpointElements[id]; | |
| 122 if (element._node === node && element._checkboxElement.checked) | 122 if (element._node === node && element._checkboxElement.checked) |
| 123 return true; | 123 return true; |
| 124 } | 124 } |
| 125 return false; | 125 return false; |
| 126 }, | 126 }, |
| 127 | 127 |
| 128 /** | 128 /** |
| 129 * @param {!WebInspector.DebuggerPausedDetails} details | 129 * @param {!WebInspector.DebuggerPausedDetails} details |
| 130 * @return {!Element} | 130 * @return {!Element} |
| 131 */ | 131 */ |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 175 for (var i = 0; i < children.length; ++i) | 175 for (var i = 0; i < children.length; ++i) |
| 176 this._removeBreakpointsForNode(children[i]); | 176 this._removeBreakpointsForNode(children[i]); |
| 177 this._saveBreakpoints(); | 177 this._saveBreakpoints(); |
| 178 }, | 178 }, |
| 179 | 179 |
| 180 /** | 180 /** |
| 181 * @param {!WebInspector.DOMNode} node | 181 * @param {!WebInspector.DOMNode} node |
| 182 */ | 182 */ |
| 183 _removeBreakpointsForNode: function(node) | 183 _removeBreakpointsForNode: function(node) |
| 184 { | 184 { |
| 185 for (var id in this._breakpointElements) { | 185 for (var element of this._breakpointElements.values()) { |
| 186 var element = this._breakpointElements[id]; | |
| 187 if (element._node === node) | 186 if (element._node === node) |
| 188 this._removeBreakpoint(element._node, element._type); | 187 this._removeBreakpoint(element._node, element._type); |
| 189 } | 188 } |
| 190 }, | 189 }, |
| 191 | 190 |
| 192 /** | 191 /** |
| 193 * @param {!WebInspector.DOMNode} node | 192 * @param {!WebInspector.DOMNode} node |
| 194 * @param {!DOMDebuggerAgent.DOMBreakpointType} type | 193 * @param {!DOMDebuggerAgent.DOMBreakpointType} type |
| 195 * @param {boolean} enabled | 194 * @param {boolean} enabled |
| 196 */ | 195 */ |
| 197 _setBreakpoint: function(node, type, enabled) | 196 _setBreakpoint: function(node, type, enabled) |
| 198 { | 197 { |
| 199 var breakpointId = this._createBreakpointId(node.id, type); | 198 var breakpointId = this._createBreakpointId(node.id, type); |
| 200 var breakpointElement = this._breakpointElements[breakpointId]; | 199 var breakpointElement = this._breakpointElements.get(breakpointId); |
| 201 if (!breakpointElement) { | 200 if (!breakpointElement) { |
| 202 breakpointElement = this._createBreakpointElement(node, type, enable d); | 201 breakpointElement = this._createBreakpointElement(node, type, enable d); |
| 203 this._breakpointElements[breakpointId] = breakpointElement; | 202 this._breakpointElements.set(breakpointId, breakpointElement); |
| 204 } else { | 203 } else { |
| 205 breakpointElement._checkboxElement.checked = enabled; | 204 breakpointElement._checkboxElement.checked = enabled; |
| 206 } | 205 } |
| 207 if (enabled) | 206 if (enabled) |
| 208 node.target().domdebuggerAgent().setDOMBreakpoint(node.id, type); | 207 node.target().domdebuggerAgent().setDOMBreakpoint(node.id, type); |
| 209 node.setMarker(WebInspector.DOMBreakpointsSidebarPane.Marker, true); | 208 node.setMarker(WebInspector.DOMBreakpointsSidebarPane.Marker, true); |
| 210 }, | 209 }, |
| 211 | 210 |
| 212 /** | 211 /** |
| 213 * @param {!WebInspector.DOMNode} node | 212 * @param {!WebInspector.DOMNode} node |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 244 if (currentElement._type && currentElement._type < element._type) | 243 if (currentElement._type && currentElement._type < element._type) |
| 245 break; | 244 break; |
| 246 currentElement = currentElement.nextSibling; | 245 currentElement = currentElement.nextSibling; |
| 247 } | 246 } |
| 248 this.addListElement(element, currentElement); | 247 this.addListElement(element, currentElement); |
| 249 return element; | 248 return element; |
| 250 }, | 249 }, |
| 251 | 250 |
| 252 _removeAllBreakpoints: function() | 251 _removeAllBreakpoints: function() |
| 253 { | 252 { |
| 254 for (var id in this._breakpointElements) { | 253 for (var element of this._breakpointElements.values()) |
| 255 var element = this._breakpointElements[id]; | |
| 256 this._removeBreakpoint(element._node, element._type); | 254 this._removeBreakpoint(element._node, element._type); |
| 257 } | |
| 258 this._saveBreakpoints(); | 255 this._saveBreakpoints(); |
| 259 }, | 256 }, |
| 260 | 257 |
| 261 /** | 258 /** |
| 262 * @param {!WebInspector.DOMNode} node | 259 * @param {!WebInspector.DOMNode} node |
| 263 * @param {!DOMDebuggerAgent.DOMBreakpointType} type | 260 * @param {!DOMDebuggerAgent.DOMBreakpointType} type |
| 264 */ | 261 */ |
| 265 _removeBreakpoint: function(node, type) | 262 _removeBreakpoint: function(node, type) |
| 266 { | 263 { |
| 267 var breakpointId = this._createBreakpointId(node.id, type); | 264 var breakpointId = this._createBreakpointId(node.id, type); |
| 268 var element = this._breakpointElements[breakpointId]; | 265 var element = this._breakpointElements.get(breakpointId); |
| 269 if (!element) | 266 if (!element) |
| 270 return; | 267 return; |
| 271 | 268 |
| 272 this.removeListElement(element); | 269 this.removeListElement(element); |
| 273 delete this._breakpointElements[breakpointId]; | 270 this._breakpointElements.delete(breakpointId); |
| 274 if (element._checkboxElement.checked) | 271 if (element._checkboxElement.checked) |
| 275 node.target().domdebuggerAgent().removeDOMBreakpoint(node.id, type); | 272 node.target().domdebuggerAgent().removeDOMBreakpoint(node.id, type); |
| 276 node.setMarker(WebInspector.DOMBreakpointsSidebarPane.Marker, this.hasBr eakpoints(node) ? true : null); | 273 node.setMarker(WebInspector.DOMBreakpointsSidebarPane.Marker, this.hasBr eakpoints(node) ? true : null); |
| 277 }, | 274 }, |
| 278 | 275 |
| 279 /** | 276 /** |
| 280 * @param {!WebInspector.DOMNode} node | 277 * @param {!WebInspector.DOMNode} node |
| 281 * @param {!DOMDebuggerAgent.DOMBreakpointType} type | 278 * @param {!DOMDebuggerAgent.DOMBreakpointType} type |
| 282 * @param {!Event} event | 279 * @param {!Event} event |
| 283 */ | 280 */ |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 325 { | 322 { |
| 326 var details = WebInspector.context.flavor(WebInspector.DebuggerPausedDet ails); | 323 var details = WebInspector.context.flavor(WebInspector.DebuggerPausedDet ails); |
| 327 if (!details || details.reason !== WebInspector.DebuggerModel.BreakReaso n.DOM) { | 324 if (!details || details.reason !== WebInspector.DebuggerModel.BreakReaso n.DOM) { |
| 328 if (this._highlightedElement) { | 325 if (this._highlightedElement) { |
| 329 this._highlightedElement.classList.remove("breakpoint-hit"); | 326 this._highlightedElement.classList.remove("breakpoint-hit"); |
| 330 delete this._highlightedElement; | 327 delete this._highlightedElement; |
| 331 } | 328 } |
| 332 return; | 329 return; |
| 333 } | 330 } |
| 334 var auxData = details.auxData; | 331 var auxData = details.auxData; |
| 335 var breakpointId = this._createBreakpointId(auxData.nodeId, auxData.type ); | 332 var breakpointId = this._createBreakpointId(auxData.nodeId, auxData.type ); |
|
lushnikov
2016/08/29 22:19:30
let's get rid of this _createBreakpointId in a fol
| |
| 336 var element = this._breakpointElements[breakpointId]; | 333 var element = this._breakpointElements.get(breakpointId); |
| 337 if (!element) | 334 if (!element) |
| 338 return; | 335 return; |
| 339 WebInspector.viewManager.showView("sources.domBreakpoints"); | 336 WebInspector.viewManager.showView("sources.domBreakpoints"); |
| 340 element.classList.add("breakpoint-hit"); | 337 element.classList.add("breakpoint-hit"); |
| 341 this._highlightedElement = element; | 338 this._highlightedElement = element; |
| 342 }, | 339 }, |
| 343 | 340 |
| 344 /** | 341 /** |
| 345 * @param {number} nodeId | 342 * @param {number} nodeId |
| 346 * @param {!DOMDebuggerAgent.DOMBreakpointType} type | 343 * @param {!DOMDebuggerAgent.DOMBreakpointType} type |
| 347 */ | 344 */ |
| 348 _createBreakpointId: function(nodeId, type) | 345 _createBreakpointId: function(nodeId, type) |
| 349 { | 346 { |
| 350 return nodeId + ":" + type; | 347 return nodeId + ":" + type; |
| 351 }, | 348 }, |
| 352 | 349 |
| 353 _saveBreakpoints: function() | 350 _saveBreakpoints: function() |
| 354 { | 351 { |
| 355 var breakpoints = []; | 352 var breakpoints = []; |
| 356 var storedBreakpoints = this._domBreakpointsSetting.get(); | 353 var storedBreakpoints = this._domBreakpointsSetting.get(); |
| 357 for (var i = 0; i < storedBreakpoints.length; ++i) { | 354 for (var i = 0; i < storedBreakpoints.length; ++i) { |
| 358 var breakpoint = storedBreakpoints[i]; | 355 var breakpoint = storedBreakpoints[i]; |
| 359 if (breakpoint.url !== this._inspectedURL) | 356 if (breakpoint.url !== this._inspectedURL) |
| 360 breakpoints.push(breakpoint); | 357 breakpoints.push(breakpoint); |
| 361 } | 358 } |
| 362 for (var id in this._breakpointElements) { | 359 for (var element of this._breakpointElements.values()) |
| 363 var element = this._breakpointElements[id]; | |
| 364 breakpoints.push({ url: this._inspectedURL, path: element._node.path (), type: element._type, enabled: element._checkboxElement.checked }); | 360 breakpoints.push({ url: this._inspectedURL, path: element._node.path (), type: element._type, enabled: element._checkboxElement.checked }); |
| 365 } | |
| 366 this._domBreakpointsSetting.set(breakpoints); | 361 this._domBreakpointsSetting.set(breakpoints); |
| 367 }, | 362 }, |
| 368 | 363 |
| 369 /** | 364 /** |
| 370 * @param {!WebInspector.DOMDocument} domDocument | 365 * @param {!WebInspector.DOMDocument} domDocument |
| 371 */ | 366 */ |
| 372 restoreBreakpoints: function(domDocument) | 367 restoreBreakpoints: function(domDocument) |
| 373 { | 368 { |
| 374 this._breakpointElements = {}; | 369 this._breakpointElements.clear(); |
| 375 this.reset(); | 370 this.reset(); |
| 376 this._inspectedURL = domDocument.documentURL; | 371 this._inspectedURL = domDocument.documentURL; |
| 377 var domModel = domDocument.domModel(); | 372 var domModel = domDocument.domModel(); |
| 378 var pathToBreakpoints = {}; | 373 /** @type {!Map<string, !Array<!Object>>} */ |
|
chenwilliam
2016/08/29 20:10:43
I'm planning on improving this type annotation by
| |
| 374 var pathToBreakpoints = new Map(); | |
| 379 | 375 |
| 380 /** | 376 /** |
| 381 * @param {string} path | 377 * @param {string} path |
| 382 * @param {?DOMAgent.NodeId} nodeId | 378 * @param {?DOMAgent.NodeId} nodeId |
| 383 * @this {WebInspector.DOMBreakpointsSidebarPane} | 379 * @this {WebInspector.DOMBreakpointsSidebarPane} |
| 384 */ | 380 */ |
| 385 function didPushNodeByPathToFrontend(path, nodeId) | 381 function didPushNodeByPathToFrontend(path, nodeId) |
| 386 { | 382 { |
| 387 var node = nodeId ? domModel.nodeForId(nodeId) : null; | 383 var node = nodeId ? domModel.nodeForId(nodeId) : null; |
| 388 if (!node) | 384 if (!node) |
| 389 return; | 385 return; |
| 390 | 386 |
| 391 var breakpoints = pathToBreakpoints[path]; | 387 var breakpoints = pathToBreakpoints.get(path); |
| 392 for (var i = 0; i < breakpoints.length; ++i) | 388 for (var i = 0; i < breakpoints.length; ++i) |
| 393 this._setBreakpoint(node, breakpoints[i].type, breakpoints[i].en abled); | 389 this._setBreakpoint(node, breakpoints[i].type, breakpoints[i].en abled); |
| 394 } | 390 } |
| 395 | 391 |
| 396 var breakpoints = this._domBreakpointsSetting.get(); | 392 var breakpoints = this._domBreakpointsSetting.get(); |
| 397 for (var i = 0; i < breakpoints.length; ++i) { | 393 for (var i = 0; i < breakpoints.length; ++i) { |
| 398 var breakpoint = breakpoints[i]; | 394 var breakpoint = breakpoints[i]; |
| 399 if (breakpoint.url !== this._inspectedURL) | 395 if (breakpoint.url !== this._inspectedURL) |
| 400 continue; | 396 continue; |
| 401 var path = breakpoint.path; | 397 var path = breakpoint.path; |
| 402 if (!pathToBreakpoints[path]) { | 398 if (!pathToBreakpoints.has(path)) { |
| 403 pathToBreakpoints[path] = []; | 399 pathToBreakpoints.set(path, []); |
| 404 domModel.pushNodeByPathToFrontend(path, didPushNodeByPathToFront end.bind(this, path)); | 400 domModel.pushNodeByPathToFrontend(path, didPushNodeByPathToFront end.bind(this, path)); |
| 405 } | 401 } |
| 406 pathToBreakpoints[path].push(breakpoint); | 402 pathToBreakpoints.get(path).push(breakpoint); |
| 407 } | 403 } |
| 408 }, | 404 }, |
| 409 | 405 |
| 410 __proto__: WebInspector.BreakpointsSidebarPaneBase.prototype | 406 __proto__: WebInspector.BreakpointsSidebarPaneBase.prototype |
| 411 } | 407 } |
| 412 | 408 |
| 413 /** | 409 /** |
| 414 * @constructor | 410 * @constructor |
| 415 * @extends {WebInspector.VBox} | 411 * @extends {WebInspector.VBox} |
| 416 */ | 412 */ |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 429 pane.show(this.element); | 425 pane.show(this.element); |
| 430 }, | 426 }, |
| 431 | 427 |
| 432 __proto__: WebInspector.VBox.prototype | 428 __proto__: WebInspector.VBox.prototype |
| 433 } | 429 } |
| 434 | 430 |
| 435 /** | 431 /** |
| 436 * @type {!WebInspector.DOMBreakpointsSidebarPane} | 432 * @type {!WebInspector.DOMBreakpointsSidebarPane} |
| 437 */ | 433 */ |
| 438 WebInspector.domBreakpointsSidebarPane; | 434 WebInspector.domBreakpointsSidebarPane; |
| OLD | NEW |