2013-09-13 06:23:17 -07:00
|
|
|
/* Any copyright is dedicated to the Public Domain.
|
|
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Test that we can debug minified javascript with source maps.
|
|
|
|
*/
|
|
|
|
|
|
|
|
const TAB_URL = EXAMPLE_URL + "doc_minified.html";
|
|
|
|
const JS_URL = EXAMPLE_URL + "code_math.js";
|
|
|
|
|
Make the debugger frontend cope with an already connected target (bug 933212); r=jryans,fitzgen
* Made the DebuggerClient, which is actually the RootActor front, not consider one of the attached child fronts as "active". Since a single DebuggerClient (or RootFront) is kept around for the App Manager's lifetime, it makes sense to move the notion of "active" tab to the toolbox's target. As each toolbox gets destroyed, the fronts should be detaching from their actors (if they are stateful) so that the app is no longer in a debugging state. Debugging a new app (or reconnecting to a previous one) will create new fronts anyway.
* Slightly refactored the TabClient, ThreadClient, SourceClient and TracerClient towards a protocol.js-based architecture, by adding parent-child references and lifecycle management. Now a tab-scoped thread actor for instance has the tab as its parent, while a global-scoped thread actor (chrome debugger) has the DebuggerCLient (RootFront) as its parent. This lets parents reference their children, so that caching in the target object can work. It also allowed me to move some methods from the DebuggerClient to the actual front that should be responsible, like reconfigureTab, reconfigureThread and attachThread. These methods now use DebuggerClient.requester, too.
* Added some error handling in the debugger client requester around "before" and "after" callbacks, which exposed some errors in tests that are now fixed.
* Fixed the state handling in the thread actor so that merely detaching from a thread doesn't put it in the exited state. This is the part that what was necessary for Firebug's use case.
* Properly loading tracer and webgl actors now on b2g.
2014-01-14 07:39:40 -08:00
|
|
|
let gDebuggee, gPanel, gDebugger;
|
2013-09-13 06:23:17 -07:00
|
|
|
let gEditor, gSources, gFrames;
|
|
|
|
|
|
|
|
function test() {
|
|
|
|
initDebugger(TAB_URL).then(([aTab, aDebuggee, aPanel]) => {
|
|
|
|
gDebuggee = aDebuggee;
|
|
|
|
gPanel = aPanel;
|
|
|
|
gDebugger = gPanel.panelWin;
|
|
|
|
gEditor = gDebugger.DebuggerView.editor;
|
|
|
|
gSources = gDebugger.DebuggerView.Sources;
|
|
|
|
gFrames = gDebugger.DebuggerView.StackFrames;
|
|
|
|
|
|
|
|
waitForSourceShown(gPanel, JS_URL)
|
|
|
|
.then(checkInitialSource)
|
|
|
|
.then(testSetBreakpoint)
|
|
|
|
.then(() => resumeDebuggerThenCloseAndFinish(gPanel))
|
|
|
|
.then(null, aError => {
|
|
|
|
ok(false, "Got an error: " + aError.message + "\n" + aError.stack);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function checkInitialSource() {
|
|
|
|
isnot(gSources.selectedValue.indexOf(".js"), -1,
|
|
|
|
"The debugger should not show the minified js file.");
|
|
|
|
is(gSources.selectedValue.indexOf(".min.js"), -1,
|
|
|
|
"The debugger should show the original js file.");
|
|
|
|
is(gEditor.getText().split("\n").length, 46,
|
|
|
|
"The debugger's editor should have the original source displayed, " +
|
|
|
|
"not the whitespace stripped minified version.");
|
|
|
|
}
|
|
|
|
|
|
|
|
function testSetBreakpoint() {
|
|
|
|
let deferred = promise.defer();
|
|
|
|
|
Make the debugger frontend cope with an already connected target (bug 933212); r=jryans,fitzgen
* Made the DebuggerClient, which is actually the RootActor front, not consider one of the attached child fronts as "active". Since a single DebuggerClient (or RootFront) is kept around for the App Manager's lifetime, it makes sense to move the notion of "active" tab to the toolbox's target. As each toolbox gets destroyed, the fronts should be detaching from their actors (if they are stateful) so that the app is no longer in a debugging state. Debugging a new app (or reconnecting to a previous one) will create new fronts anyway.
* Slightly refactored the TabClient, ThreadClient, SourceClient and TracerClient towards a protocol.js-based architecture, by adding parent-child references and lifecycle management. Now a tab-scoped thread actor for instance has the tab as its parent, while a global-scoped thread actor (chrome debugger) has the DebuggerCLient (RootFront) as its parent. This lets parents reference their children, so that caching in the target object can work. It also allowed me to move some methods from the DebuggerClient to the actual front that should be responsible, like reconfigureTab, reconfigureThread and attachThread. These methods now use DebuggerClient.requester, too.
* Added some error handling in the debugger client requester around "before" and "after" callbacks, which exposed some errors in tests that are now fixed.
* Fixed the state handling in the thread actor so that merely detaching from a thread doesn't put it in the exited state. This is the part that what was necessary for Firebug's use case.
* Properly loading tracer and webgl actors now on b2g.
2014-01-14 07:39:40 -08:00
|
|
|
gDebugger.gThreadClient.setBreakpoint({ url: JS_URL, line: 30, column: 21 }, aResponse => {
|
|
|
|
ok(!aResponse.error,
|
|
|
|
"Should be able to set a breakpoint in a js file.");
|
|
|
|
ok(!aResponse.actualLocation,
|
|
|
|
"Should be able to set a breakpoint on line 30 and column 10.");
|
|
|
|
|
|
|
|
gDebugger.gClient.addOneTimeListener("resumed", () => {
|
|
|
|
waitForCaretAndScopes(gPanel, 30).then(() => {
|
|
|
|
// Make sure that we have the right stack frames.
|
|
|
|
is(gFrames.itemCount, 9,
|
|
|
|
"Should have nine frames.");
|
|
|
|
is(gFrames.getItemAtIndex(0).attachment.url.indexOf(".min.js"), -1,
|
|
|
|
"First frame should not be a minified JS frame.");
|
|
|
|
isnot(gFrames.getItemAtIndex(0).attachment.url.indexOf(".js"), -1,
|
|
|
|
"First frame should be a JS frame.");
|
|
|
|
|
|
|
|
deferred.resolve();
|
|
|
|
});
|
2013-09-13 06:23:17 -07:00
|
|
|
|
Make the debugger frontend cope with an already connected target (bug 933212); r=jryans,fitzgen
* Made the DebuggerClient, which is actually the RootActor front, not consider one of the attached child fronts as "active". Since a single DebuggerClient (or RootFront) is kept around for the App Manager's lifetime, it makes sense to move the notion of "active" tab to the toolbox's target. As each toolbox gets destroyed, the fronts should be detaching from their actors (if they are stateful) so that the app is no longer in a debugging state. Debugging a new app (or reconnecting to a previous one) will create new fronts anyway.
* Slightly refactored the TabClient, ThreadClient, SourceClient and TracerClient towards a protocol.js-based architecture, by adding parent-child references and lifecycle management. Now a tab-scoped thread actor for instance has the tab as its parent, while a global-scoped thread actor (chrome debugger) has the DebuggerCLient (RootFront) as its parent. This lets parents reference their children, so that caching in the target object can work. It also allowed me to move some methods from the DebuggerClient to the actual front that should be responsible, like reconfigureTab, reconfigureThread and attachThread. These methods now use DebuggerClient.requester, too.
* Added some error handling in the debugger client requester around "before" and "after" callbacks, which exposed some errors in tests that are now fixed.
* Fixed the state handling in the thread actor so that merely detaching from a thread doesn't put it in the exited state. This is the part that what was necessary for Firebug's use case.
* Properly loading tracer and webgl actors now on b2g.
2014-01-14 07:39:40 -08:00
|
|
|
// This will cause the breakpoint to be hit, and put us back in the
|
|
|
|
// paused state.
|
|
|
|
gDebuggee.arithmetic();
|
2013-09-13 06:23:17 -07:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
return deferred.promise;
|
|
|
|
}
|
|
|
|
|
|
|
|
registerCleanupFunction(function() {
|
|
|
|
gDebuggee = null;
|
|
|
|
gPanel = null;
|
|
|
|
gDebugger = null;
|
|
|
|
gEditor = null;
|
|
|
|
gSources = null;
|
|
|
|
gFrames = null;
|
|
|
|
});
|