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: * Make sure the listTabs request works as specified. 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 gTab1, gTab1Actor, gTab2, gTab2Actor, 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: promise.resolve(null) michael@0: .then(testFirstTab) michael@0: .then(testSecondTab) michael@0: .then(testRemoveTab) michael@0: .then(testAttachRemovedTab) 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 testFirstTab() { michael@0: return addTab(TAB1_URL).then(aTab => { michael@0: gTab1 = aTab; michael@0: michael@0: return getTabActorForUrl(gClient, TAB1_URL).then(aGrip => { michael@0: ok(aGrip, "Should find a tab actor for the first tab."); michael@0: gTab1Actor = aGrip.actor; michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: function testSecondTab() { michael@0: return addTab(TAB2_URL).then(aTab => { michael@0: gTab2 = aTab; michael@0: michael@0: return getTabActorForUrl(gClient, TAB1_URL).then(aFirstGrip => { michael@0: return getTabActorForUrl(gClient, TAB2_URL).then(aSecondGrip => { michael@0: is(aFirstGrip.actor, gTab1Actor, "First tab's actor shouldn't have changed."); michael@0: ok(aSecondGrip, "Should find a tab actor for the second tab."); michael@0: gTab2Actor = aSecondGrip.actor; michael@0: }); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: function testRemoveTab() { michael@0: return removeTab(gTab1).then(() => { michael@0: return getTabActorForUrl(gClient, TAB1_URL).then(aGrip => { michael@0: ok(!aGrip, "Shouldn't find a tab actor for the first tab anymore."); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: function testAttachRemovedTab() { michael@0: return removeTab(gTab2).then(() => { michael@0: let deferred = promise.defer(); michael@0: michael@0: gClient.addListener("paused", (aEvent, aPacket) => { michael@0: ok(false, "Attaching to an exited tab actor shouldn't generate a pause."); michael@0: deferred.reject(); michael@0: }); michael@0: michael@0: gClient.request({ to: gTab2Actor, type: "attach" }, aResponse => { michael@0: is(aResponse.type, "exited", "Tab should consider itself exited."); michael@0: deferred.resolve(); michael@0: }); michael@0: michael@0: return deferred.promise; michael@0: }); 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: gTab1 = null; michael@0: gTab1Actor = null; michael@0: gTab2 = null; michael@0: gTab2Actor = null; michael@0: gClient = null; michael@0: });