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

Unified Diff: Source/devtools/front_end/sdk/BreakpointManager.js

Issue 310463003: DevTools: introduce TargetBreakpoints as a presentation of breakpoint and its state within target (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebase on master Created 6 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: Source/devtools/front_end/sdk/BreakpointManager.js
diff --git a/Source/devtools/front_end/sdk/BreakpointManager.js b/Source/devtools/front_end/sdk/BreakpointManager.js
index 2c0ef4f66e1f4d463447f640ee423b4272a1e89f..c412c0a18b2f200389c44548ad69bdc312b8cff6 100644
--- a/Source/devtools/front_end/sdk/BreakpointManager.js
+++ b/Source/devtools/front_end/sdk/BreakpointManager.js
@@ -31,7 +31,6 @@
/**
* @constructor
* @extends {WebInspector.Object}
- * @implements {WebInspector.TargetManager.Observer}
* @param {!WebInspector.Setting} breakpointStorage
* @param {!WebInspector.Workspace} workspace
* @param {!WebInspector.TargetManager} targetManager
@@ -42,7 +41,6 @@ WebInspector.BreakpointManager = function(breakpointStorage, workspace, targetMa
this._workspace = workspace;
this._targetManager = targetManager;
- this._breakpointForDebuggerId = {};
this._breakpointsForUISourceCode = new Map();
this._breakpointsForPrimaryUISourceCode = new Map();
/** @type {!StringMultimap.<!WebInspector.BreakpointManager.Breakpoint>} */
@@ -51,7 +49,6 @@ WebInspector.BreakpointManager = function(breakpointStorage, workspace, targetMa
this._workspace.addEventListener(WebInspector.Workspace.Events.ProjectRemoved, this._projectRemoved, this);
this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded, this._uiSourceCodeAdded, this);
this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeRemoved, this._uiSourceCodeRemoved, this);
- this._targetManager.observeTargets(this);
}
WebInspector.BreakpointManager.Events = {
@@ -80,21 +77,6 @@ WebInspector.BreakpointManager._breakpointStorageId = function(sourceFileId, lin
}
WebInspector.BreakpointManager.prototype = {
- /**
- * @param {!WebInspector.Target} target
- */
- targetAdded: function(target)
- {
- target.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.BreakpointResolved, this._breakpointResolved, this);
- },
-
- /**
- * @param {!WebInspector.Target} target
- */
- targetRemoved: function(target)
- {
- target.debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.BreakpointResolved, this._breakpointResolved, this);
- },
/**
* @param {string} sourceFileId
@@ -115,11 +97,8 @@ WebInspector.BreakpointManager.prototype = {
removeProvisionalBreakpointsForTest: function(target)
vsevik 2014/06/04 16:28:53 This one is only used for final clean up, so you c
sergeyv 2014/06/05 12:59:51 Done.
{
var breakpoints = this._provisionalBreakpoints.values();
- for (var i = 0; i < breakpoints.length; ++i) {
- var debuggerId = breakpoints[i]._debuggerId;
- if (debuggerId)
- target.debuggerModel.removeBreakpoint(debuggerId);
- }
+ for (var i = 0; i < breakpoints.length; ++i)
+ breakpoints[i].removeProvisionalBreakpointsForTest(target);
vsevik 2014/06/04 16:28:53 removeProvisionalForTest
sergeyv 2014/06/05 12:59:51 Done.
this._provisionalBreakpoints.clear();
},
@@ -143,7 +122,7 @@ WebInspector.BreakpointManager.prototype = {
if (!this._breakpointsForPrimaryUISourceCode.get(uiSourceCode))
this._breakpointsForPrimaryUISourceCode.put(uiSourceCode, []);
this._breakpointsForPrimaryUISourceCode.get(uiSourceCode).push(provisionalBreakpoint);
- provisionalBreakpoint._updateInDebugger();
+ provisionalBreakpoint._updateBreakpoint();
} else {
this._innerSetBreakpoint(uiSourceCode, breakpointItem.lineNumber, breakpointItem.columnNumber, breakpointItem.condition, breakpointItem.enabled);
}
@@ -194,9 +173,9 @@ WebInspector.BreakpointManager.prototype = {
var breakpoints = this._breakpointsForPrimaryUISourceCode.get(uiSourceCode) || [];
var sourceFileId = WebInspector.BreakpointManager._sourceFileId(uiSourceCode);
for (var i = 0; i < breakpoints.length; ++i) {
- breakpoints[i]._resetLocations();
if (breakpoints[i].enabled())
this._provisionalBreakpoints.put(sourceFileId, breakpoints[i]);
+ breakpoints[i]._resetLocations();
vsevik 2014/06/04 16:28:53 Is this change important?
sergeyv 2014/06/05 12:59:51 Done.
}
uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.SourceMappingChanged, this._uiSourceCodeMappingChanged, this);
this._breakpointsForPrimaryUISourceCode.remove(uiSourceCode);
@@ -230,7 +209,7 @@ WebInspector.BreakpointManager.prototype = {
{
var breakpoint = this.findBreakpoint(uiSourceCode, lineNumber, columnNumber);
if (breakpoint) {
- breakpoint._updateBreakpoint(condition, enabled);
+ breakpoint._setNewState(condition, enabled);
return breakpoint;
}
var projectId = uiSourceCode.project().id();
@@ -361,16 +340,6 @@ WebInspector.BreakpointManager.prototype = {
this._removeUISourceCode(uiSourceCodes[i]);
},
- _breakpointResolved: function(event)
- {
- var breakpointId = /** @type {!DebuggerAgent.BreakpointId} */ (event.data.breakpointId);
- var location = /** @type {!WebInspector.DebuggerModel.Location} */ (event.data.location);
- var breakpoint = this._breakpointForDebuggerId[breakpointId];
- if (!breakpoint)
- return;
- breakpoint._addResolvedLocation(location);
- },
-
/**
* @param {!WebInspector.BreakpointManager.Breakpoint} breakpoint
* @param {boolean} removeFromStorage
@@ -379,9 +348,7 @@ WebInspector.BreakpointManager.prototype = {
{
var uiSourceCode = breakpoint.uiSourceCode();
var breakpoints = uiSourceCode ? this._breakpointsForPrimaryUISourceCode.get(uiSourceCode) || [] : [];
- var index = breakpoints.indexOf(breakpoint);
- if (index > -1)
- breakpoints.splice(index, 1);
+ breakpoints.remove(breakpoint);
if (removeFromStorage)
this._storage._removeBreakpoint(breakpoint);
this._provisionalBreakpoints.remove(breakpoint._sourceFileId, breakpoint);
@@ -443,6 +410,7 @@ WebInspector.BreakpointManager.prototype = {
/**
* @constructor
+ * @implements {WebInspector.TargetManager.Observer}
* @param {!WebInspector.BreakpointManager} breakpointManager
* @param {string} projectId
* @param {string} path
@@ -460,22 +428,53 @@ WebInspector.BreakpointManager.Breakpoint = function(breakpointManager, projectI
this._lineNumber = lineNumber;
this._columnNumber = columnNumber;
this._sourceFileId = sourceFileId;
- /** @type {!Array.<!WebInspector.Script.Location>} */
- this._liveLocations = [];
- /** @type {!Object.<string, !WebInspector.UILocation>} */
- this._uiLocations = {};
/** @type {!Object.<string, number>} */
- this._numberOfDebuggerLocationForUILocation = new Map();
+ this._numberOfDebuggerLocationForUILocation = {};
// Force breakpoint update.
/** @type {string} */ this._condition;
/** @type {boolean} */ this._enabled;
- this._updateBreakpoint(condition, enabled);
+ /** @type {boolean} */ this._isRemoved;
+ /** @type {!WebInspector.UILocation|undefined} */ this._fakeBreakpointPrimaryLocation;
vsevik 2014/06/04 16:28:53 I would replace this with primayrLocation() getter
+
+ /** @type {!Map.<!WebInspector.Target, !WebInspector.BreakpointManager.TargetBreakpoint>}*/
+ this._targetBreakpoints = new Map();
+ this._breakpointManager._targetManager.observeTargets(this);
+ this._setNewState(condition, enabled);
vsevik 2014/06/04 16:28:53 updateState
sergeyv 2014/06/05 12:59:51 Done.
}
WebInspector.BreakpointManager.Breakpoint.prototype = {
/**
+ * @param {!WebInspector.Target} target
+ */
+ targetAdded: function(target)
+ {
+ target.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.BreakpointResolved, this._breakpointResolved, this);
vsevik 2014/06/04 16:28:53 This should be in TargetBreakpoint constructor
sergeyv 2014/06/05 12:59:51 Done.
+ this._targetBreakpoints.put(target, new WebInspector.BreakpointManager.TargetBreakpoint(target, this));
+ },
+
+ /**
+ * @param {!WebInspector.Target} target
+ */
+ targetRemoved: function(target)
+ {
+ target.debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.BreakpointResolved, this._breakpointResolved, this);
vsevik 2014/06/04 16:28:53 This should be in TargetBreakpoint.dispose()
sergeyv 2014/06/05 12:59:51 Done.
+ var targetBreakpoint = this._targetBreakpoints.remove(target);
+ targetBreakpoint._resetLocations();
vsevik 2014/06/04 16:28:53 This should be in TargetBreakpoint.dispose()
sergeyv 2014/06/05 12:59:51 Done.
+ },
+
+ /**
+ * @param {!WebInspector.Target} target
+ */
+ removeProvisionalBreakpointsForTest: function(target)
+ {
+ var debuggerId = this._targetBreakpoints.get(target)._debuggerId;
+ if (debuggerId)
+ target.debuggerModel.removeBreakpoint(debuggerId);
vsevik 2014/06/04 16:28:53 I would delegate this call to TargetBreakpoint.
sergeyv 2014/06/05 12:59:51 Done. But instead of it, I just call remove method
+ },
+
+ /**
* @return {string}
*/
projectId: function()
@@ -516,46 +515,37 @@ WebInspector.BreakpointManager.Breakpoint.prototype = {
},
/**
- * @param {!WebInspector.DebuggerModel.Location} location
- * @return {boolean}
+ * @param {?WebInspector.UILocation} oldUILocation
+ * @param {!WebInspector.UILocation} newUILocation
*/
- _addResolvedLocation: function(location)
+ _replaceUILocation: function(oldUILocation, newUILocation)
{
- var script = location.script();
- var uiLocation = script.rawLocationToUILocation(location.lineNumber, location.columnNumber);
- var breakpoint = this._breakpointManager.findBreakpoint(uiLocation.uiSourceCode, uiLocation.lineNumber, uiLocation.columnNumber);
- if (breakpoint && breakpoint != this) {
- // location clash
- this.remove();
- return false;
- }
- this._liveLocations.push(location.createLiveLocation(this._locationUpdated.bind(this, location)));
- return true;
+ if (this._isRemoved)
+ return;
+
+ this._removeUILocation(oldUILocation, true);
+ this._removeFakeBreakpointAtPrimaryLocation();
vsevik 2014/06/04 16:28:53 this one seems redundant.
sergeyv 2014/06/05 12:59:51 Well, it is not :) since here we add a real locati
+
+ if (!this._numberOfDebuggerLocationForUILocation[newUILocation.id()])
+ this._numberOfDebuggerLocationForUILocation[newUILocation.id()] = 0;
+
+ if (++this._numberOfDebuggerLocationForUILocation[newUILocation.id()] === 1)
+ this._breakpointManager._uiLocationAdded(this, newUILocation);
},
/**
- * @param {!WebInspector.DebuggerModel.Location} location
- * @param {!WebInspector.UILocation} uiLocation
+ * @param {?WebInspector.UILocation} uiLocation
+ * @param {boolean=} muteCreationFakeBreakpoint
*/
- _locationUpdated: function(location, uiLocation)
+ _removeUILocation: function(uiLocation, muteCreationFakeBreakpoint)
{
- var oldUILocation = /** @type {!WebInspector.UILocation} */ (this._uiLocations[location.id()]);
- if (oldUILocation && --this._numberOfDebuggerLocationForUILocation[oldUILocation.id()] === 0) {
- delete this._numberOfDebuggerLocationForUILocation[oldUILocation.id()];
- this._breakpointManager._uiLocationRemoved(this, oldUILocation);
- }
- if (this._uiLocations[""]) {
- var defaultLocation = this._uiLocations[""];
- delete this._uiLocations[""];
- this._breakpointManager._uiLocationRemoved(this, defaultLocation);
- }
- this._uiLocations[location.id()] = uiLocation;
-
- if (!this._numberOfDebuggerLocationForUILocation[uiLocation.id()])
- this._numberOfDebuggerLocationForUILocation[uiLocation.id()] = 0;
+ if (!uiLocation || --this._numberOfDebuggerLocationForUILocation[uiLocation.id()] !== 0)
+ return;
- if (++this._numberOfDebuggerLocationForUILocation[uiLocation.id()] === 1)
- this._breakpointManager._uiLocationAdded(this, uiLocation);
+ delete this._numberOfDebuggerLocationForUILocation[uiLocation.id()];
+ this._breakpointManager._uiLocationRemoved(this, uiLocation);
+ if (!muteCreationFakeBreakpoint)
+ this._fakeBreakpointAtPrimaryLocation();
},
/**
@@ -571,7 +561,7 @@ WebInspector.BreakpointManager.Breakpoint.prototype = {
*/
setEnabled: function(enabled)
{
- this._updateBreakpoint(this._condition, enabled);
+ this._setNewState(this._condition, enabled);
},
/**
@@ -587,20 +577,27 @@ WebInspector.BreakpointManager.Breakpoint.prototype = {
*/
setCondition: function(condition)
{
- this._updateBreakpoint(condition, this._enabled);
+ this._setNewState(condition, this._enabled);
},
/**
* @param {string} condition
* @param {boolean} enabled
*/
- _updateBreakpoint: function(condition, enabled)
+ _setNewState: function(condition, enabled)
{
if (this._enabled === enabled && this._condition === condition)
return;
this._enabled = enabled;
this._condition = condition;
this._breakpointManager._storage._updateBreakpoint(this);
+ this._updateBreakpoint();
+ },
+
+ _updateBreakpoint: function()
+ {
+ this._removeFakeBreakpointAtPrimaryLocation();
+ this._fakeBreakpointAtPrimaryLocation();
this._updateInDebugger();
},
@@ -609,106 +606,202 @@ WebInspector.BreakpointManager.Breakpoint.prototype = {
*/
remove: function(keepInStorage)
{
+ this._isRemoved = true;
var removeFromStorage = !keepInStorage;
- this._removeFromDebugger();
+ this._removeFakeBreakpointAtPrimaryLocation();
+ var targets = this._targetBreakpoints.keys();
+ for (var i = 0; i < targets.length; ++i) {
+ this._targetBreakpoints.get(targets[i])._removeFromDebugger();
vsevik 2014/06/04 16:28:53 Again ,let's put all this stuff into TargetBreakpo
sergeyv 2014/06/05 12:59:51 Done.
+ targets[i].debuggerModel.removeEventListener(WebInspector.DebuggerModel.Events.BreakpointResolved, this._breakpointResolved, this);
+ }
this._breakpointManager._removeBreakpoint(this, removeFromStorage);
+ this._breakpointManager._targetManager.removeTargetObserver(this);
},
_updateInDebugger: function()
{
- this._removeFromDebugger();
- this._fakeBreakpointAtPrimaryLocation();
- var uiSourceCode = this.uiSourceCode();
- if (!uiSourceCode || !this._enabled)
+ var targetBreakpoints = this._targetBreakpoints.values();
+ for (var i = 0; i < targetBreakpoints.length; ++i)
+ targetBreakpoints[i]._updateInDebugger();
+ },
+
+ /**
+ * @return {string}
+ */
+ _breakpointStorageId: function()
+ {
+ return WebInspector.BreakpointManager._breakpointStorageId(this._sourceFileId, this._lineNumber, this._columnNumber);
+ },
+
+ _fakeBreakpointAtPrimaryLocation: function()
+ {
+ if (this._isRemoved || !Object.isEmpty(this._numberOfDebuggerLocationForUILocation) || this._fakeBreakpointPrimaryLocation)
return;
- var targets = this._breakpointManager._targetManager.targets();
- for (var i = 0; i < targets.length; ++i) {
- var scriptFile = uiSourceCode.scriptFileForTarget(targets[i]);
- if (scriptFile && scriptFile.hasDivergedFromVM())
- return;
- }
+ var uiSourceCode = this._breakpointManager._workspace.uiSourceCode(this._projectId, this._path);
+ if (!uiSourceCode)
+ return;
- for (var i = 0; i < targets.length; ++i) {
- var rawLocation = uiSourceCode.uiLocationToRawLocation(targets[i], this._lineNumber, this._columnNumber);
- var debuggerModelLocation = /** @type {!WebInspector.DebuggerModel.Location} */ (rawLocation);
- if (debuggerModelLocation)
- targets[i].debuggerModel.setBreakpointByScriptLocation(debuggerModelLocation, this._condition, this._didSetBreakpointInDebugger.bind(this));
- else if (uiSourceCode.url)
- targets[i].debuggerModel.setBreakpointByURL(uiSourceCode.url, this._lineNumber, this._columnNumber, this._condition, this._didSetBreakpointInDebugger.bind(this));
+ this._fakeBreakpointPrimaryLocation = uiSourceCode.uiLocation(this._lineNumber, this._columnNumber);
+ this._breakpointManager._uiLocationAdded(this, this._fakeBreakpointPrimaryLocation);
+ },
+
+ _removeFakeBreakpointAtPrimaryLocation: function()
+ {
+ if (this._fakeBreakpointPrimaryLocation) {
+ this._breakpointManager._uiLocationRemoved(this, this._fakeBreakpointPrimaryLocation);
+ delete this._fakeBreakpointPrimaryLocation;
}
},
/**
- * @param {?DebuggerAgent.BreakpointId} breakpointId
- * @param {!Array.<!WebInspector.DebuggerModel.Location>} locations
- */
+ * @param {!WebInspector.Event} event
+ */
+ _breakpointResolved: function(event)
vsevik 2014/06/04 16:28:53 This method belongs to TargetBreakpoint
sergeyv 2014/06/05 12:59:51 Done.
+ {
+ var breakpointId = /** @type {!DebuggerAgent.BreakpointId} */ (event.data.breakpointId);
+ var location = /** @type {!WebInspector.DebuggerModel.Location} */ (event.data.location);
+ this._targetBreakpoints.get(location.target())._breakpointResolved(breakpointId, location);
+ },
+
+ _resetLocations: function()
+ {
+ this._removeFakeBreakpointAtPrimaryLocation();
+ var targetBreakpoints = this._targetBreakpoints.values();
+ for (var i = 0; i < targetBreakpoints.length; ++i)
+ targetBreakpoints[i]._resetLocations();
+ }
+}
+
+/**
+ * @constructor
+ * @extends {WebInspector.TargetAware}
+ * @param {!WebInspector.Target} target
+ * @param {!WebInspector.BreakpointManager.Breakpoint} breakpoint
+ */
+WebInspector.BreakpointManager.TargetBreakpoint = function(target, breakpoint)
+{
+ WebInspector.TargetAware.call(this, target);
+ this._breakpoint = breakpoint;
+ /** @type {!Array.<!WebInspector.Script.Location>} */
+ this._liveLocations = [];
+
+ /** @type {!Object.<string, !WebInspector.UILocation>} */
+ this._uiLocations = {};
+}
+
+WebInspector.BreakpointManager.TargetBreakpoint.prototype = {
+
+ _resetLocations: function()
+ {
+ var uiLocations = Object.values(this._uiLocations);
+ for (var i = 0; i < uiLocations.length; ++i)
+ this._breakpoint._removeUILocation(uiLocations[i]);
+
+ this._uiLocations = {};
+
+ for (var i = 0; i < this._liveLocations.length; ++i)
+ this._liveLocations[i].dispose();
+ this._liveLocations = [];
+ },
+
+ /**
+ * @param {boolean=} muteCallback
+ */
+ _removeFromDebugger: function(muteCallback)
+ {
+ this._resetLocations();
+ if (!this._debuggerId)
+ return;
+ this.target().debuggerModel.removeBreakpoint(this._debuggerId, muteCallback ? undefined : this._didRemoveFromDebugger.bind(this));
+ },
+
+ _updateInDebugger: function()
+ {
+ this._removeFromDebugger();
+ var uiSourceCode = this._breakpoint.uiSourceCode();
+ if (!uiSourceCode || !this._breakpoint._enabled)
+ return;
+ var scriptFile = uiSourceCode.scriptFileForTarget(this._target);
+ if (scriptFile && scriptFile.hasDivergedFromVM())
+ return;
+
+ var lineNumber = this._breakpoint._lineNumber;
+ var columnNumber = this._breakpoint._columnNumber;
+ var rawLocation = uiSourceCode.uiLocationToRawLocation(this._target, lineNumber, columnNumber);
+ var debuggerModelLocation = /** @type {!WebInspector.DebuggerModel.Location} */ (rawLocation);
+ var condition = this._breakpoint.condition();
+ if (debuggerModelLocation)
+ this.target().debuggerModel.setBreakpointByScriptLocation(debuggerModelLocation, condition, this._didSetBreakpointInDebugger.bind(this));
+ else if (uiSourceCode.url)
+ this.target().debuggerModel.setBreakpointByURL(uiSourceCode.url, lineNumber, columnNumber, condition, this._didSetBreakpointInDebugger.bind(this));
+ },
+
+ /**
+ * @param {?DebuggerAgent.BreakpointId} breakpointId
+ * @param {!Array.<!WebInspector.DebuggerModel.Location>} locations
+ */
_didSetBreakpointInDebugger: function(breakpointId, locations)
{
if (!breakpointId) {
- this.remove(true);
+ this._breakpoint.remove(true);
return;
}
- this._debuggerId = breakpointId;
- this._breakpointManager._breakpointForDebuggerId[breakpointId] = this;
+ if (this._debuggerId)
+ this._removeFromDebugger(true);
+ this._debuggerId = breakpointId;
for (var i = 0; i < locations.length; ++i)
if (!this._addResolvedLocation(locations[i]))
return;
},
- _removeFromDebugger: function()
- {
- this._resetLocations();
- if (!this._debuggerId)
- return;
- var barrier = new CallbackBarrier();
- this._breakpointManager._targetManager.targets().forEach(function(target){target.debuggerModel.removeBreakpoint(this._debuggerId, barrier.createCallback())}, this);
- barrier.callWhenDone(this._didRemoveFromDebugger.bind(this));
- },
-
_didRemoveFromDebugger: function()
{
- delete this._breakpointManager._breakpointForDebuggerId[this._debuggerId];
delete this._debuggerId;
},
- _resetLocations: function()
+ /**
+ * @param {!DebuggerAgent.BreakpointId} breakpointId
+ * @param {!WebInspector.DebuggerModel.Location} location
+ */
+ _breakpointResolved: function(breakpointId, location)
{
- for (var stringifiedLocation in this._uiLocations) {
- var uiLocation = this._uiLocations[stringifiedLocation];
- if (this._numberOfDebuggerLocationForUILocation[uiLocation.id()]) {
- this._breakpointManager._uiLocationRemoved(this, uiLocation);
- delete this._numberOfDebuggerLocationForUILocation[uiLocation.id()];
- }
- }
- if (this._uiLocations[""])
- this._breakpointManager._uiLocationRemoved(this, this._uiLocations[""]);
- for (var i = 0; i < this._liveLocations.length; ++i)
- this._liveLocations[i].dispose();
- this._liveLocations = [];
- this._uiLocations = {};
- this._numberOfDebuggerLocationForUILocation = {};
+ if (this._debuggerId === breakpointId)
+ this._addResolvedLocation(location);
},
/**
- * @return {string}
+ * @param {!WebInspector.DebuggerModel.Location} location
+ * @param {!WebInspector.UILocation} uiLocation
*/
- _breakpointStorageId: function()
+ _locationUpdated: function(location, uiLocation)
{
- return WebInspector.BreakpointManager._breakpointStorageId(this._sourceFileId, this._lineNumber, this._columnNumber);
+ var oldUILocation = this._uiLocations[location.id()] || null;
+ this._uiLocations[location.id()] = uiLocation;
+ this._breakpoint._replaceUILocation(oldUILocation, uiLocation);
},
- _fakeBreakpointAtPrimaryLocation: function()
+ /**
+ * @param {!WebInspector.DebuggerModel.Location} location
+ * @return {boolean}
+ */
+ _addResolvedLocation: function(location)
{
- var uiSourceCode = this._breakpointManager._workspace.uiSourceCode(this._projectId, this._path);
- if (!uiSourceCode)
- return;
- var uiLocation = uiSourceCode.uiLocation(this._lineNumber, this._columnNumber);
- this._uiLocations[""] = uiLocation;
- this._breakpointManager._uiLocationAdded(this, uiLocation);
- }
+ var script = location.script();
+ var uiLocation = script.rawLocationToUILocation(location.lineNumber, location.columnNumber);
+ var breakpoint = this._breakpoint._breakpointManager.findBreakpoint(uiLocation.uiSourceCode, uiLocation.lineNumber, uiLocation.columnNumber);
+ if (breakpoint && breakpoint != this._breakpoint) {
+ // location clash
+ this._breakpoint.remove();
+ return false;
+ }
+ this._liveLocations.push(location.createLiveLocation(this._locationUpdated.bind(this, location)));
+ return true;
+ },
+
+ __proto__: WebInspector.TargetAware.prototype
}
/**

Powered by Google App Engine
This is Rietveld 408576698