7

バックグラウンドページに多くのリダイレクトがあるページをロードする必要がある拡張機能があります。そのページが既知のURL(https://website.com/index.php)に到達すると、iframeのsrc設定はになりabout:blankます。

最終ページは非常に大きく、大きな画像とロードする必要のないすべてのものが含まれているため、iframeのonloadイベントにアタッチするのではなく、100ミリ秒間隔で次の関数を設定します。

function update(){
    if(document.getElementsByTagName('iframe')[0].contentDocument.location.href == "https://website.com/index.php"){
        console.log("Done!");
        clearInterval(updateInterval);
        document.getElementsByTagName('iframe')[0].src = "about:blank";
    }
}

ただし、iframeの読み込みが開始されるとすぐに、update()は次のエラーをスローします。

安全でないJavaScriptは、URL chrome-extension://hdmnoclbamhajcoblymcnloeoedkhfon/background.htmlのフレームからURLhttps://website.com/index.phpのフレームアクセスしようとします 。アクセスを要求するフレームのプロトコルは「chrome-extension」で、アクセスされるフレームのプロトコルは「https」です。プロトコルは一致する必要があります。

そのエラーをcatch()しようとしましたが、当然のことながらJavascriptに返されるメッセージにURLが含まれていません。ページは複数回リダイレクトされるため、正確なURLを知ることが重要です。iframeのsrcプロパティも、リダイレクトを反映するように更新されません。

4

1 に答える 1

8

たくさんのグーグルとほとんどあきらめた後、私は次の解決策を思いついた。正しいページが読み込まれると、挿入されたコンテンツスクリプトを使用して、拡張機能にメッセージを送り返します。

マニフェスト.json:

{
    ...
    "background": {
        "page": "background.html"
    }, "content_scripts": [
        {
            "matches": ["http://website.com/index.php"],
            "js": ["content.js"],
            "all_frames": true,
            "run_at": "document_start"
        }
    ],
    "permissions": [
        "*://*.website.com/*"
    ]
}

background.html:

<html>
    <head>
        <script type="text/javascript" src="background.js"></script>
    </head>
    <body>
        <iframe src="about:blank"></iframe>
    </body>
</html>

background.js:

var waiting = false;

function login(){ // Call this function to start
    var frame = document.getElementsByTagName('iframe')[0];
    frame.src = "https://website.com/login/";
    waiting = true;
}

function callback(){ // This gets called once the page loads
    console.log("Done!");
}

chrome.extension.onMessage.addListener(function(request, sender, sendResponse){
    if(request.loaded && waiting){
        // If you used a pattern, do extra checks here:
        // if(request.loaded == "https://website.com/index.php")
        document.getElementsByTagName('iframe')[0].src = "about:blank";
        waiting = false;
        callback();
    }
});

content.js:

chrome.extension.sendMessage({loaded: window.location.href});
于 2013-03-26T02:05:28.547 に答える