6

我正在尝试使用 WebExtensions API 将上下文菜单添加到我的 Firefox 插件中。我需要后台脚本来收听单击菜单项并向内容脚本发送消息。这就是我所拥有的:

清单.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.");
        }
    );
}

内容脚本.js

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

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

我正在关注MDN 中的这个示例,但它不起作用。它还创建了菜单项,但它们什么都不做,这让我认为 API 中的某些内容发生了变化,MDN 并没有费心更新文档。

有任何想法吗?谢谢。

4

1 回答 1

1

您的代码按以下方式工作:

带有输出的浏览器控制台

我强烈怀疑您的问题是:

  • 您正在使用 Firefox 48 之前的 Firefox 版本进行测试。Firefox 48 处于Beta阶段。“contextMenus浏览器兼容性”部分明确指出,它的第一个功能版本是 Firefox 48。WebExtensions API 仍在开发中。一般来说,您应该针对Firefox Developer EditionFirefox Nightly进行测试。如果您正在使用的所有API 都在早期版本中工作,您可以使用早期版本。但是,如果您遇到问题,您应该使用 Nightly 进行测试。我怀疑这是您最有可能出现的问题,因为您表示contextMenus示例代码没有做任何事情。
  • 您尚未导航到实际网页。您的content-script.js仅加载到与支持的方案之一匹配的页面中:即“http”、“https”、“file”、“ftp”、“app”。它没有加载到about:*页面中。如果这是您的问题,您将获得contextMenus示例代码的部分功能。此外,使用您的代码,浏览器控制台会在延迟后生成一条错误消息:

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

    出现错误的浏览器控制台

关于您的代码的注释:
请注意,您的sendMessage()函数可能过于复杂。You are searching for the active tab when the tabs.Tabobject for the tab in which the context menu item was selected was already passed to your function as one of the arguments. 更短的版本可能是:

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

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

于 2016-07-14T02:08:35.547 回答