forked from mirrors/gecko-dev
151 lines
4.5 KiB
JavaScript
151 lines
4.5 KiB
JavaScript
/* 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/. */
|
|
|
|
/**
|
|
* Tests that tabs which aren't displayed yet (i.e. need to be reloaded) are
|
|
* still displayed in the address bar results.
|
|
*/
|
|
|
|
const RESTRICT_TOKEN_OPENPAGE = "%";
|
|
|
|
const { PlacesTestUtils } = ChromeUtils.importESModule(
|
|
"resource://testing-common/PlacesTestUtils.sys.mjs"
|
|
);
|
|
|
|
const { UrlbarProviderOpenTabs } = ChromeUtils.importESModule(
|
|
"resource:///modules/UrlbarProviderOpenTabs.sys.mjs"
|
|
);
|
|
|
|
const { UrlbarTestUtils } = ChromeUtils.importESModule(
|
|
"resource://testing-common/UrlbarTestUtils.sys.mjs"
|
|
);
|
|
|
|
var stateBackup = ss.getBrowserState();
|
|
|
|
add_setup(async function() {
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [
|
|
// Set the pref to true so we know exactly how many tabs should be restoring at
|
|
// any given time. This guarantees that a finishing load won't start another.
|
|
["browser.sessionstore.restore_on_demand", true],
|
|
// Don't restore tabs lazily.
|
|
["browser.sessionstore.restore_tabs_lazily", false],
|
|
],
|
|
});
|
|
|
|
registerCleanupFunction(() => {
|
|
ss.setBrowserState(stateBackup);
|
|
});
|
|
|
|
info("Waiting for the Places DB to be initialized");
|
|
await PlacesUtils.promiseLargeCacheDBConnection();
|
|
await UrlbarProviderOpenTabs.promiseDBPopulated;
|
|
});
|
|
|
|
add_task(async function test_unrestored_tabs_listed() {
|
|
const state = {
|
|
windows: [
|
|
{
|
|
tabs: [
|
|
{
|
|
entries: [
|
|
{ url: "http://example.org/#1", triggeringPrincipal_base64 },
|
|
],
|
|
},
|
|
{
|
|
entries: [
|
|
{ url: "http://example.org/#2", triggeringPrincipal_base64 },
|
|
],
|
|
},
|
|
{
|
|
entries: [
|
|
{ url: "http://example.org/#3", triggeringPrincipal_base64 },
|
|
],
|
|
},
|
|
{
|
|
entries: [
|
|
{ url: "http://example.org/#4", triggeringPrincipal_base64 },
|
|
],
|
|
},
|
|
],
|
|
selected: 1,
|
|
},
|
|
],
|
|
};
|
|
|
|
const tabsForEnsure = new Set();
|
|
state.windows[0].tabs.forEach(function(tab) {
|
|
tabsForEnsure.add(tab.entries[0].url);
|
|
});
|
|
|
|
let tabsRestoring = 0;
|
|
let tabsRestored = 0;
|
|
|
|
await new Promise(resolve => {
|
|
function handleEvent(aEvent) {
|
|
if (aEvent.type == "SSTabRestoring") {
|
|
tabsRestoring++;
|
|
} else {
|
|
tabsRestored++;
|
|
}
|
|
|
|
if (tabsRestoring < state.windows[0].tabs.length || tabsRestored < 1) {
|
|
return;
|
|
}
|
|
|
|
gBrowser.tabContainer.removeEventListener(
|
|
"SSTabRestoring",
|
|
handleEvent,
|
|
true
|
|
);
|
|
gBrowser.tabContainer.removeEventListener(
|
|
"SSTabRestored",
|
|
handleEvent,
|
|
true
|
|
);
|
|
executeSoon(resolve);
|
|
}
|
|
|
|
// currentURI is set before SSTabRestoring is fired, so we can sucessfully check
|
|
// after that has fired for all tabs. Since 1 tab will be restored though, we
|
|
// also need to wait for 1 SSTabRestored since currentURI will be set, unset, then set.
|
|
gBrowser.tabContainer.addEventListener("SSTabRestoring", handleEvent, true);
|
|
gBrowser.tabContainer.addEventListener("SSTabRestored", handleEvent, true);
|
|
ss.setBrowserState(JSON.stringify(state));
|
|
});
|
|
|
|
// Ensure any database statements started by UrlbarProviderOpenTabs are
|
|
// complete before continuing.
|
|
await PlacesTestUtils.promiseAsyncUpdates();
|
|
|
|
// Remove the current tab from tabsForEnsure, because switch to tab doesn't
|
|
// suggest it.
|
|
tabsForEnsure.delete(gBrowser.currentURI.spec);
|
|
info("Searching open pages.");
|
|
await UrlbarTestUtils.promiseAutocompleteResultPopup({
|
|
window,
|
|
waitForFocus,
|
|
value: RESTRICT_TOKEN_OPENPAGE,
|
|
});
|
|
const total = UrlbarTestUtils.getResultCount(window);
|
|
info(`Found ${total} matches`);
|
|
|
|
// Check to see the expected uris and titles match up (in any order)
|
|
for (let i = 0; i < total; i++) {
|
|
const result = await UrlbarTestUtils.getDetailsOfResultAt(window, i);
|
|
if (result.heuristic) {
|
|
info("Skip heuristic match");
|
|
continue;
|
|
}
|
|
const url = result.url;
|
|
Assert.ok(
|
|
tabsForEnsure.has(url),
|
|
`Should have the found result '${url}' in the expected list of entries`
|
|
);
|
|
// Remove the found entry from expected results.
|
|
tabsForEnsure.delete(url);
|
|
}
|
|
// Make sure there is no reported open page that is not open.
|
|
Assert.equal(tabsForEnsure.size, 0, "Should have found all the tabs");
|
|
});
|