From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../browser/browser_ext_tabs_discard_reversed.js | 129 +++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 browser/components/extensions/test/browser/browser_ext_tabs_discard_reversed.js (limited to 'browser/components/extensions/test/browser/browser_ext_tabs_discard_reversed.js') diff --git a/browser/components/extensions/test/browser/browser_ext_tabs_discard_reversed.js b/browser/components/extensions/test/browser/browser_ext_tabs_discard_reversed.js new file mode 100644 index 0000000000..5fad30a6fb --- /dev/null +++ b/browser/components/extensions/test/browser/browser_ext_tabs_discard_reversed.js @@ -0,0 +1,129 @@ +/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set sts=2 sw=2 et tw=80: */ +"use strict"; + +add_task(async function tabs_discarded_load_and_discard() { + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + permissions: ["tabs", "webNavigation"], + }, + async background() { + browser.test.sendMessage("ready"); + const SHIP = await new Promise(resolve => + browser.test.onMessage.addListener((msg, data) => { + resolve(data); + }) + ); + + const PAGE_URL_BEFORE = "http://example.com/initiallyDiscarded"; + const PAGE_URL = + "http://example.com/browser/browser/components/extensions/test/browser/file_dummy.html"; + // Tabs without titles default to URLs without scheme, according to the + // logic of tabbrowser.js's setTabTitle/_setTabLabel. + // TODO bug 1695512: discarded tabs should also follow this logic instead + // of using the unmodified original URL. + const PAGE_TITLE_BEFORE = PAGE_URL_BEFORE; + const PAGE_TITLE_INITIAL = PAGE_URL.replace("http://", ""); + const PAGE_TITLE = "Dummy test page"; + + function assertDeepEqual(expected, actual, message) { + browser.test.assertDeepEq(expected, actual, message); + } + + let tab = await browser.tabs.create({ + url: PAGE_URL_BEFORE, + discarded: true, + }); + const TAB_ID = tab.id; + browser.test.assertTrue(tab.discarded, "Tab initially discarded"); + browser.test.assertEq(PAGE_URL_BEFORE, tab.url, "Initial URL"); + browser.test.assertEq(PAGE_TITLE_BEFORE, tab.title, "Initial title"); + + const observedChanges = { + discarded: [], + title: [], + url: [], + }; + function tabsOnUpdatedAfterLoad(tabId, changeInfo, tab) { + browser.test.assertEq(TAB_ID, tabId, "tabId for tabs.onUpdated"); + for (let [prop, value] of Object.entries(changeInfo)) { + observedChanges[prop].push(value); + } + } + browser.tabs.onUpdated.addListener(tabsOnUpdatedAfterLoad, { + properties: ["discarded", "url", "title"], + }); + + // Load new URL to transition from discarded:true to discarded:false. + await new Promise(resolve => { + browser.webNavigation.onCompleted.addListener(details => { + browser.test.assertEq(TAB_ID, details.tabId, "onCompleted for tab"); + browser.test.assertEq(PAGE_URL, details.url, "URL ater load"); + resolve(); + }); + browser.tabs.update(TAB_ID, { url: PAGE_URL }); + }); + assertDeepEqual( + [false], + observedChanges.discarded, + "changes to tab.discarded after update" + ); + // TODO bug 1669356: the tabs.onUpdated events should only see the + // requested URL and its title. However, the current implementation + // reports several events (including url/title "changes") as part of + // "restoring" the lazy browser prior to loading the requested URL. + + let expectedUrlChanges = [PAGE_URL_BEFORE, PAGE_URL]; + if (SHIP && observedChanges.url.length === 1) { + // Except when SHIP is enabled, which turns this into a race, + // so sometimes only the final URL is seen (see bug 1696815#c22). + expectedUrlChanges = [PAGE_URL]; + } + + assertDeepEqual( + expectedUrlChanges, + observedChanges.url, + "changes to tab.url after update" + ); + assertDeepEqual( + [PAGE_TITLE_INITIAL, PAGE_TITLE], + observedChanges.title, + "changes to tab.title after update" + ); + + tab = await browser.tabs.get(TAB_ID); + browser.test.assertFalse(tab.discarded, "tab.discarded after load"); + browser.test.assertEq(PAGE_URL, tab.url, "tab.url after load"); + browser.test.assertEq(PAGE_TITLE, tab.title, "tab.title after load"); + + // Reset counters. + observedChanges.discarded.length = 0; + observedChanges.title.length = 0; + observedChanges.url.length = 0; + + // Transition from discarded:false to discarded:true + await browser.tabs.discard(TAB_ID); + assertDeepEqual( + [true], + observedChanges.discarded, + "changes to tab.discarded after discard" + ); + assertDeepEqual([], observedChanges.url, "tab.url not changed"); + assertDeepEqual([], observedChanges.title, "tab.title not changed"); + + tab = await browser.tabs.get(TAB_ID); + browser.test.assertTrue(tab.discarded, "tab.discarded after discard"); + browser.test.assertEq(PAGE_URL, tab.url, "tab.url after discard"); + browser.test.assertEq(PAGE_TITLE, tab.title, "tab.title after discard"); + + await browser.tabs.remove(TAB_ID); + browser.test.sendMessage("done"); + }, + }); + + await extension.startup(); + await extension.awaitMessage("ready"); + extension.sendMessage("SHIP", Services.appinfo.sessionHistoryInParent); + await extension.awaitMessage("done"); + await extension.unload(); +}); -- cgit v1.2.3