Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* Any copyright is dedicated to the Public Domain.
"use strict";
add_setup(async () => {
await SpecialPowers.pushPrefEnv({
set: [["extensions.manifestV3.enabled", true]],
});
});
add_task(async function test_actions_setPopup_allowed_urls() {
const otherExtension = ExtensionTestUtils.loadExtension({});
const extensionDefinition = {
background() {
browser.test.onMessage.addListener(async (msg, ...args) => {
if (msg === "set-popup") {
const apiNs = args[0];
const popupOptions = args[1];
if (apiNs === "pageAction") {
popupOptions.tabId = (
await browser.tabs.query({ active: true })
)[0].id;
}
let error;
try {
await browser[apiNs].setPopup(popupOptions);
} catch (err) {
error = err;
}
browser.test.sendMessage("set-popup:done", {
error: error && String(error),
});
return;
}
browser.test.fail(`Unexpected test message: ${msg}`);
});
},
};
await otherExtension.startup();
const testCases = [
// https urls are disallowed on mv3 but currently allowed on mv2.
[
"action",
{
manifest_version: 3,
action: {},
},
{
disallowed: true,
errorMessage: "Access denied for URL https://example.com",
},
],
[
"pageAction",
{
manifest_version: 3,
page_action: {},
},
{
disallowed: true,
errorMessage: "Access denied for URL https://example.com",
},
],
[
"browserAction",
{
manifest_version: 2,
browser_action: {},
},
{
disallowed: false,
},
],
[
"pageAction",
{
manifest_version: 2,
page_action: {},
},
{
disallowed: false,
},
],
// absolute moz-extension url from same extension expected to be allowed in MV3 and MV2.
[
"action",
extension => `moz-extension://${extension.uuid}/page.html`,
{
manifest_version: 3,
action: {},
},
{
disallowed: false,
},
],
[
"browserAction",
extension => `moz-extension://${extension.uuid}/page.html`,
{
manifest_version: 2,
browser_action: { default_popup: "popup.html" },
},
{
disallowed: false,
},
],
[
"pageAction",
extension => `moz-extension://${extension.uuid}/page.html`,
{
manifest_version: 3,
page_action: {},
},
{
disallowed: false,
},
],
[
"pageAction",
extension => `moz-extension://${extension.uuid}/page.html`,
{
manifest_version: 2,
page_action: {},
},
{
disallowed: false,
},
],
// absolute moz-extension url from other extensions expected to be disallowed in MV3 and MV2.
[
"action",
`moz-extension://${otherExtension.uuid}/page.html`,
{
manifest_version: 3,
action: {},
},
{
disallowed: true,
errorMessage: `Access denied for URL moz-extension://${otherExtension.uuid}/page.html`,
},
],
[
"browserAction",
`moz-extension://${otherExtension.uuid}/page.html`,
{
manifest_version: 2,
browser_action: {},
},
{
disallowed: true,
errorMessage: `Access denied for URL moz-extension://${otherExtension.uuid}/page.html`,
},
],
[
"pageAction",
`moz-extension://${otherExtension.uuid}/page.html`,
{
manifest_version: 3,
page_action: {},
},
{
disallowed: true,
errorMessage: `Access denied for URL moz-extension://${otherExtension.uuid}/page.html`,
},
],
[
"pageAction",
`moz-extension://${otherExtension.uuid}/page.html`,
{
manifest_version: 2,
page_action: {},
},
{
disallowed: true,
errorMessage: `Access denied for URL moz-extension://${otherExtension.uuid}/page.html`,
},
],
// Empty url should also be allowed (as it resets the popup url currently set).
[
"action",
null,
{
manifest_version: 3,
action: {},
},
{
disallowed: false,
},
],
[
"browserAction",
null,
{
manifest_version: 2,
browser_action: {},
},
{
disallowed: false,
},
],
[
"pageAction",
null,
{
manifest_version: 3,
page_action: {},
},
{
disallowed: false,
},
],
[
"pageAction",
null,
{
manifest_version: 2,
page_action: {},
},
{
disallowed: false,
},
],
];
for (const [apiNs, popupUrl, manifest, expects] of testCases) {
const extension = ExtensionTestUtils.loadExtension({
...extensionDefinition,
manifest,
});
await extension.startup();
const popup =
typeof popupUrl === "function" ? popupUrl(extension) : popupUrl;
info(
`Testing ${apiNs}.setPopup({ popup: ${popup} }) on manifest_version ${
manifest.manifest_version ?? 2
}`
);
const popupOptions = { popup };
extension.sendMessage("set-popup", apiNs, popupOptions);
const { error } = await extension.awaitMessage("set-popup:done");
if (expects.disallowed) {
ok(
error?.includes(expects.errorMessage),
`Got expected error on url ${popup}: ${error}`
);
} else {
is(error, undefined, `Expected url ${popup} to be allowed`);
}
await extension.unload();
}
await otherExtension.unload();
});