【问题标题】:How to invoke Chrome native message host without arguments?如何在没有参数的情况下调用 Chrome 原生消息主机?
【发布时间】:2017-02-02 15:30:37
【问题描述】:

我正在使用 Chrome 的 native messaging API 连接到我在 Go 中使用 Cobra library 开发的本机主机。本机应用程序有一个独立的 CLI(用 Cobra 实现),并且裸命令(不带任何参数)开始通过标准输入侦听 JSON,标准输入是 Chrome 与之交互的 API。

但是,每次扩展程序向本机消息传递主机发出请求时,它都会失败(客户端只是立即与进程断开连接)。当我使用 --enable-logging 标志启动 Chrome 时,我可以看到本机主机使用 unknown command "chrome-extension://cnjopnegooahjdngnkhiokognkdjiioc/" for "--native-app-name--" 出错。这是 Cobra 的错误消息,表示“chrome-extension://cnjopnegooahjdngnkhiokognkdjiioc/”被用作参数,这似乎意味着 Chrome 正在使用 app-name chrome-extension://cnjopnegooahjdngnkhiokognkdjiioc/ 而不是 app-name 调用本机主机。

这是我在扩展程序中用来调用本机主机的代码:

var port = chrome.runtime.connectNative('app-name');
port.onMessage.addListener(function(msg) {
  console.log(msg);
});
port.onDisconnect.addListener(function() {
  console.log("disconnected");
});
port.postMessage({cmd:"ping"});

我找不到任何文档表明 Chrome 将扩展地址作为参数发送,或者是否可以阻止它。

【问题讨论】:

  • 这非常有用,感谢 wOxxOm。你知道这在任何地方都有记录吗?
  • 这个正在记录中,见codereview.chromium.org/2271143002
  • @wOxxOm 您能否将其格式化为答案?
  • @Xan,补丁登陆了,所以我按要求添加了答案。
  • @wOxxOm 我已经注意到并投了赞成票。谢谢!

标签: google-chrome google-chrome-extension chrome-native-messaging


【解决方案1】:

它是protocol 的一部分,不能被禁用。 Windows 上的命令行是这样的:

C:\Windows\system32\cmd.exe /c YOURHOSTAPP.exe chrome-extension://....................../
--parent-window=6752474  \\.\pipe\chrome.nativeMessaging.out.e11ed8be274e1a85

本机消息传递主机的第一个参数是调用者的来源,通常是chrome-extension://[ID of whitelisted extension]。这允许本地消息传递主机在本地消息传递主机清单的 allowed_origins 键中指定多个扩展时识别消息的来源。

在 Windows 上,本机消息传递主机还会传递一个命令行参数,其中包含调用 chrome 本机窗口的句柄:--parent-window=<decimal handle value>。这让原生消息传递主机可以创建正确聚焦的原生 UI 窗口。


警告:在 Windows 中,in Chrome 54 and earlier原点是作为第二个参数而不是第一个参数传递的。

【讨论】:

    猜你喜欢
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    • 2023-04-06
    • 2020-09-07
    相关资源
    最近更新 更多