Подтвердить что ты не робот

Доступ к содержимому iframe из содержимого расширения chrome script

Я делаю плагин, чтобы сделать некоторые преобразования в интерфейс. Я продолжаю получать unsafe javascript attempt to access frame with url.... Domains, protocols and ports must match (типичная проблема с перекрестным сайтом)

Но будучи расширением, он должен иметь доступ к содержимому iframe http://code.google.com/chrome/extensions/content_scripts.html...

Кто-нибудь знает, как получить доступ к содержимому, чтобы они могли быть захвачены?

4b9b3361

Ответ 1

Как правило, нет прямого доступа к объекту window другого происхождения. Если вы хотите безопасно связываться между сценариями контента в разных кадрах, вам необходимо отправить сообщение на фоновый рисунок, который, в свою очередь, отправит сообщение обратно на вкладку.

Вот пример:

Часть manifest.json:

"background": {"scripts":["bg.js"]},
"content_scripts": [
    {"js": ["main.js"], "matches": ["<all_urls>"]},
    {"js": ["sub.js"], "matches": ["<all_urls>"], "all_frames":true}
]

main.js:

var isTop = true;
chrome.runtime.onMessage.addListener(function(details) {
    alert('Message from frame: ' + details.data);
});

sub.js:

if (!window.isTop) { // true  or  undefined
    // do something...
    var data = 'test';
    // Send message to top frame, for example:
    chrome.runtime.sendMessage({sendBack:true, data:data});
}

Фон script 'bg.js':

chrome.runtime.onMessage.addListener(function(message, sender) {
    if (message.sendBack) {
        chrome.tabs.sendMessage(sender.tab.id, message.data);
    }
});

Альтернативным методом является использование chrome.tabs.executeScript в bg.js для запуска функции в основном содержании script.

Соответствующая документация

Ответ 2

Я понимаю, что это старый вопрос, но я недавно провел полдня, чтобы его решить. Обычно создание iframe выглядит примерно так:

var iframe = document.createElement('iframe');
iframe.src = chrome.extension.getURL('iframe-content-page.html');

Этот кадр будет иметь другое происхождение со страницей, и вы не сможете получить его DOM. Но если вы создаете iframe только для изоляции css, вы можете сделать это по-другому:

var iframe = document.createElement('iframe');
document.getElementById("iframe-parent").appendChild(iframe);
iframe.contentDocument.write(getFrameHtml('html/iframe-content-page.html'));
.......
function getFrameHtml(htmlFileName) {
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.open("GET", chrome.extension.getURL(html/htmlFileName), false);
    xmlhttp.send();

    return xmlhttp.responseText;
}
.......
"web_accessible_resources": [   
    "html/htmlFileName.html",
    "styles/*",
    "fonts/*"
]

После этого вы можете использовать iframe.contentDocument для доступа к iframe DOM