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 retrieveDOMBreakpoints() { |
| 57 this._domModel.requestDocument(); |
| 58 } |
| 59 |
| 60 /** |
| 61 * @return {!Array<!SDK.DOMDebuggerModel.DOMBreakpoint>} |
| 62 */ |
| 63 domBreakpoints() { |
| 64 return this._domBreakpoints.slice(); |
| 65 } |
| 66 |
| 67 /** |
| 68 * @param {!SDK.DOMNode} node |
| 69 * @param {!SDK.DOMDebuggerModel.DOMBreakpoint.Type} type |
| 70 * @return {boolean} |
| 71 */ |
| 72 hasDOMBreakpoint(node, type) { |
| 73 return this._domBreakpoints.some(breakpoint => (breakpoint.node === node &&
breakpoint.type === type)); |
| 74 } |
| 75 |
| 76 /** |
| 77 * @param {!SDK.DOMNode} node |
| 78 * @param {!SDK.DOMDebuggerModel.DOMBreakpoint.Type} type |
| 79 * @return {!SDK.DOMDebuggerModel.DOMBreakpoint} |
| 80 */ |
| 81 setDOMBreakpoint(node, type) { |
| 82 for (var breakpoint of this._domBreakpoints) { |
| 83 if (breakpoint.node === node && breakpoint.type === type) { |
| 84 this.toggleDOMBreakpoint(breakpoint, true); |
| 85 return breakpoint; |
| 86 } |
| 87 } |
| 88 var breakpoint = new SDK.DOMDebuggerModel.DOMBreakpoint(this, node, type, tr
ue); |
| 89 this._domBreakpoints.push(breakpoint); |
| 90 this._saveDOMBreakpoints(); |
| 91 this._enableDOMBreakpoint(breakpoint); |
| 92 this.dispatchEventToListeners(SDK.DOMDebuggerModel.Events.DOMBreakpointAdded
, breakpoint); |
| 93 return breakpoint; |
| 94 } |
| 95 |
| 96 /** |
| 97 * @param {!SDK.DOMNode} node |
| 98 * @param {!SDK.DOMDebuggerModel.DOMBreakpoint.Type} type |
| 99 */ |
| 100 removeDOMBreakpoint(node, type) { |
| 101 this._removeDOMBreakpoints(breakpoint => breakpoint.node === node && breakpo
int.type === type); |
| 102 } |
| 103 |
| 104 removeAllDOMBreakpoints() { |
| 105 this._removeDOMBreakpoints(breakpoint => true); |
| 106 } |
| 107 |
| 108 /** |
| 109 * @param {!SDK.DOMDebuggerModel.DOMBreakpoint} breakpoint |
| 110 * @param {boolean} enabled |
| 111 */ |
| 112 toggleDOMBreakpoint(breakpoint, enabled) { |
| 113 if (enabled === breakpoint.enabled) |
| 114 return; |
| 115 breakpoint.enabled = enabled; |
| 116 if (enabled) |
| 117 this._enableDOMBreakpoint(breakpoint); |
| 118 else |
| 119 this._disableDOMBreakpoint(breakpoint); |
| 120 this.dispatchEventToListeners(SDK.DOMDebuggerModel.Events.DOMBreakpointToggl
ed, breakpoint); |
| 121 } |
| 122 |
| 123 /** |
| 124 * @param {!SDK.DOMDebuggerModel.DOMBreakpoint} breakpoint |
| 125 */ |
| 126 _enableDOMBreakpoint(breakpoint) { |
| 127 this._agent.setDOMBreakpoint(breakpoint.node.id, breakpoint.type); |
| 128 breakpoint.node.setMarker(SDK.DOMDebuggerModel.DOMBreakpoint.Marker, true); |
| 129 } |
| 130 |
| 131 /** |
| 132 * @param {!SDK.DOMDebuggerModel.DOMBreakpoint} breakpoint |
| 133 */ |
| 134 _disableDOMBreakpoint(breakpoint) { |
| 135 this._agent.removeDOMBreakpoint(breakpoint.node.id, breakpoint.type); |
| 136 breakpoint.node.setMarker( |
| 137 SDK.DOMDebuggerModel.DOMBreakpoint.Marker, this._nodeHasBreakpoints(brea
kpoint.node) ? true : null); |
| 138 } |
| 139 |
| 140 /** |
| 141 * @param {!SDK.DOMNode} node |
| 142 * @return {boolean} |
| 143 */ |
| 144 _nodeHasBreakpoints(node) { |
| 145 for (var breakpoint of this._domBreakpoints) { |
| 146 if (breakpoint.node === node && breakpoint.enabled) |
| 147 return true; |
| 148 } |
| 149 return false; |
| 150 } |
| 151 |
| 152 /** |
| 153 * @param {!Object} auxData |
| 154 * @return {?{type: !SDK.DOMDebuggerModel.DOMBreakpoint.Type, node: !SDK.DOMNo
de, targetNode: ?SDK.DOMNode, insertion: boolean}} |
| 155 */ |
| 156 resolveDOMBreakpointData(auxData) { |
| 157 var type = auxData['type']; |
| 158 var node = this._domModel.nodeForId(auxData['nodeId']); |
| 159 if (!type || !node) |
| 160 return null; |
| 161 var targetNode = null; |
| 162 var insertion = false; |
| 163 if (type === SDK.DOMDebuggerModel.DOMBreakpoint.Type.SubtreeModified) { |
| 164 insertion = auxData['insertion'] || false; |
| 165 targetNode = this._domModel.nodeForId(auxData['targetNodeId']); |
| 166 } |
| 167 return {type: type, node: node, targetNode: targetNode, insertion: insertion
}; |
| 168 } |
| 169 |
| 170 /** |
| 171 * @return {string} |
| 172 */ |
| 173 _currentURL() { |
| 174 var domDocument = this._domModel.existingDocument(); |
| 175 return domDocument ? domDocument.documentURL : ''; |
| 176 } |
| 177 |
| 178 _documentUpdated() { |
| 179 var removed = this._domBreakpoints; |
| 180 this._domBreakpoints = []; |
| 181 this.dispatchEventToListeners(SDK.DOMDebuggerModel.Events.DOMBreakpointsRemo
ved, removed); |
| 182 |
| 183 var currentURL = this._currentURL(); |
| 184 for (var breakpoint of this._domBreakpointsSetting.get()) { |
| 185 if (breakpoint.url !== currentURL) |
| 186 continue; |
| 187 this._domModel.pushNodeByPathToFrontend(breakpoint.path, nodeId => { |
| 188 var node = nodeId ? this._domModel.nodeForId(nodeId) : null; |
| 189 if (!node) |
| 190 return; |
| 191 var domBreakpoint = new SDK.DOMDebuggerModel.DOMBreakpoint(this, node, b
reakpoint.type, breakpoint.enabled); |
| 192 this._domBreakpoints.push(domBreakpoint); |
| 193 if (breakpoint.enabled) |
| 194 this._enableDOMBreakpoint(domBreakpoint); |
| 195 this.dispatchEventToListeners(SDK.DOMDebuggerModel.Events.DOMBreakpointA
dded, domBreakpoint); |
| 196 }); |
| 197 } |
| 198 } |
| 199 |
| 200 /** |
| 201 * @param {function(!SDK.DOMDebuggerModel.DOMBreakpoint):boolean} filter |
| 202 */ |
| 203 _removeDOMBreakpoints(filter) { |
| 204 var removed = []; |
| 205 var left = []; |
| 206 for (var breakpoint of this._domBreakpoints) { |
| 207 if (filter(breakpoint)) { |
| 208 removed.push(breakpoint); |
| 209 if (breakpoint.enabled) { |
| 210 breakpoint.enabled = false; |
| 211 this._disableDOMBreakpoint(breakpoint); |
| 212 } |
| 213 } else { |
| 214 left.push(breakpoint); |
| 215 } |
| 216 } |
| 217 |
| 218 if (!removed.length) |
| 219 return; |
| 220 this._domBreakpoints = left; |
| 221 this._saveDOMBreakpoints(); |
| 222 this.dispatchEventToListeners(SDK.DOMDebuggerModel.Events.DOMBreakpointsRemo
ved, removed); |
| 223 } |
| 224 |
| 225 /** |
| 226 * @param {!Common.Event} event |
| 227 */ |
| 228 _nodeRemoved(event) { |
| 229 var node = /** @type {!SDK.DOMNode} */ (event.data.node); |
| 230 var children = node.children() || []; |
| 231 this._removeDOMBreakpoints(breakpoint => breakpoint.node === node || childre
n.indexOf(breakpoint.node) !== -1); |
| 232 } |
| 233 |
| 234 _saveDOMBreakpoints() { |
| 235 var currentURL = this._currentURL(); |
| 236 var breakpoints = this._domBreakpointsSetting.get().filter(breakpoint => bre
akpoint.url !== currentURL); |
| 237 for (var breakpoint of this._domBreakpoints) { |
| 238 breakpoints.push( |
| 239 {url: currentURL, path: breakpoint.node.path(), type: breakpoint.type,
enabled: breakpoint.enabled}); |
| 240 } |
| 241 this._domBreakpointsSetting.set(breakpoints); |
| 242 } |
47 }; | 243 }; |
48 | 244 |
49 SDK.SDKModel.register(SDK.DOMDebuggerModel, SDK.Target.Capability.DOM, false); | 245 SDK.SDKModel.register(SDK.DOMDebuggerModel, SDK.Target.Capability.DOM, false); |
50 | 246 |
| 247 /** @enum {symbol} */ |
| 248 SDK.DOMDebuggerModel.Events = { |
| 249 DOMBreakpointAdded: Symbol('DOMBreakpointAdded'), |
| 250 DOMBreakpointToggled: Symbol('DOMBreakpointToggled'), |
| 251 DOMBreakpointsRemoved: Symbol('DOMBreakpointsRemoved'), |
| 252 }; |
| 253 |
| 254 SDK.DOMDebuggerModel.DOMBreakpoint = class { |
| 255 /** |
| 256 * @param {!SDK.DOMDebuggerModel} domDebuggerModel |
| 257 * @param {!SDK.DOMNode} node |
| 258 * @param {!SDK.DOMDebuggerModel.DOMBreakpoint.Type} type |
| 259 * @param {boolean} enabled |
| 260 */ |
| 261 constructor(domDebuggerModel, node, type, enabled) { |
| 262 this.domDebuggerModel = domDebuggerModel; |
| 263 this.node = node; |
| 264 this.type = type; |
| 265 this.enabled = enabled; |
| 266 } |
| 267 }; |
| 268 |
| 269 /** @typedef {Protocol.DOMDebugger.DOMBreakpointType} */ |
| 270 SDK.DOMDebuggerModel.DOMBreakpoint.Type = Protocol.DOMDebugger.DOMBreakpointType
; |
| 271 |
| 272 SDK.DOMDebuggerModel.DOMBreakpoint.Marker = 'breakpoint-marker'; |
| 273 |
51 SDK.EventListener = class { | 274 SDK.EventListener = class { |
52 /** | 275 /** |
53 * @param {!SDK.DOMDebuggerModel} domDebuggerModel | 276 * @param {!SDK.DOMDebuggerModel} domDebuggerModel |
54 * @param {!SDK.RemoteObject} eventTarget | 277 * @param {!SDK.RemoteObject} eventTarget |
55 * @param {string} type | 278 * @param {string} type |
56 * @param {boolean} useCapture | 279 * @param {boolean} useCapture |
57 * @param {boolean} passive | 280 * @param {boolean} passive |
58 * @param {boolean} once | 281 * @param {boolean} once |
59 * @param {?SDK.RemoteObject} handler | 282 * @param {?SDK.RemoteObject} handler |
60 * @param {?SDK.RemoteObject} originalHandler | 283 * @param {?SDK.RemoteObject} originalHandler |
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
606 /** | 829 /** |
607 * @override | 830 * @override |
608 * @param {!SDK.DOMDebuggerModel} domDebuggerModel | 831 * @param {!SDK.DOMDebuggerModel} domDebuggerModel |
609 */ | 832 */ |
610 modelRemoved(domDebuggerModel) { | 833 modelRemoved(domDebuggerModel) { |
611 } | 834 } |
612 }; | 835 }; |
613 | 836 |
614 /** @type {!SDK.DOMDebuggerManager} */ | 837 /** @type {!SDK.DOMDebuggerManager} */ |
615 SDK.domDebuggerManager; | 838 SDK.domDebuggerManager; |
OLD | NEW |