Safari-Erweiterung Fragen
Ich bin in den Prozess des Aufbaus meine erste Safari-Erweiterung-eine sehr einfache-aber ich habe ein paar Probleme. Die Erweiterung läuft darauf hinaus, eine einzige, injizierte Skript, das versucht zu umgehen, um den systemeigenen feed-handler und-Umleitung auf einen http -://- URI. Meine Themen bisher sind von zweierlei Art:
- Die "whitelist" nicht so funktioniert, wie ich es erwarten würde. Da alle feeds angezeigt werden, unter "feed://" Protokoll, habe ich versucht, zu erfassen, die in die whitelist als "feed://*/*" (mit nichts in der blacklist), aber ich am Ende in einem Anfrage-Schleife, die ich nicht verstehen kann. Wenn ich blacklist Werte von "http://*/*" und "https://*/*", funktioniert alles wie erwartet.
- Ich kann nicht herausfinden, wie Zugriff auf meine Einstellungen aus meinem Skript injiziert. Das Skript erstellt eine
beforeload
event-handler, kann aber keinen Zugriff auf meine Einstellungen mit dersafari.extension.settings
Pfad angegeben in der Dokumentation.
Habe ich noch nicht gefunden, was in der Apple-Dokumentation, um anzuzeigen, dass die Einstellungen nicht frei ist von meinem script. Da Erweiterungen wie eine neue Funktion, die auch Google gibt begrenzte relevanten Ergebnisse und die meisten von denen sind aus der offiziellen Dokumentation.
Was bin ich?
UPDATE
Also ich bin der Hoffnung, dass die Dokumentation unvollständig ist, weil es grenzwertig miserabel, aber ich habe gelernt, ein wenig über die Einstellungen. Es stellt sich heraus, dass bei der Injektion von Skripts, die SafariExtensionSettings
Objekt ist nicht verfügbar. Injektion Skripte nur Zugriff auf die SafariContentExtension
- Objekt (das ist nicht sinnvoll, bei allen), aber es ist alias in genau der gleichen Weise (safari.extension.settings
)--schlechte Idee, IMO. Wie bereits in der injection-script Dokumentation:
Wichtig: Wenn Sie mit safari.Erweiterung innerhalb einer eingebundenen Skript, sind Sie nicht an die SafariExtension Klasse. Sie sind der Bewältigung der SafariContentExtension Klasse.
Verwenden Sie das messaging-system sprechen für eine Globale HTML-Datei, die den Zugriff auf die Einstellungen. Es ist irgendwie durchgeknallt, aber ich habe eine Nachricht gesendet an einen global.html
- Datei, ruft die Einstellungen und schickt eine Nachricht zurück zu meinem injection script, sobald ich herausfinden, wie man dies tun.
Da mache ich alle meine arbeiten, bevor das Dokument geladen wird, alle Methoden die ich gefunden habe, um eine Nachricht zu senden zurück verlassen Sie sich auf ein page-Objekt, dass ich nicht zu haben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie jeder andere an diesem Punkt, ich bin immer noch klettern die Lernkurve, aber hier ist, wie ich behandelt dieses problem:
Habe ich eine einfache extension mit kein Chrom, und man injiziert end Skript (script.js). Zum Zweck des be-Einstellungen habe ich Hinzugefügt, eine einfache Globale Seite (proxy.html). Wenn script.js injiziert wird, sendet es ein
getSettings
Nachricht an proxy.html. proxy.html reagiert mit einemsetSettings
Nachricht, und script.js weiterhin Initialisierung.Ist die hilfreichste Seite, die ich gefunden habe in den docs zu diesem Thema ist Nachrichten und Proxies.
proxy.html:
script.js:
EDIT: wie Sie sagten in Ihrem ersten post aktualisieren, das injizierte Skript muss nicht die gleiche Art von Zugriff auf ein globales HTML-Seite haben würde. Das ist meine funktionierende Lösung, stellen Sie sich vor, Sie möchten wissen, der Wert der Einstellung "foo" in dem eingebundenen Skript:
Injiziert script-code:
Globalen HTML-code:
Hoffe, das hilft !
Ersten post: ich bin mit dem gleichen 2. problem wie Ihr, habe ich keinen Zugriff auf meine Einstellungen (oder secureSettings) aus ein eingefügtes Skript. In meinem Fall wird das Skript geladen, nachdem die Seite geladen, aber auch so kann ich nicht verwenden
safari.extension.settings
.Die einzige Möglichkeit, die es funktioniert, ist mit einer Symbolleiste/Schaltfläche, die HTML-hinter diesem element können
getItem
undsetItem
als erwartet.Mein Fazit ist, dass aus irgendeinem Grund, injiziert Skripte können nicht auf die Einstellungen zugreifen (tatsächlich, Sie scheinen nicht einmal Zugang zu den
safari
element). Bug oder eine beabsichtigte Funktion, das bleibt herauszufinden.beforeload
, also das page-Objekt ist nicht definiert, das scheint zu bedeuten, dass diedispatchMessage()
Methode ist nicht verfügbar. Ich bin noch auf der Suche für eine Lösung für, die.Es dauerte mehrere Tage, aber ich glaube, ich fand eine praktikable Lösung, mit der
canLoad()
messaging-Methode. Mein injection-Skript ruft die Einstellungen durch aufrufen der global HTML-Seite wie diese:Meine Globale HTML-Datei, in der wiederum gibt die Einstellungen:
Es ist immer noch ein wenig "hacky", als ich möchte. Ich kann nicht scheinen, um einfach wieder die Einstellungen Objekt selbst, so dass ich zu kompilieren, wird ein neues Objekt durch Aufruf jede Einstellung manuell. Nicht ideal, aber es scheint, um wirksam zu sein.
laufen in das gleiche problem, aber die Antwort ist einfacher als Sie sich vorstellen können: fügen Sie das Skript in Ihrem globalen html.
dann können Sie Zugriff auf die Einstellungen, wie beschrieben in der Dokumentation
safari.extension.settings.myKey
können Sie auch upvote @Travis, da bekam ich die Idee, aus seinen posten
//EDIT:
eigentlich weiß ich nicht wirklich was falsch. Aufrufen der Einstellungen wie die der erste Befehl funktioniert, aber nicht zu einem späteren Zeitpunkt. Zusätzlich scheint es zu beschädigen meine komplette script nach dem 2. Injektion. Müssen die überprüfung, ob es nur in meinem (schwierigen?) script.
//EDIT2:
jetzt habe ich es zu arbeiten, um wieder die Einstellungen zu Objekt über
dispatchMessage()
in Ihrem
injected.js
und in
global.html
sich auf diese apple-Dokumentation