2017-08-18 7 views
0

問題クロームWebRequestクラス - 私は タブで実行されているChromeの拡張機能にヘッダを渡すようにしようとしている

  • 一度クロームイベントリスナーを追加します。現在の私の現在のコードでは、ページがリフレッシュされるたびに1つのイベントが追加されます。つまり、同じページで5回リフレッシュすると、最後にはイベントが各ページのロードで5回トリガーされます。私は にユーザーを許可するように、バックグラウンドスクリプトを使用してタブを実行する必要が

制限

  • は、それが実行されるサイトを除外する。
  • 私が望む特定のヘッダーを取得するために、リソースを再要求しようとする試みがCORSであり、縮小されたヘッダーセットにアクセスできるため、バックグラウンド拡張を使用して待機する必要があります。

コード

私はイベントがすでに解雇しているかどうかを確認する変数を設定しようとしました

私が試した何

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { 
    // Prevent double firing of event - extension should run once on complete. 
    if (changeInfo.status == "complete") {   
     chrome.webRequest.onCompleted.addListener(
      function(details) { 
       console.log(details); 
       // Pseudo code, where things are pulled from storage 
       // Based on this I then: 
       executeScript(tabId, "built_seo_traffic.js"); 
      }, 
      { 
       urls: ["*://*/*"], 
       types: ["main_frame"], 
       tabId: tab.id 
      }, 
      ["responseHeaders"] 
     ); 
    } 
}); 

、しかし、私はこれだけのように得ることができますスクリプトは各タブで1回ではなく、すべてのタブで1回実行されます。

これは正しく対応していますか?私はこれを簡単にする何かが欠けているだけですか? @wOxxOmへ

+3

起動時にリスナーを削除する必要があります。関数に名前を追加し、コールバック内のchrome.webRequest.onCompleted.removeListenerに渡します。 – wOxxOm

+0

ありがとう@wOxxOm私は、渡されたすべての情報を取得する方法を少し苦労していましたが、正しい方向にポインタを置いてくれました。私はそれを正しいとマークすることができるので、答えとして投稿しても構いません。 –

+0

[なぜ私のカウンタは毎回複数のカウンタを追加するのですか?](https://stackoverflow.com/questions/38808272/why-is-my-counter-adding-more-than-one-each-time) – Makyen

答えて

0

おかげで私は、次の解決策を得ることができた:

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { 
    // Prevent double firing of event - extension should run once on complete. 
    if (changeInfo.status == "complete") {   
     chrome.webRequest.onCompleted.addListener(
      executeTrafficLights, 
      { 
       urls: ["*://*/*"], 
       types: ["main_frame"], 
       tabId: tab.id 
      }, 
      ["responseHeaders"] 
     ); 
    } 
}); 


executeTrafficLights(details){ 
    console.log(details); 
    // Pseudo code, where things are pulled from storage 
    // Based on this I then: 
    executeScript(tabId, "built_seo_traffic.js"); 

    // Then remove self after executing 
    chrome.webRequest.onCompleted.removeListener(executeTrafficLights); 
} 

特に私が苦労していた部分という名前の関数が唯一のパラメータなしで呼び出すことができますので、私はわからないということだったかにtabIdとtabを渡します。

これらの情報(タブIDとURL)から必要な情報が両方とも詳細オブジェクトに表示されます。

tabに記載されている他の情報がありますか?確かにわからないのですが、これはdetailsにはありませんが、これは素晴らしいことでした。

+0

@Makyen Ahもっと一般化しようとしていました。私はそれを変更してみましょう。 –

関連する問題