2016-08-17 4 views
0

私は、タブに表示されている現在のウェブサイトで特定のスクリプトが使用されているかどうかを示す拡張子を作成しようとしています。Chrome Message Passing APIが機能しない

タブが切り替えられた場合に通知を処理し、スクリプトが使用されているかどうかを確認するために私の拡張機能のアイコンを変更する、私のバックグラウンドスクリプトにメッセージを送信するために使用されるスクリプトを確認するコンテンツスクリプトがあります。

これは私のコンテンツスクリプトです(load.js):

chrome.runtime.sendMessage({script_found: checkScript()}); 
function checkScript() { 
    var script_found = true; 
    var length = document.getElementsByTagName("script").length; 

    for (var i = 0; i < length; i++) { 
     var list = document.getElementsByTagName("script")[i].src; 
     var t = list.toString(); 
     if (t.length > 1) { 
      if((t.indexOf("edge") != -1) || (t.indexOf("prototype") != -1)) { 
       script_found = false; 
      } 
     } 
    } 

    return script_found; 
} 

chrome.runtime.onMessage.addListener(
    function(request, sendResponse) { 
    if(request.tabSwitch == true) { 
     sendResponse({script_found: checkScript()}); 
    } 
}); 

これは私のバックグラウンドサービス(background.js)です:

chrome.tabs.onActivated.addListener(tabSwitch); 

function tabSwitch() { 
    chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
     chrome.tabs.sendMessage(tabs[0].id, {tabSwitch: "true"},function(response) { 
      refreshIcon(response.script_found); 
     }); 
    }); 
} 

chrome.runtime.onMessage.addListener(
    function(request) { 
    refreshIcon(request.script_found); 
    }); 


function refreshIcon(script_found) { 
    if(script_found) { 
     chrome.browserAction.setIcon({path:"good.png"}) 
    } else if(!script_found) { 
     chrome.browserAction.setIcon({path:"error.png"}) 
    } 
} 

それが機能しない理由私は本当に知りませんon tabSwitch。ウェブサイトが読み込まれてもうまく動作しますが、タブを切り替えると表示されません。

私はあなたが助けてくれることを願っています! ありがとうございます!

EDIT: はこれが私のマニフェスト(manifest.jsonを)です:

{ 
    "manifest_version": 2, 

    "name": "Script Hunter", 
    "description": "This extension shows if certain scripts are used on this page.", 
    "version": "1.0", 

    "content_scripts": [{ 
    "matches": ["<all_urls>"], 
    "js": ["load.js"], 
    "run_at": "document_idle" 
    }], 

    "background": {"scripts": ["background.js"]}, 

    "browser_action": { 
    "default_icon": "good.png" 
    }, 

    "permissions": [ 
    "tabs", 
    "activeTab", 
    "https://ajax.googleapis.com/" 
    ] 
} 

おかげで再び!

+0

あなたは 'manifest.json'を投稿してくださいもらえますか?私はあなたのコンテンツスクリプトが 'chrome.tabs.onActivated'が起こったときに引き起こす(デフォルトでは' document_idle'によって)遅すぎて注入されたと思います。スクリプトはまったく注入されません。 –

+0

通信関連の質問の99%に対する1つの答え:それをデバッグしてください。あなたはおそらく、「真の」と他のものとの間に「真実」は等しくないことに驚くでしょう。 – wOxxOm

+0

@HaibaraAiはあなたが正しいように見えます。私は何を変えるべきですか? –

答えて

0
  1. background.jsについて、あなたはちょうどchrome.tabs.onActivatedのコールバックパラメータを使用することができ、アクティブなタブを照会する必要はありません。 load.jsで

    chrome.tabs.onActivated.addListener(tabSwitch); 
    
    function tabSwitch(activeInfo) { 
        chrome.tabs.sendMessage(activeInfo.tabId, {tabSwitch: true},function(response) { 
         refreshIcon(response.script_found); 
        }); 
    } 
    
  2. (@wOxxOmはコメントで述べたように、ここでtabSwitch: trueを使用)、chrome.runtime.onMessageのコールバックの3番目のパラメータは、しかし、あなたは、2つのパラメータのみを指定し、sendResponseです。

    chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { 
        ... 
    }); 
    
+0

お返事ありがとうございました。私はすべてを変更しましたが、background.jsがタブスイッチを認識していますが、load.jsに情報を送信していないようです。 –

+0

@ r0d最新のload.jsがロードされていることを確認する前に、Webページを再ロードしましたか? –

+0

私のコードの順序を入れ替えなければならなかった。私はすべての機能を一番下に移動し、リスナーと送信者をトップに移動させました。完全に機能しています。ご協力いただきありがとうございます! –

関連する問題