Bug 952259 - Tests for Metro SessionStore.getBrowserState [r=msamuel]

This commit is contained in:
Matt Brubeck 2014-01-28 15:24:52 -08:00
parent 860f631f3c
commit c3ab1bf977
3 changed files with 63 additions and 10 deletions

View File

@ -0,0 +1,55 @@
/* vim: set ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
var gSessionStore = Cc["@mozilla.org/browser/sessionstore;1"]
.getService(Ci.nsISessionStore);
function test() {
runTests();
}
function getState() {
return JSON.parse(gSessionStore.getBrowserState());
}
function getTabData() {
return getState().windows[0].tabs;
}
function isValidTabData(aData) {
return aData && aData.entries && aData.entries.length &&
typeof aData.index == "number";
}
gTests.push({
desc: "getBrowserState tests",
run: function() {
// Wait for Session Manager to be initialized.
yield waitForCondition(() => window.__SSID);
info(window.__SSID);
let tabData1 = getTabData();
ok(tabData1.every(isValidTabData), "Tab data starts out valid");
// Open a tab.
let tab = Browser.addTab("about:mozilla");
let tabData2 = getTabData();
is(tabData2.length, tabData1.length, "New tab not added yet.");
// Wait for the tab's session data to be initialized.
yield waitForMessage("Content:SessionHistory", tab.browser.messageManager);
yield waitForMs(0);
let tabData3 = getTabData();
is(tabData3.length, tabData1.length + 1, "New tab added.");
ok(tabData3.every(isValidTabData), "Tab data still valid");
// Close the tab.
Browser.closeTab(tab, { forceClose: true } );
let tabData4 = getTabData();
is(tabData4.length, tabData1.length, "Closed tab removed.");
ok(tabData4.every(isValidTabData), "Tab data valid again");
}
});

View File

@ -56,6 +56,7 @@ support-files =
[browser_private_browsing.js]
[browser_prompt.js]
[browser_remotetabs.js]
[browser_sessionstore.js]
[browser_snappedState.js]
[browser_tabs.js]
[browser_tabs_container.js]

View File

@ -338,6 +338,7 @@ SessionStore.prototype = {
// Assign it a unique identifier and create its data object
aWindow.__SSID = "window" + gUUIDGenerator.generateUUID().toString();
this._windows[aWindow.__SSID] = { tabs: [], selected: 0, _closedTabs: [] };
this._orderedWindows.push(aWindow.__SSID);
// Perform additional initialization when the first window is loading
if (this._loadState == STATE_STOPPED) {
@ -348,9 +349,6 @@ SessionStore.prototype = {
if (!this.shouldRestore()) {
this._clearCache();
Services.obs.notifyObservers(null, "sessionstore-windows-restored", "");
// If nothing is being restored, we only have our single Metro window.
this._orderedWindows.push(aWindow.__SSID);
}
}
@ -554,15 +552,13 @@ SessionStore.prototype = {
_getTabData: function(aWindow) {
return aWindow.Browser.tabs
.filter(tab => !tab.isPrivate)
.filter(tab => !tab.isPrivate && tab.browser.__SS_data)
.map(tab => {
let browser = tab.browser;
if (browser.__SS_data) {
let tabData = browser.__SS_data;
if (browser.__SS_extdata)
tabData.extData = browser.__SS_extdata;
return tabData;
}
let tabData = browser.__SS_data;
if (browser.__SS_extdata)
tabData.extData = browser.__SS_extdata;
return tabData;
});
},
@ -801,6 +797,7 @@ SessionStore.prototype = {
} catch (ex) { /* currentGroupId is undefined if user has no tab groups */ }
// Move all window data from sessionstore.js to this._windows.
this._orderedWindows = [];
for (let i = 0; i < data.windows.length; i++) {
let SSID;
if (i != windowIndex) {