私の最初の拡張で、私は基本的に動作する自分のMySQLデータベースにuserforumのコメントを保存しようとしています。コンテンツスクリプト/バックグラウンドスクリプトping-pong通信の頭痛
は今、私はこの問題でこだわっている:私は「妨害」ユーザ(同じドメインが、HTTPS)を使用せずに、バックグラウンドで収集されなければならないいくつかの追加情報が必要。 私はバックグラウンドページでiframeを使って、1つのページがそのiframeに読み込まれ、そこからいくつかの情報が収集され、そのiframeに別のページが読み込まれ、そこからいくつかの情報が収集されるはずです。私はこの思い付いた:
コンテンツスクリプト:送信ボタンは、iframe内
背景ページURLをロードするために背景ページをトリガー:iframe内に負荷のURLを、それが完全に
コンテンツをロードされていることをコンテンツスクリプトにメッセージを送りますスクリプト:メッセージを受信し、iframe から情報を収集し、バックグラウンドページに送信します。その後、同じことをもう一度。最後にバックグラウンドのページ情報を$ post経由で私のサーバーに送ります。
実際、このピンポン通信は私の仕事ではありません。 bg.jsは情報を受け取っていますが、コンテンツスクリプトに戻すことはできません。おそらく、コンテンツスクリプトがアクティブなタブから情報を取得し、バックグラウンドスクリプトのiframeから情報を取得するときに、どのスクリプトが情報を受け取る準備ができているのか分かりません。
私が気づいたのは、コンテンツスクリプトは、拡張機能がリロードされたときにiframeから情報を取得することです。
マニフェスト:
{
"manifest_version": 2,
"name": "SaveMyCommenz",
"version": "1.0",
"description": "SMC",
"version": "1",
"browser_action": {
"default_icon": "icons/icon-19.png",
"default_popup": "popup.html"
},
"icons": {
"48": "icons/icon-48.png",
"96": "icons/icon-96.png"
},
"content_scripts": [
{
"matches": ["*://*.example.com/*"],
"js": ["jquery.min.js", "smc.js"],
"run_at": "document_end",
"all_frames": true
}
],
"background": {
"scripts": ["bg.js"]
},
"permissions": [
"http://example.me/*",
"https://example.me/*",
"tabs"
]
}
smc.js(コンテンツスクリプト)
// ################# MESSAGE PASSING ##########################
document.addEventListener("submit",function(){
// tell bg.js to load site1 in iframe
chrome.runtime.sendMessage('1');
//...
}
chrome.runtime.onMessage.addListener(function(response, sender, sendResponse) {
if (response == '2'){// get Info1
//get info1
var link = document.querySelector("a[href*='permalink']");
// send info1 to bg.js...
//tell bg.js to load 2nd site in iframe
chrome.runtime.sendMessage('3');
}
if (response == '4'){// get Info2
var link = document.querySelector("a[href*='permalink']");
// send info2 to bg.js...
}
});
bg.js(バックグラウンドスクリプト)
load_iFrame();
function load_iFrame() {
var iframeX = document.createElement("iframe");
iframeX.setAttribute("src", "https://example.com");
iframeX.style.width = "90%";
iframeX.style.height = "500px";
document.body.appendChild(iframeX);
}
// ################# MESSAGE PASSING ##########################
chrome.runtime.onMessage.addListener(function (response, sender, sendResponse) {
//console.log("in bg.js angekommen: " + response.a);
if (response == '1') {
//chrome.runtime.reload(); // Kommentarseiten laden
// load site 1
window.frames['iframeX'].location = "https://example.com?page=1";
// reload?
// tell content script that site is fully loaded
chrome.tabs.query({
active: true,
currentWindow: true
}, function (tabs) {
chrome.tabs.sendMessage(tabs[0].id, {
"2"
});
});
}
if (response == '3') {
// load site 2
window.frames['iframeX'].location = "http://example.com?page=2";
// reload?
// tell content script that site is fully loaded
chrome.tabs.query({
active: true,
currentWindow: true
}, function (tabs) {
chrome.tabs.sendMessage(tabs[0].id, {
"4"
});
});
}
});
var kom = document.querySelectorAll("a[href*='permalink']");
var i;
const kommentarSta = new Array;
for (i = 0; i < kom.length; i++) {
kommentarSta[i] = kom[i].innerText;
console.log("Kommentar" + i + ": " + kommentarSta[i]);
}
いつ、どのように私はどのページをリロードする必要がありますこの通信を行うべきか?
iframeのURLに挿入される別のコンテンツスクリプトを宣言します。メインのコンテンツスクリプトを通常のページURL(http)でのみ実行するように宣言します。バックグラウンドページにメッセージを中継させる。答えのための – wOxxOm
thx!どのようにiframeで実行するコンテンツスクリプトを宣言するのですか?私はそれが通常のhttpsページを実行していることを意味thx! – bimbam
ええ、1つのURLはiframeでロードしていますが、他のhttpはhttpsです:/ – bimbam