browser.tabs.sendMessage():错误:接收端不存在

时间:2017-02-09 22:20:35

标签: javascript firefox-webextensions

我尝试运行tabs.sendMessage() MDN page上给出的示例代码。所以我的代码是:

的manifest.json

{
    "manifest_version": 2,
    "name": "test1",
    "version": "1.0",
    "description": "test",
    "icons": {
        "48": "icons/Ruler48.png"
    },
    "permissions": [
        "notifications",
        "tabs",
        "activeTab"
    ],
    "browser_action": {
        "default_icon": "icons/Ruler48.png",
        "default_title": "test"
    },
    "content_scripts": [{
        "matches": ["*://*/"],
        "js": ["content-script.js"]
    }],
    "background": {
        "scripts": ["bgS.js"]
    }
}

bgS.js:

function onError(error) {
  console.error(`Error: ${error}`);
}

function sendMessageToTabs(tabs) {
  for (let tab of tabs) {
    console.log(tab.id);
    browser.tabs.sendMessage(
      tab.id,
      {greeting: "Hi from background script"}
    ).then(response => {
      console.log("Message from the content script:");
      console.log(response.response);
    }).catch(onError);
  }
}

browser.browserAction.onClicked.addListener(() => {
  browser.tabs.query({
    currentWindow: true,
    active: true
  }).then(sendMessageToTabs).catch(onError);
});

内容的script.js

browser.runtime.onMessage.addListener(request => {
  console.log("Message from the background script:");
  console.log(request.greeting);
  return Promise.resolve({response: "Hi from content script"});
});

我使用web-ext运行它,在点击浏览器操作按钮后,在控制台中我收到此消息:Error: Error: Could not establish connection. Receiving end does not exist.

web-ext run --verbose

的输出
 web-ext run --verbose
[program.js][debug] Getting the version from package.json
[program.js][info] Version: 1.8.0
[program.js][debug] Getting the version from package.json
[cmd/run.js][info] Running web extension from C:\test
[util/manifest.js][debug] Validating manifest at C:\test\manifest.json
[cmd/run.js][debug] Creating new Firefox profile
[cmd/run.js][debug] Deferring extension installation until after connecting to the remote debugger    
[firefox/index.js][debug] Checking if remote Firefox port 6005 is available
[firefox/remote.js][debug] Connecting to Firefox on port 6005
[firefox/index.js][debug] Executing Firefox binary: C:\Program Files\Mozilla Firefox\firefox.exe    
[firefox/index.js][info] Use --verbose or open Tools > Web Developer > Browser Console to see logging
[cmd/run.js][debug] Connecting to the remote Firefox debugger
[firefox/remote.js][debug] Connecting to Firefox on port 6005
[cmd/run.js][debug] Retrying Firefox (0); connection error: Error: connect ECONNREFUSED 127.0.0.1:6005
[firefox/remote.js][debug] Connecting to Firefox on port 6005
[cmd/run.js][debug] Retrying Firefox (1); connection error: Error: connect ECONNREFUSED 127.0.0.1:6005
[firefox/remote.js][debug] Connecting to Firefox on port 6005
[cmd/run.js][debug] Retrying Firefox (2); connection error: Error: connect ECONNREFUSED 127.0.0.1:6005
[firefox/remote.js][debug] Connecting to Firefox on port 6005
[firefox/index.js][debug] Firefox stdout: Started debugger server on 6005
[cmd/run.js][debug] Retrying Firefox (3); connection error: Error: connect ECONNREFUSED 127.0.0.1:6005
[firefox/remote.js][debug] Connecting to Firefox on port 6005
[firefox/remote.js][debug] Connected to the remote Firefox debugger
[firefox/index.js][debug] Firefox stderr: JavaScript strict warning: resource://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/shared/security/socket.js, line 778: ReferenceError: reference to undefined property this._handshakeTimeout
[firefox/index.js][debug] Firefox stderr: JavaScript strict warning: chrome://browser/content/browser.js, line 6573: SyntaxError: applying the 'delete' operator to an unqualified name is deprecated
[firefox/remote.js][debug] installTemporaryAddon: {"addon":{"id":"d71da5f6ee8174302deb5edfa887679913cd71ed@temporary-addon","actor":false},"from":"server1.conn0.addonsActor3"}
[firefox/remote.js][info] Installed C:\test as a temporary add-on
[cmd/run.js][info] The extension will reload if any source file changes
[util/file-filter.js][debug] Resolved path **/*.xpi with sourceDir C:\test to C:\test\**\*.xpi
[util/file-filter.js][debug] Resolved path **/*.zip with sourceDir C:\test to C:\test\**\*.zip
[util/file-filter.js][debug] Resolved path **/.* with sourceDir C:\test to C:\test\**\.*
[util/file-filter.js][debug] Resolved path **/.*/**/* with sourceDir C:\test to C:\test\**\.*\**\*
[util/file-filter.js][debug] Resolved path **/node_modules with sourceDir C:\test to C:\test\**\node_modules
[util/file-filter.js][debug] Resolved path **/node_modules/**/* with sourceDir C:\test to C:\test\**\node_modules\**\*
[util/file-filter.js][debug] Resolved path C:\test\web-ext-artifacts with sourceDir C:\test to C:\test\web-ext-artifacts
[util/file-filter.js][debug] Resolved path C:\test\web-ext-artifacts\**\* with sourceDir C:\test to C:\test\web-ext-artifacts\**\*
[watcher.js][debug] Watching for file changes in C:\test
[firefox/index.js][debug] Firefox stderr: JavaScript strict warning: chrome://browser/content/tabbrowser.xml, line 640: ReferenceError: reference to undefined property this.mBrowser.initialPageLoadedFromURLBar
[firefox/index.js][debug] Firefox stdout: 1486682957594 addons.webextension.d71da5f6ee8174302deb5edfa887679913cd71ed@temporary-addon    WARN    Please specify whether you want browser_style or not in your browser_action options.
[firefox/index.js][debug] Firefox stderr: JavaScript strict warning: chrome://global/content/bindings/browser.xml, line 385: ReferenceError: reference to undefined property tabBrowser.localName
[firefox/index.js][debug] Firefox stderr: JavaScript strict warning: resource://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/shared/node-properties/node-properties.js, line 134: ReferenceError: reference to undefined property control.resume
[firefox/index.js][debug] Firefox stderr: JavaScript strict warning: resource://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/shared/node-properties/node-properties.js, line 124: ReferenceError: reference to undefined property options._comments[c]
[firefox/index.js][debug] Firefox stderr: JavaScript strict warning: resource://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/shared/node-properties/node-properties.js, line 130: ReferenceError: reference to undefined property options._separators[c]
[firefox/index.js][debug] Firefox stderr: JavaScript strict warning: resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/system/unload.js, line 31: ReferenceError: reference to undefined property observers[i].value
[firefox/index.js][debug] Firefox stderr: JavaScript strict warning: resource://gre/modules/ProfileAge.jsm, line 202: ReferenceError: reference to undefined property times.reset
[firefox/index.js][debug] Firefox stderr: JavaScript strict warning: resource://gre/modules/LoginStore.jsm, line 275: ReferenceError: reference to undefined property this.data.version
[firefox/index.js][debug] Firefox stderr: JavaScript strict warning: chrome://global/content/bindings/browser.xml, line 385: ReferenceError: reference to undefined property tabBrowser.localName

