2017-03-08 26 views
0

私の最初の拡張で、私は基本的に動作する自分の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]); 
} 

いつ、どのように私はどのページをリロードする必要がありますこの通信を行うべきか?

+0

iframeのURLに挿入される別のコンテンツスクリプトを宣言します。メインのコンテンツスクリプトを通常のページURL(http)でのみ実行するように宣言します。バックグラウンドページにメッセージを中継させる。答えのための – wOxxOm

+0

thx!どのようにiframeで実行するコンテンツスクリプトを宣言するのですか?私はそれが通常のhttpsページを実行していることを意味thx! – bimbam

+0

ええ、1つのURLはiframeでロードしていますが、他のhttpはhttpsです:/ – bimbam

答えて

0
if (response.a == '1'){ 

load_iframe(); 
//chrome.runtime.reload();  
window.frames['iframeX'].location = "https://derstandard.at/userprofil/postings?ortMode=1&groupMode=2&pageNumber=2"; 

     } 


function load_iFrame() { 
    var iframeX = document.createElement("iframe"); 
    iframeX.setAttribute("src", "https://derstandard.at/userprofil/postings?sortMode=1&groupMode=2&pageNumber=1"); 
    iframeX.style.width = "90%"; 
    iframeX.style.height = "500px"; 
    document.body.appendChild(iframeX); 

}

bg.jsは、コンテンツスクリプトからのメッセージ= 1を待ってから、iframe内に新しいページをロードするが、それはdoesntの必要があります。 iframeXが存在しないと言っています。 bg.jsにiframeがないうちにリロードすると、/ thx(ヘルプ)

関連する問題