Браузер не хочет выполнять сторонний скрипт в расширении
Пытаюсь вставить рекламный скрипт в окно расширения.
<div id="baN7DiJdgGFKDhh1smvjJ2"></div> <script type="text/javascript"> var bid = 'N1FiJouGFKDhh9rgzjN4'; var sid = '2034'; var async = 1; </script> <script type="text/javascript" src="http://ads.actionteaser.ru/news.js"></script> Браузер выдает такую ошибку в консоль: Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self' chrome-extension-resource:". Either the 'unsafe-inline' keyword, a hash ('sha256-...'), or a nonce ('nonce-...') is required to enable inline execution. index.html:10 Refused to load the script 'http://ads.actionteaser.ru/news.js' because it violates the following Content Security Policy directive: "script-src 'self' chrome-extension-resource:". Как я понял нужно что-то записать в "content_security_policy" в файле манифеста, но не могу понять что именно. |
https://developer.chrome.com/extensi...-remote-script
следовательно, по протоколу HTTP никак, если через HTTPS то например так: "content_security_policy": "script-src 'self' https://adskayareklamka.com; object-src 'self'" |
#Решение проблемы динамического подключения js в chrome extensions
Столнулся с той же проблемой, единственным решением при поддержке динамической загрузки нужных скриптов стало написание некоторого функционала:
1. manifest.json Код:
{
function parseMessage(request, sender, sendResponse) {
switch(request.type) {
case 'ajax':
ajax(request, sendResponse);
break;
}
}
chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
parseMessage.call(this, request, sender, sendResponse);
return true;
});
3. core.js
/*
Здесь вставил содержимое файла jQuery v3.1.1
*/
/*
Ajax function
ajax({query: [{url: '/ajax'}, {url: '/ajax2'}]}, function(e) { ... });
@args request (object), sendResponse (function)
*/
/**
* XmlHttpRequest's getAllResponseHeaders() method returns a string of response
* headers according to the format described here:
* [url]http://www.w3.org/TR/XMLHttpRequest/#the-getallresponseheaders-method[/url]
* This method parses that string into a user-friendly key/value pair object.
*/
function parseResponseHeaders(r){var n={};if(!r)return n;for(var e=r.split("\r\n"),s=0;s<e.length;s++){var i=e[s],t=i.indexOf(": ");if(t>0){var a=i.substring(0,t),f=i.substring(t+2);n[a]=f}}return n};
function ajax(request, sendResponse) {
if(!isBackground()) {
return chrome.extension.sendMessage({
type: 'ajax',
query: request.query
}, sendResponse || function() {});
}
if(request.query) {
var responses = {},
join = request.joinResults;
function sendReq(n, req) {
$.ajax($.extend({
success: function(res, status, xhr) {
var xhr = $.extend({
headers: $.isFunction(parseResponseHeaders) ? parseResponseHeaders(xhr.getAllResponseHeaders()) : null
}, xhr),
data = {res: res, status: status, xhr: xhr};
if(!n && !req) { sendResponse(data); }
else {
responses[n] = data;
var arr = $.map(responses, function(v) { return [v]; });
if(arr.length >= request.query.length) { !join ? sendResponse(arr) : sendResponse.apply(request, arr); }
}
},
error: function(xhr, status, error) {
var xhr = $.extend({}, xhr),
data = {res: error, status: status, xhr: xhr};
if(!n && !req) { sendResponse(data); }
else {
responses[n] = data;
var arr = $.map(responses, function(v) { return [v]; });
if(arr.length >= request.query.length) { !join ? sendResponse(arr) : sendResponse.apply(request, arr); }
}
}
}, req || request.query));
}
if(!request.query.length) { sendReq(); }
else { $.each(request.query, sendReq); }
}
}
/*
Include given file(s) to current document context (based on ajax)
require('https://site.com/file');
require({url: 'https://site.com/file', async: false}, function(f) { .. });
require([
{url: 'https://site.com/file', async: false},
'https://site.com/file2'
], function(f) { .. });
@args files (string/array/object), [callback (function)]
*/
function require(files, callback) {
var timeout, content = [], loaded = 0;
function req(file) {
if(!file) return;
ajax({
query: ($.type(file) == 'object' ? file : {url: file})
}, function(f) {
if((file.url || file).indexOf('.js') > -1) {
try {
eval.call(window, f.res);
} catch(e) {
console.warn(f, e);
}
}
content.push( $.extend(f, {file: file}) );
loaded++;
});
}
if($.type(files) == 'string') {
req(files);
} else if(files && $.type(files[0]) !== 'undefined') {
$.map(files, req);
}
timeout = setInterval(function() {
if(loaded == ($.type(files) == 'string' ? 1 : files.length) && $.isFunction(callback)) {
clearInterval(timeout);
callback(content);
}
}, 1000);
}
/*
Check if current script instance of background or content
isBackground() // true
@return true (boolean) from background script
false (boolean) from content script
*/
function isBackground() {
return location.protocol == 'chrome-extension:';
}
4. options.js
/*Append module*/
require(chrome.extension.getURL('assets/script1.js'));
$(init);
поскольку модуль используется при нажатии на кнопку я не ожидаю его загрузки, если нужна инициализация после загрузки используйте коллбэк:
/*Append modules*/
require([
chrome.extension.getURL('assets/script1.js'),
chrome.extension.getURL('assets/script2.js')
], function(scripts) { /* Initialise */ });
|
| Часовой пояс GMT +3, время: 15:17. |