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 --- .../test/browser/browser_ext_tabs_create.js | 299 +++++++++++++++++++++ 1 file changed, 299 insertions(+) create mode 100644 browser/components/extensions/test/browser/browser_ext_tabs_create.js (limited to 'browser/components/extensions/test/browser/browser_ext_tabs_create.js') diff --git a/browser/components/extensions/test/browser/browser_ext_tabs_create.js b/browser/components/extensions/test/browser/browser_ext_tabs_create.js new file mode 100644 index 0000000000..a3b6e78331 --- /dev/null +++ b/browser/components/extensions/test/browser/browser_ext_tabs_create.js @@ -0,0 +1,299 @@ +/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set sts=2 sw=2 et tw=80: */ +"use strict"; + +add_task(async function test_create_options() { + let tab = await BrowserTestUtils.openNewForegroundTab( + gBrowser, + "about:robots" + ); + gBrowser.selectedTab = tab; + + // TODO: Multiple windows. + + await SpecialPowers.pushPrefEnv({ + set: [ + // Using pre-loaded new tab pages interferes with onUpdated events. + // It probably shouldn't. + ["browser.newtab.preload", false], + // Some test cases below load http and check the behavior of https-first. + ["dom.security.https_first", true], + ], + }); + + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + permissions: ["tabs"], + + background: { page: "bg/background.html" }, + }, + + files: { + "bg/blank.html": ``, + + "bg/background.html": ` + + + `, + + "bg/background.js": function () { + let activeTab; + let activeWindow; + + function runTests() { + const DEFAULTS = { + index: 2, + windowId: activeWindow, + active: true, + pinned: false, + url: "about:newtab", + // 'selected' is marked as unsupported in schema, so we've removed it. + // For more details, see bug 1337509 + selected: undefined, + mutedInfo: { + muted: false, + extensionId: undefined, + reason: undefined, + }, + }; + + let tests = [ + { + create: { url: "https://example.com/" }, + result: { url: "https://example.com/" }, + }, + { + create: { url: "view-source:https://example.com/" }, + result: { url: "view-source:https://example.com/" }, + }, + { + create: { url: "blank.html" }, + result: { url: browser.runtime.getURL("bg/blank.html") }, + }, + { + create: { url: "https://example.com/", openInReaderMode: true }, + result: { + url: `about:reader?url=${encodeURIComponent( + "https://example.com/" + )}`, + }, + }, + { + create: {}, + result: { url: "about:newtab" }, + }, + { + create: { active: false }, + result: { active: false }, + }, + { + create: { active: true }, + result: { active: true }, + }, + { + create: { pinned: true }, + result: { pinned: true, index: 0 }, + }, + { + create: { pinned: true, active: true }, + result: { pinned: true, active: true, index: 0 }, + }, + { + create: { pinned: true, active: false }, + result: { pinned: true, active: false, index: 0 }, + }, + { + create: { index: 1 }, + result: { index: 1 }, + }, + { + create: { index: 1, active: false }, + result: { index: 1, active: false }, + }, + { + create: { windowId: activeWindow }, + result: { windowId: activeWindow }, + }, + { + create: { index: 9999 }, + result: { index: 2 }, + }, + { + // https-first redirects http to https. + create: { url: "http://example.com/" }, + result: { url: "https://example.com/" }, + }, + { + // https-first redirects http to https. + create: { url: "view-source:http://example.com/" }, + result: { url: "view-source:https://example.com/" }, + }, + { + // Despite https-first, the about:reader URL does not change. + create: { url: "http://example.com/", openInReaderMode: true }, + result: { + url: `about:reader?url=${encodeURIComponent( + "http://example.com/" + )}`, + }, + }, + { + create: { muted: true }, + result: { + mutedInfo: { + muted: true, + extensionId: browser.runtime.id, + reason: "extension", + }, + }, + }, + { + create: { muted: false }, + result: { + mutedInfo: { + muted: false, + extensionId: undefined, + reason: undefined, + }, + }, + }, + ]; + + async function nextTest() { + if (!tests.length) { + browser.test.notifyPass("tabs.create"); + return; + } + + let test = tests.shift(); + let expected = Object.assign({}, DEFAULTS, test.result); + + browser.test.log( + `Testing tabs.create(${JSON.stringify( + test.create + )}), expecting ${JSON.stringify(test.result)}` + ); + + let updatedPromise = new Promise(resolve => { + let onUpdated = (changedTabId, changed) => { + if (changed.url) { + browser.tabs.onUpdated.removeListener(onUpdated); + resolve({ tabId: changedTabId, url: changed.url }); + } + }; + browser.tabs.onUpdated.addListener(onUpdated); + }); + + let createdPromise = new Promise(resolve => { + let onCreated = tab => { + browser.test.assertTrue( + "id" in tab, + `Expected tabs.onCreated callback to receive tab object` + ); + resolve(); + }; + browser.tabs.onCreated.addListener(onCreated); + }); + + let [tab] = await Promise.all([ + browser.tabs.create(test.create), + createdPromise, + ]); + let tabId = tab.id; + + for (let key of Object.keys(expected)) { + if (key === "url") { + // FIXME: This doesn't get updated until later in the load cycle. + continue; + } + + if (key === "mutedInfo") { + for (let key of Object.keys(expected.mutedInfo)) { + browser.test.assertEq( + expected.mutedInfo[key], + tab.mutedInfo[key], + `Expected value for tab.mutedInfo.${key}` + ); + } + } else { + browser.test.assertEq( + expected[key], + tab[key], + `Expected value for tab.${key}` + ); + } + } + + let updated = await updatedPromise; + browser.test.assertEq( + tabId, + updated.tabId, + `Expected value for tab.id` + ); + browser.test.assertEq( + expected.url, + updated.url, + `Expected value for tab.url` + ); + + await browser.tabs.remove(tabId); + await browser.tabs.update(activeTab, { active: true }); + + nextTest(); + } + + nextTest(); + } + + browser.tabs.query({ active: true, currentWindow: true }, tabs => { + activeTab = tabs[0].id; + activeWindow = tabs[0].windowId; + + runTests(); + }); + }, + }, + }); + + await extension.startup(); + await extension.awaitFinish("tabs.create"); + await extension.unload(); + + BrowserTestUtils.removeTab(tab); +}); + +add_task(async function test_create_with_popup() { + const extension = ExtensionTestUtils.loadExtension({ + async background() { + let normalWin = await browser.windows.create(); + let lastFocusedNormalWin = await browser.windows.getLastFocused({}); + browser.test.assertEq( + lastFocusedNormalWin.id, + normalWin.id, + "The normal window is the last focused window." + ); + let popupWin = await browser.windows.create({ type: "popup" }); + let lastFocusedPopupWin = await browser.windows.getLastFocused({}); + browser.test.assertEq( + lastFocusedPopupWin.id, + popupWin.id, + "The popup window is the last focused window." + ); + let newtab = await browser.tabs.create({}); + browser.test.assertEq( + normalWin.id, + newtab.windowId, + "New tab was created in last focused normal window." + ); + await Promise.all([ + browser.windows.remove(normalWin.id), + browser.windows.remove(popupWin.id), + ]); + browser.test.sendMessage("complete"); + }, + }); + + await extension.startup(); + await extension.awaitMessage("complete"); + await extension.unload(); +}); -- cgit v1.2.3