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: * Check tab attach/navigation. michael@0: */ michael@0: michael@0: const TAB1_URL = EXAMPLE_URL + "doc_empty-tab-01.html"; michael@0: const TAB2_URL = EXAMPLE_URL + "doc_empty-tab-02.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(TAB1_URL) michael@0: .then(() => attachTabActorForUrl(gClient, TAB1_URL)) michael@0: .then(testNavigate) michael@0: .then(testDetach) 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 testNavigate([aGrip, aResponse]) { michael@0: let outstanding = [promise.defer(), promise.defer()]; michael@0: michael@0: gClient.addListener("tabNavigated", function onTabNavigated(aEvent, aPacket) { michael@0: is(aPacket.url, TAB2_URL, michael@0: "Got a tab navigation notification."); michael@0: michael@0: if (aPacket.state == "start") { michael@0: ok(true, "Tab started to navigate."); michael@0: outstanding[0].resolve(); michael@0: } else { michael@0: ok(true, "Tab finished navigating."); michael@0: gClient.removeListener("tabNavigated", onTabNavigated); michael@0: outstanding[1].resolve(); michael@0: } michael@0: }); michael@0: michael@0: gBrowser.selectedTab.linkedBrowser.loadURI(TAB2_URL); michael@0: return promise.all(outstanding.map(e => e.promise)) michael@0: .then(() => aGrip.actor); michael@0: } michael@0: michael@0: function testDetach(aActor) { michael@0: let deferred = promise.defer(); michael@0: michael@0: gClient.addOneTimeListener("tabDetached", (aType, aPacket) => { michael@0: ok(true, "Got a tab detach notification."); michael@0: is(aPacket.from, aActor, "tab detach message comes from the expected actor"); michael@0: gClient.close(deferred.resolve); michael@0: }); michael@0: michael@0: removeTab(gBrowser.selectedTab); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: registerCleanupFunction(function() { michael@0: gClient = null; michael@0: });