4

WebExtensions APIを使用して、Firefoxのアドオンにコンテキストメニューを追加しようとしています。私は、メニュー項目のクリックを聞き、コンテンツスクリプトにメッセージを送るバックグラウンドスクリプトが必要です。 これは私が持っているものです。コンテキストメニューが機能しないfirefoxアドオンWebExtensions

manifest.jsonを

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

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

    "applications": { 
    "gecko": { 
     "id": "[email protected]", 
     "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コンソールとブラウザコンソールの両方をチェックしています)。 clickイベントが機能していないため、メッセージも送信されません。

私はMDNのthis exampleに従っていますが、これはうまくいきません。メニュー項目も作成されますが、何もしないので、APIとMDNで変更されたものがドキュメントを更新する必要はありませんでした。

アイデア?ありがとう。

答えて

1

あなたのコードが書かれたように動作します

Browser console with output

私は強くあなたの問題は、のいずれかであることを疑う:

  • あなたが前にFirefoxの48のFirefox 48へのFirefoxのバージョンを使用してテストしていますBetaにあります。 contextMenus "Browser compatibility" sectionは、それが機能する最初のバージョンがFirefox 48であることを明確に述べています.WebExtensions APIはまだ開発中です。通常、Firefox Developer EditionまたはFirefox Nightlyに対してテストする必要があります。 すべて使用しているAPIが以前のバージョンで動作することが示されている場合は、以前のバージョンを使用できます。ただし、問題が発生した場合は、Nightlyでテストする必要があります。 contextMenus example codeが何もしていないことを示しているので、これがあなたの最も可能性の高い問題であると思われます。
  • あなたは実際のウェブページに移動していません。 content-script.jsは、「http」、「https」、「file」、「ftp」、「app」のいずれかのサポートされているスキームに一致するページにのみ読み込まれます。 about:*ページには読み込まれません。これが問題だった場合は、contextMenusサンプルコードの部分的な機能があります。

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

    Browser Console with error

あなたのコードに関する注記:
注意、あなたのほかに、あなたのコードを使用して、コンソールが持っているでしょうブラウザは、遅延の後に、エラーメッセージを生成しましたsendMessage()機能は、潜在的に、過度に複雑です。コンテキストメニュー項目が選択されたタブのtabs.Tabオブジェクトがすでに引数の1つとして関数に渡されているときに、アクティブなタブを検索しています。短いバージョンは次のようになります。

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

私はあなたがアクティブなタブの検索ではなく、コンテキストメニューのリスナーが提供するtabs.Tabオブジェクトを使用するために必要な事態が発生しているかどうかを知るために興味があります。

+0

ありがとうございます。問題はFirefoxのバージョンでした。私が最新バージョンを持っていると仮定するのはばかげた誤りでした。 Developer Editionに関しては、私の実際のアドオンはそれよりもはるかに複雑であり、DEは何かをしていました(私は以前のウェブ開発経験はないので、この「何か」が何であったかはわかりません)適切に動作します。私は今テストし、うまくいきます。 – guimarac

関連する問題