Вам не нужно связываться с фреймами. Можно выполнять междоменный XMLHttpRequests, используя фоновые страницы. Начиная с Chrome 13, межсайтовые запросы могут быть сделаны из скрипта контента. Тем не менее, запросы могут по-прежнему не выполняться, если страница обслуживается заголовком политики безопасности содержимого с ограничением connect-src
.
Еще одна причина выбора метода nexy вместо сценариев содержимого заключается в том, что запросы к сайтам http будут вызывать смешанное предупреждение о содержимом («На странице https: // ... отображается небезопасный контент с http: // ...») .
Еще одна причина для делегирования запроса на фоновую страницу - это когда вы хотите получить ресурс из file://
, потому что скрипт содержимого не может прочитать из file:
, если он не запущен на странице в file://
схема.
Примечание
Чтобы включить запросы между источниками, вы должны явно предоставить разрешения вашему расширению, используя массив permissions
в файле манифеста.
Межсайтовый запрос с использованием фонового скрипта.
Сценарий содержимого запрашивает функциональность из фона через сообщения API. Вот пример очень простого способа отправки и получения ответа на запрос.
chrome.runtime.sendMessage({
method: 'POST',
action: 'xhttp',
url: 'http://www.stackoverflow.com/search',
data: 'q=something'
}, function(responseText) {
alert(responseText);
/*Callback function to deal with the response*/
});
Фон / Событие Страница:
/**
* Possible parameters for request:
* action: "xhttp" for a cross-origin HTTP request
* method: Default "GET"
* url : required, but not validated
* data : data to send in a POST request
*
* The callback function is called upon completion of the request */
chrome.runtime.onMessage.addListener(function(request, sender, callback) {
if (request.action == "xhttp") {
var xhttp = new XMLHttpRequest();
var method = request.method ? request.method.toUpperCase() : 'GET';
xhttp.onload = function() {
callback(xhttp.responseText);
};
xhttp.onerror = function() {
// Do whatever you want on error. Don't forget to invoke the
// callback to clean up the communication port.
callback();
};
xhttp.open(method, request.url, true);
if (method == 'POST') {
xhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
}
xhttp.send(request.data);
return true; // prevents the callback from being called too early on return
}
});
Примечание: API обмена сообщениями переименовывались несколько раз. Если ваш целевой браузер не последняя версия Chrome, проверьте этот ответ .
Для полноты вот файл манифеста , чтобы опробовать мою демонстрацию:
{
"name": "X-domain test",
"manifest_version": 2,
"permissions": [
"http://www.stackoverflow.com/search*"
],
"content_scripts": {
"js": ["contentscript.js"],
"matches": ["http://www.example.com/*"]
},
"background": {
"scripts": ["background.js"],
"persistent": false
}
}