michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: /** michael@0: * Verify the "frames" request on the thread. michael@0: */ michael@0: michael@0: var gDebuggee; michael@0: var gClient; michael@0: var gThreadClient; michael@0: michael@0: function run_test() michael@0: { michael@0: initTestDebuggerServer(); michael@0: gDebuggee = addTestGlobal("test-stack"); michael@0: gClient = new DebuggerClient(DebuggerServer.connectPipe()); michael@0: gClient.connect(function() { michael@0: attachTestTabAndResume(gClient, "test-stack", function(aResponse, aTabClient, aThreadClient) { michael@0: gThreadClient = aThreadClient; michael@0: test_pause_frame(); michael@0: }); michael@0: }); michael@0: do_test_pending(); michael@0: } michael@0: michael@0: var gFrames = [ michael@0: // Function calls... michael@0: { type: "call", callee: { name: "depth3" } }, michael@0: { type: "call", callee: { name: "depth2" } }, michael@0: { type: "call", callee: { name: "depth1" } }, michael@0: michael@0: // Anonymous function call in our eval... michael@0: { type: "call", callee: { name: undefined } }, michael@0: michael@0: // The eval itself. michael@0: { type: "eval", callee: { name: undefined } }, michael@0: ]; michael@0: michael@0: var gSliceTests = [ michael@0: { start: 0, count: undefined, resetActors: true }, michael@0: { start: 0, count: 1 }, michael@0: { start: 2, count: 2 }, michael@0: { start: 1, count: 15 }, michael@0: { start: 15, count: undefined }, michael@0: ]; michael@0: michael@0: function test_frame_slice() { michael@0: if (gSliceTests.length == 0) { michael@0: gThreadClient.resume(function() { finishClient(gClient); }); michael@0: return; michael@0: } michael@0: michael@0: let test = gSliceTests.shift(); michael@0: gThreadClient.getFrames(test.start, test.count, function(aResponse) { michael@0: var testFrames = gFrames.slice(test.start, test.count ? test.start + test.count : undefined); michael@0: do_check_eq(testFrames.length, aResponse.frames.length); michael@0: for (var i = 0; i < testFrames.length; i++) { michael@0: let expected = testFrames[i]; michael@0: let actual = aResponse.frames[i]; michael@0: michael@0: if (test.resetActors) { michael@0: expected.actor = actual.actor; michael@0: } michael@0: michael@0: for each (let key in ["type", "callee-name"]) { michael@0: do_check_eq(expected[key], actual[key]); michael@0: } michael@0: } michael@0: test_frame_slice(); michael@0: }); michael@0: } michael@0: michael@0: function test_pause_frame() michael@0: { michael@0: gThreadClient.addOneTimeListener("paused", function(aEvent, aPacket1) { michael@0: test_frame_slice(); michael@0: }); michael@0: michael@0: gDebuggee.eval("(" + function() { michael@0: function depth3() { michael@0: debugger; michael@0: } michael@0: function depth2() { michael@0: depth3(); michael@0: } michael@0: function depth1() { michael@0: depth2(); michael@0: }; michael@0: depth1(); michael@0: } + ")()"); michael@0: }