https://wiki.greasespot.net/Greasemonkey_Manual :API
Die Greasemonkey-APIs sind im Allgemeinen privilegierte Aktionen und im Allgemeinen alle synchronen Aktionen. Inhaltsskripte haben (fast) keinen API-Zugriff und müssen daher Nachrichten weitergeben, um privilegierte Aktionen auszuführen. Weberweiterungen erhalten nur eine synchrone Nachrichtenweitergabe (Zitat erforderlich).
Jede Methode hat also ihre eigenen Herausforderungen.
Einfacher:
GM_getResourceURL
muss synchron ein Ergebnis liefern, ist aber trivial zu berechnen.GM_addStyle
ist trivial.GM_log
sollte wahrscheinlich eingestellt oder einfach console.log
.GM_openInTab
funktionell zu keinem Ergebnis, selbst die Reihenfolge ist nicht kritisch.GM_registerMenuCommand
hat kein synchrones Verhalten.GM_setClipboard
führt zu keinem Ergebnis.GM_xmlhttpRequest
ist vollständig asynchron.Schwerer:
GM_deleteValue
führt zu keinem Ergebnis. Die Reihenfolge ist immer noch wichtig (dh das Löschen von X muss vor jedem zukünftigen Satz von X erfolgen).GM_setValue
entspricht dem Löschen. Kein synchrones Ergebnis, aber die Reihenfolge ist wichtig.Sehr schwer:
GM_getValue
muss synchron ein Ergebnis produzieren.GM_listValues
muss synchron ein Ergebnis produzieren. (Außerdem bietet der AFAICT- Speicher keine gute unterstützende API. Die einzige Option besteht darin, einen Wert nach Namen abzurufen oder alle Namen und Werte abzurufen. Ohne Möglichkeit, z. B. durch Skripte zu trennen.)GM_getResourceText
müssen ein Ergebnis synchron erzeugen, und es können sehr große Werte sein. (Dh sie alle im Arbeitsspeicher vorab zwischenzuspeichern ist wahrscheinlich zu teuer.)bug1323433 und bug1332273 könnten hier von Interesse sein.
Danke für die Hinweise, ich stimme zu, dass beide super nützlich sind.
Oh, vielleicht ist eine gewisse Menge an synchroner Nachrichtenweitergabe möglich!
Testen Sie dies. Ermöglicht dies die Verwendung einer einfachen synchronen Implementierung (unterstützt durch Nur-Hintergrund-APIs) für die oben genannten Methoden?
Dies gibt ein Versprechen auf der Inhaltsseite zurück, sodass es effektiv asynchron ist. Ich denke, "synchron" ist hier eine falsche Bezeichnung, es ist eher so, als würde man eine Nachricht von einem Kind an ein Elternteil mit einer Antwort koppeln, damit man ausstehende Antworten nicht manuell verfolgen muss.
Afaik die einzige verfügbare synchrone API sind Sync-XHRs, die dann mit Webrequest oder ähnlichem abgefangen werden könnten.
Die Synchronisierung von XHR funktioniert im Inhaltsskript nicht richtig: https://bugzilla.mozilla.org/show_bug.cgi?id=1360968, daher haben wir derzeit keinen Synchronisierungskanal von Inhalt > Hintergrund.
Sieht so aus, als ob GM_setValue
und GM_getValue
als Synchronisierungsvorgang konzipiert wurden und in einem einzelnen Prozessbrowser funktionieren sie gut, wenn wir in mehreren Registerkarten arbeiten, aber in e10s nein (https://github.com/greasemonkey /greasemonkey/issues/2427). Mit der alten Erweiterungs-API lässt es sich leicht reparieren, in WebExt jedoch nicht. Ohne Sync-Nachricht (auch für kleine Daten, nur kurze Werte ausgeben) können wir den Wert zwischen mehreren Registerkarten nicht richtig synchronisieren. Irgendwann wird dies immer eine Rennbedingung sein.
Unabhängig davon, wie Sie die oben genannten Probleme in der WebExt-Version lösen, sollten wir eine neue asynchrone set/get-Methode erhalten, damit wir das Skript, wo es wichtig ist, asynchron schreiben können. Dokumentationen sollten einige Informationen über das Verhalten von GM_setValue
und GM_getValue
, wenn auf mehreren Registerkarten gearbeitet wird.
Imo, es gibt seltene Anwendungsfälle, in denen GM_setValue
/ GM_getValue
auf mehreren Registerkarten verwendet wird und die Reihenfolge eingehalten werden muss. Daher sollte das Speichern einer Kopie (Cache) von _GM_values_ im Inhaltsskript, das Lesen immer aus dem Cache, das asynchrone Zurückschreiben und das Aktualisieren des Caches mit Ereignissen, die durch das Hintergrundskript ausgelöst werden, eine akzeptable Lösung sein.
Übrigens, wenn ja, fügen Sie ein API-Äquivalent zu GM_addValueChangeListener
wenn möglich. (und ich mag den Namen nicht addValueChangeListener
etwas anderes sollte vielleicht besser sein
In meinem Dev-Zweig gibt es Unterstützung für:
GM.getResourceURL
GM.deleteValue
, GM.getValue
, GM.listValues
, GM.setValue
Ich habe vor, niemals hinzuzufügen :
GM_log
GM_addStyle
Wir brauchen noch :
GM_xmlhttpRequest
Ich plane zu verzögern (oder vielleicht fallen zu lassen):
GM_registerMenuCommand
(dieser war schon immer ein enormer Supportaufwand)GM_getResourceText
Was bedeutet, dass der Fortschritt hier tatsächlich ziemlich nahe ist.
Gutes Feedback zu obigem Commit, nicht vergessen.
Ich habe gerade das neue Add-On ausprobiert. Es scheint, dass die domänenübergreifende xhr-Anfrage bereits ohne GM_xhr-Funktionen aktiviert wurde. Ist das wirklich ein Verhalten?
Versuchen Sie es einfach mit einem Userscript-Grant None mit den folgenden Codes:
fetch(prompt()).then(resp => resp.text()).then(text => alert(text)).catch(error => alert(error));
Äh, bestätigt. Wir führen derzeit Benutzerskripte als "Inhaltsskripts" aus – der Erweiterung mit allen Berechtigungen der Erweiterung.
Ich habe mir das ein wenig angesehen, aber bisher tappte ich im Dunkeln, wie man unprivilegierten Code ("Web-Bereich" - wie nennen wir das jetzt, da "Inhalt"-Bereich mehrdeutig ist?!)) ausführt. Das nächste, was ich finden kann, ist das Erstellen von Skript-Tags, die vom CSP der Seite blockiert werden können/werden, was ich definitiv nicht möchte.
Derzeit besteht die einzige Möglichkeit zum Ändern von CSP darin, die Header für jede Dokumentanforderung abzufangen und zu ändern. Es gibt noch offene Fragen, um Weberweiterungen von Content-CSPs auszunehmen, aber es scheint nicht viel diesbezüglich zu geben.
Neben dem Einfügen von <script>
Tags sollte window.eval
auch im Seitenbereich laufen, denke ich.
Die offiziellen Begriffe sind "Inhaltsskriptbereich" vs. "Seitenbereich".
Ein weiteres Problem besteht darin, dass sie eine String-Verarbeitung benötigen, um sie in einen separaten Bereich einzuschließen, der die GM-APIs definieren könnte.
Ich habe auch einen Fehler für Sandbox
Äquivalente in Weberweiterungen gemeldet, aber er hat auch keine hohe Priorität.
Sowohl Skript als auch eval von AIUI sind anfällig für Blockierungen durch CSP. Aber ich habe bestätigt, dass eval Privilegien verliert.
https://bugzilla.mozilla.org/show_bug.cgi?id=1391669
Wir müssen <all_urls>
wenn wir möglicherweise ein Inhaltsskript auf einer beliebigen Seite ausführen möchten. Wenn wir danach fragen, bekommt unser Inhaltsskript das und kann XHR überall hin senden.
Zumindest in Firefox ( https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Content_scripts#Using_eval ()_in_content_scripts ) können wir bis zum Seitenbereich herunterfallen, aber dann sind wir wirklich Seitenbereich und wir kann APIs dem Skript nicht sicher zugänglich machen, ohne es für alles/alles auszusetzen, was auf der Seite (AFAIK) ausgeführt wird, was noch schlimmer ist.
Können fetch und xhr im Content-Skript überschrieben werden?
Stellen Sie möglicherweise einen modifizierten Abruf bereit, der seine eigene CORS-Überprüfung durchführt.
GM.xmlhttpRequest()
wurde hinzugefügt in 60a50d05b1e565571d8a3e638b0683a1a9c2beaaGM.getResourceText()
wird in #2548 behandeltGM.registerMenuCommand()
wird absichtlich übersprungen.@the8472 Siehe meine Implementierung von withUnsafeWindow()
in https://github.com/greasemonkey/greasemonkey/issues/2232#issuecomment -326841025
Es ahmt das Verhalten der alten with (object) ...
Funktion nach, nur ein bisschen sicherer. (Brauchen Sie moderne Browser.)
@arantius schrieb am 25. Juli :
Ich habe vor, niemals hinzuzufügen :
GM_log GM_addStyle
Diese wurden bei der Erstellung dieses Tickets (von @arantius am 3. März ) als trivial bezeichnet (unter der Annahme einer Zuordnung von GM_log zu console.log).
Nach meiner Erfahrung sind dies zwei der am häufigsten verwendeten API-Aufrufe. Würde es nicht viele alte Skripte grundlos brechen, wenn man sie aufgibt? Oder hast du dich ausschließlich auf den Dev-Zweig bezogen?
In Tampermonkey hat GM_addStyle
eine spezielle Fähigkeit, Stil einzufügen, der die CSP-Einschränkung umgehen kann (falls Inline <style>
verboten ist). Ich würde mich freuen, wenn wir diese Funktion auch in Greasemonkey haben können.
Hilfreichster Kommentar
In Tampermonkey hat
GM_addStyle
eine spezielle Fähigkeit, Stil einzufügen, der die CSP-Einschränkung umgehen kann (falls Inline<style>
verboten ist). Ich würde mich freuen, wenn wir diese Funktion auch in Greasemonkey haben können.