/* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is sessionstore test code. * * The Initial Developer of the Original Code is * Mozilla Foundation. * Portions created by the Initial Developer are Copyright (C) 2010 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Paul O’Shannessy * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ let ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore); // This assumes that tests will at least have some state/entries function waitForBrowserState(aState, aSetStateCallback) { let windows = [window]; let tabsRestored = 0; let expectedTabsRestored = 0; let expectedWindows = aState.windows.length; let windowsOpen = 1; let listening = false; let windowObserving = false; let restoreHiddenTabs = Services.prefs.getBoolPref( "browser.sessionstore.restore_hidden_tabs"); aState.windows.forEach(function (winState) { winState.tabs.forEach(function (tabState) { if (restoreHiddenTabs || !tabState.hidden) expectedTabsRestored++; }); }); // There must be only hidden tabs and restoreHiddenTabs = false. We still // expect one of them to be restored because it gets shown automatically. if (!expectedTabsRestored) expectedTabsRestored = 1; function onSSTabRestored(aEvent) { if (++tabsRestored == expectedTabsRestored) { // Remove the event listener from each window windows.forEach(function(win) { win.gBrowser.tabContainer.removeEventListener("SSTabRestored", onSSTabRestored, true); }); listening = false; info("running " + aSetStateCallback.name); executeSoon(aSetStateCallback); } } // Used to add our listener to further windows so we can catch SSTabRestored // coming from them when creating a multi-window state. function windowObserver(aSubject, aTopic, aData) { if (aTopic == "domwindowopened") { let newWindow = aSubject.QueryInterface(Ci.nsIDOMWindow); newWindow.addEventListener("load", function() { newWindow.removeEventListener("load", arguments.callee, false); if (++windowsOpen == expectedWindows) { Services.ww.unregisterNotification(windowObserver); windowObserving = false; } // Track this window so we can remove the progress listener later windows.push(newWindow); // Add the progress listener newWindow.gBrowser.tabContainer.addEventListener("SSTabRestored", onSSTabRestored, true); }, false); } } // We only want to register the notification if we expect more than 1 window if (expectedWindows > 1) { registerCleanupFunction(function() { if (windowObserving) { Services.ww.unregisterNotification(windowObserver); } }); windowObserving = true; Services.ww.registerNotification(windowObserver); } registerCleanupFunction(function() { if (listening) { windows.forEach(function(win) { win.gBrowser.tabContainer.removeEventListener("SSTabRestored", onSSTabRestored, true); }); } }); // Add the event listener for this window as well. listening = true; gBrowser.tabContainer.addEventListener("SSTabRestored", onSSTabRestored, true); // Finally, call setBrowserState ss.setBrowserState(JSON.stringify(aState)); } // waitForSaveState waits for a state write but not necessarily for the state to // turn dirty. function waitForSaveState(aSaveStateCallback) { let observing = false; let topic = "sessionstore-state-write"; let sessionSaveTimeout = 1000 + Services.prefs.getIntPref("browser.sessionstore.interval"); function removeObserver() { if (!observing) return; Services.obs.removeObserver(observer, topic, false); observing = false; } let timeout = setTimeout(function () { removeObserver(); aSaveStateCallback(); }, sessionSaveTimeout); function observer(aSubject, aTopic, aData) { removeObserver(); timeout = clearTimeout(timeout); executeSoon(aSaveStateCallback); } registerCleanupFunction(function() { removeObserver(); if (timeout) { clearTimeout(timeout); } }); observing = true; Services.obs.addObserver(observer, topic, false); }; var gUniqueCounter = 0; function r() { return Date.now() + "-" + (++gUniqueCounter); }