Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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 SDK.DOMDebuggerModel = class extends SDK.SDKModel { | 5 SDK.DOMDebuggerModel = class extends SDK.SDKModel { |
| 6 /** | 6 /** |
| 7 * @param {!SDK.Target} target | 7 * @param {!SDK.Target} target |
| 8 */ | 8 */ |
| 9 constructor(target) { | 9 constructor(target) { |
| 10 super(target); | 10 super(target); |
| 11 this._agent = target.domdebuggerAgent(); | 11 this._agent = target.domdebuggerAgent(); |
| 12 this._runtimeModel = /** @type {!SDK.RuntimeModel} */ (target.model(SDK.Runt imeModel)); | 12 this._runtimeModel = /** @type {!SDK.RuntimeModel} */ (target.model(SDK.Runt imeModel)); |
| 13 this._domModel = /** @type {!SDK.DOMModel} */ (target.model(SDK.DOMModel)); | 13 this._domModel = /** @type {!SDK.DOMModel} */ (target.model(SDK.DOMModel)); |
| 14 this._domModel.addEventListener(SDK.DOMModel.Events.DocumentUpdated, this._d ocumentUpdated, this); | |
| 15 this._domModel.addEventListener(SDK.DOMModel.Events.NodeRemoved, this._nodeR emoved, this); | |
| 16 | |
| 17 /** @type {!Array<!SDK.DOMDebuggerModel.DOMBreakpoint>} */ | |
| 18 this._domBreakpoints = []; | |
| 19 this._domBreakpointsSetting = Common.settings.createLocalSetting('domBreakpo ints', []); | |
| 20 if (this._domModel.existingDocument()) | |
| 21 this._documentUpdated(); | |
| 14 } | 22 } |
| 15 | 23 |
| 16 /** | 24 /** |
| 17 * @return {!SDK.RuntimeModel} | 25 * @return {!SDK.RuntimeModel} |
| 18 */ | 26 */ |
| 19 runtimeModel() { | 27 runtimeModel() { |
| 20 return this._runtimeModel; | 28 return this._runtimeModel; |
| 21 } | 29 } |
| 22 | 30 |
| 23 /** | 31 /** |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 37 var location = this._runtimeModel.debuggerModel().createRawLocationByScrip tId( | 45 var location = this._runtimeModel.debuggerModel().createRawLocationByScrip tId( |
| 38 payload.scriptId, payload.lineNumber, payload.columnNumber); | 46 payload.scriptId, payload.lineNumber, payload.columnNumber); |
| 39 eventListeners.push(new SDK.EventListener( | 47 eventListeners.push(new SDK.EventListener( |
| 40 this, remoteObject, payload.type, payload.useCapture, payload.passive, payload.once, | 48 this, remoteObject, payload.type, payload.useCapture, payload.passive, payload.once, |
| 41 payload.handler ? this._runtimeModel.createRemoteObject(payload.handle r) : null, | 49 payload.handler ? this._runtimeModel.createRemoteObject(payload.handle r) : null, |
| 42 payload.originalHandler ? this._runtimeModel.createRemoteObject(payloa d.originalHandler) : null, | 50 payload.originalHandler ? this._runtimeModel.createRemoteObject(payloa d.originalHandler) : null, |
| 43 /** @type {!SDK.DebuggerModel.Location} */ (location), null)); | 51 /** @type {!SDK.DebuggerModel.Location} */ (location), null)); |
| 44 } | 52 } |
| 45 return eventListeners; | 53 return eventListeners; |
| 46 } | 54 } |
| 55 | |
| 56 /** | |
| 57 * @return {!Array<!SDK.DOMDebuggerModel.DOMBreakpoint>} | |
| 58 */ | |
| 59 domBreakpoints() { | |
| 60 return this._domBreakpoints.slice(); | |
| 61 } | |
| 62 | |
| 63 /** | |
| 64 * @param {!SDK.DOMNode} node | |
| 65 * @param {!SDK.DOMDebuggerModel.DOMBreakpoint.Type} type | |
| 66 * @return {boolean} | |
| 67 */ | |
| 68 hasDOMBreakpoint(node, type) { | |
| 69 return this._domBreakpoints.some(breakpoint => (breakpoint._node === node && breakpoint._type === type)); | |
| 70 } | |
| 71 | |
| 72 /** | |
| 73 * @param {!SDK.DOMNode} node | |
| 74 * @param {!SDK.DOMDebuggerModel.DOMBreakpoint.Type} type | |
| 75 * @return {!SDK.DOMDebuggerModel.DOMBreakpoint} | |
| 76 */ | |
| 77 setDOMBreakpoint(node, type) { | |
| 78 for (var breakpoint of this._domBreakpoints) { | |
| 79 if (breakpoint._node === node && breakpoint._type === type) { | |
| 80 breakpoint.setEnabled(true); | |
| 81 return breakpoint; | |
| 82 } | |
| 83 } | |
| 84 var breakpoint = new SDK.DOMDebuggerModel.DOMBreakpoint(this, node, type, tr ue); | |
| 85 this._domBreakpoints.push(breakpoint); | |
| 86 this._saveDOMBreakpoints(); | |
| 87 this.dispatchEventToListeners(SDK.DOMDebuggerModel.Events.DOMBreakpointAdded , breakpoint); | |
| 88 return breakpoint; | |
| 89 } | |
| 90 | |
| 91 /** | |
| 92 * @param {!SDK.DOMNode} node | |
| 93 * @param {!SDK.DOMDebuggerModel.DOMBreakpoint.Type} type | |
| 94 */ | |
| 95 removeDOMBreakpoint(node, type) { | |
| 96 this._removeDOMBreakpoints(breakpoint => breakpoint._node === node && breakp oint._type === type); | |
| 97 } | |
| 98 | |
| 99 removeAllDOMBreakpoints() { | |
| 100 this._removeDOMBreakpoints(breakpoint => true); | |
| 101 } | |
| 102 | |
| 103 /** | |
| 104 * @param {!Object} auxData | |
| 105 * @return {?{type: !SDK.DOMDebuggerModel.DOMBreakpoint.Type, node: !SDK.DOMNo de, targetNode: ?SDK.DOMNode, insertion: boolean}} | |
| 106 */ | |
| 107 resolveDOMBreakpointData(auxData) { | |
| 108 var type = auxData['type']; | |
| 109 var node = this._domModel.nodeForId(auxData['nodeId']); | |
| 110 if (!type || !node) | |
| 111 return null; | |
| 112 var targetNode = null; | |
| 113 var insertion = false; | |
| 114 if (type === SDK.DOMDebuggerModel.DOMBreakpoint.Type.SubtreeModified) { | |
| 115 insertion = auxData['insertion'] || false; | |
| 116 targetNode = this._domModel.nodeForId(auxData['targetNodeId']); | |
| 117 } | |
| 118 return {type: type, node: node, targetNode: targetNode, insertion: insertion }; | |
| 119 } | |
| 120 | |
| 121 /** | |
| 122 * @return {string} | |
| 123 */ | |
| 124 _currentURL() { | |
| 125 var domDocument = this._domModel.existingDocument(); | |
| 126 return domDocument ? domDocument.documentURL : ''; | |
| 127 } | |
| 128 | |
| 129 _documentUpdated() { | |
| 130 var removed = this._domBreakpoints; | |
| 131 this._domBreakpoints = []; | |
| 132 this.dispatchEventToListeners(SDK.DOMDebuggerModel.Events.DOMBreakpointsRemo ved, removed); | |
| 133 | |
| 134 var currentURL = this._currentURL(); | |
| 135 for (var breakpoint of this._domBreakpointsSetting.get()) { | |
| 136 if (breakpoint.url !== currentURL) | |
| 137 continue; | |
| 138 this._domModel.pushNodeByPathToFrontend(breakpoint.path, nodeId => { | |
| 139 var node = nodeId ? this._domModel.nodeForId(nodeId) : null; | |
| 140 if (!node) | |
| 141 return; | |
| 142 var domBreakpoint = new SDK.DOMDebuggerModel.DOMBreakpoint(this, node, b reakpoint.type, breakpoint.enabled); | |
| 143 this._domBreakpoints.push(domBreakpoint); | |
| 144 this.dispatchEventToListeners(SDK.DOMDebuggerModel.Events.DOMBreakpointA dded, domBreakpoint); | |
| 145 }); | |
| 146 } | |
| 147 } | |
| 148 | |
| 149 /** | |
| 150 * @param {function(!SDK.DOMDebuggerModel.DOMBreakpoint):boolean} filter | |
| 151 */ | |
| 152 _removeDOMBreakpoints(filter) { | |
| 153 var removed = []; | |
| 154 var left = []; | |
| 155 for (var breakpoint of this._domBreakpoints) { | |
| 156 if (filter(breakpoint)) { | |
| 157 removed.push(breakpoint); | |
| 158 if (breakpoint._enabled) { | |
| 159 breakpoint._enabled = false; | |
| 160 breakpoint._disable(); | |
| 161 } | |
| 162 } else { | |
| 163 left.push(breakpoint); | |
| 164 } | |
| 165 } | |
| 166 | |
| 167 if (!removed.length) | |
| 168 return; | |
| 169 this._domBreakpoints = left; | |
| 170 this._saveDOMBreakpoints(); | |
| 171 this.dispatchEventToListeners(SDK.DOMDebuggerModel.Events.DOMBreakpointsRemo ved, removed); | |
| 172 } | |
| 173 | |
| 174 /** | |
| 175 * @param {!Common.Event} event | |
| 176 */ | |
| 177 _nodeRemoved(event) { | |
| 178 var node = /** @type {!SDK.DOMNode} */ (event.data.node); | |
| 179 var children = node.children() || []; | |
| 180 this._removeDOMBreakpoints(breakpoint => breakpoint._node === node || childr en.indexOf(breakpoint._node) !== -1); | |
| 181 } | |
| 182 | |
| 183 _saveDOMBreakpoints() { | |
| 184 var currentURL = this._currentURL(); | |
| 185 var breakpoints = this._domBreakpointsSetting.get().filter(breakpoint => bre akpoint.url !== currentURL); | |
| 186 for (var breakpoint of this._domBreakpoints) { | |
| 187 breakpoints.push( | |
| 188 {url: currentURL, path: breakpoint._node.path(), type: breakpoint._typ e, enabled: breakpoint._enabled}); | |
| 189 } | |
| 190 this._domBreakpointsSetting.set(breakpoints); | |
| 191 } | |
| 47 }; | 192 }; |
| 48 | 193 |
| 49 SDK.SDKModel.register(SDK.DOMDebuggerModel, SDK.Target.Capability.DOM, false); | 194 SDK.SDKModel.register(SDK.DOMDebuggerModel, SDK.Target.Capability.DOM, false); |
| 50 | 195 |
| 196 /** @enum {symbol} */ | |
| 197 SDK.DOMDebuggerModel.Events = { | |
| 198 DOMBreakpointAdded: Symbol('DOMBreakpointAdded'), | |
| 199 DOMBreakpointToggled: Symbol('DOMBreakpointToggled'), | |
| 200 DOMBreakpointsRemoved: Symbol('DOMBreakpointsRemoved'), | |
| 201 }; | |
| 202 | |
| 203 SDK.DOMDebuggerModel.DOMBreakpoint = class { | |
| 204 /** | |
| 205 * @param {!SDK.DOMDebuggerModel} domDebuggerModel | |
| 206 * @param {!SDK.DOMNode} node | |
| 207 * @param {!SDK.DOMDebuggerModel.DOMBreakpoint.Type} type | |
| 208 * @param {boolean} enabled | |
| 209 */ | |
| 210 constructor(domDebuggerModel, node, type, enabled) { | |
|
pfeldman
2017/04/24 23:46:20
Hi Java! This could totally be a struct.
dgozman
2017/04/25 19:24:25
Done.
| |
| 211 this._domDebuggerModel = domDebuggerModel; | |
| 212 this._node = node; | |
| 213 this._type = type; | |
| 214 this._enabled = enabled; | |
| 215 if (enabled) | |
| 216 this._enable(); | |
| 217 } | |
| 218 | |
| 219 /** | |
| 220 * @return {!SDK.DOMDebuggerModel} | |
| 221 */ | |
| 222 domDebuggerModel() { | |
| 223 return this._domDebuggerModel; | |
| 224 } | |
| 225 | |
| 226 /** | |
| 227 * @return {!SDK.DOMNode} | |
| 228 */ | |
| 229 node() { | |
| 230 return this._node; | |
| 231 } | |
| 232 | |
| 233 /** | |
| 234 * @return {!SDK.DOMDebuggerModel.DOMBreakpoint.Type} | |
| 235 */ | |
| 236 type() { | |
| 237 return this._type; | |
| 238 } | |
| 239 | |
| 240 /** | |
| 241 * @return {boolean} | |
| 242 */ | |
| 243 enabled() { | |
| 244 return this._enabled; | |
| 245 } | |
| 246 | |
| 247 /** | |
| 248 * @param {boolean} enabled | |
| 249 */ | |
| 250 setEnabled(enabled) { | |
| 251 if (enabled === this._enabled) | |
| 252 return; | |
| 253 | |
| 254 this._enabled = enabled; | |
| 255 if (enabled) | |
| 256 this._enable(); | |
| 257 else | |
| 258 this._disable(); | |
| 259 this._domDebuggerModel.dispatchEventToListeners(SDK.DOMDebuggerModel.Events. DOMBreakpointToggled, this); | |
| 260 } | |
| 261 | |
| 262 _enable() { | |
| 263 this._domDebuggerModel._agent.setDOMBreakpoint(this._node.id, this._type); | |
| 264 this._node.setMarker(SDK.DOMDebuggerModel.DOMBreakpoint.Marker, true); | |
| 265 } | |
| 266 | |
| 267 _disable() { | |
| 268 this._domDebuggerModel._agent.removeDOMBreakpoint(this._node.id, this._type) ; | |
| 269 this._node.setMarker(SDK.DOMDebuggerModel.DOMBreakpoint.Marker, this._nodeHa sBreakpoints() ? true : null); | |
| 270 } | |
| 271 | |
| 272 /** | |
| 273 * @return {boolean} | |
| 274 */ | |
| 275 _nodeHasBreakpoints() { | |
| 276 for (var breakpoint of this._domDebuggerModel._domBreakpoints) { | |
|
pfeldman
2017/04/24 23:46:20
Move into model, retain private.
dgozman
2017/04/25 19:24:25
Done.
| |
| 277 if (breakpoint._node === this._node && breakpoint._enabled) | |
| 278 return true; | |
| 279 } | |
| 280 return false; | |
| 281 } | |
| 282 }; | |
| 283 | |
| 284 /** @typedef {Protocol.DOMDebugger.DOMBreakpointType} */ | |
| 285 SDK.DOMDebuggerModel.DOMBreakpoint.Type = Protocol.DOMDebugger.DOMBreakpointType ; | |
| 286 // SubtreeModified: Protocol.DOMDebugger.DOMBreakpointType.SubtreeModified, | |
| 287 // AttributeModified: Protocol.DOMDebugger.DOMBreakpointType.AttributeModified , | |
| 288 // NodeRemoved: Protocol.DOMDebugger.DOMBreakpointType.NodeRemoved, | |
| 289 // }; | |
| 290 | |
| 291 SDK.DOMDebuggerModel.DOMBreakpoint.Marker = 'breakpoint-marker'; | |
| 292 | |
| 51 SDK.EventListener = class { | 293 SDK.EventListener = class { |
| 52 /** | 294 /** |
| 53 * @param {!SDK.DOMDebuggerModel} domDebuggerModel | 295 * @param {!SDK.DOMDebuggerModel} domDebuggerModel |
| 54 * @param {!SDK.RemoteObject} eventTarget | 296 * @param {!SDK.RemoteObject} eventTarget |
| 55 * @param {string} type | 297 * @param {string} type |
| 56 * @param {boolean} useCapture | 298 * @param {boolean} useCapture |
| 57 * @param {boolean} passive | 299 * @param {boolean} passive |
| 58 * @param {boolean} once | 300 * @param {boolean} once |
| 59 * @param {?SDK.RemoteObject} handler | 301 * @param {?SDK.RemoteObject} handler |
| 60 * @param {?SDK.RemoteObject} originalHandler | 302 * @param {?SDK.RemoteObject} originalHandler |
| (...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 606 /** | 848 /** |
| 607 * @override | 849 * @override |
| 608 * @param {!SDK.DOMDebuggerModel} domDebuggerModel | 850 * @param {!SDK.DOMDebuggerModel} domDebuggerModel |
| 609 */ | 851 */ |
| 610 modelRemoved(domDebuggerModel) { | 852 modelRemoved(domDebuggerModel) { |
| 611 } | 853 } |
| 612 }; | 854 }; |
| 613 | 855 |
| 614 /** @type {!SDK.DOMDebuggerManager} */ | 856 /** @type {!SDK.DOMDebuggerManager} */ |
| 615 SDK.domDebuggerManager; | 857 SDK.domDebuggerManager; |
| OLD | NEW |