Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

"use strict";
const server = createHttpServer({ hosts: ["example.com"] });
server.registerDirectory("/data/", do_get_file("data"));
add_task(async function test_runtime_getURL() {
function background() {
const origin = location.origin;
function checkURL(input, expectedOutput, extraDescription = "") {
browser.test.assertEq(
expectedOutput,
browser.runtime.getURL(input),
`Expected result for runtime.getURL(${input}) : ${extraDescription}`
);
}
// Common cases: leading / is optional.
checkURL("test.txt", `${origin}/test.txt`, "Leading / is optional");
checkURL("/test.txt", `${origin}/test.txt`, "With leading /");
// Case 1: "passing non-string parameter"
browser.test.assertThrows(
() => browser.runtime.getURL(200),
"Incorrect argument types for runtime.getURL.",
"getURL() with non-string should throw"
);
browser.test.assertThrows(
() => browser.runtime.getURL(),
"Incorrect argument types for runtime.getURL.",
"getURL() requires a parameter"
);
// Case 2: "passing lesser known utf-8 characters"
checkURL("Ω", `${origin}/Ω`, "Lesser known utf-8 character");
// Case 3: "passing a full external URL"
checkURL("https://example.com/", `${origin}/https://example.com/`);
// Case 4: "passing a full extension-owned URL"
// Note: Firefox has historically returned the parsed URL when the input is
// the moz-extension:-URL. To minimize the odds of regressions, we preserve
// the behavior. Note: Chrome returns `${origin}/${origin}`.
checkURL(`${origin}/`, `${origin}/`, "");
checkURL(location.href, location.href, "Full moz-extension URL");
// Case 5: "passing URL which is exactly //"
checkURL("//", `${origin}//`);
// Case 6: "passing URL which starts with or is three slashes ///"
checkURL("///", `${origin}///`);
// Case 7: "passing URL which starts with exactly two slashes and at least
// one non-slash character"
checkURL("//example", `${origin}//example`);
// Case 8: "passing URL which is exactly ."
checkURL(".", `${origin}/.`);
// Case 9: "passing URL which starts with ./"
checkURL("././/example", `${origin}/././/example`);
// Case 10: "passing URL which contains ../"
checkURL("../../example/..//test/", `${origin}/../../example/..//test/`);
// Case 11: "../ artifact edge-cases"
checkURL("../", `${origin}/../`);
checkURL("..", `${origin}/..`);
checkURL("/.././", `${origin}/.././`);
// More edge cases not covered above.
// moz-extension:-URL, not this extension.
// moz-extension:-origin (missing trailing slash, not a URL).
checkURL(origin, `${origin}/${origin}`, "moz-extension without path slash");
browser.test.sendMessage("check_origin", origin);
}
let extension = ExtensionTestUtils.loadExtension({ background });
await extension.startup();
equal(
await extension.awaitMessage("check_origin"),
`moz-extension://${extension.uuid}`,
"Got expected base URL (origin)"
);
await extension.unload();
});
add_task(async function test_contentscript() {
let extension = ExtensionTestUtils.loadExtension({
background() {
browser.runtime.onMessage.addListener(([url1, url2]) => {
let url3 = browser.runtime.getURL("test_file.html");
let url4 = browser.extension.getURL("test_file.html");
browser.test.assertTrue(url1 !== undefined, "url1 defined");
browser.test.assertTrue(
url1.startsWith("moz-extension://"),
"url1 has correct scheme"
);
browser.test.assertTrue(
url1.endsWith("test_file.html"),
"url1 has correct leaf name"
);
browser.test.assertEq(url1, url2, "url2 matches");
browser.test.assertEq(url1, url3, "url3 matches");
browser.test.assertEq(url1, url4, "url4 matches");
browser.test.notifyPass("geturl");
});
},
manifest: {
content_scripts: [
{
js: ["content_script.js"],
run_at: "document_idle",
},
],
},
files: {
"content_script.js"() {
let url1 = browser.runtime.getURL("test_file.html");
let url2 = browser.extension.getURL("test_file.html");
browser.runtime.sendMessage([url1, url2]);
},
},
});
// Turn off warning as errors to pass for deprecated APIs
ExtensionTestUtils.failOnSchemaWarnings(false);
await extension.startup();
let contentPage = await ExtensionTestUtils.loadContentPage(
);
await extension.awaitFinish("geturl");
await contentPage.close();
await extension.unload();
ExtensionTestUtils.failOnSchemaWarnings(true);
});