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

Загрузка клиентской библиотеки 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, если вы хотите использовать функцию обратного вызова. Спасибо Илье. Подробнее здесь

4b9b3361

Ответ 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. Я также не изменял политику безопасности контента. Однако обратите внимание, что решение довольно недокументировано, поэтому оно может быть изменено в будущем.

Ответ 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'",