OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 /** |
| 6 * @constructor |
| 7 * @extends {WebInspector.Object} |
| 8 * @implements {WebInspector.TargetManager.Observer} |
| 9 */ |
| 10 WebInspector.DOMBreakpointManager = function() |
| 11 { |
| 12 /** @type {!Map<!WebInspector.Target, !Protocol.DOMDebuggerAgent>} */ |
| 13 this._agents = new Map(); |
| 14 this._domBreakpointsSetting = WebInspector.settings.createLocalSetting("domB
reakpoints", []); |
| 15 /** @type {!Map<string, !WebInspector.DOMBreakpointManager.Breakpoint>} */ |
| 16 this._breakpoints = new Map(); |
| 17 WebInspector.targetManager.addModelListener(WebInspector.DOMModel, WebInspec
tor.DOMModel.Events.DocumentUpdated, this._restoreBreakpoints, this); |
| 18 WebInspector.targetManager.addModelListener(WebInspector.DOMModel, WebInspec
tor.DOMModel.Events.NodeRemoved, this._nodeRemoved, this); |
| 19 WebInspector.targetManager.observeTargets(this); |
| 20 } |
| 21 |
| 22 WebInspector.DOMBreakpointManager.Marker = "breakpoint-marker"; |
| 23 |
| 24 WebInspector.DOMBreakpointManager.Events = { |
| 25 BreakpointsChanged: "BreakpointsChanged" |
| 26 }; |
| 27 |
| 28 WebInspector.DOMBreakpointManager.prototype = { |
| 29 /** |
| 30 * @override |
| 31 * @param {!WebInspector.Target} target |
| 32 */ |
| 33 targetAdded: function(target) |
| 34 { |
| 35 if (target.hasDOMCapability()) |
| 36 this._agents.set(target, target.domdebuggerAgent()); |
| 37 }, |
| 38 |
| 39 /** |
| 40 * @override |
| 41 * @param {!WebInspector.Target} target |
| 42 */ |
| 43 targetRemoved: function(target) |
| 44 { |
| 45 if (target.hasDOMCapability()) |
| 46 this._agents.delete(target); |
| 47 }, |
| 48 |
| 49 /** |
| 50 * @return {!Array<!WebInspector.DOMBreakpointManager.Breakpoint>} |
| 51 */ |
| 52 domBreakpoints: function() |
| 53 { |
| 54 var breakpoints = []; |
| 55 for (var breakpoint of this._breakpoints.values()) |
| 56 breakpoints.push(breakpoint); |
| 57 return breakpoints; |
| 58 }, |
| 59 |
| 60 /** |
| 61 * @param {!WebInspector.DOMNode} node |
| 62 * @param {!DOMDebuggerAgent.DOMBreakpointType} type |
| 63 * @param {boolean} enabled |
| 64 */ |
| 65 setBreakpoint: function(node, type, enabled) |
| 66 { |
| 67 this._innerSetBreakpoint(node, type, enabled); |
| 68 this._saveBreakpoints(); |
| 69 }, |
| 70 |
| 71 /** |
| 72 * @param {!WebInspector.DOMNode} node |
| 73 * @param {!DOMDebuggerAgent.DOMBreakpointType} type |
| 74 * @param {boolean} enabled |
| 75 */ |
| 76 _innerSetBreakpoint: function(node, type, enabled) |
| 77 { |
| 78 var url = node.ownerDocument.documentURL.removeURLFragment(); |
| 79 var breakpoint = new WebInspector.DOMBreakpointManager.Breakpoint(node,
type, url, enabled); |
| 80 this._breakpoints.set(this._createBreakpointId(node, type), breakpoint); |
| 81 var agent = this._agents.get(node.target()); |
| 82 if (enabled) { |
| 83 agent.setDOMBreakpoint(node.id, type); |
| 84 node.setMarker(WebInspector.DOMBreakpointManager.Marker, true); |
| 85 } else { |
| 86 agent.removeDOMBreakpoint(node.id, type); |
| 87 node.setMarker(WebInspector.DOMBreakpointManager.Marker, this._hasOt
herBreakpoints(node, type) ? true : null); |
| 88 } |
| 89 }, |
| 90 |
| 91 /** |
| 92 * @param {!WebInspector.DOMNode} node |
| 93 * @param {!DOMDebuggerAgent.DOMBreakpointType} type |
| 94 */ |
| 95 removeBreakpoint: function(node, type) |
| 96 { |
| 97 this._innerRemoveBreakpoint(node, type); |
| 98 this._saveBreakpoints(); |
| 99 }, |
| 100 |
| 101 /** |
| 102 * @param {!WebInspector.DOMNode} node |
| 103 * @param {!DOMDebuggerAgent.DOMBreakpointType} type |
| 104 */ |
| 105 _innerRemoveBreakpoint: function(node, type) |
| 106 { |
| 107 var breakpointId = this._createBreakpointId(node, type); |
| 108 var breakpoint = this._breakpoints.get(breakpointId); |
| 109 if (breakpoint.enabled) { |
| 110 var agent = this._agents.get(node.target()); |
| 111 agent.removeDOMBreakpoint(node.id, type); |
| 112 node.setMarker(WebInspector.DOMBreakpointManager.Marker, this._hasOt
herBreakpoints(node, type) ? true : null); |
| 113 } |
| 114 this._breakpoints.remove(breakpointId); |
| 115 }, |
| 116 |
| 117 /** |
| 118 * @param {!WebInspector.DOMNode} node |
| 119 * @param {!DOMDebuggerAgent.DOMBreakpointType} type |
| 120 */ |
| 121 toggleBreakpoint: function(node, type) |
| 122 { |
| 123 var nodeBreakpoints = this.nodeBreakpoints(node); |
| 124 if (!nodeBreakpoints.get(type)) |
| 125 this.setBreakpoint(node, type, true); |
| 126 else |
| 127 this.removeBreakpoint(node, type); |
| 128 }, |
| 129 |
| 130 removeAllBreakpoints: function() |
| 131 { |
| 132 for (var breakpoint of this._breakpoints.values()) |
| 133 this._innerRemoveBreakpoint(breakpoint.node, breakpoint.type); |
| 134 this._saveBreakpoints(); |
| 135 }, |
| 136 |
| 137 /** |
| 138 * @param {!WebInspector.DOMNode} node |
| 139 * @return {!Map<string, boolean>} |
| 140 */ |
| 141 nodeBreakpoints: function(node) |
| 142 { |
| 143 var nodeBreakpoints = new Map(); |
| 144 for (var breakpoint of this._breakpoints.values()) { |
| 145 if (breakpoint.node === node && breakpoint.enabled) |
| 146 nodeBreakpoints.set(breakpoint.type, true); |
| 147 } |
| 148 return nodeBreakpoints; |
| 149 }, |
| 150 |
| 151 /** |
| 152 * @param {!WebInspector.Event} event |
| 153 */ |
| 154 _restoreBreakpoints: function(event) |
| 155 { |
| 156 var inspectedRootDocument = /** @type {!WebInspector.DOMDocument} */ (ev
ent.data); |
| 157 if (!inspectedRootDocument) |
| 158 return; |
| 159 var domModel = /** @type {!WebInspector.DOMModel} */ (event.target); |
| 160 var pathToBreakpoints = {}; |
| 161 this._breakpoints.clear(); |
| 162 this.dispatchEventToListeners(WebInspector.DOMBreakpointManager.Events.B
reakpointsChanged); |
| 163 |
| 164 /** |
| 165 * @param {string} path |
| 166 * @param {?DOMAgent.NodeId} nodeId |
| 167 * @this {WebInspector.DOMBreakpointManager} |
| 168 */ |
| 169 function didPushNodeByPathToFrontend(path, nodeId) |
| 170 { |
| 171 var node = nodeId ? domModel.nodeForId(nodeId) : null; |
| 172 if (!node) |
| 173 return; |
| 174 |
| 175 for (var breakpoint of pathToBreakpoints[path]) |
| 176 this._innerSetBreakpoint(node, breakpoint.type, breakpoint.enabl
ed); |
| 177 this.dispatchEventToListeners(WebInspector.DOMBreakpointManager.Even
ts.BreakpointsChanged); |
| 178 } |
| 179 |
| 180 var breakpoints = this._domBreakpointsSetting.get(); |
| 181 for (var breakpoint of breakpoints) { |
| 182 if (breakpoint.url !== WebInspector.targetManager.inspectedURL()) |
| 183 continue; |
| 184 var path = breakpoint.path; |
| 185 if (!pathToBreakpoints[path]) { |
| 186 pathToBreakpoints[path] = []; |
| 187 domModel.pushNodeByPathToFrontend(path, didPushNodeByPathToFront
end.bind(this, path)); |
| 188 } |
| 189 pathToBreakpoints[path].push(breakpoint); |
| 190 } |
| 191 }, |
| 192 |
| 193 _saveBreakpoints: function() |
| 194 { |
| 195 var breakpoints = []; |
| 196 var storedBreakpoints = this._domBreakpointsSetting.get(); |
| 197 for (var breakpoint of storedBreakpoints) { |
| 198 if (breakpoint.url !== WebInspector.targetManager.inspectedURL()) |
| 199 breakpoints.push(breakpoint); |
| 200 } |
| 201 for (var breakpoint of this._breakpoints.values()) { |
| 202 breakpoints.push({ |
| 203 url: breakpoint.url, |
| 204 path: breakpoint.node.path(), |
| 205 type: breakpoint.type, |
| 206 enabled: breakpoint.enabled |
| 207 }); |
| 208 } |
| 209 this._domBreakpointsSetting.set(breakpoints); |
| 210 this.dispatchEventToListeners(WebInspector.DOMBreakpointManager.Events.B
reakpointsChanged); |
| 211 }, |
| 212 |
| 213 /** |
| 214 * @param {!WebInspector.DOMNode} node |
| 215 * @param {!DOMDebuggerAgent.DOMBreakpointType} type |
| 216 * @return {boolean} |
| 217 */ |
| 218 _hasOtherBreakpoints: function(node, type) |
| 219 { |
| 220 for (var breakpoint of this._breakpoints.values()) { |
| 221 if (breakpoint.node === node && breakpoint.type !== type && breakpoi
nt.enabled) |
| 222 return true; |
| 223 } |
| 224 return false; |
| 225 }, |
| 226 |
| 227 /** |
| 228 * @param {!WebInspector.Event} event |
| 229 */ |
| 230 _nodeRemoved: function(event) |
| 231 { |
| 232 var node = event.data.node; |
| 233 this._removeBreakpointsForNode(node); |
| 234 var children = node.children(); |
| 235 if (!children) |
| 236 return; |
| 237 for (var child of children) |
| 238 this._removeBreakpointsForNode(child); |
| 239 }, |
| 240 |
| 241 /** |
| 242 * @param {!WebInspector.DOMNode} node |
| 243 */ |
| 244 _removeBreakpointsForNode: function(node) |
| 245 { |
| 246 for (var breakpoint of this._breakpoints.values()) { |
| 247 if (breakpoint.node === node) |
| 248 this._innerRemoveBreakpoint(breakpoint.node, breakpoint.type); |
| 249 } |
| 250 this._saveBreakpoints(); |
| 251 }, |
| 252 |
| 253 /** |
| 254 * @param {!WebInspector.DOMNode} node |
| 255 * @param {!DOMDebuggerAgent.DOMBreakpointType} type |
| 256 * @return {string} |
| 257 */ |
| 258 _createBreakpointId: function(node, type) |
| 259 { |
| 260 return node.id + ":" + type; |
| 261 }, |
| 262 |
| 263 __proto__: WebInspector.Object.prototype |
| 264 }; |
| 265 |
| 266 /** |
| 267 * @constructor |
| 268 * @param {!WebInspector.DOMNode} node |
| 269 * @param {!DOMDebuggerAgent.DOMBreakpointType} type |
| 270 * @param {string} url |
| 271 * @param {boolean} enabled |
| 272 */ |
| 273 WebInspector.DOMBreakpointManager.Breakpoint = function(node, type, url, enabled
) |
| 274 { |
| 275 this.node = node; |
| 276 this.path = node.path(); |
| 277 this.type = type; |
| 278 this.url = url; |
| 279 this.enabled = enabled; |
| 280 } |
| 281 |
| 282 /** |
| 283 * @type {!WebInspector.DOMBreakpointManager} |
| 284 */ |
| 285 WebInspector.domBreakpointManager; |
OLD | NEW |