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

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/bindings/BreakpointManager.js

Issue 2466123002: DevTools: reformat front-end code to match chromium style. (Closed)
Patch Set: all done Created 4 years, 1 month 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 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer 11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the 12 * in the documentation and/or other materials provided with the
13 * distribution. 13 * distribution.
14 * * Neither the name of Google Inc. nor the names of its 14 * * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from 15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission. 16 * this software without specific prior written permission.
17 * 17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30
31 /** 30 /**
32 * @constructor
33 * @extends {WebInspector.Object}
34 * @implements {WebInspector.TargetManager.Observer} 31 * @implements {WebInspector.TargetManager.Observer}
35 * @param {?WebInspector.Setting} breakpointsSetting 32 * @unrestricted
36 * @param {!WebInspector.Workspace} workspace
37 * @param {!WebInspector.TargetManager} targetManager
38 * @param {!WebInspector.DebuggerWorkspaceBinding} debuggerWorkspaceBinding
39 */ 33 */
40 WebInspector.BreakpointManager = function(breakpointsSetting, workspace, targetM anager, debuggerWorkspaceBinding) 34 WebInspector.BreakpointManager = class extends WebInspector.Object {
41 { 35 /**
36 * @param {?WebInspector.Setting} breakpointsSetting
37 * @param {!WebInspector.Workspace} workspace
38 * @param {!WebInspector.TargetManager} targetManager
39 * @param {!WebInspector.DebuggerWorkspaceBinding} debuggerWorkspaceBinding
40 */
41 constructor(breakpointsSetting, workspace, targetManager, debuggerWorkspaceBin ding) {
42 super();
42 this._storage = new WebInspector.BreakpointManager.Storage(this, breakpoints Setting); 43 this._storage = new WebInspector.BreakpointManager.Storage(this, breakpoints Setting);
43 this._workspace = workspace; 44 this._workspace = workspace;
44 this._targetManager = targetManager; 45 this._targetManager = targetManager;
45 this._debuggerWorkspaceBinding = debuggerWorkspaceBinding; 46 this._debuggerWorkspaceBinding = debuggerWorkspaceBinding;
46 47
47 this._breakpointsActive = true; 48 this._breakpointsActive = true;
48 this._breakpointsForUISourceCode = new Map(); 49 this._breakpointsForUISourceCode = new Map();
49 this._breakpointsForPrimaryUISourceCode = new Map(); 50 this._breakpointsForPrimaryUISourceCode = new Map();
50 /** @type {!Multimap.<string, !WebInspector.BreakpointManager.Breakpoint>} * / 51 /** @type {!Multimap.<string, !WebInspector.BreakpointManager.Breakpoint>} * /
51 this._provisionalBreakpoints = new Multimap(); 52 this._provisionalBreakpoints = new Multimap();
52 53
53 this._workspace.addEventListener(WebInspector.Workspace.Events.ProjectRemove d, this._projectRemoved, this); 54 this._workspace.addEventListener(WebInspector.Workspace.Events.ProjectRemove d, this._projectRemoved, this);
54 this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeA dded, this._uiSourceCodeAdded, this); 55 this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeA dded, this._uiSourceCodeAdded, this);
55 this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeR emoved, this._uiSourceCodeRemoved, this); 56 this._workspace.addEventListener(
57 WebInspector.Workspace.Events.UISourceCodeRemoved, this._uiSourceCodeRem oved, this);
58 }
59
60 /**
61 * @param {string} sourceFileId
62 * @param {number} lineNumber
63 * @param {number} columnNumber
64 * @return {string}
65 */
66 static _breakpointStorageId(sourceFileId, lineNumber, columnNumber) {
67 if (!sourceFileId)
68 return '';
69 return sourceFileId + ':' + lineNumber + ':' + columnNumber;
70 }
71
72 /**
73 * @param {!WebInspector.UISourceCode} uiSourceCode
74 * @return {string}
75 */
76 _sourceFileId(uiSourceCode) {
77 // TODO(lushnikov): _sourceFileId is not needed any more.
78 return uiSourceCode.url();
79 }
80
81 /**
82 * @override
83 * @param {!WebInspector.Target} target
84 */
85 targetAdded(target) {
86 var debuggerModel = WebInspector.DebuggerModel.fromTarget(target);
87 if (debuggerModel && !this._breakpointsActive)
88 debuggerModel.setBreakpointsActive(this._breakpointsActive);
89 }
90
91 /**
92 * @override
93 * @param {!WebInspector.Target} target
94 */
95 targetRemoved(target) {
96 }
97
98 /**
99 * @param {string} sourceFileId
100 * @return {!Map.<string, !WebInspector.BreakpointManager.Breakpoint>}
101 */
102 _provisionalBreakpointsForSourceFileId(sourceFileId) {
103 var result = new Map();
104 var breakpoints = this._provisionalBreakpoints.get(sourceFileId).valuesArray ();
105 for (var i = 0; i < breakpoints.length; ++i)
106 result.set(breakpoints[i]._breakpointStorageId(), breakpoints[i]);
107 return result;
108 }
109
110 removeProvisionalBreakpointsForTest() {
111 var breakpoints = this._provisionalBreakpoints.valuesArray();
112 for (var i = 0; i < breakpoints.length; ++i)
113 breakpoints[i].remove();
114 this._provisionalBreakpoints.clear();
115 }
116
117 /**
118 * @param {!WebInspector.UISourceCode} uiSourceCode
119 */
120 _restoreBreakpoints(uiSourceCode) {
121 var sourceFileId = this._sourceFileId(uiSourceCode);
122 if (!sourceFileId)
123 return;
124
125 this._storage.mute();
126 var breakpointItems = this._storage.breakpointItems(this._sourceFileId(uiSou rceCode));
127 var provisionalBreakpoints = this._provisionalBreakpointsForSourceFileId(sou rceFileId);
128 for (var i = 0; i < breakpointItems.length; ++i) {
129 var breakpointItem = breakpointItems[i];
130 var itemStorageId = WebInspector.BreakpointManager._breakpointStorageId(
131 breakpointItem.sourceFileId, breakpointItem.lineNumber, breakpointItem .columnNumber);
132 var provisionalBreakpoint = provisionalBreakpoints.get(itemStorageId);
133 if (provisionalBreakpoint) {
134 if (!this._breakpointsForPrimaryUISourceCode.get(uiSourceCode))
135 this._breakpointsForPrimaryUISourceCode.set(uiSourceCode, []);
136 this._breakpointsForPrimaryUISourceCode.get(uiSourceCode).push(provision alBreakpoint);
137 provisionalBreakpoint._updateBreakpoint();
138 } else {
139 this._innerSetBreakpoint(
140 uiSourceCode, breakpointItem.lineNumber, breakpointItem.columnNumber , breakpointItem.condition,
141 breakpointItem.enabled);
142 }
143 }
144 this._provisionalBreakpoints.removeAll(sourceFileId);
145 this._storage.unmute();
146 }
147
148 /**
149 * @param {!WebInspector.Event} event
150 */
151 _uiSourceCodeAdded(event) {
152 var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.data);
153 this._restoreBreakpoints(uiSourceCode);
154 if (uiSourceCode.contentType().hasScripts())
155 uiSourceCode.addEventListener(
156 WebInspector.UISourceCode.Events.SourceMappingChanged, this._uiSourceC odeMappingChanged, this);
157 }
158
159 /**
160 * @param {!WebInspector.Event} event
161 */
162 _uiSourceCodeRemoved(event) {
163 var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.data);
164 this._removeUISourceCode(uiSourceCode);
165 }
166
167 /**
168 * @param {!WebInspector.Event} event
169 */
170 _uiSourceCodeMappingChanged(event) {
171 var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.target);
172 var isIdentity = /** @type {boolean} */ (event.data.isIdentity);
173 var target = /** @type {!WebInspector.Target} */ (event.data.target);
174 if (isIdentity)
175 return;
176 var breakpoints = this._breakpointsForPrimaryUISourceCode.get(uiSourceCode) || [];
177 for (var i = 0; i < breakpoints.length; ++i)
178 breakpoints[i]._updateInDebuggerForTarget(target);
179 }
180
181 /**
182 * @param {!WebInspector.UISourceCode} uiSourceCode
183 */
184 _removeUISourceCode(uiSourceCode) {
185 var breakpoints = this._breakpointsForPrimaryUISourceCode.get(uiSourceCode) || [];
186 var sourceFileId = this._sourceFileId(uiSourceCode);
187 for (var i = 0; i < breakpoints.length; ++i) {
188 breakpoints[i]._resetLocations();
189 if (breakpoints[i].enabled())
190 this._provisionalBreakpoints.set(sourceFileId, breakpoints[i]);
191 }
192 uiSourceCode.removeEventListener(
193 WebInspector.UISourceCode.Events.SourceMappingChanged, this._uiSourceCod eMappingChanged, this);
194 this._breakpointsForPrimaryUISourceCode.remove(uiSourceCode);
195 }
196
197 /**
198 * @param {!WebInspector.UISourceCode} uiSourceCode
199 * @param {number} lineNumber
200 * @param {number} columnNumber
201 * @param {string} condition
202 * @param {boolean} enabled
203 * @return {!WebInspector.BreakpointManager.Breakpoint}
204 */
205 setBreakpoint(uiSourceCode, lineNumber, columnNumber, condition, enabled) {
206 var uiLocation = new WebInspector.UILocation(uiSourceCode, lineNumber, colum nNumber);
207 var normalizedLocation = this._debuggerWorkspaceBinding.normalizeUILocation( uiLocation);
208 if (normalizedLocation.id() !== uiLocation.id()) {
209 WebInspector.Revealer.reveal(normalizedLocation);
210 uiLocation = normalizedLocation;
211 }
212 this.setBreakpointsActive(true);
213 return this._innerSetBreakpoint(
214 uiLocation.uiSourceCode, uiLocation.lineNumber, uiLocation.columnNumber, condition, enabled);
215 }
216
217 /**
218 * @param {!WebInspector.UISourceCode} uiSourceCode
219 * @param {number} lineNumber
220 * @param {number} columnNumber
221 * @param {string} condition
222 * @param {boolean} enabled
223 * @return {!WebInspector.BreakpointManager.Breakpoint}
224 */
225 _innerSetBreakpoint(uiSourceCode, lineNumber, columnNumber, condition, enabled ) {
226 var breakpoint = this.findBreakpoint(uiSourceCode, lineNumber, columnNumber) ;
227 if (breakpoint) {
228 breakpoint._updateState(condition, enabled);
229 return breakpoint;
230 }
231 var projectId = uiSourceCode.project().id();
232 var path = uiSourceCode.url();
233 var sourceFileId = this._sourceFileId(uiSourceCode);
234 breakpoint = new WebInspector.BreakpointManager.Breakpoint(
235 this, projectId, path, sourceFileId, lineNumber, columnNumber, condition , enabled);
236 if (!this._breakpointsForPrimaryUISourceCode.get(uiSourceCode))
237 this._breakpointsForPrimaryUISourceCode.set(uiSourceCode, []);
238 this._breakpointsForPrimaryUISourceCode.get(uiSourceCode).push(breakpoint);
239 return breakpoint;
240 }
241
242 /**
243 * @param {!WebInspector.UISourceCode} uiSourceCode
244 * @param {number} lineNumber
245 * @param {number} columnNumber
246 * @return {?WebInspector.BreakpointManager.Breakpoint}
247 */
248 findBreakpoint(uiSourceCode, lineNumber, columnNumber) {
249 var breakpoints = this._breakpointsForUISourceCode.get(uiSourceCode);
250 var lineBreakpoints = breakpoints ? breakpoints.get(String(lineNumber)) : nu ll;
251 var columnBreakpoints = lineBreakpoints ? lineBreakpoints.get(String(columnN umber)) : null;
252 return columnBreakpoints ? columnBreakpoints[0] : null;
253 }
254
255 /**
256 * @param {!WebInspector.UISourceCode} uiSourceCode
257 * @param {number} lineNumber
258 * @return {?WebInspector.BreakpointManager.Breakpoint}
259 */
260 findBreakpointOnLine(uiSourceCode, lineNumber) {
261 var breakpoints = this._breakpointsForUISourceCode.get(uiSourceCode);
262 var lineBreakpoints = breakpoints ? breakpoints.get(String(lineNumber)) : nu ll;
263 return lineBreakpoints ? lineBreakpoints.valuesArray()[0][0] : null;
264 }
265
266 /**
267 * @param {!WebInspector.UISourceCode} uiSourceCode
268 * @return {!Array.<!WebInspector.BreakpointManager.Breakpoint>}
269 */
270 breakpointsForUISourceCode(uiSourceCode) {
271 var result = [];
272 var uiSourceCodeBreakpoints = this._breakpointsForUISourceCode.get(uiSourceC ode);
273 var breakpoints = uiSourceCodeBreakpoints ? uiSourceCodeBreakpoints.valuesAr ray() : [];
274 for (var i = 0; i < breakpoints.length; ++i) {
275 var lineBreakpoints = breakpoints[i];
276 var columnBreakpointArrays = lineBreakpoints ? lineBreakpoints.valuesArray () : [];
277 result = result.concat.apply(result, columnBreakpointArrays);
278 }
279 return result;
280 }
281
282 /**
283 * @return {!Array.<!WebInspector.BreakpointManager.Breakpoint>}
284 */
285 allBreakpoints() {
286 var result = [];
287 var uiSourceCodes = this._breakpointsForUISourceCode.keysArray();
288 for (var i = 0; i < uiSourceCodes.length; ++i)
289 result = result.concat(this.breakpointsForUISourceCode(uiSourceCodes[i]));
290 return result;
291 }
292
293 /**
294 * @param {!WebInspector.UISourceCode} uiSourceCode
295 * @return {!Array.<!{breakpoint: !WebInspector.BreakpointManager.Breakpoint, uiLocation: !WebInspector.UILocation}>}
296 */
297 breakpointLocationsForUISourceCode(uiSourceCode) {
298 var uiSourceCodeBreakpoints = this._breakpointsForUISourceCode.get(uiSourceC ode);
299 var lineNumbers = uiSourceCodeBreakpoints ? uiSourceCodeBreakpoints.keysArra y() : [];
300 var result = [];
301 for (var i = 0; i < lineNumbers.length; ++i) {
302 var lineBreakpoints = uiSourceCodeBreakpoints.get(lineNumbers[i]);
303 var columnNumbers = lineBreakpoints.keysArray();
304 for (var j = 0; j < columnNumbers.length; ++j) {
305 var columnBreakpoints = lineBreakpoints.get(columnNumbers[j]);
306 var lineNumber = parseInt(lineNumbers[i], 10);
307 var columnNumber = parseInt(columnNumbers[j], 10);
308 for (var k = 0; k < columnBreakpoints.length; ++k) {
309 var breakpoint = columnBreakpoints[k];
310 var uiLocation = uiSourceCode.uiLocation(lineNumber, columnNumber);
311 result.push({breakpoint: breakpoint, uiLocation: uiLocation});
312 }
313 }
314 }
315 return result;
316 }
317
318 /**
319 * @return {!Array.<!{breakpoint: !WebInspector.BreakpointManager.Breakpoint, uiLocation: !WebInspector.UILocation}>}
320 */
321 allBreakpointLocations() {
322 var result = [];
323 var uiSourceCodes = this._breakpointsForUISourceCode.keysArray();
324 for (var i = 0; i < uiSourceCodes.length; ++i)
325 result = result.concat(this.breakpointLocationsForUISourceCode(uiSourceCod es[i]));
326 return result;
327 }
328
329 /**
330 * @param {boolean} toggleState
331 */
332 toggleAllBreakpoints(toggleState) {
333 var breakpoints = this.allBreakpoints();
334 for (var i = 0; i < breakpoints.length; ++i)
335 breakpoints[i].setEnabled(toggleState);
336 }
337
338 removeAllBreakpoints() {
339 var breakpoints = this.allBreakpoints();
340 for (var i = 0; i < breakpoints.length; ++i)
341 breakpoints[i].remove();
342 }
343
344 _projectRemoved(event) {
345 var project = /** @type {!WebInspector.Project} */ (event.data);
346 var uiSourceCodes = project.uiSourceCodes();
347 for (var i = 0; i < uiSourceCodes.length; ++i)
348 this._removeUISourceCode(uiSourceCodes[i]);
349 }
350
351 /**
352 * @param {!WebInspector.BreakpointManager.Breakpoint} breakpoint
353 * @param {boolean} removeFromStorage
354 */
355 _removeBreakpoint(breakpoint, removeFromStorage) {
356 var uiSourceCode = breakpoint.uiSourceCode();
357 var breakpoints = uiSourceCode ? this._breakpointsForPrimaryUISourceCode.get (uiSourceCode) || [] : [];
358 breakpoints.remove(breakpoint);
359 if (removeFromStorage)
360 this._storage._removeBreakpoint(breakpoint);
361 this._provisionalBreakpoints.remove(breakpoint._sourceFileId, breakpoint);
362 }
363
364 /**
365 * @param {!WebInspector.BreakpointManager.Breakpoint} breakpoint
366 * @param {!WebInspector.UILocation} uiLocation
367 */
368 _uiLocationAdded(breakpoint, uiLocation) {
369 var breakpoints = this._breakpointsForUISourceCode.get(uiLocation.uiSourceCo de);
370 if (!breakpoints) {
371 breakpoints = new Map();
372 this._breakpointsForUISourceCode.set(uiLocation.uiSourceCode, breakpoints) ;
373 }
374 var lineBreakpoints = breakpoints.get(String(uiLocation.lineNumber));
375 if (!lineBreakpoints) {
376 lineBreakpoints = new Map();
377 breakpoints.set(String(uiLocation.lineNumber), lineBreakpoints);
378 }
379 var columnBreakpoints = lineBreakpoints.get(String(uiLocation.columnNumber)) ;
380 if (!columnBreakpoints) {
381 columnBreakpoints = [];
382 lineBreakpoints.set(String(uiLocation.columnNumber), columnBreakpoints);
383 }
384 columnBreakpoints.push(breakpoint);
385 this.dispatchEventToListeners(
386 WebInspector.BreakpointManager.Events.BreakpointAdded, {breakpoint: brea kpoint, uiLocation: uiLocation});
387 }
388
389 /**
390 * @param {!WebInspector.BreakpointManager.Breakpoint} breakpoint
391 * @param {!WebInspector.UILocation} uiLocation
392 */
393 _uiLocationRemoved(breakpoint, uiLocation) {
394 var breakpoints = this._breakpointsForUISourceCode.get(uiLocation.uiSourceCo de);
395 if (!breakpoints)
396 return;
397
398 var lineBreakpoints = breakpoints.get(String(uiLocation.lineNumber));
399 if (!lineBreakpoints)
400 return;
401 var columnBreakpoints = lineBreakpoints.get(String(uiLocation.columnNumber)) ;
402 if (!columnBreakpoints)
403 return;
404 columnBreakpoints.remove(breakpoint);
405 if (!columnBreakpoints.length)
406 lineBreakpoints.remove(String(uiLocation.columnNumber));
407 if (!lineBreakpoints.size)
408 breakpoints.remove(String(uiLocation.lineNumber));
409 if (!breakpoints.size)
410 this._breakpointsForUISourceCode.remove(uiLocation.uiSourceCode);
411 this.dispatchEventToListeners(
412 WebInspector.BreakpointManager.Events.BreakpointRemoved, {breakpoint: br eakpoint, uiLocation: uiLocation});
413 }
414
415 /**
416 * @param {boolean} active
417 */
418 setBreakpointsActive(active) {
419 if (this._breakpointsActive === active)
420 return;
421
422 this._breakpointsActive = active;
423 var debuggerModels = WebInspector.DebuggerModel.instances();
424 for (var i = 0; i < debuggerModels.length; ++i)
425 debuggerModels[i].setBreakpointsActive(active);
426
427 this.dispatchEventToListeners(WebInspector.BreakpointManager.Events.Breakpoi ntsActiveStateChanged, active);
428 }
429
430 /**
431 * @return {boolean}
432 */
433 breakpointsActive() {
434 return this._breakpointsActive;
435 }
56 }; 436 };
57 437
58 /** @enum {symbol} */ 438 /** @enum {symbol} */
59 WebInspector.BreakpointManager.Events = { 439 WebInspector.BreakpointManager.Events = {
60 BreakpointAdded: Symbol("breakpoint-added"), 440 BreakpointAdded: Symbol('breakpoint-added'),
61 BreakpointRemoved: Symbol("breakpoint-removed"), 441 BreakpointRemoved: Symbol('breakpoint-removed'),
62 BreakpointsActiveStateChanged: Symbol("BreakpointsActiveStateChanged") 442 BreakpointsActiveStateChanged: Symbol('BreakpointsActiveStateChanged')
63 }; 443 };
64 444
445
65 /** 446 /**
66 * @param {string} sourceFileId 447 * @implements {WebInspector.TargetManager.Observer}
67 * @param {number} lineNumber 448 * @unrestricted
68 * @param {number} columnNumber
69 * @return {string}
70 */ 449 */
71 WebInspector.BreakpointManager._breakpointStorageId = function(sourceFileId, lin eNumber, columnNumber) 450 WebInspector.BreakpointManager.Breakpoint = class {
72 { 451 /**
73 if (!sourceFileId) 452 * @param {!WebInspector.BreakpointManager} breakpointManager
74 return ""; 453 * @param {string} projectId
75 return sourceFileId + ":" + lineNumber + ":" + columnNumber; 454 * @param {string} path
76 }; 455 * @param {string} sourceFileId
77 456 * @param {number} lineNumber
78 WebInspector.BreakpointManager.prototype = { 457 * @param {number} columnNumber
79 /** 458 * @param {string} condition
80 * @param {!WebInspector.UISourceCode} uiSourceCode 459 * @param {boolean} enabled
81 * @return {string} 460 */
82 */ 461 constructor(breakpointManager, projectId, path, sourceFileId, lineNumber, colu mnNumber, condition, enabled) {
83 _sourceFileId: function(uiSourceCode)
84 {
85 // TODO(lushnikov): _sourceFileId is not needed any more.
86 return uiSourceCode.url();
87 },
88
89 /**
90 * @override
91 * @param {!WebInspector.Target} target
92 */
93 targetAdded: function(target)
94 {
95 var debuggerModel = WebInspector.DebuggerModel.fromTarget(target);
96 if (debuggerModel && !this._breakpointsActive)
97 debuggerModel.setBreakpointsActive(this._breakpointsActive);
98 },
99
100 /**
101 * @override
102 * @param {!WebInspector.Target} target
103 */
104 targetRemoved: function(target) { },
105
106 /**
107 * @param {string} sourceFileId
108 * @return {!Map.<string, !WebInspector.BreakpointManager.Breakpoint>}
109 */
110 _provisionalBreakpointsForSourceFileId: function(sourceFileId)
111 {
112 var result = new Map();
113 var breakpoints = this._provisionalBreakpoints.get(sourceFileId).valuesA rray();
114 for (var i = 0; i < breakpoints.length; ++i)
115 result.set(breakpoints[i]._breakpointStorageId(), breakpoints[i]);
116 return result;
117 },
118
119 removeProvisionalBreakpointsForTest: function()
120 {
121 var breakpoints = this._provisionalBreakpoints.valuesArray();
122 for (var i = 0; i < breakpoints.length; ++i)
123 breakpoints[i].remove();
124 this._provisionalBreakpoints.clear();
125 },
126
127 /**
128 * @param {!WebInspector.UISourceCode} uiSourceCode
129 */
130 _restoreBreakpoints: function(uiSourceCode)
131 {
132 var sourceFileId = this._sourceFileId(uiSourceCode);
133 if (!sourceFileId)
134 return;
135
136 this._storage.mute();
137 var breakpointItems = this._storage.breakpointItems(this._sourceFileId(u iSourceCode));
138 var provisionalBreakpoints = this._provisionalBreakpointsForSourceFileId (sourceFileId);
139 for (var i = 0; i < breakpointItems.length; ++i) {
140 var breakpointItem = breakpointItems[i];
141 var itemStorageId = WebInspector.BreakpointManager._breakpointStorag eId(breakpointItem.sourceFileId, breakpointItem.lineNumber, breakpointItem.colum nNumber);
142 var provisionalBreakpoint = provisionalBreakpoints.get(itemStorageId );
143 if (provisionalBreakpoint) {
144 if (!this._breakpointsForPrimaryUISourceCode.get(uiSourceCode))
145 this._breakpointsForPrimaryUISourceCode.set(uiSourceCode, [] );
146 this._breakpointsForPrimaryUISourceCode.get(uiSourceCode).push(p rovisionalBreakpoint);
147 provisionalBreakpoint._updateBreakpoint();
148 } else {
149 this._innerSetBreakpoint(uiSourceCode, breakpointItem.lineNumber , breakpointItem.columnNumber, breakpointItem.condition, breakpointItem.enabled) ;
150 }
151 }
152 this._provisionalBreakpoints.removeAll(sourceFileId);
153 this._storage.unmute();
154 },
155
156 /**
157 * @param {!WebInspector.Event} event
158 */
159 _uiSourceCodeAdded: function(event)
160 {
161 var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.data );
162 this._restoreBreakpoints(uiSourceCode);
163 if (uiSourceCode.contentType().hasScripts())
164 uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.Sourc eMappingChanged, this._uiSourceCodeMappingChanged, this);
165 },
166
167 /**
168 * @param {!WebInspector.Event} event
169 */
170 _uiSourceCodeRemoved: function(event)
171 {
172 var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.data );
173 this._removeUISourceCode(uiSourceCode);
174 },
175
176 /**
177 * @param {!WebInspector.Event} event
178 */
179 _uiSourceCodeMappingChanged: function(event)
180 {
181 var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.targ et);
182 var isIdentity = /** @type {boolean} */ (event.data.isIdentity);
183 var target = /** @type {!WebInspector.Target} */ (event.data.target);
184 if (isIdentity)
185 return;
186 var breakpoints = this._breakpointsForPrimaryUISourceCode.get(uiSourceCo de) || [];
187 for (var i = 0; i < breakpoints.length; ++i)
188 breakpoints[i]._updateInDebuggerForTarget(target);
189 },
190
191 /**
192 * @param {!WebInspector.UISourceCode} uiSourceCode
193 */
194 _removeUISourceCode: function(uiSourceCode)
195 {
196 var breakpoints = this._breakpointsForPrimaryUISourceCode.get(uiSourceCo de) || [];
197 var sourceFileId = this._sourceFileId(uiSourceCode);
198 for (var i = 0; i < breakpoints.length; ++i) {
199 breakpoints[i]._resetLocations();
200 if (breakpoints[i].enabled())
201 this._provisionalBreakpoints.set(sourceFileId, breakpoints[i]);
202 }
203 uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.Source MappingChanged, this._uiSourceCodeMappingChanged, this);
204 this._breakpointsForPrimaryUISourceCode.remove(uiSourceCode);
205 },
206
207 /**
208 * @param {!WebInspector.UISourceCode} uiSourceCode
209 * @param {number} lineNumber
210 * @param {number} columnNumber
211 * @param {string} condition
212 * @param {boolean} enabled
213 * @return {!WebInspector.BreakpointManager.Breakpoint}
214 */
215 setBreakpoint: function(uiSourceCode, lineNumber, columnNumber, condition, e nabled)
216 {
217 var uiLocation = new WebInspector.UILocation(uiSourceCode, lineNumber, c olumnNumber);
218 var normalizedLocation = this._debuggerWorkspaceBinding.normalizeUILocat ion(uiLocation);
219 if (normalizedLocation.id() !== uiLocation.id()) {
220 WebInspector.Revealer.reveal(normalizedLocation);
221 uiLocation = normalizedLocation;
222 }
223 this.setBreakpointsActive(true);
224 return this._innerSetBreakpoint(uiLocation.uiSourceCode, uiLocation.line Number, uiLocation.columnNumber, condition, enabled);
225 },
226
227 /**
228 * @param {!WebInspector.UISourceCode} uiSourceCode
229 * @param {number} lineNumber
230 * @param {number} columnNumber
231 * @param {string} condition
232 * @param {boolean} enabled
233 * @return {!WebInspector.BreakpointManager.Breakpoint}
234 */
235 _innerSetBreakpoint: function(uiSourceCode, lineNumber, columnNumber, condit ion, enabled)
236 {
237 var breakpoint = this.findBreakpoint(uiSourceCode, lineNumber, columnNum ber);
238 if (breakpoint) {
239 breakpoint._updateState(condition, enabled);
240 return breakpoint;
241 }
242 var projectId = uiSourceCode.project().id();
243 var path = uiSourceCode.url();
244 var sourceFileId = this._sourceFileId(uiSourceCode);
245 breakpoint = new WebInspector.BreakpointManager.Breakpoint(this, project Id, path, sourceFileId, lineNumber, columnNumber, condition, enabled);
246 if (!this._breakpointsForPrimaryUISourceCode.get(uiSourceCode))
247 this._breakpointsForPrimaryUISourceCode.set(uiSourceCode, []);
248 this._breakpointsForPrimaryUISourceCode.get(uiSourceCode).push(breakpoin t);
249 return breakpoint;
250 },
251
252 /**
253 * @param {!WebInspector.UISourceCode} uiSourceCode
254 * @param {number} lineNumber
255 * @param {number} columnNumber
256 * @return {?WebInspector.BreakpointManager.Breakpoint}
257 */
258 findBreakpoint: function(uiSourceCode, lineNumber, columnNumber)
259 {
260 var breakpoints = this._breakpointsForUISourceCode.get(uiSourceCode);
261 var lineBreakpoints = breakpoints ? breakpoints.get(String(lineNumber)) : null;
262 var columnBreakpoints = lineBreakpoints ? lineBreakpoints.get(String(col umnNumber)) : null;
263 return columnBreakpoints ? columnBreakpoints[0] : null;
264 },
265
266 /**
267 * @param {!WebInspector.UISourceCode} uiSourceCode
268 * @param {number} lineNumber
269 * @return {?WebInspector.BreakpointManager.Breakpoint}
270 */
271 findBreakpointOnLine: function(uiSourceCode, lineNumber)
272 {
273 var breakpoints = this._breakpointsForUISourceCode.get(uiSourceCode);
274 var lineBreakpoints = breakpoints ? breakpoints.get(String(lineNumber)) : null;
275 return lineBreakpoints ? lineBreakpoints.valuesArray()[0][0] : null;
276 },
277
278 /**
279 * @param {!WebInspector.UISourceCode} uiSourceCode
280 * @return {!Array.<!WebInspector.BreakpointManager.Breakpoint>}
281 */
282 breakpointsForUISourceCode: function(uiSourceCode)
283 {
284 var result = [];
285 var uiSourceCodeBreakpoints = this._breakpointsForUISourceCode.get(uiSou rceCode);
286 var breakpoints = uiSourceCodeBreakpoints ? uiSourceCodeBreakpoints.valu esArray() : [];
287 for (var i = 0; i < breakpoints.length; ++i) {
288 var lineBreakpoints = breakpoints[i];
289 var columnBreakpointArrays = lineBreakpoints ? lineBreakpoints.value sArray() : [];
290 result = result.concat.apply(result, columnBreakpointArrays);
291 }
292 return result;
293 },
294
295 /**
296 * @return {!Array.<!WebInspector.BreakpointManager.Breakpoint>}
297 */
298 allBreakpoints: function()
299 {
300 var result = [];
301 var uiSourceCodes = this._breakpointsForUISourceCode.keysArray();
302 for (var i = 0; i < uiSourceCodes.length; ++i)
303 result = result.concat(this.breakpointsForUISourceCode(uiSourceCodes [i]));
304 return result;
305 },
306
307 /**
308 * @param {!WebInspector.UISourceCode} uiSourceCode
309 * @return {!Array.<!{breakpoint: !WebInspector.BreakpointManager.Breakpoint , uiLocation: !WebInspector.UILocation}>}
310 */
311 breakpointLocationsForUISourceCode: function(uiSourceCode)
312 {
313 var uiSourceCodeBreakpoints = this._breakpointsForUISourceCode.get(uiSou rceCode);
314 var lineNumbers = uiSourceCodeBreakpoints ? uiSourceCodeBreakpoints.keys Array() : [];
315 var result = [];
316 for (var i = 0; i < lineNumbers.length; ++i) {
317 var lineBreakpoints = uiSourceCodeBreakpoints.get(lineNumbers[i]);
318 var columnNumbers = lineBreakpoints.keysArray();
319 for (var j = 0; j < columnNumbers.length; ++j) {
320 var columnBreakpoints = lineBreakpoints.get(columnNumbers[j]);
321 var lineNumber = parseInt(lineNumbers[i], 10);
322 var columnNumber = parseInt(columnNumbers[j], 10);
323 for (var k = 0; k < columnBreakpoints.length; ++k) {
324 var breakpoint = columnBreakpoints[k];
325 var uiLocation = uiSourceCode.uiLocation(lineNumber, columnN umber);
326 result.push({breakpoint: breakpoint, uiLocation: uiLocation} );
327 }
328 }
329 }
330 return result;
331 },
332
333 /**
334 * @return {!Array.<!{breakpoint: !WebInspector.BreakpointManager.Breakpoint , uiLocation: !WebInspector.UILocation}>}
335 */
336 allBreakpointLocations: function()
337 {
338 var result = [];
339 var uiSourceCodes = this._breakpointsForUISourceCode.keysArray();
340 for (var i = 0; i < uiSourceCodes.length; ++i)
341 result = result.concat(this.breakpointLocationsForUISourceCode(uiSou rceCodes[i]));
342 return result;
343 },
344
345 /**
346 * @param {boolean} toggleState
347 */
348 toggleAllBreakpoints: function(toggleState)
349 {
350 var breakpoints = this.allBreakpoints();
351 for (var i = 0; i < breakpoints.length; ++i)
352 breakpoints[i].setEnabled(toggleState);
353 },
354
355 removeAllBreakpoints: function()
356 {
357 var breakpoints = this.allBreakpoints();
358 for (var i = 0; i < breakpoints.length; ++i)
359 breakpoints[i].remove();
360 },
361
362 _projectRemoved: function(event)
363 {
364 var project = /** @type {!WebInspector.Project} */ (event.data);
365 var uiSourceCodes = project.uiSourceCodes();
366 for (var i = 0; i < uiSourceCodes.length; ++i)
367 this._removeUISourceCode(uiSourceCodes[i]);
368 },
369
370 /**
371 * @param {!WebInspector.BreakpointManager.Breakpoint} breakpoint
372 * @param {boolean} removeFromStorage
373 */
374 _removeBreakpoint: function(breakpoint, removeFromStorage)
375 {
376 var uiSourceCode = breakpoint.uiSourceCode();
377 var breakpoints = uiSourceCode ? this._breakpointsForPrimaryUISourceCode .get(uiSourceCode) || [] : [];
378 breakpoints.remove(breakpoint);
379 if (removeFromStorage)
380 this._storage._removeBreakpoint(breakpoint);
381 this._provisionalBreakpoints.remove(breakpoint._sourceFileId, breakpoint );
382 },
383
384 /**
385 * @param {!WebInspector.BreakpointManager.Breakpoint} breakpoint
386 * @param {!WebInspector.UILocation} uiLocation
387 */
388 _uiLocationAdded: function(breakpoint, uiLocation)
389 {
390 var breakpoints = this._breakpointsForUISourceCode.get(uiLocation.uiSour ceCode);
391 if (!breakpoints) {
392 breakpoints = new Map();
393 this._breakpointsForUISourceCode.set(uiLocation.uiSourceCode, breakp oints);
394 }
395 var lineBreakpoints = breakpoints.get(String(uiLocation.lineNumber));
396 if (!lineBreakpoints) {
397 lineBreakpoints = new Map();
398 breakpoints.set(String(uiLocation.lineNumber), lineBreakpoints);
399 }
400 var columnBreakpoints = lineBreakpoints.get(String(uiLocation.columnNumb er));
401 if (!columnBreakpoints) {
402 columnBreakpoints = [];
403 lineBreakpoints.set(String(uiLocation.columnNumber), columnBreakpoin ts);
404 }
405 columnBreakpoints.push(breakpoint);
406 this.dispatchEventToListeners(WebInspector.BreakpointManager.Events.Brea kpointAdded, {breakpoint: breakpoint, uiLocation: uiLocation});
407 },
408
409 /**
410 * @param {!WebInspector.BreakpointManager.Breakpoint} breakpoint
411 * @param {!WebInspector.UILocation} uiLocation
412 */
413 _uiLocationRemoved: function(breakpoint, uiLocation)
414 {
415 var breakpoints = this._breakpointsForUISourceCode.get(uiLocation.uiSour ceCode);
416 if (!breakpoints)
417 return;
418
419 var lineBreakpoints = breakpoints.get(String(uiLocation.lineNumber));
420 if (!lineBreakpoints)
421 return;
422 var columnBreakpoints = lineBreakpoints.get(String(uiLocation.columnNumb er));
423 if (!columnBreakpoints)
424 return;
425 columnBreakpoints.remove(breakpoint);
426 if (!columnBreakpoints.length)
427 lineBreakpoints.remove(String(uiLocation.columnNumber));
428 if (!lineBreakpoints.size)
429 breakpoints.remove(String(uiLocation.lineNumber));
430 if (!breakpoints.size)
431 this._breakpointsForUISourceCode.remove(uiLocation.uiSourceCode);
432 this.dispatchEventToListeners(WebInspector.BreakpointManager.Events.Brea kpointRemoved, {breakpoint: breakpoint, uiLocation: uiLocation});
433 },
434
435 /**
436 * @param {boolean} active
437 */
438 setBreakpointsActive: function(active)
439 {
440 if (this._breakpointsActive === active)
441 return;
442
443 this._breakpointsActive = active;
444 var debuggerModels = WebInspector.DebuggerModel.instances();
445 for (var i = 0; i < debuggerModels.length; ++i)
446 debuggerModels[i].setBreakpointsActive(active);
447
448 this.dispatchEventToListeners(WebInspector.BreakpointManager.Events.Brea kpointsActiveStateChanged, active);
449 },
450
451 /**
452 * @return {boolean}
453 */
454 breakpointsActive: function()
455 {
456 return this._breakpointsActive;
457 },
458
459 __proto__: WebInspector.Object.prototype
460 };
461
462 /**
463 * @constructor
464 * @implements {WebInspector.TargetManager.Observer}
465 * @param {!WebInspector.BreakpointManager} breakpointManager
466 * @param {string} projectId
467 * @param {string} path
468 * @param {string} sourceFileId
469 * @param {number} lineNumber
470 * @param {number} columnNumber
471 * @param {string} condition
472 * @param {boolean} enabled
473 */
474 WebInspector.BreakpointManager.Breakpoint = function(breakpointManager, projectI d, path, sourceFileId, lineNumber, columnNumber, condition, enabled)
475 {
476 this._breakpointManager = breakpointManager; 462 this._breakpointManager = breakpointManager;
477 this._projectId = projectId; 463 this._projectId = projectId;
478 this._path = path; 464 this._path = path;
479 this._lineNumber = lineNumber; 465 this._lineNumber = lineNumber;
480 this._columnNumber = columnNumber; 466 this._columnNumber = columnNumber;
481 this._sourceFileId = sourceFileId; 467 this._sourceFileId = sourceFileId;
482 468
483 /** @type {!Map<string, number>} */ 469 /** @type {!Map<string, number>} */
484 this._numberOfDebuggerLocationForUILocation = new Map(); 470 this._numberOfDebuggerLocationForUILocation = new Map();
485 471
486 // Force breakpoint update. 472 // Force breakpoint update.
487 /** @type {string} */ this._condition; 473 /** @type {string} */ this._condition;
488 /** @type {boolean} */ this._enabled; 474 /** @type {boolean} */ this._enabled;
489 /** @type {boolean} */ this._isRemoved; 475 /** @type {boolean} */ this._isRemoved;
490 /** @type {!WebInspector.UILocation|undefined} */ this._fakePrimaryLocation; 476 /** @type {!WebInspector.UILocation|undefined} */ this._fakePrimaryLocation;
491 477
492 this._currentState = null; 478 this._currentState = null;
493 /** @type {!Map.<!WebInspector.Target, !WebInspector.BreakpointManager.Targe tBreakpoint>}*/ 479 /** @type {!Map.<!WebInspector.Target, !WebInspector.BreakpointManager.Targe tBreakpoint>}*/
494 this._targetBreakpoints = new Map(); 480 this._targetBreakpoints = new Map();
495 this._updateState(condition, enabled); 481 this._updateState(condition, enabled);
496 this._breakpointManager._targetManager.observeTargets(this); 482 this._breakpointManager._targetManager.observeTargets(this);
483 }
484
485 /**
486 * @override
487 * @param {!WebInspector.Target} target
488 */
489 targetAdded(target) {
490 var debuggerModel = WebInspector.DebuggerModel.fromTarget(target);
491 if (!debuggerModel)
492 return;
493 var debuggerWorkspaceBinding = this._breakpointManager._debuggerWorkspaceBin ding;
494 this._targetBreakpoints.set(
495 target, new WebInspector.BreakpointManager.TargetBreakpoint(debuggerMode l, this, debuggerWorkspaceBinding));
496 }
497
498 /**
499 * @override
500 * @param {!WebInspector.Target} target
501 */
502 targetRemoved(target) {
503 var debuggerModel = WebInspector.DebuggerModel.fromTarget(target);
504 if (!debuggerModel)
505 return;
506 var targetBreakpoint = this._targetBreakpoints.remove(target);
507 targetBreakpoint._cleanUpAfterDebuggerIsGone();
508 targetBreakpoint._removeEventListeners();
509 }
510
511 /**
512 * @return {string}
513 */
514 projectId() {
515 return this._projectId;
516 }
517
518 /**
519 * @return {string}
520 */
521 path() {
522 return this._path;
523 }
524
525 /**
526 * @return {number}
527 */
528 lineNumber() {
529 return this._lineNumber;
530 }
531
532 /**
533 * @return {number}
534 */
535 columnNumber() {
536 return this._columnNumber;
537 }
538
539 /**
540 * @return {?WebInspector.UISourceCode}
541 */
542 uiSourceCode() {
543 return this._breakpointManager._workspace.uiSourceCode(this._projectId, this ._path);
544 }
545
546 /**
547 * @param {?WebInspector.UILocation} oldUILocation
548 * @param {!WebInspector.UILocation} newUILocation
549 */
550 _replaceUILocation(oldUILocation, newUILocation) {
551 if (this._isRemoved)
552 return;
553
554 this._removeUILocation(oldUILocation, true);
555 this._removeFakeBreakpointAtPrimaryLocation();
556
557 var current = (this._numberOfDebuggerLocationForUILocation.get(newUILocation .id()) || 0) + 1;
558 this._numberOfDebuggerLocationForUILocation.set(newUILocation.id(), current) ;
559 if (current === 1)
560 this._breakpointManager._uiLocationAdded(this, newUILocation);
561 }
562
563 /**
564 * @param {?WebInspector.UILocation} uiLocation
565 * @param {boolean=} muteCreationFakeBreakpoint
566 */
567 _removeUILocation(uiLocation, muteCreationFakeBreakpoint) {
568 if (!uiLocation || !this._numberOfDebuggerLocationForUILocation.has(uiLocati on.id()))
569 return;
570 var current = (this._numberOfDebuggerLocationForUILocation.get(uiLocation.id ()) || 0) - 1;
571 this._numberOfDebuggerLocationForUILocation.set(uiLocation.id(), current);
572 if (current !== 0)
573 return;
574
575 this._numberOfDebuggerLocationForUILocation.delete(uiLocation.id());
576 this._breakpointManager._uiLocationRemoved(this, uiLocation);
577 if (!muteCreationFakeBreakpoint)
578 this._fakeBreakpointAtPrimaryLocation();
579 }
580
581 /**
582 * @return {boolean}
583 */
584 enabled() {
585 return this._enabled;
586 }
587
588 /**
589 * @param {boolean} enabled
590 */
591 setEnabled(enabled) {
592 this._updateState(this._condition, enabled);
593 }
594
595 /**
596 * @return {string}
597 */
598 condition() {
599 return this._condition;
600 }
601
602 /**
603 * @param {string} condition
604 */
605 setCondition(condition) {
606 this._updateState(condition, this._enabled);
607 }
608
609 /**
610 * @param {string} condition
611 * @param {boolean} enabled
612 */
613 _updateState(condition, enabled) {
614 if (this._enabled === enabled && this._condition === condition)
615 return;
616 this._enabled = enabled;
617 this._condition = condition;
618 this._breakpointManager._storage._updateBreakpoint(this);
619 this._updateBreakpoint();
620 }
621
622 _updateBreakpoint() {
623 this._removeFakeBreakpointAtPrimaryLocation();
624 this._fakeBreakpointAtPrimaryLocation();
625 var targetBreakpoints = this._targetBreakpoints.valuesArray();
626 for (var i = 0; i < targetBreakpoints.length; ++i)
627 targetBreakpoints[i]._scheduleUpdateInDebugger();
628 }
629
630 /**
631 * @param {boolean=} keepInStorage
632 */
633 remove(keepInStorage) {
634 this._isRemoved = true;
635 var removeFromStorage = !keepInStorage;
636 this._removeFakeBreakpointAtPrimaryLocation();
637 var targetBreakpoints = this._targetBreakpoints.valuesArray();
638 for (var i = 0; i < targetBreakpoints.length; ++i) {
639 targetBreakpoints[i]._scheduleUpdateInDebugger();
640 targetBreakpoints[i]._removeEventListeners();
641 }
642
643 this._breakpointManager._removeBreakpoint(this, removeFromStorage);
644 this._breakpointManager._targetManager.unobserveTargets(this);
645 }
646
647 /**
648 * @param {!WebInspector.Target} target
649 */
650 _updateInDebuggerForTarget(target) {
651 this._targetBreakpoints.get(target)._scheduleUpdateInDebugger();
652 }
653
654 /**
655 * @return {string}
656 */
657 _breakpointStorageId() {
658 return WebInspector.BreakpointManager._breakpointStorageId(
659 this._sourceFileId, this._lineNumber, this._columnNumber);
660 }
661
662 _fakeBreakpointAtPrimaryLocation() {
663 if (this._isRemoved || this._numberOfDebuggerLocationForUILocation.size || t his._fakePrimaryLocation)
664 return;
665
666 var uiSourceCode = this._breakpointManager._workspace.uiSourceCode(this._pro jectId, this._path);
667 if (!uiSourceCode)
668 return;
669
670 this._fakePrimaryLocation = uiSourceCode.uiLocation(this._lineNumber, this._ columnNumber);
671 if (this._fakePrimaryLocation)
672 this._breakpointManager._uiLocationAdded(this, this._fakePrimaryLocation);
673 }
674
675 _removeFakeBreakpointAtPrimaryLocation() {
676 if (this._fakePrimaryLocation) {
677 this._breakpointManager._uiLocationRemoved(this, this._fakePrimaryLocation );
678 delete this._fakePrimaryLocation;
679 }
680 }
681
682 _resetLocations() {
683 this._removeFakeBreakpointAtPrimaryLocation();
684 var targetBreakpoints = this._targetBreakpoints.valuesArray();
685 for (var i = 0; i < targetBreakpoints.length; ++i)
686 targetBreakpoints[i]._resetLocations();
687 }
497 }; 688 };
498 689
499 WebInspector.BreakpointManager.Breakpoint.prototype = {
500 /**
501 * @override
502 * @param {!WebInspector.Target} target
503 */
504 targetAdded: function(target)
505 {
506 var debuggerModel = WebInspector.DebuggerModel.fromTarget(target);
507 if (!debuggerModel)
508 return;
509 var debuggerWorkspaceBinding = this._breakpointManager._debuggerWorkspac eBinding;
510 this._targetBreakpoints.set(target, new WebInspector.BreakpointManager.T argetBreakpoint(debuggerModel, this, debuggerWorkspaceBinding));
511 },
512
513 /**
514 * @override
515 * @param {!WebInspector.Target} target
516 */
517 targetRemoved: function(target)
518 {
519 var debuggerModel = WebInspector.DebuggerModel.fromTarget(target);
520 if (!debuggerModel)
521 return;
522 var targetBreakpoint = this._targetBreakpoints.remove(target);
523 targetBreakpoint._cleanUpAfterDebuggerIsGone();
524 targetBreakpoint._removeEventListeners();
525 },
526
527 /**
528 * @return {string}
529 */
530 projectId: function()
531 {
532 return this._projectId;
533 },
534
535 /**
536 * @return {string}
537 */
538 path: function()
539 {
540 return this._path;
541 },
542
543 /**
544 * @return {number}
545 */
546 lineNumber: function()
547 {
548 return this._lineNumber;
549 },
550
551 /**
552 * @return {number}
553 */
554 columnNumber: function()
555 {
556 return this._columnNumber;
557 },
558
559 /**
560 * @return {?WebInspector.UISourceCode}
561 */
562 uiSourceCode: function()
563 {
564 return this._breakpointManager._workspace.uiSourceCode(this._projectId, this._path);
565 },
566
567 /**
568 * @param {?WebInspector.UILocation} oldUILocation
569 * @param {!WebInspector.UILocation} newUILocation
570 */
571 _replaceUILocation: function(oldUILocation, newUILocation)
572 {
573 if (this._isRemoved)
574 return;
575
576 this._removeUILocation(oldUILocation, true);
577 this._removeFakeBreakpointAtPrimaryLocation();
578
579 var current = (this._numberOfDebuggerLocationForUILocation.get(newUILoca tion.id()) || 0) + 1;
580 this._numberOfDebuggerLocationForUILocation.set(newUILocation.id(), curr ent);
581 if (current === 1)
582 this._breakpointManager._uiLocationAdded(this, newUILocation);
583 },
584
585 /**
586 * @param {?WebInspector.UILocation} uiLocation
587 * @param {boolean=} muteCreationFakeBreakpoint
588 */
589 _removeUILocation: function(uiLocation, muteCreationFakeBreakpoint)
590 {
591 if (!uiLocation || !this._numberOfDebuggerLocationForUILocation.has(uiLo cation.id()))
592 return;
593 var current = (this._numberOfDebuggerLocationForUILocation.get(uiLocatio n.id()) || 0) - 1;
594 this._numberOfDebuggerLocationForUILocation.set(uiLocation.id(), current );
595 if (current !== 0)
596 return;
597
598 this._numberOfDebuggerLocationForUILocation.delete(uiLocation.id());
599 this._breakpointManager._uiLocationRemoved(this, uiLocation);
600 if (!muteCreationFakeBreakpoint)
601 this._fakeBreakpointAtPrimaryLocation();
602 },
603
604 /**
605 * @return {boolean}
606 */
607 enabled: function()
608 {
609 return this._enabled;
610 },
611
612 /**
613 * @param {boolean} enabled
614 */
615 setEnabled: function(enabled)
616 {
617 this._updateState(this._condition, enabled);
618 },
619
620 /**
621 * @return {string}
622 */
623 condition: function()
624 {
625 return this._condition;
626 },
627
628 /**
629 * @param {string} condition
630 */
631 setCondition: function(condition)
632 {
633 this._updateState(condition, this._enabled);
634 },
635
636 /**
637 * @param {string} condition
638 * @param {boolean} enabled
639 */
640 _updateState: function(condition, enabled)
641 {
642 if (this._enabled === enabled && this._condition === condition)
643 return;
644 this._enabled = enabled;
645 this._condition = condition;
646 this._breakpointManager._storage._updateBreakpoint(this);
647 this._updateBreakpoint();
648 },
649
650 _updateBreakpoint: function()
651 {
652 this._removeFakeBreakpointAtPrimaryLocation();
653 this._fakeBreakpointAtPrimaryLocation();
654 var targetBreakpoints = this._targetBreakpoints.valuesArray();
655 for (var i = 0; i < targetBreakpoints.length; ++i)
656 targetBreakpoints[i]._scheduleUpdateInDebugger();
657 },
658
659 /**
660 * @param {boolean=} keepInStorage
661 */
662 remove: function(keepInStorage)
663 {
664
665 this._isRemoved = true;
666 var removeFromStorage = !keepInStorage;
667 this._removeFakeBreakpointAtPrimaryLocation();
668 var targetBreakpoints = this._targetBreakpoints.valuesArray();
669 for (var i = 0; i < targetBreakpoints.length; ++i) {
670 targetBreakpoints[i]._scheduleUpdateInDebugger();
671 targetBreakpoints[i]._removeEventListeners();
672 }
673
674 this._breakpointManager._removeBreakpoint(this, removeFromStorage);
675 this._breakpointManager._targetManager.unobserveTargets(this);
676 },
677
678 /**
679 * @param {!WebInspector.Target} target
680 */
681 _updateInDebuggerForTarget: function(target)
682 {
683 this._targetBreakpoints.get(target)._scheduleUpdateInDebugger();
684 },
685
686 /**
687 * @return {string}
688 */
689 _breakpointStorageId: function()
690 {
691 return WebInspector.BreakpointManager._breakpointStorageId(this._sourceF ileId, this._lineNumber, this._columnNumber);
692 },
693
694 _fakeBreakpointAtPrimaryLocation: function()
695 {
696 if (this._isRemoved || this._numberOfDebuggerLocationForUILocation.size || this._fakePrimaryLocation)
697 return;
698
699 var uiSourceCode = this._breakpointManager._workspace.uiSourceCode(this. _projectId, this._path);
700 if (!uiSourceCode)
701 return;
702
703 this._fakePrimaryLocation = uiSourceCode.uiLocation(this._lineNumber, th is._columnNumber);
704 if (this._fakePrimaryLocation)
705 this._breakpointManager._uiLocationAdded(this, this._fakePrimaryLoca tion);
706 },
707
708 _removeFakeBreakpointAtPrimaryLocation: function()
709 {
710 if (this._fakePrimaryLocation) {
711 this._breakpointManager._uiLocationRemoved(this, this._fakePrimaryLo cation);
712 delete this._fakePrimaryLocation;
713 }
714 },
715
716 _resetLocations: function()
717 {
718 this._removeFakeBreakpointAtPrimaryLocation();
719 var targetBreakpoints = this._targetBreakpoints.valuesArray();
720 for (var i = 0; i < targetBreakpoints.length; ++i)
721 targetBreakpoints[i]._resetLocations();
722 }
723 };
724
725 /** 690 /**
726 * @constructor 691 * @unrestricted
727 * @extends {WebInspector.SDKObject}
728 * @param {!WebInspector.DebuggerModel} debuggerModel
729 * @param {!WebInspector.BreakpointManager.Breakpoint} breakpoint
730 * @param {!WebInspector.DebuggerWorkspaceBinding} debuggerWorkspaceBinding
731 */ 692 */
732 WebInspector.BreakpointManager.TargetBreakpoint = function(debuggerModel, breakp oint, debuggerWorkspaceBinding) 693 WebInspector.BreakpointManager.TargetBreakpoint = class extends WebInspector.SDK Object {
733 { 694 /**
734 WebInspector.SDKObject.call(this, debuggerModel.target()); 695 * @param {!WebInspector.DebuggerModel} debuggerModel
696 * @param {!WebInspector.BreakpointManager.Breakpoint} breakpoint
697 * @param {!WebInspector.DebuggerWorkspaceBinding} debuggerWorkspaceBinding
698 */
699 constructor(debuggerModel, breakpoint, debuggerWorkspaceBinding) {
700 super(debuggerModel.target());
735 this._debuggerModel = debuggerModel; 701 this._debuggerModel = debuggerModel;
736 this._breakpoint = breakpoint; 702 this._breakpoint = breakpoint;
737 this._debuggerWorkspaceBinding = debuggerWorkspaceBinding; 703 this._debuggerWorkspaceBinding = debuggerWorkspaceBinding;
738 704
739 this._liveLocations = new WebInspector.LiveLocationPool(); 705 this._liveLocations = new WebInspector.LiveLocationPool();
740 706
741 /** @type {!Map<string, !WebInspector.UILocation>} */ 707 /** @type {!Map<string, !WebInspector.UILocation>} */
742 this._uiLocations = new Map(); 708 this._uiLocations = new Map();
743 this._debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.Debug gerWasDisabled, this._cleanUpAfterDebuggerIsGone, this); 709 this._debuggerModel.addEventListener(
744 this._debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.Debug gerWasEnabled, this._scheduleUpdateInDebugger, this); 710 WebInspector.DebuggerModel.Events.DebuggerWasDisabled, this._cleanUpAfte rDebuggerIsGone, this);
711 this._debuggerModel.addEventListener(
712 WebInspector.DebuggerModel.Events.DebuggerWasEnabled, this._scheduleUpda teInDebugger, this);
745 this._hasPendingUpdate = false; 713 this._hasPendingUpdate = false;
746 this._isUpdating = false; 714 this._isUpdating = false;
747 this._cancelCallback = false; 715 this._cancelCallback = false;
748 this._currentState = null; 716 this._currentState = null;
749 if (this._debuggerModel.debuggerEnabled()) 717 if (this._debuggerModel.debuggerEnabled())
750 this._scheduleUpdateInDebugger(); 718 this._scheduleUpdateInDebugger();
719 }
720
721 _resetLocations() {
722 for (var uiLocation of this._uiLocations.values())
723 this._breakpoint._removeUILocation(uiLocation);
724
725 this._uiLocations.clear();
726 this._liveLocations.disposeAll();
727 }
728
729 _scheduleUpdateInDebugger() {
730 if (this._isUpdating) {
731 this._hasPendingUpdate = true;
732 return;
733 }
734
735 this._isUpdating = true;
736 this._updateInDebugger(this._didUpdateInDebugger.bind(this));
737 }
738
739 _didUpdateInDebugger() {
740 this._isUpdating = false;
741 if (this._hasPendingUpdate) {
742 this._hasPendingUpdate = false;
743 this._scheduleUpdateInDebugger();
744 }
745 }
746
747 /**
748 * @return {boolean}
749 */
750 _scriptDiverged() {
751 var uiSourceCode = this._breakpoint.uiSourceCode();
752 if (!uiSourceCode)
753 return false;
754 var scriptFile = this._debuggerWorkspaceBinding.scriptFile(uiSourceCode, thi s.target());
755 return !!scriptFile && scriptFile.hasDivergedFromVM();
756 }
757
758 /**
759 * @param {function()} callback
760 */
761 _updateInDebugger(callback) {
762 if (this.target().isDisposed()) {
763 this._cleanUpAfterDebuggerIsGone();
764 callback();
765 return;
766 }
767
768 var uiSourceCode = this._breakpoint.uiSourceCode();
769 var lineNumber = this._breakpoint._lineNumber;
770 var columnNumber = this._breakpoint._columnNumber;
771 var condition = this._breakpoint.condition();
772
773 var debuggerLocation = uiSourceCode ?
774 this._debuggerWorkspaceBinding.uiLocationToRawLocation(this.target(), ui SourceCode, lineNumber, columnNumber) :
775 null;
776 var newState;
777 if (this._breakpoint._isRemoved || !this._breakpoint.enabled() || this._scri ptDiverged())
778 newState = null;
779 else if (debuggerLocation) {
780 var script = debuggerLocation.script();
781 if (script.sourceURL)
782 newState = new WebInspector.BreakpointManager.Breakpoint.State(
783 script.sourceURL, null, debuggerLocation.lineNumber, debuggerLocatio n.columnNumber, condition);
784 else
785 newState = new WebInspector.BreakpointManager.Breakpoint.State(
786 null, debuggerLocation.scriptId, debuggerLocation.lineNumber, debugg erLocation.columnNumber, condition);
787 } else if (this._breakpoint._currentState && this._breakpoint._currentState. url) {
788 var position = this._breakpoint._currentState;
789 newState = new WebInspector.BreakpointManager.Breakpoint.State(
790 position.url, null, position.lineNumber, position.columnNumber, condit ion);
791 } else if (uiSourceCode) {
792 newState = new WebInspector.BreakpointManager.Breakpoint.State(
793 uiSourceCode.url(), null, lineNumber, columnNumber, condition);
794 }
795 if (this._debuggerId && WebInspector.BreakpointManager.Breakpoint.State.equa ls(newState, this._currentState)) {
796 callback();
797 return;
798 }
799
800 this._breakpoint._currentState = newState;
801
802 if (this._debuggerId) {
803 this._resetLocations();
804 this._debuggerModel.removeBreakpoint(this._debuggerId, this._didRemoveFrom Debugger.bind(this, callback));
805 this._scheduleUpdateInDebugger();
806 this._currentState = null;
807 return;
808 }
809
810 if (!newState) {
811 callback();
812 return;
813 }
814
815 var updateCallback = this._didSetBreakpointInDebugger.bind(this, callback);
816 if (newState.url)
817 this._debuggerModel.setBreakpointByURL(
818 newState.url, newState.lineNumber, newState.columnNumber, this._breakp oint.condition(), updateCallback);
819 else if (newState.scriptId)
820 this._debuggerModel.setBreakpointBySourceId(
821 /** @type {!WebInspector.DebuggerModel.Location} */ (debuggerLocation) , condition, updateCallback);
822
823 this._currentState = newState;
824 }
825
826 /**
827 * @param {function()} callback
828 * @param {?DebuggerAgent.BreakpointId} breakpointId
829 * @param {!Array.<!WebInspector.DebuggerModel.Location>} locations
830 */
831 _didSetBreakpointInDebugger(callback, breakpointId, locations) {
832 if (this._cancelCallback) {
833 this._cancelCallback = false;
834 callback();
835 return;
836 }
837
838 if (!breakpointId) {
839 this._breakpoint.remove(true);
840 callback();
841 return;
842 }
843
844 this._debuggerId = breakpointId;
845 this._debuggerModel.addBreakpointListener(this._debuggerId, this._breakpoint Resolved, this);
846 for (var i = 0; i < locations.length; ++i) {
847 if (!this._addResolvedLocation(locations[i]))
848 break;
849 }
850 callback();
851 }
852
853 /**
854 * @param {function()} callback
855 */
856 _didRemoveFromDebugger(callback) {
857 if (this._cancelCallback) {
858 this._cancelCallback = false;
859 callback();
860 return;
861 }
862
863 this._resetLocations();
864 this._debuggerModel.removeBreakpointListener(this._debuggerId, this._breakpo intResolved, this);
865 delete this._debuggerId;
866 callback();
867 }
868
869 /**
870 * @param {!WebInspector.Event} event
871 */
872 _breakpointResolved(event) {
873 this._addResolvedLocation(/** @type {!WebInspector.DebuggerModel.Location}*/ (event.data));
874 }
875
876 /**
877 * @param {!WebInspector.DebuggerModel.Location} location
878 * @param {!WebInspector.LiveLocation} liveLocation
879 */
880 _locationUpdated(location, liveLocation) {
881 var uiLocation = liveLocation.uiLocation();
882 if (!uiLocation)
883 return;
884 var oldUILocation = this._uiLocations.get(location.id()) || null;
885 this._uiLocations.set(location.id(), uiLocation);
886 this._breakpoint._replaceUILocation(oldUILocation, uiLocation);
887 }
888
889 /**
890 * @param {!WebInspector.DebuggerModel.Location} location
891 * @return {boolean}
892 */
893 _addResolvedLocation(location) {
894 var uiLocation = this._debuggerWorkspaceBinding.rawLocationToUILocation(loca tion);
895 var breakpoint = this._breakpoint._breakpointManager.findBreakpoint(
896 uiLocation.uiSourceCode, uiLocation.lineNumber, uiLocation.columnNumber) ;
897 if (breakpoint && breakpoint !== this._breakpoint) {
898 // location clash
899 this._breakpoint.remove();
900 return false;
901 }
902 this._debuggerWorkspaceBinding.createLiveLocation(
903 location, this._locationUpdated.bind(this, location), this._liveLocation s);
904 return true;
905 }
906
907 _cleanUpAfterDebuggerIsGone() {
908 if (this._isUpdating)
909 this._cancelCallback = true;
910
911 this._resetLocations();
912 this._currentState = null;
913 if (this._debuggerId)
914 this._didRemoveFromDebugger(function() {});
915 }
916
917 _removeEventListeners() {
918 this._debuggerModel.removeEventListener(
919 WebInspector.DebuggerModel.Events.DebuggerWasDisabled, this._cleanUpAfte rDebuggerIsGone, this);
920 this._debuggerModel.removeEventListener(
921 WebInspector.DebuggerModel.Events.DebuggerWasEnabled, this._scheduleUpda teInDebugger, this);
922 }
751 }; 923 };
752 924
753 WebInspector.BreakpointManager.TargetBreakpoint.prototype = {
754
755 _resetLocations: function()
756 {
757 for (var uiLocation of this._uiLocations.values())
758 this._breakpoint._removeUILocation(uiLocation);
759
760 this._uiLocations.clear();
761 this._liveLocations.disposeAll();
762 },
763
764 _scheduleUpdateInDebugger: function()
765 {
766 if (this._isUpdating) {
767 this._hasPendingUpdate = true;
768 return;
769 }
770
771 this._isUpdating = true;
772 this._updateInDebugger(this._didUpdateInDebugger.bind(this));
773 },
774
775 _didUpdateInDebugger: function()
776 {
777 this._isUpdating = false;
778 if (this._hasPendingUpdate) {
779 this._hasPendingUpdate = false;
780 this._scheduleUpdateInDebugger();
781 }
782 },
783
784 /**
785 * @return {boolean}
786 */
787 _scriptDiverged: function()
788 {
789 var uiSourceCode = this._breakpoint.uiSourceCode();
790 if (!uiSourceCode)
791 return false;
792 var scriptFile = this._debuggerWorkspaceBinding.scriptFile(uiSourceCode, this.target());
793 return !!scriptFile && scriptFile.hasDivergedFromVM();
794 },
795
796 /**
797 * @param {function()} callback
798 */
799 _updateInDebugger: function(callback)
800 {
801 if (this.target().isDisposed()) {
802 this._cleanUpAfterDebuggerIsGone();
803 callback();
804 return;
805 }
806
807 var uiSourceCode = this._breakpoint.uiSourceCode();
808 var lineNumber = this._breakpoint._lineNumber;
809 var columnNumber = this._breakpoint._columnNumber;
810 var condition = this._breakpoint.condition();
811
812 var debuggerLocation = uiSourceCode ? this._debuggerWorkspaceBinding.uiL ocationToRawLocation(this.target(), uiSourceCode, lineNumber, columnNumber) : nu ll;
813 var newState;
814 if (this._breakpoint._isRemoved || !this._breakpoint.enabled() || this._ scriptDiverged())
815 newState = null;
816 else if (debuggerLocation) {
817 var script = debuggerLocation.script();
818 if (script.sourceURL)
819 newState = new WebInspector.BreakpointManager.Breakpoint.State(s cript.sourceURL, null, debuggerLocation.lineNumber, debuggerLocation.columnNumbe r, condition);
820 else
821 newState = new WebInspector.BreakpointManager.Breakpoint.State(n ull, debuggerLocation.scriptId, debuggerLocation.lineNumber, debuggerLocation.co lumnNumber, condition);
822 } else if (this._breakpoint._currentState && this._breakpoint._currentSt ate.url) {
823 var position = this._breakpoint._currentState;
824 newState = new WebInspector.BreakpointManager.Breakpoint.State(posit ion.url, null, position.lineNumber, position.columnNumber, condition);
825 } else if (uiSourceCode) {
826 newState = new WebInspector.BreakpointManager.Breakpoint.State(uiSou rceCode.url(), null, lineNumber, columnNumber, condition);
827 }
828 if (this._debuggerId && WebInspector.BreakpointManager.Breakpoint.State. equals(newState, this._currentState)) {
829 callback();
830 return;
831 }
832
833 this._breakpoint._currentState = newState;
834
835 if (this._debuggerId) {
836 this._resetLocations();
837 this._debuggerModel.removeBreakpoint(this._debuggerId, this._didRemo veFromDebugger.bind(this, callback));
838 this._scheduleUpdateInDebugger();
839 this._currentState = null;
840 return;
841 }
842
843 if (!newState) {
844 callback();
845 return;
846 }
847
848 var updateCallback = this._didSetBreakpointInDebugger.bind(this, callbac k);
849 if (newState.url)
850 this._debuggerModel.setBreakpointByURL(newState.url, newState.lineNu mber, newState.columnNumber, this._breakpoint.condition(), updateCallback);
851 else if (newState.scriptId)
852 this._debuggerModel.setBreakpointBySourceId(/** @type {!WebInspector .DebuggerModel.Location} */ (debuggerLocation), condition, updateCallback);
853
854 this._currentState = newState;
855 },
856
857 /**
858 * @param {function()} callback
859 * @param {?DebuggerAgent.BreakpointId} breakpointId
860 * @param {!Array.<!WebInspector.DebuggerModel.Location>} locations
861 */
862 _didSetBreakpointInDebugger: function(callback, breakpointId, locations)
863 {
864 if (this._cancelCallback) {
865 this._cancelCallback = false;
866 callback();
867 return;
868 }
869
870 if (!breakpointId) {
871 this._breakpoint.remove(true);
872 callback();
873 return;
874 }
875
876 this._debuggerId = breakpointId;
877 this._debuggerModel.addBreakpointListener(this._debuggerId, this._breakp ointResolved, this);
878 for (var i = 0; i < locations.length; ++i) {
879 if (!this._addResolvedLocation(locations[i]))
880 break;
881 }
882 callback();
883 },
884
885 /**
886 * @param {function()} callback
887 */
888 _didRemoveFromDebugger: function(callback)
889 {
890 if (this._cancelCallback) {
891 this._cancelCallback = false;
892 callback();
893 return;
894 }
895
896 this._resetLocations();
897 this._debuggerModel.removeBreakpointListener(this._debuggerId, this._bre akpointResolved, this);
898 delete this._debuggerId;
899 callback();
900 },
901
902 /**
903 * @param {!WebInspector.Event} event
904 */
905 _breakpointResolved: function(event)
906 {
907 this._addResolvedLocation(/** @type {!WebInspector.DebuggerModel.Locatio n}*/ (event.data));
908 },
909
910 /**
911 * @param {!WebInspector.DebuggerModel.Location} location
912 * @param {!WebInspector.LiveLocation} liveLocation
913 */
914 _locationUpdated: function(location, liveLocation)
915 {
916 var uiLocation = liveLocation.uiLocation();
917 if (!uiLocation)
918 return;
919 var oldUILocation = this._uiLocations.get(location.id()) || null;
920 this._uiLocations.set(location.id(), uiLocation);
921 this._breakpoint._replaceUILocation(oldUILocation, uiLocation);
922 },
923
924 /**
925 * @param {!WebInspector.DebuggerModel.Location} location
926 * @return {boolean}
927 */
928 _addResolvedLocation: function(location)
929 {
930 var uiLocation = this._debuggerWorkspaceBinding.rawLocationToUILocation( location);
931 var breakpoint = this._breakpoint._breakpointManager.findBreakpoint(uiLo cation.uiSourceCode, uiLocation.lineNumber, uiLocation.columnNumber);
932 if (breakpoint && breakpoint !== this._breakpoint) {
933 // location clash
934 this._breakpoint.remove();
935 return false;
936 }
937 this._debuggerWorkspaceBinding.createLiveLocation(location, this._locati onUpdated.bind(this, location), this._liveLocations);
938 return true;
939 },
940
941 _cleanUpAfterDebuggerIsGone: function()
942 {
943 if (this._isUpdating)
944 this._cancelCallback = true;
945
946 this._resetLocations();
947 this._currentState = null;
948 if (this._debuggerId)
949 this._didRemoveFromDebugger(function() {});
950 },
951
952 _removeEventListeners: function()
953 {
954 this._debuggerModel.removeEventListener(WebInspector.DebuggerModel.Event s.DebuggerWasDisabled, this._cleanUpAfterDebuggerIsGone, this);
955 this._debuggerModel.removeEventListener(WebInspector.DebuggerModel.Event s.DebuggerWasEnabled, this._scheduleUpdateInDebugger, this);
956 },
957
958 __proto__: WebInspector.SDKObject.prototype
959 };
960
961 /** 925 /**
962 * @constructor 926 * @unrestricted
963 * @param {?string} url
964 * @param {?string} scriptId
965 * @param {number} lineNumber
966 * @param {number} columnNumber
967 * @param {string} condition
968 */ 927 */
969 WebInspector.BreakpointManager.Breakpoint.State = function(url, scriptId, lineNu mber, columnNumber, condition) 928 WebInspector.BreakpointManager.Breakpoint.State = class {
970 { 929 /**
930 * @param {?string} url
931 * @param {?string} scriptId
932 * @param {number} lineNumber
933 * @param {number} columnNumber
934 * @param {string} condition
935 */
936 constructor(url, scriptId, lineNumber, columnNumber, condition) {
971 this.url = url; 937 this.url = url;
972 this.scriptId = scriptId; 938 this.scriptId = scriptId;
973 this.lineNumber = lineNumber; 939 this.lineNumber = lineNumber;
974 this.columnNumber = columnNumber; 940 this.columnNumber = columnNumber;
975 this.condition = condition; 941 this.condition = condition;
942 }
943
944 /**
945 * @param {?WebInspector.BreakpointManager.Breakpoint.State|undefined} stateA
946 * @param {?WebInspector.BreakpointManager.Breakpoint.State|undefined} stateB
947 * @return {boolean}
948 */
949 static equals(stateA, stateB) {
950 if (!stateA || !stateB)
951 return false;
952
953 if (stateA.scriptId || stateB.scriptId)
954 return false;
955
956 return stateA.url === stateB.url && stateA.lineNumber === stateB.lineNumber &&
957 stateA.columnNumber === stateB.columnNumber && stateA.condition === stat eB.condition;
958 }
976 }; 959 };
977 960
961
978 /** 962 /**
979 * @param {?WebInspector.BreakpointManager.Breakpoint.State|undefined} stateA 963 * @unrestricted
980 * @param {?WebInspector.BreakpointManager.Breakpoint.State|undefined} stateB
981 * @return {boolean}
982 */ 964 */
983 WebInspector.BreakpointManager.Breakpoint.State.equals = function(stateA, stateB ) 965 WebInspector.BreakpointManager.Storage = class {
984 { 966 /**
985 if (!stateA || !stateB) 967 * @param {!WebInspector.BreakpointManager} breakpointManager
986 return false; 968 * @param {?WebInspector.Setting} setting
987 969 */
988 if (stateA.scriptId || stateB.scriptId) 970 constructor(breakpointManager, setting) {
989 return false;
990
991 return stateA.url === stateB.url && stateA.lineNumber === stateB.lineNumber && stateA.columnNumber === stateB.columnNumber && stateA.condition === stateB.co ndition;
992 };
993
994 /**
995 * @constructor
996 * @param {!WebInspector.BreakpointManager} breakpointManager
997 * @param {?WebInspector.Setting} setting
998 */
999 WebInspector.BreakpointManager.Storage = function(breakpointManager, setting)
1000 {
1001 this._breakpointManager = breakpointManager; 971 this._breakpointManager = breakpointManager;
1002 this._setting = setting || WebInspector.settings.createLocalSetting("breakpo ints", []); 972 this._setting = setting || WebInspector.settings.createLocalSetting('breakpo ints', []);
1003 var breakpoints = this._setting.get(); 973 var breakpoints = this._setting.get();
1004 /** @type {!Object.<string, !WebInspector.BreakpointManager.Storage.Item>} * / 974 /** @type {!Object.<string, !WebInspector.BreakpointManager.Storage.Item>} * /
1005 this._breakpoints = {}; 975 this._breakpoints = {};
1006 for (var i = 0; i < breakpoints.length; ++i) { 976 for (var i = 0; i < breakpoints.length; ++i) {
1007 var breakpoint = /** @type {!WebInspector.BreakpointManager.Storage.Item } */ (breakpoints[i]); 977 var breakpoint = /** @type {!WebInspector.BreakpointManager.Storage.Item} */ (breakpoints[i]);
1008 breakpoint.columnNumber = breakpoint.columnNumber || 0; 978 breakpoint.columnNumber = breakpoint.columnNumber || 0;
1009 this._breakpoints[breakpoint.sourceFileId + ":" + breakpoint.lineNumber + ":" + breakpoint.columnNumber] = breakpoint; 979 this._breakpoints[breakpoint.sourceFileId + ':' + breakpoint.lineNumber + ':' + breakpoint.columnNumber] =
1010 } 980 breakpoint;
981 }
982 }
983
984 mute() {
985 this._muted = true;
986 }
987
988 unmute() {
989 delete this._muted;
990 }
991
992 /**
993 * @param {string} sourceFileId
994 * @return {!Array.<!WebInspector.BreakpointManager.Storage.Item>}
995 */
996 breakpointItems(sourceFileId) {
997 var result = [];
998 for (var id in this._breakpoints) {
999 var breakpoint = this._breakpoints[id];
1000 if (breakpoint.sourceFileId === sourceFileId)
1001 result.push(breakpoint);
1002 }
1003 return result;
1004 }
1005
1006 /**
1007 * @param {!WebInspector.BreakpointManager.Breakpoint} breakpoint
1008 */
1009 _updateBreakpoint(breakpoint) {
1010 if (this._muted || !breakpoint._breakpointStorageId())
1011 return;
1012 this._breakpoints[breakpoint._breakpointStorageId()] = new WebInspector.Brea kpointManager.Storage.Item(breakpoint);
1013 this._save();
1014 }
1015
1016 /**
1017 * @param {!WebInspector.BreakpointManager.Breakpoint} breakpoint
1018 */
1019 _removeBreakpoint(breakpoint) {
1020 if (this._muted)
1021 return;
1022 delete this._breakpoints[breakpoint._breakpointStorageId()];
1023 this._save();
1024 }
1025
1026 _save() {
1027 var breakpointsArray = [];
1028 for (var id in this._breakpoints)
1029 breakpointsArray.push(this._breakpoints[id]);
1030 this._setting.set(breakpointsArray);
1031 }
1011 }; 1032 };
1012 1033
1013 WebInspector.BreakpointManager.Storage.prototype = {
1014 mute: function()
1015 {
1016 this._muted = true;
1017 },
1018
1019 unmute: function()
1020 {
1021 delete this._muted;
1022 },
1023
1024 /**
1025 * @param {string} sourceFileId
1026 * @return {!Array.<!WebInspector.BreakpointManager.Storage.Item>}
1027 */
1028 breakpointItems: function(sourceFileId)
1029 {
1030 var result = [];
1031 for (var id in this._breakpoints) {
1032 var breakpoint = this._breakpoints[id];
1033 if (breakpoint.sourceFileId === sourceFileId)
1034 result.push(breakpoint);
1035 }
1036 return result;
1037 },
1038
1039 /**
1040 * @param {!WebInspector.BreakpointManager.Breakpoint} breakpoint
1041 */
1042 _updateBreakpoint: function(breakpoint)
1043 {
1044 if (this._muted || !breakpoint._breakpointStorageId())
1045 return;
1046 this._breakpoints[breakpoint._breakpointStorageId()] = new WebInspector. BreakpointManager.Storage.Item(breakpoint);
1047 this._save();
1048 },
1049
1050 /**
1051 * @param {!WebInspector.BreakpointManager.Breakpoint} breakpoint
1052 */
1053 _removeBreakpoint: function(breakpoint)
1054 {
1055 if (this._muted)
1056 return;
1057 delete this._breakpoints[breakpoint._breakpointStorageId()];
1058 this._save();
1059 },
1060
1061 _save: function()
1062 {
1063 var breakpointsArray = [];
1064 for (var id in this._breakpoints)
1065 breakpointsArray.push(this._breakpoints[id]);
1066 this._setting.set(breakpointsArray);
1067 }
1068 };
1069
1070 /** 1034 /**
1071 * @constructor 1035 * @unrestricted
1072 * @param {!WebInspector.BreakpointManager.Breakpoint} breakpoint
1073 */ 1036 */
1074 WebInspector.BreakpointManager.Storage.Item = function(breakpoint) 1037 WebInspector.BreakpointManager.Storage.Item = class {
1075 { 1038 /**
1039 * @param {!WebInspector.BreakpointManager.Breakpoint} breakpoint
1040 */
1041 constructor(breakpoint) {
1076 this.sourceFileId = breakpoint._sourceFileId; 1042 this.sourceFileId = breakpoint._sourceFileId;
1077 this.lineNumber = breakpoint.lineNumber(); 1043 this.lineNumber = breakpoint.lineNumber();
1078 this.columnNumber = breakpoint.columnNumber(); 1044 this.columnNumber = breakpoint.columnNumber();
1079 this.condition = breakpoint.condition(); 1045 this.condition = breakpoint.condition();
1080 this.enabled = breakpoint.enabled(); 1046 this.enabled = breakpoint.enabled();
1047 }
1081 }; 1048 };
1082 1049
1083 /** @type {!WebInspector.BreakpointManager} */ 1050 /** @type {!WebInspector.BreakpointManager} */
1084 WebInspector.breakpointManager; 1051 WebInspector.breakpointManager;
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698