1

私の拡張機能では、 mybackground.jsからcontent.jsusingにメッセージを渡していますchrome.tabs.sendMessage。有効なtabId(その値、負でない値を出力する) 場合、アラートの後にコンテンツがアラートを出力することがありますbackground.jsが、ほとんどの場合ではありません。これがサンプルコードです。コードに何か不足していますか? でアラートが表示されるたびに、 でアラートがbackground.js発生するはずcontent.jsです。リクエストが処理されていて、ページがまだ完全に表示されていないときにメッセージを送信しています。

background.js

...

if(url == "http://example.com"){
   alert("In background");
   chrome.tabs.sendMessage(tabId, {msg: "HELLO"});          
}

...

content.js

chrome.runtime.onMessage.addListener(
        function (request, sender, sendResponse) {    
          alert("In content");
        });

マニフェスト.json

  "content_scripts": [  
        {
            "matches": [
                "http://*/*",
                "https://*/*"
            ],
            "js": ["content.js"],
            "all_frames": true,
            "run_at": "document_end"
        }
    ],

追加した

覚えておいていただきたいのは、最初のリクエストが https にリダイレクトされてonBeforeRquest失敗した後、DOM の画像 URL を http に (http から強制的に http にリダイレクトするように) 変更したいということです。コンテンツ スクリプトがすべてのメッセージを受信して​​いないことに気付いたため、これは機能していません。次のコードの簡単なテストとして、「In onErrorOccurred」というメッセージが出力されるたびに、コンソールで「In content」が続く必要があると予想していますが、このようには機能していません。どんな提案も歓迎します。コンテンツの準備ができているかどうかを確認してから、メッセージを送信します。コードは次のとおりです。

content.js:

chrome.extension.sendRequest({contentStatus: "activated"});

chrome.runtime.onMessage.addListener(
   function (request, sender, sendResponse) {
      console.log(request.srcurl);  //or console.log("In content");
});

background.js:

var contentActive = {}  
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {   
   chrome.tabs.getSelected(null, function(tabs) {       
      if (request.contentStatus == "activated")
          contentActive[tabs.id] = true;    
   });    
});

chrome.webRequest.onErrorOccurred.addListener(
   function(details){ 
      if(details.type == 'image' && details.url == "https://example.com/image1.jpg") {     
         if(contentActive[details.tabId]){
           console.log("In onErrorOccurred");
              chrome.tabs.sendMessage(details.tabId, {srcurl: "In content"});       
        }
     }
}, {urls: ['https://*/*']});
4

0 に答える 0