gecko/browser/components/tabview/test/browser_tabview_pending_tabs.js

120 lines
3.3 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const STATE = {
windows: [{
tabs: [{
entries: [{ url: "about:mozilla" }],
hidden: true,
extData: {"tabview-tab": '{"url":"about:mozilla","groupID":1}'}
},{
entries: [{ url: "about:robots" }],
hidden: false,
extData: {"tabview-tab": '{"url":"about:robots","groupID":1}'},
}],
selected: 1,
extData: {
"tabview-groups": '{"nextID":2,"activeGroupId":1, "totalNumber":1}',
"tabview-group":
'{"1":{"bounds":{"left":15,"top":5,"width":280,"height":232},"id":1}}'
}
}]
};
/**
* Make sure that tabs are restored on demand as otherwise the tab will start
* loading immediately and we can't check whether it shows cached data.
*/
add_task(function setup() {
Services.prefs.setBoolPref("browser.sessionstore.restore_on_demand", true);
registerCleanupFunction(() => {
Services.prefs.clearUserPref("browser.sessionstore.restore_on_demand");
});
});
/**
* Ensure that a pending tab shows cached data.
*/
add_task(function () {
// Open a new window.
let win = OpenBrowserWindow();
yield promiseDelayedStartupFinished(win);
// Set the window to a specific state.
let ss = Cc["@mozilla.org/browser/sessionstore;1"]
.getService(Ci.nsISessionStore)
.setWindowState(win, JSON.stringify(STATE), true);
// Open Panorama.
yield promiseTabViewShown(win);
let [tab1, tab2] = win.gBrowser.tabs;
let cw = win.TabView.getContentWindow();
// Update the two tabs in reverse order. Panorama will first try to update
// the second tab but will put it back onto the queue once it detects that
// it hasn't loaded yet. It will then try to update the first tab.
cw.TabItems.update(tab2);
cw.TabItems.update(tab1);
let tabItem1 = tab1._tabViewTabItem;
let tabItem2 = tab2._tabViewTabItem;
// Wait for the first tabItem to be updated. Calling update() on the second
// tabItem won't send a notification as that is pushed back onto the queue.
yield promiseTabItemUpdated(tabItem1);
// Check that the first tab doesn't show cached data, the second one does.
ok(!tabItem1.isShowingCachedData(), "doesn't show cached data");
ok(tabItem2.isShowingCachedData(), "shows cached data");
// Cleanup.
yield promiseWindowClosed(win);
});
function promiseTabItemUpdated(tabItem) {
let deferred = Promise.defer();
tabItem.addSubscriber("updated", function onUpdated() {
tabItem.removeSubscriber("updated", onUpdated);
deferred.resolve();
});
return deferred.promise;
}
function promiseAllTabItemsUpdated(win) {
let deferred = Promise.defer();
afterAllTabItemsUpdated(deferred.resolve, win);
return deferred.promise;
}
function promiseDelayedStartupFinished(win) {
let deferred = Promise.defer();
whenDelayedStartupFinished(win, deferred.resolve);
return deferred.promise;
}
function promiseTabViewShown(win) {
let deferred = Promise.defer();
showTabView(deferred.resolve, win);
return deferred.promise;
}
function promiseWindowClosed(win) {
let deferred = Promise.defer();
Services.obs.addObserver(function obs(subject, topic) {
if (subject == win) {
Services.obs.removeObserver(obs, topic);
deferred.resolve();
}
}, "domwindowclosed", false);
win.close();
return deferred.promise;
}