Je suis en train de construire ma première extension de safari - très simple - mais j'ai rencontré quelques problèmes. L'extension revient à un seul script injecté qui tente de contourner le gestionnaire d'alimentation natif et de rediriger vers un HTTP: // URI. Mes problèmes jusqu'à présent sont Twofold: P>
Beforeload code> manipulateur d'événements, mais je ne peux pas accéder à mes paramètres à l'aide du chemin Safari.extension.Settings code> indiqué dans la documentation. LI>
ol>
Je n'ai rien trouvé dans la documentation d'Apple pour indiquer que les paramètres ne devraient pas être disponibles auprès de mon script. Étant donné que les extensions sont une nouvelle fonctionnalité, même Google renvoie des résultats pertinents limités et la plupart de ceux-ci proviennent de la documentation officielle. p>
Qu'est-ce que je manque? p>
mise à jour forte>
J'espère donc que la documentation est incomplète car elle est limite abyssale, mais j'ai appris un peu des paramètres. Il s'avère que, des scripts d'injection, l'objet Safariextensionnons code> n'est pas disponible. Les scripts d'injection ont seulement accès à l'objet code> SafaricontExtension code> (qui n'est pas utile du tout), mais il est aliasé de la même manière ( Safari.extension.Settings code>) - mauvaise idée, imo. Comme indiqué dans le Documentation de script d'injection a >: p>
Important: lorsque vous utilisez Safari.extension à partir d'un script injecté, vous ne répondez pas à la classe Safariextension. Vous abordez la classe SafaricontExtension. P>
blockQuote>
Vous devez utiliser le système de messagerie pour parler à un fichier HTML global qui a accès aux paramètres. C'est un peu de Loopopy, mais j'ai un message envoyé à un fichier global.html code> qui récupère les paramètres et enverra un message à mon script d'injection dès que je ne comprendrai comment faire cela. p>
Puisque je fais tout mon travail avant le chargement du document, toutes les méthodes que j'ai trouvées pour envoyer un message back em> s'appuient sur un objet de page que je n'ai pas. p>
4 Réponses :
edit: strong> Comme vous l'avez dit dans votre mise à jour de la publication initiale, le script injecté n'a pas le même type d'accès qu'une page HTML globale aurait. Ceci est ma solution de travail, imaginez que vous souhaitez connaître la valeur du paramètre "FOO" dans le script injecté: Code de script injecté: p> code HTML global: < / p> espère que cela aide! p> Poste initial: strong> J'ai le même 2ème problème que toi, je Impossible d'accéder à mes paramètres (ou sécurisées) à partir d'un script injecté. Dans mon cas, le script est chargé après la charge de la page, mais même ainsi, je ne peux pas utiliser La seule façon dont il fonctionne est avec une barre d'outils / bouton, le bouton HTML derrière cet élément peut Ma conclusion est que, pour une raison quelconque, les scripts injectés ne peuvent pas accéder à Paramètres (en fait, ils ne semblent même pas avoir accès à l'élément code> Safari code>). Fonction bug ou prévu, qui reste à comprendre. P> p>
Safari.extension.Settings code>. P>
getItem code> et
SETITEM code> comme prévu. p>
Jetez un coup d'œil aux mises à jour que j'ai ajoutées ci-dessus. Je sais maintenant pourquoi i> vous ne pouvez pas accéder aux paramètres et j'ai même indiqué comment leur atteindre (même si cela ne fonctionne pas pour moi pour d'autres raisons).
Je viens de trouver une solution pour mon problème, il est affiché ci-dessus pour vous ou quelqu'un d'autre avec le même problème. Peut-être que vous pouvez l'adapter pour votre cas!
Merci pour la mise à jour. Dans mon cas, tout le travail est effectué Beforeload code>, de sorte que l'objet de la page est indéfini qui semble signifier que la méthode
DispatchMessage () code> n'est pas disponible. Je cherche toujours une solution de contournement à cela.
Cela m'a fallu plusieurs jours, mais je pense avoir trouvé une solution réalisable à l'aide de la méthode de messagerie code> (code>. Mon script d'injection récupère les paramètres en appelant la page HTML globale comme suit:
settings = { 'setting1': safari.extension.settings.getItem( 'setting1' ) } msgEvent.message = settings;
Comme tout le monde à ce stade, je grimpe toujours la courbe d'apprentissage, mais voici comment j'ai géré ce problème:
J'ai une simple extension sans chrome et un script final injecté (script.js) . Dans le but de charger les paramètres, j'ai ajouté une page globale simple (proxy.html). Lorsque Script.js est injecté, il envoie un message code> getSettings code> à proxy.html. proxy.html répond avec un message code> SetSettings code> et script.js poursuit l'initialisation. P>
La page la plus utile que j'ai trouvée dans les docs sur ce sujet est Messages et proxies . P>
proxy.html: p> script.js: p>
Rick, tu es une sauvetage! Merci beaucoup pour cela.
Concentrez-vous dans le même problème, mais la réponse est plus facile que vous ne pouvez l'imaginer: incluez le script de votre HTML global.
switch (event.name) { case "getSettings": // send the settings data event.target.page.dispatchMessage("SETTINGS", safari.extension.settings);