Question

Je suis en train de construire ma première extension de Safari - très simple - mais j'ai rencontré quelques problèmes. L'extension se résume à un seul, le script injecté qui tente de contourner le gestionnaire d'alimentation native et une redirection vers http: // URI. Mes questions à ce jour sont de deux ordres:

  1. Le « whitelist » ne fonctionne pas la façon dont je me attends. Étant donné que tous les flux sont présentés sous la « alimentation: // » protocole, j'ai essayé de capturer que dans la liste blanche comme « flux: // * / * » (avec rien dans la liste noire), mais je finis dans une demande boucle que je ne comprends pas. Si je mets liste noire valeurs de " http: // * / * " et « 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 gestionnaire d'événements beforeload, mais ne peut pas accéder à mes paramètres à l'aide du chemin de safari.extension.settings indiqué dans la documentation.

Je n'ai pas trouvé quoi que ce soit dans la documentation d'Apple pour indiquer que les paramètres ne devraient pas être disponibles à partir de mon script. Les extensions sont une telle nouvelle fonctionnalité, même Google rendements limités des résultats pertinents et la plupart d'entre eux sont de la documentation officielle.

Qu'est-ce que je manque?

UPDATE J'espère donc que la documentation est incomplète, car elle est abyssale de la limite, mais je l'ai appris un peu sur les paramètres. Il se trouve que, à partir de scripts d'injection, l'objet SafariExtensionSettings n'est pas disponible. scripts d'injection n'ont accès à l'objet SafariContentExtension (qui est pas du tout utile), mais il est aliasées exactement de la même manière (safari.extension.settings) - mauvaise idée, l'OMI. Comme il est indiqué dans le script injection documentation :

  

Important: Lorsque vous utilisez safari.extension à partir d'un script injecté, vous ne réglons pas la classe SafariExtension. Vous abordez la classe SafariContentExtension.

Vous devez utiliser le système de messagerie pour parler à un fichier HTML global qui a accès aux paramètres. Il est un peu loufoque, mais j'ai un message envoyé à un fichier global.html qui récupère les paramètres et enverront un retour de message à mon script d'injection dès que je savoir comment s'y faire.

Depuis que je fais tout mon travail avant le chargement de documents, toutes les méthodes que j'ai trouvé pour envoyer le message retour se fondent sur un objet page que je n'ai pas.

Était-ce utile?

La solution 3

Il m'a fallu plusieurs jours, mais je pense que j'ai trouvé une solution viable en utilisant la méthode de messagerie canLoad(). Mon script d'injection récupère les paramètres en appelant la page globale HTML comme ceci:

settings = safari.self.tab.canLoad( event );

Mon fichier global HTML, à son tour, renvoie ces paramètres comme:

settings = {
  'setting1': safari.extension.settings.getItem( 'setting1' )
}

msgEvent.message = settings;

Il est encore un peu plus « aki » que je voudrais. Je ne peux pas sembler revenir simplement les paramètres lui-même objet, donc je dois compiler un nouvel objet en récupérant chaque paramètre manuellement. Pas idéal, mais il ne semble pas être efficace.

Autres conseils

Comme tout le monde à ce moment, je suis encore grimper la courbe d'apprentissage, mais voici comment je l'ai traité ce problème:

J'ai une simple extension sans chrome et un script final injecté (script.js). Aux fins des paramètres de chargement, j'ai ajouté une page globale simple (proxy.html). Lorsque script.js est injecté, il envoie un message à getSettings proxy.html. répond proxy.html avec un message de setSettings et script.js continue initialisation.

La page la plus utile que j'ai trouvé dans la documentation sur ce sujet est Messages noreferrer et de proxies.

proxy.html:

<!doctype html>
<html lang="en">
<head>
  <script type="text/javascript">
    safari.application.addEventListener( "message", function( e ) {
      if( e.name === "getSettings" ) {
        e.target.page.dispatchMessage( "setSettings", {
          sort_keys: safari.extension.settings.getItem( "sort_keys" )
        } );
      }
    }, false );
  </script>
</head>
<body></body>
</html>

script.js:

( function() {
  var settings, init = function() {
    // do extension stuff
  };

  // listen for an incoming setSettings message
  safari.self.addEventListener( "message", function( e ) {
    if( e.name === "setSettings" ) {
      settings = e.message;
      init();
    }
  }, false );

  // ask proxy.html for settings
  safari.self.tab.dispatchMessage( "getSettings" );
}() )

EDIT: comme vous l'avez dit dans votre mise à jour post initial, le script injecté n'a pas le même genre d'accès qu'une page globale HTML aurait. Ceci est ma solution de travail, imaginez que vous voulez connaître la valeur de réglage « foo » dans le script injecté:

code de script Injecté:

function getMessage(msgEvent) {

    if (msgEvent.name == "settingValueIs")
        alert("Value for asked setting is: " + msgEvent.message);

}

safari.self.tab.dispatchMessage("getSettingValue", "foo"); // ask for value
safari.self.addEventListener("message", getMessage, false); // wait for reply

Code mondial HTML:

function respondToMessage(messageEvent) {

    if (messageEvent.name == "getSettingValue") {

           // getItem("foo");
        var value = safari.extension.settings.getItem(messageEvent.message);
        // return value of foo to injected script
           safari.application.activeBrowserWindow.activeTab.page.dispatchMessage("settingValueIs", value);

    } 

}

safari.application.addEventListener("message",respondToMessage,false);

Hope this helps!


Message initial: Je vais avoir le même problème que vous 2, je ne peux pas accéder à mes paramètres (ou secureSettings) à partir d'un script injecté. Dans mon cas, le script est chargé après chargement de la page, mais même de cette façon je ne peux pas utiliser safari.extension.settings.

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

Ma conclusion est que, pour une raison quelconque, injecté des scripts paramètres ne peuvent pas accéder (en fait, ils ne semblent même avoir accès à l'élément de safari). Bug ou une fonction destinée, qui reste à comprendre.

exécuter le même problème, mais la réponse est plus facile que vous pouvez imaginer: inclure le script dans votre code html global

.
<!DOCTYPE HTML>
<script type="text/javascript" src="cleanup.js"></script>
<script>
…
</script>

vous pouvez accéder aux paramètres tels que décrits dans la documentation safari.extension.settings.myKey

vous pouvez également upvote @Travis, parce que j'ai eu l'idée de son poste

// EDIT:
en fait je ne sais pas vraiment ce qui est erroné. Appeler les paramètres que les premiers travaux de commande, mais pas plus tard. En outre, il semble corrompre mon script complet après la 2. injection. vérification de besoin si elle est seulement dans mon script (difficile?).

// EDIT2:
maintenant je l'ai eu à travailler pour récupérer les paramètres objet via dispatchMessage()

dans votre injected.js

function gotSettings(msgEvent) {
   if (msgEvent.name === "SETTINGS") {
      setts = msgEvent.message;
      alert(setts.mySetting1);
      // run the programm
   }
}

safari.self.addEventListener("message", gotSettings, false);
safari.self.tab.dispatchMessage("getSettings");

et global.html

switch (event.name) {
case "getSettings":
   // send the settings data
   event.target.page.dispatchMessage("SETTINGS", safari.extension.settings);

ce documentation apple

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top