Контекстные меню не работают надстройка Firefox WebExtensions

Я пытаюсь добавить контекстное меню в свою надстройку Firefox, используя API WebExtensions. Мне нужен фоновый скрипт, чтобы прослушивать щелчок по пункту меню и отправлять сообщение в скрипт контента. Вот что у меня есть:

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"]
    }
  ]
}

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

content-script.js

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

Пункт меню создается, но сообщения никогда не отображаются (я проверяю как веб-консоль, так и консоль браузера). Поскольку событие клика не работает, сообщение также не отправляется.

Я использую этот пример из MDN, который не работает. Он также создает пункты меню, но они ничего не делают, что наводит меня на мысль, что что-то изменилось в API, и MDN не удосужились обновить документацию.

Любые идеи? Спасибо.


person guimarac    schedule 13.07.2016    source источник


Ответы (1)


Ваш код работает так, как написано:

Консоль браузера с выводом

Я сильно подозреваю, что ваша проблема связана с одним из:

  • Вы тестируете версию Firefox до Firefox 48. Firefox 48 находится в Бета. Раздел contextMenus "Совместимость браузера" четко заявляет, что первой версией, в которой он работает, является Firefox 48. API WebExtensions все еще находится в разработке. Как правило, вам следует тестировать Firefox Developer Edition или Firefox 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() потенциально слишком сложна. Вы ищете активную вкладку, когда tabs.Tab объект для вкладки, в которой был выбран пункт контекстного меню, уже был передан вашей функции в качестве одного из аргументов. Более короткая версия может быть:

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

Мне было бы интересно узнать, сталкивались ли вы с ситуацией, когда вам нужно было искать активную вкладку, а не использовать объект tabs.Tab, предоставленный прослушивателем контекстного меню.

person Makyen♦    schedule 14.07.2016
comment
Спасибо. Проблема была в версии Firefox. Глупой ошибкой было предположить, что у меня последняя версия. Что касается Developer Edition, мое фактическое дополнение намного сложнее, чем это, и DE делал что-то (у меня нет предыдущего опыта веб-разработки, поэтому я не знаю, что это было), что мешало правильной работе надстройки. . Я проверил сейчас, и он работает нормально. - person guimarac; 14.07.2016