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: * Tests that the exit frame packets get the correct `why` value. michael@0: */ michael@0: michael@0: var gDebuggee; michael@0: var gClient; michael@0: var gTraceClient; michael@0: michael@0: function run_test() michael@0: { michael@0: initTestTracerServer(); michael@0: gDebuggee = addTestGlobal("test-tracer-actor"); michael@0: gClient = new DebuggerClient(DebuggerServer.connectPipe()); michael@0: gClient.connect(function() { michael@0: attachTestTab(gClient, "test-tracer-actor", function(aResponse, aTabClient) { michael@0: gClient.attachTracer(aResponse.traceActor, function(aResponse, aTraceClient) { michael@0: gTraceClient = aTraceClient; michael@0: test_exit_frame_whys(); michael@0: }); michael@0: }); michael@0: }); michael@0: do_test_pending(); michael@0: } michael@0: michael@0: function test_exit_frame_whys() michael@0: { michael@0: gClient.addListener("traces", (aEvent, { traces }) => { michael@0: for (let t of traces) { michael@0: if (t.type == "exitedFrame") { michael@0: check_trace(t); michael@0: } michael@0: } michael@0: }); michael@0: michael@0: start_trace() michael@0: .then(eval_code) michael@0: .then(stop_trace) michael@0: .then(function() { michael@0: finishClient(gClient); michael@0: }).then(null, error => { michael@0: do_check_true(false, "Should not get an error, got: " + error); michael@0: }); michael@0: } michael@0: michael@0: function start_trace() michael@0: { michael@0: let deferred = promise.defer(); michael@0: gTraceClient.startTrace(["name"], null, function() { deferred.resolve(); }); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function eval_code() michael@0: { michael@0: gDebuggee.eval("(" + function() { michael@0: function thrower() { michael@0: throw new Error(); michael@0: } michael@0: michael@0: function* yielder() { michael@0: yield 1; michael@0: } michael@0: michael@0: function returner() { michael@0: return 1; michael@0: } michael@0: michael@0: try { michael@0: thrower(); michael@0: } catch(e) {} michael@0: michael@0: // XXX bug 923729: Can't test yielding yet. michael@0: // for (let x of yielder()) { michael@0: // break; michael@0: // } michael@0: michael@0: returner(); michael@0: } + ")()"); michael@0: } michael@0: michael@0: function stop_trace() michael@0: { michael@0: let deferred = promise.defer(); michael@0: gTraceClient.stopTrace(null, function() { deferred.resolve(); }); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function check_trace(aEvent, { sequence, why }) michael@0: { michael@0: switch(sequence) { michael@0: case 3: michael@0: do_check_eq(why, "throw"); michael@0: break; michael@0: case 5: michael@0: do_check_eq(why, "return"); michael@0: break; michael@0: } michael@0: }