2011-03-11 Pavel Podivilov <podivilov@chromium.org>

        Reviewed by Pavel Feldman.

        Web Inspector: move breakpoints restoring after live edit to debugger presentation model.
        https://bugs.webkit.org/show_bug.cgi?id=56179

        Presentation model should move breakpoints based on text diff as required by "revert to revision" action in resources panel.

        * inspector/front-end/DebuggerModel.js:
        (WebInspector.DebuggerModel):
        (WebInspector.DebuggerModel.prototype.setBreakpoint.didSetBreakpoint):
        (WebInspector.DebuggerModel.prototype.setBreakpoint):
        (WebInspector.DebuggerModel.prototype.reset):
        (WebInspector.DebuggerModel.prototype.editScriptSource.didEditScriptSource):
        (WebInspector.DebuggerModel.prototype.editScriptSource):
        (WebInspector.DebuggerModel.prototype.get callFrames):
        (WebInspector.DebuggerModel.prototype._pausedScript):
        (WebInspector.DebuggerModel.prototype._resumedScript):
        * inspector/front-end/DebuggerPresentationModel.js:
        (WebInspector.DebuggerPresentationModel):
        (WebInspector.DebuggerPresentationModel.prototype._scriptSourceChanged):
        * inspector/front-end/ScriptsPanel.js:
        (WebInspector.ScriptsPanel.prototype._scriptSourceChanged):

