123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
- /* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
- /**
- * Check regression when opening two tabs
- */
- var { DebuggerServer } = require("devtools/server/main");
- var { DebuggerClient } = require("devtools/shared/client/main");
- const TAB_URL_1 = "data:text/html;charset=utf-8,foo";
- const TAB_URL_2 = "data:text/html;charset=utf-8,bar";
- var gClient;
- var gTab1, gTab2;
- var gTabActor1, gTabActor2;
- function test() {
- waitForExplicitFinish();
- if (!DebuggerServer.initialized) {
- DebuggerServer.init();
- DebuggerServer.addBrowserActors();
- }
- openTabs();
- }
- function openTabs() {
- // Open two tabs, select the second
- addTab(TAB_URL_1).then(tab1 => {
- gTab1 = tab1;
- addTab(TAB_URL_2).then(tab2 => {
- gTab2 = tab2;
- connect();
- });
- });
- }
- function connect() {
- // Connect to debugger server to fetch the two tab actors
- gClient = new DebuggerClient(DebuggerServer.connectPipe());
- gClient.connect()
- .then(() => gClient.listTabs())
- .then(response => {
- // Fetch the tab actors for each tab
- gTabActor1 = response.tabs.filter(a => a.url === TAB_URL_1)[0];
- gTabActor2 = response.tabs.filter(a => a.url === TAB_URL_2)[0];
- checkGetTab();
- });
- }
- function checkGetTab() {
- gClient.getTab({tab: gTab1})
- .then(response => {
- is(JSON.stringify(gTabActor1), JSON.stringify(response.tab),
- "getTab returns the same tab grip for first tab");
- })
- .then(() => {
- let filter = {};
- // Filter either by tabId or outerWindowID,
- // if we are running tests OOP or not.
- if (gTab1.linkedBrowser.frameLoader.tabParent) {
- filter.tabId = gTab1.linkedBrowser.frameLoader.tabParent.tabId;
- } else {
- let windowUtils = gTab1.linkedBrowser.contentWindow
- .QueryInterface(Ci.nsIInterfaceRequestor)
- .getInterface(Ci.nsIDOMWindowUtils);
- filter.outerWindowID = windowUtils.outerWindowID;
- }
- return gClient.getTab(filter);
- })
- .then(response => {
- is(JSON.stringify(gTabActor1), JSON.stringify(response.tab),
- "getTab returns the same tab grip when filtering by tabId/outerWindowID");
- })
- .then(() => gClient.getTab({tab: gTab2}))
- .then(response => {
- is(JSON.stringify(gTabActor2), JSON.stringify(response.tab),
- "getTab returns the same tab grip for second tab");
- })
- .then(checkGetTabFailures);
- }
- function checkGetTabFailures() {
- gClient.getTab({ tabId: -999 })
- .then(
- response => ok(false, "getTab unexpectedly succeed with a wrong tabId"),
- response => {
- is(response.error, "noTab");
- is(response.message, "Unable to find tab with tabId '-999'");
- }
- )
- .then(() => gClient.getTab({ outerWindowID: -999 }))
- .then(
- response => ok(false, "getTab unexpectedly succeed with a wrong outerWindowID"),
- response => {
- is(response.error, "noTab");
- is(response.message, "Unable to find tab with outerWindowID '-999'");
- }
- )
- .then(checkSelectedTabActor);
- }
- function checkSelectedTabActor() {
- // Send a naive request to the second tab actor
- // to check if it works
- gClient.request({ to: gTabActor2.consoleActor, type: "startListeners", listeners: [] }, aResponse => {
- ok("startedListeners" in aResponse, "Actor from the selected tab should respond to the request.");
- closeSecondTab();
- });
- }
- function closeSecondTab() {
- // Close the second tab, currently selected
- let container = gBrowser.tabContainer;
- container.addEventListener("TabClose", function onTabClose() {
- container.removeEventListener("TabClose", onTabClose);
- checkFirstTabActor();
- });
- gBrowser.removeTab(gTab2);
- }
- function checkFirstTabActor() {
- // then send a request to the first tab actor
- // to check if it still works
- gClient.request({ to: gTabActor1.consoleActor, type: "startListeners", listeners: [] }, aResponse => {
- ok("startedListeners" in aResponse, "Actor from the first tab should still respond.");
- cleanup();
- });
- }
- function cleanup() {
- let container = gBrowser.tabContainer;
- container.addEventListener("TabClose", function onTabClose() {
- container.removeEventListener("TabClose", onTabClose);
- gClient.close().then(finish);
- });
- gBrowser.removeTab(gTab1);
- }
|