diff -r 000000000000 -r 6474c204b198 toolkit/devtools/server/tests/unit/test_blackboxing-01.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolkit/devtools/server/tests/unit/test_blackboxing-01.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,174 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +/** + * Test basic black boxing. + */ + +var gDebuggee; +var gClient; +var gThreadClient; + +function run_test() +{ + initTestDebuggerServer(); + gDebuggee = addTestGlobal("test-black-box"); + gClient = new DebuggerClient(DebuggerServer.connectPipe()); + gClient.connect(function() { + attachTestTabAndResume(gClient, "test-black-box", function(aResponse, aTabClient, aThreadClient) { + gThreadClient = aThreadClient; + test_black_box(); + }); + }); + do_test_pending(); +} + +const BLACK_BOXED_URL = "http://example.com/blackboxme.js"; +const SOURCE_URL = "http://example.com/source.js"; + +function test_black_box() +{ + gClient.addOneTimeListener("paused", function () { + gThreadClient.setBreakpoint({ + url: SOURCE_URL, + line: 2 + }, function (aResponse) { + do_check_true(!aResponse.error, "Should be able to set breakpoint."); + gThreadClient.resume(test_black_box_default); + }); + }); + + Components.utils.evalInSandbox( + "" + function doStuff(k) { // line 1 + let arg = 15; // line 2 - Step in here + k(arg); // line 3 + }, // line 4 + gDebuggee, + "1.8", + BLACK_BOXED_URL, + 1 + ); + + Components.utils.evalInSandbox( + "" + function runTest() { // line 1 + doStuff( // line 2 - Break here + function (n) { // line 3 - Step through `doStuff` to here + debugger; // line 5 + } // line 6 + ); // line 7 + } // line 8 + + "\n debugger;", // line 9 + gDebuggee, + "1.8", + SOURCE_URL, + 1 + ); +} + +function test_black_box_default() { + gThreadClient.getSources(function (aResponse) { + do_check_true(!aResponse.error, "Should be able to get sources."); + + let sourceClient = gThreadClient.source( + aResponse.sources.filter(s => s.url == BLACK_BOXED_URL)[0]); + do_check_true(!sourceClient.isBlackBoxed, + "By default the source is not black boxed."); + + // Test that we can step into `doStuff` when we are not black boxed. + runTest( + function onSteppedLocation(aLocation) { + do_check_eq(aLocation.url, BLACK_BOXED_URL, + "Should step into `doStuff`."); + do_check_eq(aLocation.line, 2, + "Should step into `doStuff`."); + }, + function onDebuggerStatementFrames(aFrames) { + do_check_true(!aFrames.some(f => f.source.isBlackBoxed)); + }, + test_black_boxing.bind(null, sourceClient) + ); + }); +} + +function test_black_boxing(aSourceClient) { + aSourceClient.blackBox(function (aResponse) { + do_check_true(!aResponse.error, "Should not get an error black boxing."); + do_check_true(aSourceClient.isBlackBoxed, + "The source client should report itself as black boxed correctly."); + + // Test that we step through `doStuff` when we are black boxed and its frame + // doesn't show up. + runTest( + function onSteppedLocation(aLocation) { + do_check_eq(aLocation.url, SOURCE_URL, + "Should step through `doStuff`."); + do_check_eq(aLocation.line, 3, + "Should step through `doStuff`."); + }, + function onDebuggerStatementFrames(aFrames) { + for (let f of aFrames) { + if (f.where.url == BLACK_BOXED_URL) { + do_check_true(f.source.isBlackBoxed, "Should be black boxed"); + } else { + do_check_true(!f.source.isBlackBoxed, "Should not be black boxed") + } + } + }, + test_unblack_boxing.bind(null, aSourceClient) + ); + }); +} + +function test_unblack_boxing(aSourceClient) { + aSourceClient.unblackBox(function (aResponse) { + do_check_true(!aResponse.error, "Should not get an error un-black boxing"); + do_check_true(!aSourceClient.isBlackBoxed, "The source is not black boxed."); + + // Test that we can step into `doStuff` again. + runTest( + function onSteppedLocation(aLocation) { + do_check_eq(aLocation.url, BLACK_BOXED_URL, + "Should step into `doStuff`."); + do_check_eq(aLocation.line, 2, + "Should step into `doStuff`."); + }, + function onDebuggerStatementFrames(aFrames) { + do_check_true(!aFrames.some(f => f.source.isBlackBoxed)); + }, + finishClient.bind(null, gClient) + ); + }); +} + +function runTest(aOnSteppedLocation, aOnDebuggerStatementFrames, aFinishedCallback) { + gClient.addOneTimeListener("paused", function (aEvent, aPacket) { + do_check_eq(aPacket.why.type, "breakpoint"); + gClient.addOneTimeListener("paused", function () { + gClient.addOneTimeListener("paused", function () { + getCurrentLocation(function (aLocation) { + aOnSteppedLocation(aLocation); + gClient.addOneTimeListener("paused", function (aEvent, aPacket) { + do_check_eq(aPacket.why.type, "debuggerStatement"); + gThreadClient.getFrames(0, 100, function ({frames}) { + aOnDebuggerStatementFrames(frames); + gThreadClient.resume(aFinishedCallback); + }); + }); + gThreadClient.resume(); + }); + }); + gThreadClient.stepIn(); + }); + gThreadClient.stepIn(); + }); + + gDebuggee.runTest(); +} + +function getCurrentLocation(aCallback) { + gThreadClient.getFrames(0, 1, function ({frames, error}) { + do_check_true(!error, "Should not get an error: " + error); + let [{where}] = frames; + aCallback(where); + }); +}