chrome.runtime.connectNative生成Uncaught TypeError:undefined不是函数

时间:2014-07-13 18:42:06

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

我写了一个chrome扩展,调用此connect()函数来连接到本地C ++程序:

function connect() {
  console.log("test1");
  //port = chrome.extension.connectNative('com.a.chrome_interface');
  port = chrome.runtime.connectNative('com.a.chrome_interface');

  port.onMessage.addListener(onNativeMessage);
  port.onDisconnect.addListener(onDisconnected);
  console.log("test5");
}

我可以在控制台中看到test1,但之后我收到了错误

Uncaught TypeError: undefined is not a function

port = chrome.runtime.connectNative('com.a.chrome_interface');

我的扩展程序清单文件位于:

{
  "name": "CPP_Connect",
  "version": "1.0",
  "description": "Send data to CPP program",

  "content_scripts": [
   {
     "matches": ["<all_urls>"],
     "js": ["contentscript.js"]
   }
  ],

  "permissions": ["contextMenus", "tabs", "nativeMessaging", "<all_urls>"],

  "manifest_version": 2

}

我的com.a.chrome_interface.json看起来像这样:

{
"name": "com.a.chrome_interface",
"description": "Chrome Native Messaging API Example Host",
"path": "com.a.chrome_interface",
"type": "stdio",
"allowed_origins": [
"chrome-extension://abc.../"
]
}

和com.a.chrome_interface是一个linux可执行的C ++文件,它生成一个文件,如果它被调用,则永远不会创建该文件。 我把两个文件放在

 /etc/opt/chrome/native-messaging-hosts/

所以我想,我确实正确地注册了我的C ++,但我也猜测,如果我注册错了,我应该得到一个不同的错误。 如果我使用chrome.extension.connect()脚本运行低谷,错误消息消失,但没有数据到达我的C ++程序。

我确实阅读并尝试按照说明操作 https://developer.chrome.com/extensions/messaging#native-messaging 并搜索了很多,但我可以找出问题的原因。

我在Ubuntu 12.04上使用Chromium 34。

  1. 在我撰写扩展程序时,是否必须使用chrome.runtime.connectNative()或chrome.extension.connectNative()?
  2. 如何连接数据并将数据发送到我的C ++程序?

1 个答案:

答案 0 :(得分:14)

connectNative()在内容脚本中不可用。 要连接到本地程序,内容脚本必须发送数据,例如到扩展的后台脚本和后台脚本中, port = chrome.extension.connectNative 可以使用。 所以这是一个解决方案:

contentscript.js:

....
// send data to background script
chrome.extension.sendRequest("Some Data");
....

background.js:

function connect() {
    // connect to local program com.a.chrome_interface
    port = chrome.extension.connectNative('com.a.chrome_interface');
    port.onMessage.addListener(onNativeMessage);
    port.onDisconnect.addListener(onDisconnected);
}

chrome.extension.onRequest.addListener(function(data, sender) {
    if (data.length > 0) {
        connect();
        sendNativeMessage(data);
    }
});

manifest.json在我的问题中如上所述,但另外:

...
  "background": {
  "scripts": ["background.js"]
  },
...

com.a.chrome_interface.json与上述问题一样不变。