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: * Test the "depth" trace type. 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_frame_depths(); michael@0: }); michael@0: }); michael@0: }); michael@0: do_test_pending(); michael@0: } michael@0: michael@0: function test_frame_depths() michael@0: { michael@0: const tracesStopped = promise.defer(); michael@0: gClient.addListener("traces", (aEvent, { traces }) => { michael@0: for (let t of traces) { michael@0: check_trace(t); michael@0: } michael@0: tracesStopped.resolve(); michael@0: }); michael@0: michael@0: start_trace() michael@0: .then(eval_code) michael@0: .then(() => tracesStopped.promise) 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(["depth", "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 iife() { michael@0: function first() { michael@0: second(); michael@0: } michael@0: michael@0: function second() { michael@0: third(); michael@0: } michael@0: michael@0: function third() { michael@0: } michael@0: michael@0: first(); 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({ sequence, depth, name }) michael@0: { michael@0: switch(sequence) { michael@0: case 0: michael@0: do_check_eq(name, "(eval)"); michael@0: // Fall through michael@0: case 9: michael@0: do_check_eq(depth, 0); michael@0: break; michael@0: michael@0: case 1: michael@0: do_check_eq(name, "iife"); michael@0: // Fall through michael@0: case 8: michael@0: do_check_eq(depth, 1); michael@0: break; michael@0: michael@0: case 2: michael@0: do_check_eq(name, "first"); michael@0: // Fall through michael@0: case 7: michael@0: do_check_eq(depth, 2); michael@0: break; michael@0: michael@0: case 3: michael@0: do_check_eq(name, "second"); michael@0: // Fall through michael@0: case 6: michael@0: do_check_eq(depth, 3); michael@0: break; michael@0: michael@0: case 4: michael@0: do_check_eq(name, "third"); michael@0: // Fall through michael@0: case 5: michael@0: do_check_eq(depth, 4); michael@0: break; michael@0: michael@0: default: michael@0: // Should have covered all sequences. michael@0: do_check_true(false); michael@0: } michael@0: }