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 the behavior of the debugger statement. michael@0: */ michael@0: michael@0: const TAB_URL = EXAMPLE_URL + "doc_inline-debugger-statement.html"; michael@0: michael@0: let gClient; michael@0: michael@0: function test() { michael@0: if (!DebuggerServer.initialized) { michael@0: DebuggerServer.init(() => true); michael@0: DebuggerServer.addBrowserActors(); michael@0: } michael@0: michael@0: let transport = DebuggerServer.connectPipe(); michael@0: gClient = new DebuggerClient(transport); michael@0: gClient.connect((aType, aTraits) => { michael@0: is(aType, "browser", michael@0: "Root actor should identify itself as a browser."); michael@0: michael@0: addTab(TAB_URL) michael@0: .then(() => attachTabActorForUrl(gClient, TAB_URL)) michael@0: .then(testEarlyDebuggerStatement) michael@0: .then(testDebuggerStatement) michael@0: .then(closeConnection) michael@0: .then(finish) michael@0: .then(null, aError => { michael@0: ok(false, "Got an error: " + aError.message + "\n" + aError.stack); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: function testEarlyDebuggerStatement([aGrip, aResponse]) { michael@0: let deferred = promise.defer(); michael@0: michael@0: let onPaused = function(aEvent, aPacket) { michael@0: ok(false, "Pause shouldn't be called before we've attached!"); michael@0: deferred.reject(); michael@0: }; michael@0: michael@0: gClient.addListener("paused", onPaused); michael@0: michael@0: // This should continue without nesting an event loop and calling michael@0: // the onPaused hook, because we haven't attached yet. michael@0: let debuggee = gBrowser.selectedTab.linkedBrowser.contentWindow.wrappedJSObject; michael@0: debuggee.runDebuggerStatement(); michael@0: michael@0: gClient.removeListener("paused", onPaused); michael@0: michael@0: // Now attach and resume... michael@0: gClient.request({ to: aResponse.threadActor, type: "attach" }, () => { michael@0: gClient.request({ to: aResponse.threadActor, type: "resume" }, () => { michael@0: ok(true, "Pause wasn't called before we've attached."); michael@0: deferred.resolve([aGrip, aResponse]); michael@0: }); michael@0: }); michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function testDebuggerStatement([aGrip, aResponse]) { michael@0: let deferred = promise.defer(); michael@0: michael@0: gClient.addListener("paused", (aEvent, aPacket) => { michael@0: gClient.request({ to: aResponse.threadActor, type: "resume" }, () => { michael@0: ok(true, "The pause handler was triggered on a debugger statement."); michael@0: deferred.resolve(); michael@0: }); michael@0: }); michael@0: michael@0: // Reach around the debugging protocol and execute the debugger statement. michael@0: let debuggee = gBrowser.selectedTab.linkedBrowser.contentWindow.wrappedJSObject; michael@0: debuggee.runDebuggerStatement(); michael@0: } michael@0: michael@0: function closeConnection() { michael@0: let deferred = promise.defer(); michael@0: gClient.close(deferred.resolve); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: registerCleanupFunction(function() { michael@0: removeTab(gBrowser.selectedTab); michael@0: gClient = null; michael@0: }); michael@0: