Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 38 additions & 27 deletions web-extensions/resources/runtime/background.js
Original file line number Diff line number Diff line change
@@ -1,30 +1,41 @@
browser.test.runTests([
function browserRuntimeGetURLErrorCases() {
browser.test.assertThrows(() => browser.runtime.getURL())
browser.test.assertThrows(() => browser.runtime.getURL(null))
browser.test.assertThrows(() => browser.runtime.getURL(undefined))
browser.test.assertThrows(() => browser.runtime.getURL(42))
browser.test.assertThrows(() => browser.runtime.getURL(/test/))
},
function browserRuntimeGetURLNormalCases() {
browser.test.assertEq(typeof browser.runtime.getURL(""), "string")
browser.test.assertEq(new URL(browser.runtime.getURL("")).pathname, "/")
browser.test.assertEq(new URL(browser.runtime.getURL("test.js")).pathname, "/test.js")
browser.test.assertEq(new URL(browser.runtime.getURL("/test.js")).pathname, "/test.js")
browser.test.assertEq(new URL(browser.runtime.getURL("../../test.js")).pathname, "/test.js")
browser.test.assertEq(new URL(browser.runtime.getURL("./test.js")).pathname, "/test.js")
browser.test.assertEq(new URL(browser.runtime.getURL("././/example")).pathname, "//example")
browser.test.assertEq(new URL(browser.runtime.getURL("../../example/..//test/")).pathname, "//test/")
browser.test.assertEq(new URL(browser.runtime.getURL(".")).pathname, "/")
browser.test.assertEq(new URL(browser.runtime.getURL("..//../")).pathname, "/")
browser.test.assertEq(new URL(browser.runtime.getURL(".././..")).pathname, "/")
browser.test.assertEq(new URL(browser.runtime.getURL("/.././.")).pathname, "/")
},
async function browserRuntimeGetPlatformInfo() {
const platformInfo = await browser.runtime.getPlatformInfo()
function browserRuntimeGetURLErrorCases() {
browser.test.assertThrows(() => browser.runtime.getURL());
browser.test.assertThrows(() => browser.runtime.getURL(null));
browser.test.assertThrows(() => browser.runtime.getURL(undefined));
browser.test.assertThrows(() => browser.runtime.getURL(42));
browser.test.assertThrows(() => browser.runtime.getURL(/test/));
},
function browserRuntimeGetURLNormalCases() {
browser.test.assertEq(typeof browser.runtime.getURL(""), "string");
browser.test.assertEq(new URL(browser.runtime.getURL("")).pathname, "/");
browser.test.assertEq(new URL(browser.runtime.getURL("test.js")).pathname, "/test.js");
browser.test.assertEq(new URL(browser.runtime.getURL("/test.js")).pathname, "/test.js");
browser.test.assertEq(new URL(browser.runtime.getURL("../../test.js")).pathname, "/test.js");
browser.test.assertEq(new URL(browser.runtime.getURL("./test.js")).pathname, "/test.js");
browser.test.assertEq(new URL(browser.runtime.getURL("././/example")).pathname, "//example");
browser.test.assertEq(new URL(browser.runtime.getURL("../../example/..//test/")).pathname, "//test/");
browser.test.assertEq(new URL(browser.runtime.getURL(".")).pathname, "/");
browser.test.assertEq(new URL(browser.runtime.getURL("..//../")).pathname, "/");
browser.test.assertEq(new URL(browser.runtime.getURL(".././..")).pathname, "/");
browser.test.assertEq(new URL(browser.runtime.getURL("/.././.")).pathname, "/");
},
async function browserRuntimeGetPlatformInfo() {
const platformInfo = await browser.runtime.getPlatformInfo();

browser.test.assertEq(typeof platformInfo, "object")
browser.test.assertEq(typeof platformInfo.os, "string")
browser.test.assertEq(typeof platformInfo.arch, "string")
browser.test.assertEq(typeof platformInfo, "object");
browser.test.assertEq(typeof platformInfo.os, "string");
browser.test.assertEq(typeof platformInfo.arch, "string");
},
async function browserRuntimeGetVersion() {
const version = browser.runtime.getVersion();
browser.test.assertEq(typeof version, "string");
// Implementations are free on how they interpret the version number.
// However, they need to be consistent in APIs (like the management API).
browser.test.assertTrue(version === "1.01" || version === "1.1");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we add a comment that explains that leading zeroes are handled differently across browsers?

Copy link
Author

@carlosjeurissen carlosjeurissen Jan 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally we would have runtime.getVersion() specified somewhere with a note the version number is up for interpretation by the implementation but has to be consistent with other APIs (like the management API).

We may want to make the version validator more strict in mv4, see w3c/webextensions#878 (comment)

Edit: updated the PR with a comment.

if (browser.management && browser.management.getSelf) {
const extensionInfo = await browser.management.getSelf();
browser.test.assertEq(version, extensionInfo.version);
}
])
}
]);
7 changes: 5 additions & 2 deletions web-extensions/resources/runtime/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@
"manifest_version": 3,
"name": "BrowserRuntimeTestExtension",
"description": "browser.runtime test extension",
"version": "1.0",
"version": "1.01",
"background": {
"scripts": [ "background.js" ],
"service_worker": "background.js",
"type": "module"
}
},
"permissions": [
"management"
]
}