2016-11-24 6 views
0

Chrome拡張機能をFirefox WebExtensionに移植しています。これまでのところ、私はコンテンツ、背景スクリプト、および実行可能ファイルと円滑に通信できます。Firefox WebExtension:拡張機能が既に存在するかどうかをチェック

私のエクステンションの存在を確認したいと思います。

ブラウザのスクリプト

// browser-script.js 

var isExtensionHere = false; 

$("#is-extension-here").click(function(){ 

    console.log("Check the existence of the extension"); 

    window.postMessage({ 
     direction: "from-page-script", 
     message: "areYouThere" 
     }, "*"); 
}); 

window.addEventListener("message", function(event) { 
    if (event.source == window && 
     event.data.direction && 
     event.data.direction == "from-content-script") { 
     if(event.data.message == "OK") { 
      isExtensionHere = true; 
     } 
    } 
}); 

コンテンツスクリプト

// content-script.js 

window.addEventListener("message", function(event) { 
    if (event.source == window && 
     event.data.direction && 
     event.data.direction == "from-page-script") { 

    if(event.data.message == "areYouThere") { 
     window.postMessage({ 
     direction: "from-content-script", 
     message: "OK" 
     }, "*"); 
    } 
    } 
}); 

拡張子はここにあるとき、それは正常に動作します:これは実際に私はそれを行う方法です。しかし、そうでないときは、明らかに私の内線からの回答は得られません。拡張機能がここにないときに、ポップアップやメッセージをどのようにトリガーするのかをどうやって知ることができますか?

答えて

1
  1. ロジックを逆にすることができます。ページが拡張機能からpingを受信するようにします。お互いの関係でスクリプトが実行されるタイミング(たとえばrun_atに応じて)に注意する必要があります。そのため、ページがリッスンを開始する前に誤ってメッセージを送信しないようにしてください。

  2. ページにプレゼンスをアナウンスする別の方法を使用することができます。コンテンツスクリプトでは、既知のIDを持つ不可視のDOM要素を追加でき、その存在をページから確認できます。

  3. 現在の方法を維持したい場合は、応答が発生するようにタイマーを設定できます。何か、例えば、200msは十分以上にすべきです。

    それは一度だけ解決することができますので、あなたは、約束としてこれを実装することができます。

    var isExtensionHere = new Promise((resolve, reject) => { 
        const listener = (event) => { 
        if (
         event.source == window && event.data.direction 
         && event.data.direction == "from-content-script" 
         && event.data.message == "OK" 
        ) { 
         resolve(true); 
        } 
        } 
    
        setTimeout(() => { 
        window.removeEventListener("message", listener); 
        resolve(false); // Will have no effect if already called with true 
        }, 200); 
    
        window.addEventListener("message", listener); 
    
        window.postMessage({ 
        direction: "from-page-script", 
        message: "areYouThere" 
        }, "*"); 
    }); 
    
    // Sometime later 
    isExtensionHere.then((result) => { /* ... */ }); 
    

    あなたが動的に再確認し、新たな約束を毎回返すisExtensionHere機能を作りたい場合。

+0

お返事ありがとうございます。 – Thordax

関連する問題