summaryrefslogtreecommitdiffstats
path: root/toolkit/components/extensions/test/mochitest/test_ext_dnr_other_extensions.html
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/extensions/test/mochitest/test_ext_dnr_other_extensions.html')
-rw-r--r--toolkit/components/extensions/test/mochitest/test_ext_dnr_other_extensions.html113
1 files changed, 113 insertions, 0 deletions
diff --git a/toolkit/components/extensions/test/mochitest/test_ext_dnr_other_extensions.html b/toolkit/components/extensions/test/mochitest/test_ext_dnr_other_extensions.html
new file mode 100644
index 0000000000..d3074b3dec
--- /dev/null
+++ b/toolkit/components/extensions/test/mochitest/test_ext_dnr_other_extensions.html
@@ -0,0 +1,113 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>DNR and tabs.create from other extension</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 the
+// tabs.create API does not work in a xpcshell test.
+
+add_setup(async () => {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["extensions.manifestV3.enabled", true],
+ ["extensions.dnr.enabled", true],
+ ],
+ });
+});
+
+
+add_task(async function tabs_create_can_be_redirected_by_other_dnr_extension() {
+ let dnrExtension = ExtensionTestUtils.loadExtension({
+ manifest: {
+ permissions: ["declarativeNetRequestWithHostAccess"],
+ // redirect action requires host permissions:
+ host_permissions: ["*://example.com/*"],
+ },
+ async background() {
+ await browser.declarativeNetRequest.updateSessionRules({
+ addRules: [
+ {
+ id: 1,
+ condition: {
+ resourceTypes: ["main_frame"],
+ urlFilter: "?dnr_redir_me_pls",
+ },
+ action: {
+ type: "redirect",
+ redirect: {
+ transform: {
+ query: "?dnr_redir_target"
+ },
+ },
+ },
+ },
+ ],
+ });
+ browser.test.sendMessage("dnr_registered");
+ },
+ });
+ await dnrExtension.startup();
+ await dnrExtension.awaitMessage("dnr_registered");
+
+ let extension = ExtensionTestUtils.loadExtension({
+ manifest: {
+ permissions: ["webNavigation"],
+ },
+ async background() {
+ async function createTabAndGetFinalUrl(url) {
+ let navigationDonePromise = new Promise(resolve => {
+ browser.webNavigation.onDOMContentLoaded.addListener(
+ function listener(details) {
+ browser.webNavigation.onDOMContentLoaded.removeListener(listener);
+ resolve(details);
+ },
+ // All input URLs and redirection targets match this URL filter:
+ { url: [{ queryPrefix: "dnr_redir_" }] }
+ );
+ });
+ const tab = await browser.tabs.create({ url });
+ browser.test.log(`Waiting for navigation done, starting from ${url}`);
+ const result = await navigationDonePromise;
+ browser.test.assertEq(
+ tab.id,
+ result.tabId,
+ `Observed load completion for navigation tab with initial URL ${url}`
+ );
+ await browser.tabs.remove(tab.id);
+ return result.url;
+ }
+
+ browser.test.assertEq(
+ "https://example.com/?dnr_redir_target",
+ await createTabAndGetFinalUrl("https://example.com/?dnr_redir_me_pls"),
+ "DNR rule from other extension should have redirected the navigation"
+ );
+
+ browser.test.assertEq(
+ "https://example.org/?dnr_redir_me_pls",
+ await createTabAndGetFinalUrl("https://example.org/?dnr_redir_me_pls"),
+ "DNR redirect ignored for URLs without host permission"
+ );
+ browser.test.sendMessage("done");
+ }
+ });
+ await extension.startup();
+ await extension.awaitMessage("done");
+
+ await dnrExtension.unload();
+ await extension.unload();
+});
+
+</script>
+</body>
+</html>