var testURL = chromeRoot + "browser_blank_01.html"; // A queue to order the tests and a handle for each test var gTests = []; var gCurrentTest = null; var ss = null; //------------------------------------------------------------------------------ // Entry point (must be named "test") function test() { // The "runNextTest" approach is async, so we need to call "waitForExplicitFinish()" // We call "finish()" when the tests are finished waitForExplicitFinish(); ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore); // Start the tests runNextTest(); } //------------------------------------------------------------------------------ // Iterating tests by shifting test out one by one as runNextTest is called. function runNextTest() { // Run the next test until all tests completed if (gTests.length > 0) { gCurrentTest = gTests.shift(); info(gCurrentTest.desc); gCurrentTest.run(); } else { // Cleanup. All tests are completed at this point try { // Add any cleanup code here } finally { // We must finialize the tests finish(); } } } //------------------------------------------------------------------------------ // Case: Loading a page and test setting tab values gTests.push({ desc: "Loading a page and test setting tab values", _currentTab: null, run: function() { this._currentTab = Browser.addTab(testURL, true); // Need to wait until the page is loaded and then wait till the tab has // the right data store into __SS_data/__SS_extdata. messageManager.addMessageListener("pageshow", function(aMessage) { if (gCurrentTest._currentTab.browser.currentURI.spec != "about:blank") { messageManager.removeMessageListener(aMessage.name, arguments.callee); waitFor(gCurrentTest.onPageReady, function() { return Browser.selectedBrowser.__SS_data.entries[0].url != "about:blank"; }); } }); }, onPageReady: function() { // Add some data ss.setTabValue(gCurrentTest._currentTab.chromeTab, "test1", "hello"); is(ss.getTabValue(gCurrentTest._currentTab.chromeTab, "test1"), "hello", "Set/Get tab value matches"); // Close tab and then undo the close gCurrentTest.numTabs = Browser.tabs.length; let tabs = document.getElementById("tabs"); tabs.addEventListener("TabClose", function() { tabs.removeEventListener("TabClose", arguments.callee, false); setTimeout(function() { gCurrentTest.onTabClose(); }, 0); }, false); Browser.closeTab(gCurrentTest._currentTab); gCurrentTest.numClosed = ss.getClosedTabCount(window); }, onTabClose: function() { isnot(Browser.tabs.length, gCurrentTest.numTabs, "Tab was closed"); is(ss.getClosedTabCount(window), gCurrentTest.numClosed, "Tab was stored"); // SessionStore works with chrome tab elements, not JS tab objects. // Map the _currentTab from chrome to JS gCurrentTest._currentTab = Browser.getTabFromChrome(ss.undoCloseTab(window, 0)); gCurrentTest.numClosed = ss.getClosedTabCount(window); // Need to wait until the page is loaded messageManager.addMessageListener("pageshow", function(aMessage) { if (gCurrentTest._currentTab.browser.currentURI.spec != "about:blank") { messageManager.removeMessageListener(aMessage.name, arguments.callee); setTimeout(function() { gCurrentTest.onPageUndo(); }, 0); } }); }, onPageUndo: function() { is(Browser.tabs.length, gCurrentTest.numTabs, "Tab was reopened"); // XXX The behavior is different depending if the tests is launch alone or with the testsuite is(ss.getClosedTabCount(window), gCurrentTest.numClosed, "Tab was removed from store"); is(ss.getTabValue(gCurrentTest._currentTab.chromeTab, "test1"), "hello", "Set/Get tab value matches after un-close"); ss.deleteTabValue(gCurrentTest._currentTab.chromeTab, "test1"); is(ss.getTabValue(gCurrentTest._currentTab.chromeTab, "test1"), "", "Set/Get tab value matches after removing value"); // Shutdown Browser.closeTab(gCurrentTest._currentTab); runNextTest(); } });