Хранение данных расширения Chrome у себя на сервере
Через расширение для Chome хочу отправлять на сервер и получать обратно данные со страниц сайтов. Использую для этого jquery. При отправке с сайта(когда использую расширение на том же сайте) на котором обработчик php-ный находится- все отрабатывает нормально, но при отправке с других сайтов система отказывается работать сообщая следующее:
Access to XMLHttpRequest at 'https://site.ru/poe.php' from origin 'https://www.liveinternet.ru' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
CORS это штуковина которую можно уговорить(по данным из Гугла) пропускать запросы добавив что-то в Файл Манифеста. Вроде можно просто указать в permissions скрипт обработчика и все должно быть хорошо, но нет...
Файл manifest.json :
{
"manifest_version": 2,
"name": "poe",
"description": "123",
"version": "1.0.0",
"content_scripts":[
{
"matches": ["<all_urls>"],
"js": [ "jquery-1.5.1.min.js", "script.js"],
"run_at": "document_end"
}
],
"permissions": ["http://*/", "*://*/*", "https://site.ru/poe.php", "<all_urls>"],
"content_security_policy": "script-src 'self' https://site.ru/poe.php; object-src 'self'"
}
В чем проблема? Что нужно сделать чтобы запросы на свой сервер с любых страниц работали?
Ответы (1 шт):
Оказывается что разрешения из manifest.json относительно CORS распространяются на файлы pop-up-а(окно появляющееся при нажатии на иконку расширения), и файлы всплывающих сообщений расширения. Но не распространяются на content_scripts(скрипты подгружаемые в тело страницы) И для того чтобы отправлять на сервер инфу и получать обратно нужно пересылать ее через эти файлы, например с помощью API Хрома(еще, вероятно, возможно через chrome.storage , ...)- например вот так:
var port = chrome.runtime.connect({name: "GoodName"}); //создание соединения с файлом pop-up
port.postMessage({ack: dobav}); //пошла инфа {переменная: значение}
port.onMessage.addListener(function(msg) { //функция которая ждет ответ
console.log(msg.color); //инфа из pop-up
});
В pop-up:
chrome.runtime.onConnect.addListener(function(port) {
port.onMessage.addListener(function(msg) {
$.ajax({ //Аякс в городе
url: "site/obrabotchic.php", // куда отправляем
type: "post", // метод передачи
dataType: "json", // тип передачи данных
data: { // что отправляем
"info": msg.ack
},
success: function(data){ //Аяксу пришел ответ с сервера
vasia = data.info;
port.postMessage({color: vasia}); //отправляем инфу в контент скрипт- в скобках
название переменной и сама инфа
}})
});
});
В manifest.json добавляем разрешения на отправку запросов.