Je cherche depuis un certain temps à associer la bibliothèque cliente javascript de Google Api avec une extension chrome, mais il semble que l'extension chrome présente un cas terrible de pieds froids. Le lien vers le script est
https://apis.google.com/js/client.js
Le téléchargement des fichiers est compliqué, car le script charge d’autres scripts. J'ai essayé de l'inclure dans le manifeste
manifest.json (extrait)
"background": {
"scripts": [
"background.js",
"https://apis.google.com/js/client.js?onload=callbackFunction"
]
},
mais alors l'extension ne charge pas. J'ai également essayé d'injecter le script dans l'arrière-plan HTML
background.js (extrait)
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);
mais le débogueur de chrome me donne
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:".
Des idées, ou sont-ils destinés à être séparés?
Edit: notez que vous devez ajouter "? Onload = myCallbackFunction" à l'URL du script si vous souhaitez utiliser une fonction de rappel. Merci Ilya. Plus d'infos ici
Jusqu'à présent, la seule solution que j'ai trouvée consiste à injecter d'abord le script dans la page HTML en arrière-plan, comme je l'ai fait:
background.js (extrait)
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);
Et pour contourner l'avertissement de sécurité, éditez le fichier manifeste ( source ):
manifest.json (extrait)
"content_security_policy": "script-src 'self' https://apis.google.com; object-src 'self'"
Cependant, notez que contourner la sécurité ne fonctionne que pour les liens https
, et je trouve aussi que c'est un peu hacky ... toute autre solution est la bienvenue
J'ai trouvé quelque chose d'intéressant dans le code source de https://apis.google.com/js/client.js
. Ça lit:
gapi.load("client",{callback:window["gapi_onload"], ......
gapi.load
est appelé dès que client.js
est chargé dans la page Web. Il semble que window.gapi_onload
sera appelé en tant que rappel une fois que gapi.client
sera chargé.
Pour prouver le concept, j’ai construit ce lecteur: http://plnkr.co/edit/TGvzI9SMKwGM6KnFSs7U
gapi.auth
et gapi.client
ont été correctement imprimés sur la console.
Retour aux extensions de Chrome.
Je mets ceci dans la section de fond de mon mainfest.json
:
"background": {
"scripts": [
"background.js",
"gapi-client.js"
]
}
dans lequel background.js
est le script d'arrière-plan principal de mon extension. Tout le contenu de gapi-client.js
est directement copié-collé à partir de https://apis.google.com/js/client.js
.
Dans background.js
, on lit:
window.gapi_onload = function(){
console.log('gapi loaded.', gapi.auth, gapi.client);
// Do things you want with gapi.auth and gapi.client.
}
Veuillez noter que background.js
est chargé avant le gapi-client.js
. Étant donné que gapi-client.js
lit window["gapi_onload"]
dès son chargement, window.gapi_onload
doit être spécifié avant.
Par conséquent, window.gapi_onload
est appelé comme prévu, avec gapi.auth
et gapi.client
renseignés.
Dans ma solution, je n'ai pas créé un background.html
moi-même. Je n'ai pas non plus modifié la politique de sécurité du contenu. Cependant, notez que la solution est plutôt non documentée, donc sujette à changement dans le futur.
Vous pouvez les charger via background.html qui charge votre 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>
avec manifest.json:
"background":
{
"page": "background.html"
},
"content_security_policy": "script-src 'self' https://apis.google.com; object-src 'self'",
Vous avez juste besoin de définir la méthode onload pour cette bibliothèque
https://apis.google.com/js/client.js?onload=handleClientLoad
et handleClientLoad - par défaut votre méthode d'enregistrement.
J'ai essayé d'ajouter le fichier manifeste comme suggestion de woojoo666, mais il a toujours échoué, Il semble qu'il faille ajouter un indicateur supplémentaire, 'unsafe-eval':
"content_security_policy": "script-src 'self' 'unsafe-eval' https://apis.google.com ; object-src 'self'",