上下文菜单不工作 firefox 附加 WebExtensions

Context menus not working firefox add-on WebExtensions

我正在尝试使用 WebExtensions API 向我的 firefox 插件添加上下文菜单。我需要后台脚本来监听菜单项上的点击并向内容脚本发送消息。 这是我的:

manifest.json

{
  "manifest_version": 2,
  "name": "MyExt",
  "version": "0.0.1",

  "description": "Test extension",
  "icons": {
    "48": "icons/icon-48.png"
  },

  "applications": {
    "gecko": {
      "id": "myext@local",
      "strict_min_version": "45.0"
    }
  },

  "permissions": ["contextMenus"],

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

  "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["content-script.js"]
    }
  ]
}

背景-scripts.js

chrome.contextMenus.create({
    id: "clickme",
    title: "Click me!",
    contexts: ["all"]
});

browser.contextMenus.onClicked.addListener(function(info, tab) {
    console.log("Hello World!");
    sendMessage(info, tab);
});

function sendMessage(info, tab) {
    chrome.tabs.query(
        {active: true, currentWindow: true }, 
        function(tabs) {
            chrome.tabs.sendMessage(tabs[0].id, "Test message from background script.");
        }
    );
}

内容-script.js

browser.runtime.onMessage.addListener(function(msg) {
    console.log(msg);
});

正在创建菜单项,但从未显示消息(我正在检查 Web 和浏览器控制台)。由于点击事件不起作用,消息也没有发送。

我正在从 MDN 关注 this example,但它不起作用。它还创建了菜单项,但它们什么都不做,这让我觉得 API 中发生了一些变化,而 MDN 没有更新文档。

有什么想法吗?谢谢

你的代码如写的那样工作:

我强烈怀疑您的问题是:

  • 您正在使用 Firefox 48 之前的 Firefox 版本进行测试。Firefox 48 在 Beta. The contextMenus "Browser compatibility" section clearly states that the first version in which it is functional is Firefox 48. The WebExtensions API is still in development. In general, you should be testing against Firefox Developer Edition, or Firefox Nightly. You can use earlier versions if all the APIs you are using are indicated to be working in an earlier version. However, if you experience problems, you should test with Nightly. I suspect that this is your most likely issue as you indicated that the contextMenus example code 中没有执行任何操作。
  • 您没有导航到实际网页。您的 content-script.js 仅加载到与受支持方案之一匹配的页面中:即 "http"、"https"、"file", "ftp", "app"。它未在 about:* 页中加载。如果这是您的问题,您可能已经从 contextMenus 示例代码中获得了部分功能。此外,使用您的代码,浏览器控制台会在延迟后生成一条错误消息:

    Error: Could not establish connection. Receiving end does not exist.
    

关于您的代码的注释:
请注意,您的 sendMessage() 函数可能过于复杂。当tabs.Tab对象的“选择上下文菜单”项已作为参数之一传递给您的函数时,您正在搜索“活动”选项卡。较短的版本可能是:

function sendMessage(info, tab) {
    chrome.tabs.sendMessage(tab.id, "Test message from background script.");
}

我很想知道您是否遇到过需要搜索活动选项卡而不是使用上下文菜单侦听器提供的 tabs.Tab 对象的情况。