fix: allow Web Store extension native messaging
- Add the Chrome Web Store extension ID alongside the keyed testing ID. - Register both extension origins in the native messaging host manifest. - Update install output so users can distinguish testing and Web Store IDs. - Add CLI coverage for the generated allowed_origins list.
This commit is contained in:
@@ -9,10 +9,12 @@ import click
|
|||||||
from rich.console import Console
|
from rich.console import Console
|
||||||
|
|
||||||
from browser_cli.constants import (
|
from browser_cli.constants import (
|
||||||
|
ALLOWED_EXTENSION_IDS,
|
||||||
EXTENSION_ID,
|
EXTENSION_ID,
|
||||||
NATIVE_HOST_DIRS,
|
NATIVE_HOST_DIRS,
|
||||||
NATIVE_HOST_NAME,
|
NATIVE_HOST_NAME,
|
||||||
SUPPORTED_BROWSERS,
|
SUPPORTED_BROWSERS,
|
||||||
|
WEBSTORE_EXTENSION_ID,
|
||||||
WINDOWS_NATIVE_HOST_REGISTRY_KEYS,
|
WINDOWS_NATIVE_HOST_REGISTRY_KEYS,
|
||||||
)
|
)
|
||||||
from browser_cli.platform import install_base_dir, is_windows
|
from browser_cli.platform import install_base_dir, is_windows
|
||||||
@@ -75,14 +77,15 @@ def cmd_install(browser):
|
|||||||
console.print(f" 1. Open [cyan]{ext_url}[/cyan]")
|
console.print(f" 1. Open [cyan]{ext_url}[/cyan]")
|
||||||
console.print(" 2. Enable [bold]Developer mode[/bold] (top-right toggle)")
|
console.print(" 2. Enable [bold]Developer mode[/bold] (top-right toggle)")
|
||||||
console.print(f" 3. Click [bold]Load unpacked[/bold] → select: [cyan]{Path(__file__).parent.parent.parent / 'extension'}[/cyan]")
|
console.print(f" 3. Click [bold]Load unpacked[/bold] → select: [cyan]{Path(__file__).parent.parent.parent / 'extension'}[/cyan]")
|
||||||
console.print(f" 4. Extension ID will be [cyan]{EXTENSION_ID}[/cyan] (fixed by built-in key)\n")
|
console.print(f" 4. Testing extension ID will be [cyan]{EXTENSION_ID}[/cyan] (fixed by built-in key)")
|
||||||
|
console.print(f" Chrome Web Store extension ID is [cyan]{WEBSTORE_EXTENSION_ID}[/cyan]\n")
|
||||||
|
|
||||||
manifest = {
|
manifest = {
|
||||||
"name": NATIVE_HOST_NAME,
|
"name": NATIVE_HOST_NAME,
|
||||||
"description": "browser-cli native messaging host",
|
"description": "browser-cli native messaging host",
|
||||||
"path": str(host_exe),
|
"path": str(host_exe),
|
||||||
"type": "stdio",
|
"type": "stdio",
|
||||||
"allowed_origins": [f"chrome-extension://{EXTENSION_ID}/"],
|
"allowed_origins": [f"chrome-extension://{extension_id}/" for extension_id in ALLOWED_EXTENSION_IDS],
|
||||||
}
|
}
|
||||||
installed = _install_manifest(browser, host_exe, manifest)
|
installed = _install_manifest(browser, host_exe, manifest)
|
||||||
if not installed:
|
if not installed:
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ DEFAULT_ALIAS = "default"
|
|||||||
|
|
||||||
NATIVE_HOST_NAME = "com.browsercli.host"
|
NATIVE_HOST_NAME = "com.browsercli.host"
|
||||||
EXTENSION_ID = "bfpmkhngkjnfhabmfckgeohlilokodkg"
|
EXTENSION_ID = "bfpmkhngkjnfhabmfckgeohlilokodkg"
|
||||||
|
WEBSTORE_EXTENSION_ID = "hekaebjhbhhdbmakimmaklbblbmccahp"
|
||||||
|
ALLOWED_EXTENSION_IDS = [EXTENSION_ID, WEBSTORE_EXTENSION_ID]
|
||||||
SUPPORTED_BROWSERS = ["chrome", "chromium", "brave", "edge", "vivaldi"]
|
SUPPORTED_BROWSERS = ["chrome", "chromium", "brave", "edge", "vivaldi"]
|
||||||
|
|
||||||
PROTOCOL_MIN_CLIENT = "0.9.0"
|
PROTOCOL_MIN_CLIENT = "0.9.0"
|
||||||
|
|||||||
@@ -89,6 +89,34 @@ def test_install_help_lists_supported_browsers():
|
|||||||
assert result.exit_code == 0
|
assert result.exit_code == 0
|
||||||
assert "[chrome|chromium|brave|edge|vivaldi]" in result.output
|
assert "[chrome|chromium|brave|edge|vivaldi]" in result.output
|
||||||
|
|
||||||
|
def test_install_writes_testing_and_webstore_allowed_origins(tmp_path):
|
||||||
|
manifests = []
|
||||||
|
|
||||||
|
def fake_install_manifest(_browser, _host_exe, manifest):
|
||||||
|
manifests.append(manifest)
|
||||||
|
return [tmp_path / "com.browsercli.host.json"]
|
||||||
|
|
||||||
|
with patch("browser_cli.commands.install.native_host_exe", return_value=tmp_path / "browser-cli-native-host"), patch(
|
||||||
|
"browser_cli.commands.install.write_native_host_exe"
|
||||||
|
), patch("browser_cli.commands.install._install_manifest", side_effect=fake_install_manifest):
|
||||||
|
result = CliRunner().invoke(main, ["install", "brave"])
|
||||||
|
|
||||||
|
assert result.exit_code == 0
|
||||||
|
assert manifests == [
|
||||||
|
{
|
||||||
|
"name": "com.browsercli.host",
|
||||||
|
"description": "browser-cli native messaging host",
|
||||||
|
"path": str(tmp_path / "browser-cli-native-host"),
|
||||||
|
"type": "stdio",
|
||||||
|
"allowed_origins": [
|
||||||
|
"chrome-extension://bfpmkhngkjnfhabmfckgeohlilokodkg/",
|
||||||
|
"chrome-extension://hekaebjhbhhdbmakimmaklbblbmccahp/",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
]
|
||||||
|
assert "Testing extension ID" in result.output
|
||||||
|
assert "Chrome Web Store extension ID" in result.output
|
||||||
|
|
||||||
def test_install_windows_registers_native_host(tmp_path):
|
def test_install_windows_registers_native_host(tmp_path):
|
||||||
writes = []
|
writes = []
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user