这是在浏览器控制台中,在安装之前出现的第一条消息。我的意思是它在安装之前就已存在,所以它会安静地安装。点击按钮后,我收到了最后两条消息,第一条消息从此行tab.id提供了console.log(tab.id),然后出现错误:

1486683758937   addons.webextension.16f1634b55daa52a653f3a2ba33358a691bb015a@temporary-addon    WARN    Please specify whether you want browser_style or not in your browser_action options.
10  bgS.js:8:3
Error: Error: Could not establish connection. Receiving end does not exist.  bgS.js:3:3

1 个答案:

答案 0 :(得分:3)

如果在runtime.onMessage调用中指定的标签中的扩展程序的内容脚本没有为tabs.sendMessage()侦听器定义,则会看到错误。这可能是因为没有内容脚本,或者因为注入的内容脚本没有为runtime.onMessage添加监听器。

您应该记住,您不能将内容脚本注入到包含about:newtababout:debugging等网址的网页中。此外,Firefox不允许您将脚本注入到{ {1}}。

您的问题更加复杂,因为您的Match Pattern可能不是您想要的那样。您可能希望addons.mozilla.org成为:

matches

请注意匹配模式末尾的尾随"matches": ["*://*/*"], 。您当前使用的模式*仅匹配使用"*://*/"http方案加载的任何域的首页。例如,它与https不匹配,但会匹配https://www.google.com/?gws_rd=ssl

鉴于您的代码是在用户单击浏览器或页面操作按钮时直接执行的,您需要以某种合理的方式处理此错误,该方式向用户提供他们所请求的内容无法完成的反馈,因为用户点击http://www.example.com/等网页上的按钮,导致此错误。如何处理此错误将取决于您的代码正在执行的操作。而不是设置用户点击他们期望工作的启用按钮的情况,更好的选择是在您无法执行的页面上禁用您的操作按钮(对于浏览器操作,使用browserAction.disable())你的代码。