Загрузка клиентской библиотеки Javascript Google API в расширение Chrome
Я пытаюсь выпустить клиентскую библиотеку google api javascript с расширением chrome некоторое время, но, похоже, хром-расширение имеет ужасный случай холодных ножек. Ссылка на script есть
https://apis.google.com/js/client.js
Загрузка файлов беспорядочна, потому что script фактически загружает другие скрипты. Я попытался включить его в манифест
manifest.json(выдержка)
"background": {
"scripts": [
"background.js",
"https://apis.google.com/js/client.js?onload=callbackFunction"
]
},
но затем расширение не загружается. Я также попытался вставить script в фоновый html
background.js(выдержка)
var body = document.getElementsByTagName('body')[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = "https://apis.google.com/js/client.js?onload=callbackFunction";
body.appendChild(script);
но хром-отладчик дает мне
Refused to load the script 'https://apis.google.com/js/client.js' because it violates the following Content Security Policy directive: "script-src 'self' chrome-extension-resource:".
Любые идеи, или им суждено быть разделенными?
Изменить: обратите внимание, что вы должны добавить "? onload = myCallbackFunction" к URL-адресу script, если вы хотите использовать функцию обратного вызова. Спасибо Илье. Подробнее здесь
Ответы
Ответ 1
Пока единственное решение, которое я нашел, - это сначала ввести script на страницу фона html, как я:
background.js(выдержка)
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = "https://apis.google.com/js/client.js?onload=callbackFunction";
head.appendChild(script);
Затем, чтобы обойти предупреждение безопасности, отредактируйте файл манифеста (источник):
manifest.json(выдержка)
"content_security_policy": "script-src 'self' https://apis.google.com; object-src 'self'"
Однако обратите внимание, что в обход безопасности работает только для ссылок https
, и я также считаю это своего рода взломом... любые другие решения приветствуются
Ответ 2
Я нашел что-то интересное в исходном коде https://apis.google.com/js/client.js
. Он гласит:
gapi.load("client",{callback:window["gapi_onload"], ......
gapi.load
вызывается, как только client.js
загружается на веб-страницу. Похоже, что window.gapi_onload
будет вызываться как обратный вызов после загрузки gapi.client
.
В качестве доказательства концепции я построил этот плункер: http://plnkr.co/edit/TGvzI9SMKwGM6KnFSs7U
Оба gapi.auth
и gapi.client
успешно печатаются на консоли.
Вернитесь к расширениям Chrome.
Я помещал это в фоновый раздел моего mainfest.json
:
"background": {
"scripts": [
"background.js",
"gapi-client.js"
]
}
в котором background.js
является основным фоном script в моем расширении. Все содержимое gapi-client.js
напрямую копируется и вставляется с https://apis.google.com/js/client.js
.
Внутри background.js
он читает:
window.gapi_onload = function(){
console.log('gapi loaded.', gapi.auth, gapi.client);
// Do things you want with gapi.auth and gapi.client.
}
Обратите внимание, что background.js
загружается до gapi-client.js
. Поскольку gapi-client.js
читает window["gapi_onload"]
, как только он загружается, перед этим следует указать window.gapi_onload
.
В результате window.gapi_onload
вызывается, как ожидалось, при заполнении gapi.auth
и gapi.client
.
В моем решении я сам не создал background.html
. Я также не изменял политику безопасности контента. Однако обратите внимание, что решение довольно недокументировано, поэтому оно может быть изменено в будущем.
Ответ 3
Вам просто нужно установить метод onload для этой библиотеки
https://apis.google.com/js/client.js?onload=handleClientLoad
и handleClientLoad - по умолчанию ваш метод регистрации.
Пример для js oauth
Ответ 4
Вы можете загрузить их через background.html, который загружает ваши background.js.
<html>
<head>
<title></title>
<script src="background.js"></script>
</head>
<body>
</body>
<script src="https://apis.google.com/js/client.js"></script>
</html>
с manifest.json:
"background":
{
"page": "background.html"
},
"content_security_policy": "script-src 'self' https://apis.google.com; object-src 'self'",
Ответ 5
Я попытался добавить файл манифеста как предложение woojoo666, но он все еще не удался,
Похоже, нам нужно добавить еще один флаг "unsafe-eval":
"content_security_policy": "script -src 'self' 'небезопасно-eval' https://apis.google.com; object-src 'self'",