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

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);
});

メニュー項目は作成されていますが、メッセージは表示されません (Web コンソールとブラウザ コンソールの両方を確認しています)。クリック イベントが機能していないため、メッセージも送信されません。

私はこの MDN の例に従っていますが、これは機能しません。また、メニュー項目も作成しますが、何もしないので、API と MDN で何かが変更されても、わざわざドキュメントを更新しなかったと思います。

何か案は?ありがとう。

4

1 に答える 1

1

コードは次のように機能します。

出力付きブラウザコンソール

あなたの問題は次のいずれかであると強く疑われます。

  • Firefox 48 より前のバージョンの Firefox を使用してテストしています。Firefox 48 はベータ版です。「contextMenusブラウザの互換性」セクションには、それが機能する最初のバージョンは Firefox 48 であることが明確に記載されています。WebExtensions API はまだ開発中です。一般に、 Firefox Developer EditionまたはFirefox Nightlyに対してテストする必要があります。使用しているすべての API が以前のバージョンで動作することが示されている場合は、以前のバージョンを使用できます。ただし、問題が発生した場合は、Nightly でテストする必要があります。contextMenusサンプルコードが何もしていないことを指摘したため、これが最も可能性の高い問題であると思われます。
  • 実際の Web ページに移動していません。content-script.jsは、「http」、「https」、「file」、「ftp」、「app」など、サポートされているスキームのいずれかに一致するページにのみ読み込まれます。ページにはロードされませんabout:*。これが問題である場合は、contextMenusサンプル コードの一部の機能しか使用できませんでした。さらに、あなたのコードを使用すると、ブラウザ コンソールは遅れてエラー メッセージを生成します。

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

    エラーのあるブラウザ コンソール

コードに関する注意:
関数sendMessage()が過度に複雑になる可能性があることに注意してください。tabs.Tabコンテキスト メニュー項目が選択されたタブのオブジェクトが引数の 1 つとして既に関数に渡されている場合、アクティブなタブを検索しています。短いバージョンは次のようになります。

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

tabs.Tabコンテキスト メニュー リスナーによって提供されるオブジェクトを使用するのではなく、アクティブなタブを検索する必要がある状況に遭遇したことがあるかどうかを知りたいです。

于 2016-07-14T02:08:35.547 に答える