feat: add Firefox extension support
Testing / remote-protocol-compat (0.9.5) (push) Successful in 48s
Testing / test (push) Failing after 53s
Testing / remote-protocol-compat (0.9.3) (push) Successful in 52s

- Add Firefox as an install target with native messaging manifest support.
- Generate Firefox-specific extension packages with Gecko metadata and AMO-compatible manifest transforms.
- Keep tab group commands available in Firefox through dynamic tab group API helpers.
- Avoid Firefox linter warnings for static tab group API references and direct eval tokens.
- Add Firefox packaging and installer regression coverage.
- Bump the package and extension version to 0.15.1.
This commit is contained in:
2026-06-14 17:19:25 +02:00
parent 9df5e1bd8f
commit 9b8cefcd72
21 changed files with 225 additions and 62 deletions
+21
View File
@@ -19,6 +19,9 @@ def _fake_extension(tmp_path: Path) -> Path:
"manifest_version": 3,
"name": "browser-cli",
"version": "1.2.3",
"permissions": ["tabs", "tabGroups", "windows", "nativeMessaging"],
"background": {"service_worker": "background.js"},
"browser_specific_settings": {"gecko": {"id": "browser-cli@yiprawr.dev"}},
"key": "test-key",
}), encoding="utf-8")
for name in ("background.js", "content-dispatch.js", "content.js"):
@@ -47,6 +50,24 @@ def test_webstore_package_strips_manifest_key(tmp_path):
assert "content.js" in names
assert "icons/icon-128.png" in names
def test_firefox_package_strips_chromium_key_and_firefox_incompatible_permission(tmp_path):
packager = _packager_with_fake_extension(tmp_path)
out = packager.package_extension(firefox=True, out=tmp_path / "firefox.zip")
with zipfile.ZipFile(out) as zf:
manifest = json.loads(zf.read("manifest.json"))
assert "key" not in manifest
assert manifest["browser_specific_settings"]["gecko"]["id"] == "browser-cli@yiprawr.dev"
assert "tabGroups" in manifest["permissions"]
assert "windows" not in manifest["permissions"]
assert "nativeMessaging" in manifest["permissions"]
assert "service_worker" not in manifest["background"]
assert manifest["background"]["scripts"] == ["background.js"]
assert manifest["browser_specific_settings"]["gecko"]["strict_min_version"] == "140.0"
assert manifest["browser_specific_settings"]["gecko_android"]["strict_min_version"] == "142.0"
assert manifest["browser_specific_settings"]["gecko"]["data_collection_permissions"] == {"required": ["none"]}
def test_local_package_keeps_manifest_key(tmp_path):
packager = _packager_with_fake_extension(tmp_path)
out = packager.package_extension(webstore=False, out=tmp_path / "local.zip")