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 enteredFrame packets are sent on frame entry and michael@0: * exitedFrame packets are sent on frame exit. Tests that the "name" michael@0: * trace type works for function declarations. 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_enter_exit_frame(); michael@0: }); michael@0: }); michael@0: }); michael@0: do_test_pending(); michael@0: } michael@0: michael@0: function test_enter_exit_frame() michael@0: { michael@0: let tracesSeen = 0; michael@0: let traceNames = []; michael@0: let traceStopped = promise.defer(); michael@0: michael@0: gClient.addListener("traces", function onTraces(aEvent, { traces }) { michael@0: for (let t of traces) { michael@0: tracesSeen++; michael@0: michael@0: if (t.type == "enteredFrame") { michael@0: do_check_eq(t.type, "enteredFrame", michael@0: 'enteredFrame response should have type "enteredFrame"'); michael@0: do_check_eq(typeof t.sequence, "number", michael@0: 'enteredFrame response should have sequence number'); michael@0: do_check_true(!isNaN(t.sequence), michael@0: 'enteredFrame sequence should be a number'); michael@0: do_check_eq(typeof t.name, "string", michael@0: 'enteredFrame response should have function name'); michael@0: traceNames[t.sequence] = t.name; michael@0: } else { michael@0: do_check_eq(t.type, "exitedFrame", michael@0: 'exitedFrame response should have type "exitedFrame"'); michael@0: do_check_eq(typeof t.sequence, "number", michael@0: 'exitedFrame response should have sequence number'); michael@0: do_check_true(!isNaN(t.sequence), michael@0: 'exitedFrame sequence should be a number'); michael@0: } michael@0: michael@0: if (tracesSeen == 10) { michael@0: gClient.removeListener("traces", onTraces); michael@0: traceStopped.resolve(); michael@0: } michael@0: } michael@0: }); michael@0: michael@0: start_trace() michael@0: .then(eval_code) michael@0: .then(() => traceStopped.promise) michael@0: .then(stop_trace) michael@0: .then(function() { michael@0: do_check_eq(traceNames[2], "baz", michael@0: 'Should have entered "baz" frame in third packet'); michael@0: do_check_eq(traceNames[3], "bar", michael@0: 'Should have entered "bar" frame in fourth packet'); michael@0: do_check_eq(traceNames[4], "foo", michael@0: 'Should have entered "foo" frame in fifth packet'); michael@0: finishClient(gClient); 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 foo() { michael@0: return; michael@0: } michael@0: function bar() { michael@0: return foo(); michael@0: } michael@0: function baz() { michael@0: return bar(); michael@0: } michael@0: baz(); 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: }