Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(440)

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/sdk/DOMDebuggerModel.js

Issue 2837203002: [DevTools] Move dom breakpoints to DOMDebuggerModel (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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;
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698