summaryrefslogtreecommitdiffstats
path: root/toolkit/components/extensions/test/mochitest/test_ext_dnr_tabIds.html
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 17:32:43 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 17:32:43 +0000
commit6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch)
treea68f146d7fa01f0134297619fbe7e33db084e0aa /toolkit/components/extensions/test/mochitest/test_ext_dnr_tabIds.html
parentInitial commit. (diff)
downloadthunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.tar.xz
thunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.zip
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'toolkit/components/extensions/test/mochitest/test_ext_dnr_tabIds.html')
-rw-r--r--toolkit/components/extensions/test/mochitest/test_ext_dnr_tabIds.html137
1 files changed, 137 insertions, 0 deletions
diff --git a/toolkit/components/extensions/test/mochitest/test_ext_dnr_tabIds.html b/toolkit/components/extensions/test/mochitest/test_ext_dnr_tabIds.html
new file mode 100644
index 0000000000..0278a8ccc8
--- /dev/null
+++ b/toolkit/components/extensions/test/mochitest/test_ext_dnr_tabIds.html
@@ -0,0 +1,137 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>DNR with tabIds condition</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
+ <script type="text/javascript" src="head.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css">
+</head>
+<body>
+<script>
+"use strict";
+
+// While most DNR tests are xpcshell tests, this one is a mochitest because it
+// is not possible to create a tab and get a tabId in a xpcshell test.
+
+// toolkit/components/extensions/test/xpcshell/test_ext_dnr_tabIds.js does
+// exist, as an isolated xpcshell is needed to verify that the internals are
+// working as expected. A mochitest is not a good fit for that because it has
+// built-in add-ons that may affect the observed behavior.
+
+add_setup(async () => {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["extensions.manifestV3.enabled", true],
+ ["extensions.dnr.enabled", true],
+ ],
+ });
+});
+
+add_task(async function match_by_tabIds() {
+ let extension = ExtensionTestUtils.loadExtension({
+ async background() {
+ async function createTabAndPort() {
+ let portPromise = new Promise(resolve => {
+ browser.runtime.onConnect.addListener(function listener(port) {
+ browser.runtime.onConnect.removeListener(listener);
+ browser.test.assertEq("port_from_tab", port.name, "Got port");
+ resolve(port);
+ });
+ });
+ const tab = await browser.tabs.create({ url: "tab.html" });
+ const port = await portPromise;
+ browser.test.assertEq(tab.id, port.sender.tab.id, "Got port from tab");
+ browser.test.assertTrue(tab.id > 0, `tabId must be valid: ${tab.id}`);
+ tab.port = port;
+ return tab;
+ }
+ async function getFinalUrlForFetchInTab(tabWithPort, url) {
+ const port = tabWithPort.port; // from createTabAndPort.
+ return new Promise(resolve => {
+ port.onMessage.addListener(function listener(responseUrl) {
+ port.onMessage.removeListener(listener);
+ resolve(responseUrl);
+ });
+ port.postMessage(url);
+ });
+ }
+ let tab1 = await createTabAndPort();
+ let tab2 = await createTabAndPort();
+
+ const URL_PREFIX = "https://example.com/tests/toolkit/components/extensions/test/mochitest/file_sample.txt";
+
+ function makeRedirect(id, condition, url) {
+ return {
+ id,
+ // The test sends a request to example.net and expects a redirect to
+ // URL_PREFIX (example.com).
+ condition: { requestDomains: ["example.net"], ...condition },
+ action: { type: "redirect", redirect: { url }},
+ };
+ }
+ await browser.declarativeNetRequest.updateSessionRules({
+ addRules: [
+ makeRedirect(1, { tabIds: [-1] }, `${URL_PREFIX}?tabId/-1`),
+ makeRedirect(2, { tabIds: [tab1.id] }, `${URL_PREFIX}?tabId/tab1`),
+ makeRedirect(
+ 3,
+ { excludedTabIds: [-1, tab1.id] },
+ `${URL_PREFIX}?tabId/not-1,not-tab1`
+ ),
+ ],
+ });
+
+ browser.test.assertEq(
+ `${URL_PREFIX}?tabId/-1`,
+ (await fetch("https://example.net/?pre-redirect-bg")).url,
+ "Request from background should match tabIds: [-1]"
+ );
+ browser.test.assertEq(
+ `${URL_PREFIX}?tabId/tab1`,
+ await getFinalUrlForFetchInTab(tab1, "https://example.net/?pre-tab1"),
+ "Request from tab1 should match tabIds: [tab1]"
+ );
+ browser.test.assertEq(
+ `${URL_PREFIX}?tabId/not-1,not-tab1`,
+ await getFinalUrlForFetchInTab(tab2, "https://example.net/?pre-tab2"),
+ "Request from tab2 should match excludedTabIds: [-1, tab1]"
+ );
+
+ await browser.tabs.remove(tab1.id);
+ await browser.tabs.remove(tab2.id);
+
+ browser.test.sendMessage("done");
+ },
+ temporarilyInstalled: true, // Needed for granted_host_permissions
+ manifest: {
+ manifest_version: 3,
+ host_permissions: ["*://example.com/*", "*://example.net/*"],
+ permissions: ["declarativeNetRequest"],
+ granted_host_permissions: true,
+ },
+ files: {
+ "tab.html": `<!DOCTYPE html><script src="tab.js"><\/script>`,
+ "tab.js": () => {
+ let port = browser.runtime.connect({ name: "port_from_tab" });
+ port.onMessage.addListener(async url => {
+ try {
+ let res = await fetch(url);
+ port.postMessage(res.url);
+ } catch (e) {
+ port.postMessage(e.message);
+ }
+ });
+ },
+ },
+ });
+ await extension.startup();
+ await extension.awaitMessage("done");
+
+ await extension.unload();
+});
+
+</script>
+</body>
+</html>