Доступ к URL-адресу iframe из расширения Chrome

У меня есть расширение, которому нужно загрузить страницу с большим количеством переадресаций на фоновой странице. Как только эта страница перейдет на известный URL-адрес (https://website.com/index.php), iframe должен иметь свой src установить на about:blank.

Конечная страница довольно большая и содержит большие изображения и все, что не нужно загружать, поэтому вместо того, чтобы привязываться к событию onload iframe, я установил следующую функцию с интервалом 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-адресом https://website.com/index.php из фрейма с URL-расширением chrome:/ /hdmnoclbamhajcoblymcnloeoedkhfon/background.html. Кадр, запрашивающий доступ, имеет протокол «chrome-extension», кадр, к которому осуществляется доступ, имеет протокол «https». Протоколы должны совпадать.

Я попытался поймать () эту ошибку, но сообщение, переданное обратно в Javascript, неудивительно, не включает URL-адрес. Страница перенаправляется несколько раз, поэтому важно знать точный URL. Свойство src iframe также не обновляется для отражения перенаправлений.


person Dan Hlavenka    schedule 26.03.2013    source источник


Ответы (1)


После много поиска в Google и почти полного отказа я нашел следующее решение. Он использует внедренный сценарий содержимого для отправки сообщения обратно расширению после загрузки правильной страницы.

манифест.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/*"
    ]
}

фон.html:

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

фон.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();
    }
});

контент.js:

chrome.extension.sendMessage({loaded: window.location.href});
person Dan Hlavenka    schedule 26.03.2013