Safari Extension Domande
-
26-09-2019 - |
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:
- 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
- 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 percorsosafari.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.
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