Domanda

Sono in procinto di costruire il mio primo ampliamento Safari - molto semplice - ma ho incontrato un paio di problemi. L'estensione si riduce a un singolo script, iniettata che i tentativi di bypassare il gestore di alimentazione nativa e reindirizzamento a un http: // URI. I miei problemi finora sono due:

  1. La "lista bianca" non funziona il modo in cui mi aspetto. Dal momento che tutti i feed vengono visualizzati sotto il "mangime: //" Protocollo, ho cercato di catturare che nella lista bianca come "mangime: // * / *" (con niente nella lista nera), ma io alla fine in una richiesta ciclo che non riesco a capire. Se ho impostato lista nera i valori di " http: // * / * " e " https: //. * / * ", tutto funziona come previsto
  2. Non riesco a capire come accedere le mie impostazioni dal mio script iniettato. Lo script crea un gestore di eventi beforeload, ma non può accedere le mie impostazioni utilizzando il percorso safari.extension.settings indicati nella documentazione.

Non ho trovato nulla nella documentazione di Apple per indicare che le impostazioni non dovrebbero essere disponibili dal mio script. Poiché le estensioni sono una nuova funzionalità quali, anche i rendimenti di Google limitati risultati rilevanti e la maggior parte di coloro che sono dalla documentazione ufficiale.

Che cosa mi manca?

Aggiorna Così sto sperando che la documentazione è incompleta perché è borderline abissale, ma ho imparato un po 'di impostazioni. Si scopre che, dagli script di iniezione, l'oggetto SafariExtensionSettings non è disponibile. script di iniezione hanno solo accesso all'oggetto SafariContentExtension (che non è utile a tutti), ma è alias esattamente nello stesso modo (safari.extension.settings) - cattiva idea, IMO. Come indicato nel iniezione documentazione dello script :

  

Importante: quando si utilizza safari.extension dall'interno di uno script iniettato, si è non affrontare la classe SafariExtension. Si sta affrontando la classe SafariContentExtension.

È necessario utilizzare il sistema di messaggistica di parlare con un file HTML globale che ha accesso alle impostazioni. È un po 'Loopy, ma ho un messaggio che viene inviato a un file global.html che recupera le impostazioni e le invierà un messaggio a tornare il mio script di iniezione appena ho capire come fare per farlo.

Dal momento che sto facendo tutto il mio lavoro prima del caricamento del documento, tutti i metodi che ho trovato per inviare un messaggio Indietro si basano su un oggetto di pagina che non ho.

È stato utile?

Soluzione 3

Mi ci sono voluti diversi giorni, ma credo di aver trovato una soluzione praticabile utilizzando il metodo di messaggistica canLoad(). Il mio script iniezione recupera impostazioni chiamando la pagina HTML globale come questo:

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

Il mio file HTML globale, a sua volta, torna tali impostazioni come:

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

msgEvent.message = settings;

E 'ancora un po' di più "hacky" di quanto mi piacerebbe. Non riesco a tornare semplicemente le impostazioni di per sé oggetto, quindi devo compilare un nuovo oggetto recuperando ogni impostazione manualmente. Non è l'ideale, ma sembra essere efficace.

Altri suggerimenti

Come tutti gli altri, a questo punto, sono ancora salire la curva di apprendimento, ma ecco come ho gestito questo problema:

Ho una semplice estensione senza cromo e uno script di fine iniezione (script.js). Al fine di caricare le impostazioni ho aggiunto una semplice pagina globale (proxy.html). Quando script.js viene iniettato, invia un messaggio a getSettings proxy.html. risponde proxy.html con un messaggio setSettings e script.js continua l'inizializzazione.

La pagina più utile che ho trovato nella documentazione su questo argomento è noreferrer Messaggi e Proxy .

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" );
}() )

Modifica come hai detto nel tuo post iniziale di aggiornamento, lo script iniettato non ha lo stesso tipo di accesso che una pagina HTML globale avrebbe. Questa è la mia soluzione di lavoro, immaginare che si desidera conoscere il valore di impostazione "pippo" nello script iniettato:

codice di script iniettato:

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

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

Spero che questo aiuti!


post iniziale: Sto avendo lo stesso secondo problema come voi, io non è possibile accedere le mie impostazioni (o secureSettings) da uno script iniettato. Nel mio caso lo script viene caricato dopo il caricamento della pagina, ma anche in questo modo non posso usare safari.extension.settings.

L'unico modo in cui funziona è con un pulsante / barra degli strumenti, il codice HTML dietro quella elemento può getItem e setItem come previsto.

La mia conclusione è che, per qualche motivo, gli script possono iniettato impostazioni non di accesso (in realtà, non hanno nemmeno sembrano avere accesso all'elemento safari). Bug o funzionalità previsto, quello che resta da capire.

incontrato lo stesso problema, ma la risposta è più facile di quanto si possa immaginare: comprendono lo script nel tuo html globale

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

quindi è possibile accedere alle impostazioni come descritto nella documentazione safari.extension.settings.myKey

si può anche upvote @Travis, perché ho avuto l'idea da suo posto

// EDIT:
in realtà io non so davvero che cosa è sbagliato. Chiamando le impostazioni come le prime opere di comando, ma non in un secondo momento. Inoltre sembra corrompere il mio script completo dopo il 2. iniezione. verifica necessità se è solo nella mia (difficile?) script.

// EDIT2:
ora ho capito a lavorare per tornare alle impostazioni oggetto tramite dispatchMessage()

nel vostro 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");

e in global.html

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

questo documentazione mela

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top