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 |