Reviewed by Darin.
authorthatcher <thatcher@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 1 Aug 2006 03:51:45 +0000 (03:51 +0000)
committerthatcher <thatcher@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 1 Aug 2006 03:51:45 +0000 (03:51 +0000)
        http://bugzilla.opendarwin.org/show_bug.cgi?id=10178
        Bug 10178: [Drosera] Selecting a frame in the stack list should take you to that location in the source

        * Drosera/debugger.js:  Keep a stack that contains the source file and line number references for outer
        frames.  Use this stack to determine which file and line to highlight when a stack frame is selected.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@15725 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKitTools/ChangeLog
WebKitTools/Drosera/debugger.js

index 457223c..55e1989 100644 (file)
@@ -2,6 +2,16 @@
 
         Reviewed by Darin.
 
+        http://bugzilla.opendarwin.org/show_bug.cgi?id=10178
+        Bug 10178: [Drosera] Selecting a frame in the stack list should take you to that location in the source
+
+        * Drosera/debugger.js:  Keep a stack that contains the source file and line number references for outer
+        frames.  Use this stack to determine which file and line to highlight when a stack frame is selected.
+
+2006-07-31  Mark Rowe  <opendarwin.org@bdash.net.nz>
+
+        Reviewed by Darin.
+
         http://bugzilla.opendarwin.org/show_bug.cgi?id=10175
         Bug 10175: [Drosera] Anonymous functions show up as "(global scope)" in stack list
 
index 87440fc..40360c8 100644 (file)
@@ -33,6 +33,8 @@ var currentFile = -1;
 var currentRow = null;
 var currentStack = null;
 var currentCallFrame = null;
+var lastStatement = null;
+var frameLineNumberStack = new Array();
 var previousFiles = new Array();
 var nextFiles = new Array();
 var isResizingColumn = false;
@@ -646,6 +648,11 @@ function selectStackFrame(event)
     addStyleClass(this, "current");
     this.callFrame.loadVariables();
     currentCallFrame = this.callFrame;
+
+    if (frameLineNumberInfo = frameLineNumberStack[this.callFrame.index - 1])
+        jumpToLine(frameLineNumberInfo[0], frameLineNumberInfo[1]);
+    else if (this.callFrame.index == 0)
+        jumpToLine(lastStatement[0], lastStatement[1]);
 }
 
 function selectVariable(event)
@@ -785,6 +792,39 @@ function didParseScript(source, fileSource, url, sourceId, baseLineNumber)
         loadFile(fileIndex, true);
 }
 
+function jumpToLine(sourceId, line)
+{
+    var script = scripts[sourceId];
+    if (line <= 0 || !script)
+        return;
+
+    var file = files[script.file];
+    if (!file)
+        return;
+
+    if (currentFile != script.file)
+        loadFile(script.file, true);
+    if (currentRow)
+        removeStyleClass(currentRow, "current");
+    if (!file.element)
+        return;
+    if (line > file.element.firstChild.childNodes.length)
+        return;
+
+    currentRow = file.element.firstChild.childNodes.item(line - 1);
+    if (!currentRow)
+        return;
+
+    addStyleClass(currentRow, "current");
+
+    var sourcesDiv = document.getElementById("sources");
+    var sourcesDocument = document.getElementById("sources").contentDocument;
+    var parent = sourcesDocument.body;
+    var offset = totalOffsetTop(currentRow, parent);
+    if (offset < (parent.scrollTop + 20) || offset > (parent.scrollTop + sourcesDiv.clientHeight - 20))
+        parent.scrollTop = totalOffsetTop(currentRow, parent) - (sourcesDiv.clientHeight / 2) + 10;
+}
+
 function willExecuteStatement(sourceId, line, fromLeavingFrame)
 {
     var script = scripts[sourceId];
@@ -795,6 +835,8 @@ function willExecuteStatement(sourceId, line, fromLeavingFrame)
     if (!file)
         return;
 
+    lastStatement = [sourceId, line];
+
     if (pauseOnNextStatement || file.breakpoints[line] == 1 || (steppingOver && !steppingStack)) {
         pause();
         pauseOnNextStatement = false;
@@ -802,29 +844,8 @@ function willExecuteStatement(sourceId, line, fromLeavingFrame)
     }
 
     if (isPaused()) {
-        if (currentFile != script.file)
-            loadFile(script.file, true);
-        if (currentRow)
-            removeStyleClass(currentRow, "current");
-        if (!file.element)
-            return;
-        if (line > file.element.firstChild.childNodes.length)
-            return;
-
         updateFunctionStack();
-
-        currentRow = file.element.firstChild.childNodes.item(line - 1);
-        if (!currentRow)
-            return;
-
-        addStyleClass(currentRow, "current");
-
-        var sourcesDiv = document.getElementById("sources");
-        var sourcesDocument = document.getElementById("sources").contentDocument;
-        var parent = sourcesDocument.body;
-        var offset = totalOffsetTop(currentRow, parent);
-        if (offset < (parent.scrollTop + 20) || offset > (parent.scrollTop + sourcesDiv.clientHeight - 20))
-            parent.scrollTop = totalOffsetTop(currentRow, parent) - (sourcesDiv.clientHeight / 2) + 10;
+        jumpToLine(sourceId, line);
     }
 }
 
@@ -832,6 +853,9 @@ function didEnterCallFrame(sourceId, line)
 {
     if (steppingOver || steppingOut)
         steppingStack++;
+
+    if (lastStatement)
+        frameLineNumberStack.unshift(lastStatement);
     willExecuteStatement(sourceId, line);
 }
 
@@ -840,6 +864,7 @@ function willLeaveCallFrame(sourceId, line)
     if (line <= 0)
         resume();
     willExecuteStatement(sourceId, line, true);
+    frameLineNumberStack.shift();
     if (!steppingStack)
         steppingOver = false;
     if (steppingOut && !steppingStack) {
@@ -853,7 +878,8 @@ function willLeaveCallFrame(sourceId, line)
 function exceptionWasRaised(sourceId, line)
 {
     pause();
-    willExecuteStatement(sourceId, line);
+    updateFunctionStack();
+    jumpToLine(sourceId, line);
 }
 
 function showConsoleWindow()