私の拡張機能では、 mybackground.js
からcontent.js
usingにメッセージを渡しています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://*/*']});