12
votes

Questions d'extension de safari

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:

  1. Le "Whitelist" ne fonctionne pas comme je m'attendais. Étant donné que tous les flux sont montrés sous le protocole "Nourriture: //", j'ai essayé de capturer cela dans la liste blanche comme "nourrir: // * / *" (avec rien dans la liste noire), mais je me retrouve dans une demande boucle que je ne peux pas comprendre. Si je définis liste noire de " http: // * / * " et " href = "https: // * / *" rel = "nfollow NOREFERRER"> https: // * / * ", tout fonctionne comme prévu.
  2. Je ne peux pas comprendre comment accéder à mes paramètres de mon script injecté. Le script crée un Beforeload manipulateur d'événements, mais je ne peux pas accéder à mes paramètres à l'aide du chemin Safari.extension.Settings indiqué dans la documentation.

    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.

    Qu'est-ce que je manque?

    mise à jour 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 n'est pas disponible. Les scripts d'injection ont seulement accès à l'objet SafaricontExtension (qui n'est pas utile du tout), mais il est aliasé de la même manière ( Safari.extension.Settings ) - mauvaise idée, imo. Comme indiqué dans le Documentation de script d'injection :

    Important: lorsque vous utilisez Safari.extension à partir d'un script injecté, vous ne répondez pas à la classe Safariextension. Vous abordez la classe SafaricontExtension.

    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 qui récupère les paramètres et enverra un message à mon script d'injection dès que je ne comprendrai comment faire cela.

    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 s'appuient sur un objet de page que je n'ai pas.


0 commentaires

4 Réponses :


3
votes

edit: 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é: xxx

code HTML global: < / p> xxx

espère que cela aide!


Poste initial: 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 Safari.extension.Settings .

La seule façon dont il fonctionne est avec une barre d'outils / bouton, le bouton HTML derrière cet élément peut getItem et SETITEM comme prévu.

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 Safari ). Fonction bug ou prévu, qui reste à comprendre.


3 commentaires

Jetez un coup d'œil aux mises à jour que j'ai ajoutées ci-dessus. Je sais maintenant pourquoi 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 , de sorte que l'objet de la page est indéfini qui semble signifier que la méthode DispatchMessage () n'est pas disponible. Je cherche toujours une solution de contournement à cela.



2
votes

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;


0 commentaires

6
votes

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 getSettings à proxy.html. proxy.html répond avec un message SetSettings et script.js poursuit l'initialisation.

La page la plus utile que j'ai trouvée dans les docs sur ce sujet est Messages et proxies .

proxy.html: xxx

script.js: xxx


1 commentaires

Rick, tu es une sauvetage! Merci beaucoup pour cela.



1
votes

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);


0 commentaires