git-svn-id: svn://svn.chromium.org/blink/trunk@81020 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent b75b4a80
2011-03-11 Pavel Podivilov <podivilov@chromium.org>
Reviewed by Pavel Feldman.
Web Inspector: move breakpoints restoring after live edit to debugger presentation model.
https://bugs.webkit.org/show_bug.cgi?id=56179
Presentation model should move breakpoints based on text diff as required by "revert to revision" action in resources panel.
* inspector/front-end/DebuggerModel.js:
(WebInspector.DebuggerModel):
(WebInspector.DebuggerModel.prototype.setBreakpoint.didSetBreakpoint):
(WebInspector.DebuggerModel.prototype.setBreakpoint):
(WebInspector.DebuggerModel.prototype.reset):
(WebInspector.DebuggerModel.prototype.editScriptSource.didEditScriptSource):
(WebInspector.DebuggerModel.prototype.editScriptSource):
(WebInspector.DebuggerModel.prototype.get callFrames):
(WebInspector.DebuggerModel.prototype._pausedScript):
(WebInspector.DebuggerModel.prototype._resumedScript):
* inspector/front-end/DebuggerPresentationModel.js:
(WebInspector.DebuggerPresentationModel):
(WebInspector.DebuggerPresentationModel.prototype._scriptSourceChanged):
* inspector/front-end/ScriptsPanel.js:
(WebInspector.ScriptsPanel.prototype._scriptSourceChanged):
2011-03-10 Alexander Pavlov <apavlov@chromium.org> 2011-03-10 Alexander Pavlov <apavlov@chromium.org>
Reviewed by Pavel Feldman. Reviewed by Pavel Feldman.
......
...@@ -30,8 +30,7 @@ ...@@ -30,8 +30,7 @@
WebInspector.DebuggerModel = function() WebInspector.DebuggerModel = function()
{ {
this._paused = false; this._debuggerPausedDetails = {};
this._callFrames = [];
this._breakpoints = {}; this._breakpoints = {};
this._scripts = {}; this._scripts = {};
...@@ -89,11 +88,9 @@ WebInspector.DebuggerModel.prototype = { ...@@ -89,11 +88,9 @@ WebInspector.DebuggerModel.prototype = {
function didSetBreakpoint(breakpointsPushedToBackend, error, breakpointId, locations) function didSetBreakpoint(breakpointsPushedToBackend, error, breakpointId, locations)
{ {
if (error || !breakpointId) { if (error || !breakpointId)
WebInspector.log("failed");
return; return;
}
var breakpoint = new WebInspector.Breakpoint(breakpointId, url, "", lineNumber, columnNumber, condition, enabled); var breakpoint = new WebInspector.Breakpoint(breakpointId, url, "", lineNumber, columnNumber, condition, enabled);
breakpoint.locations = locations; breakpoint.locations = locations;
this._breakpoints[breakpointId] = breakpoint; this._breakpoints[breakpointId] = breakpoint;
...@@ -187,8 +184,7 @@ WebInspector.DebuggerModel.prototype = { ...@@ -187,8 +184,7 @@ WebInspector.DebuggerModel.prototype = {
reset: function() reset: function()
{ {
this._paused = false; this._debuggerPausedDetails = {};
this._callFrames = [];
for (var id in this._breakpoints) { for (var id in this._breakpoints) {
var breakpoint = this._breakpoints[id]; var breakpoint = this._breakpoints[id];
if (!breakpoint.url) if (!breakpoint.url)
...@@ -222,81 +218,44 @@ WebInspector.DebuggerModel.prototype = { ...@@ -222,81 +218,44 @@ WebInspector.DebuggerModel.prototype = {
editScriptSource: function(sourceID, scriptSource) editScriptSource: function(sourceID, scriptSource)
{ {
function didEditScriptSource(error, success, newBodyOrErrorMessage, callFrames) var oldSource = this._scripts[sourceID].source;
{ DebuggerAgent.editScriptSource(sourceID, scriptSource, this._updateScriptSource.bind(this, sourceID, oldSource));
if (error)
return;
if (success) {
if (callFrames && callFrames.length)
this._callFrames = callFrames;
this._updateScriptSource(sourceID, newBodyOrErrorMessage);
} else
WebInspector.log(newBodyOrErrorMessage, WebInspector.ConsoleMessage.MessageLevel.Warning);
}
DebuggerAgent.editScriptSource(sourceID, scriptSource, didEditScriptSource.bind(this));
}, },
_updateScriptSource: function(sourceID, scriptSource) _updateScriptSource: function(sourceID, oldSource, error, success, newBodyOrErrorMessage, callFrames)
{ {
var script = this._scripts[sourceID]; if (error)
var oldSource = script.source; return;
script.source = scriptSource;
// Clear and re-create breakpoints according to text diff. if (!success) {
var diff = Array.diff(oldSource.split("\n"), script.source.split("\n")); WebInspector.log(newBodyOrErrorMessage, WebInspector.ConsoleMessage.MessageLevel.Warning);
for (var id in this._breakpoints) { return;
var breakpoint = this._breakpoints[id];
if (breakpoint.url) {
if (breakpoint.url !== script.sourceURL)
continue;
} else {
if (breakpoint.sourceID !== sourceID)
continue;
}
this.removeBreakpoint(breakpoint.id);
var lineNumber = breakpoint.lineNumber;
var newLineNumber = diff.left[lineNumber].row;
if (newLineNumber === undefined) {
for (var i = lineNumber - 1; i >= 0; --i) {
if (diff.left[i].row === undefined)
continue;
var shiftedLineNumber = diff.left[i].row + lineNumber - i;
if (shiftedLineNumber < diff.right.length) {
var originalLineNumber = diff.right[shiftedLineNumber].row;
if (originalLineNumber === lineNumber || originalLineNumber === undefined)
newLineNumber = shiftedLineNumber;
}
break;
}
}
if (newLineNumber === undefined)
continue;
if (breakpoint.url)
this.setBreakpoint(breakpoint.url, newLineNumber, breakpoint.columnNumber, breakpoint.condition, breakpoint.enabled);
else
this.setBreakpointBySourceId(sourceID, newLineNumber, breakpoint.columnNumber, breakpoint.condition, breakpoint.enabled);
} }
this._scripts[sourceID].source = newBodyOrErrorMessage;
this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.ScriptSourceChanged, { sourceID: sourceID, oldSource: oldSource }); this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.ScriptSourceChanged, { sourceID: sourceID, oldSource: oldSource });
if (callFrames && callFrames.length) {
this._debuggerPausedDetails.callFrames = callFrames;
this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.DebuggerPaused, this._debuggerPausedDetails);
}
}, },
get callFrames() get callFrames()
{ {
return this._callFrames; return this._debuggerPausedDetails.callFrames;
}, },
_pausedScript: function(details) _pausedScript: function(details)
{ {
this._paused = true; this._debuggerPausedDetails = details;
this._callFrames = details.callFrames;
details.breakpoint = this._breakpointForCallFrame(details.callFrames[0]); details.breakpoint = this._breakpointForCallFrame(details.callFrames[0]);
this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.DebuggerPaused, details); this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.DebuggerPaused, details);
}, },
_resumedScript: function() _resumedScript: function()
{ {
this._paused = false; this._debuggerPausedDetails = {};
this._callFrames = [];
this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.DebuggerResumed); this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.DebuggerResumed);
}, },
......
...@@ -35,6 +35,7 @@ WebInspector.DebuggerPresentationModel = function() ...@@ -35,6 +35,7 @@ WebInspector.DebuggerPresentationModel = function()
WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.ParsedScriptSource, this._parsedScriptSource, this); WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.ParsedScriptSource, this._parsedScriptSource, this);
WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.FailedToParseScriptSource, this._failedToParseScriptSource, this); WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.FailedToParseScriptSource, this._failedToParseScriptSource, this);
WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.ScriptSourceChanged, this._scriptSourceChanged, this);
WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.BreakpointAdded, this._breakpointAdded, this); WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.BreakpointAdded, this._breakpointAdded, this);
WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.BreakpointRemoved, this._breakpointRemoved, this); WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.BreakpointRemoved, this._breakpointRemoved, this);
WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.BreakpointResolved, this._breakpointResolved, this); WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.BreakpointResolved, this._breakpointResolved, this);
...@@ -71,6 +72,49 @@ WebInspector.DebuggerPresentationModel.prototype = { ...@@ -71,6 +72,49 @@ WebInspector.DebuggerPresentationModel.prototype = {
} }
}, },
_scriptSourceChanged: function(event)
{
var sourceID = event.data.sourceID;
var oldSource = event.data.oldSource;
var script = WebInspector.debuggerModel.scriptForSourceID(sourceID);
// Clear and re-create breakpoints according to text diff.
var diff = Array.diff(oldSource.split("\n"), script.source.split("\n"));
var breakpoints = WebInspector.debuggerModel.breakpoints;
for (var id in breakpoints) {
var breakpoint = breakpoints[id];
if (breakpoint.url) {
if (breakpoint.url !== script.sourceURL)
continue;
} else {
if (breakpoint.sourceID !== sourceID)
continue;
}
WebInspector.debuggerModel.removeBreakpoint(breakpoint.id);
var lineNumber = breakpoint.lineNumber;
var newLineNumber = diff.left[lineNumber].row;
if (newLineNumber === undefined) {
for (var i = lineNumber - 1; i >= 0; --i) {
if (diff.left[i].row === undefined)
continue;
var shiftedLineNumber = diff.left[i].row + lineNumber - i;
if (shiftedLineNumber < diff.right.length) {
var originalLineNumber = diff.right[shiftedLineNumber].row;
if (originalLineNumber === lineNumber || originalLineNumber === undefined)
newLineNumber = shiftedLineNumber;
}
break;
}
}
if (newLineNumber === undefined)
continue;
if (breakpoint.url)
WebInspector.debuggerModel.setBreakpoint(breakpoint.url, newLineNumber, breakpoint.columnNumber, breakpoint.condition, breakpoint.enabled);
else
WebInspector.debuggerModel.setBreakpointBySourceId(script.sourceID, newLineNumber, breakpoint.columnNumber, breakpoint.condition, breakpoint.enabled);
}
},
continueToLine: function(sourceFileId, lineNumber) continueToLine: function(sourceFileId, lineNumber)
{ {
var location = this._sourceLocationToActualLocation(sourceFileId, lineNumber); var location = this._sourceLocationToActualLocation(sourceFileId, lineNumber);
......
...@@ -267,10 +267,6 @@ WebInspector.ScriptsPanel.prototype = { ...@@ -267,10 +267,6 @@ WebInspector.ScriptsPanel.prototype = {
var sourceFileId = this._sourceFileIdForScript(script); var sourceFileId = this._sourceFileIdForScript(script);
this._recreateSourceFrame(sourceFileId); this._recreateSourceFrame(sourceFileId);
var callFrames = WebInspector.debuggerModel.callFrames;
if (callFrames.length)
this._debuggerPaused({ data: { callFrames: callFrames } });
}, },
_addScript: function(script) _addScript: function(script)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment