Sie müssen dem Skript auf beliebige Weise einen "Grant" hinzufügen ...
Greasemonkey 1.0 fügt einen speziellen Metadatenblock-Imperativ hinzu: @grant.
If a script does not specify any @grant values, Greasemonkey 1.0-1.9 will attempt to auto-detect the right settings. From GreaseMonkey 2.0, @grant none is assumed by default, if no other values are specified.[1] If a script specifies any values (or they were auto detected), then it will be provided with only those API methods that it declares. The valid values are unsafeWindow, and the names of those GM_ prefixed values that you wish your script to be granted access to. Otherwise the script will be granted no special API privileges, and thus run without the security constraints Greasemonkey scripts have traditionally had. If you want your script to operate in this mode, you should explicitly declare @grant none.
Beispiele
Es ist üblich, dass Skripts (bei der letzten Zählung mehr als die Hälfte) überhaupt keine speziellen APIs verwenden. Wenn Sie explizit darum bitten, keine besonderen Berechtigungen zu erhalten, bedeutet dies, dass das Skript direkt auf der Inhaltsseite ausgeführt wird. Dies bedeutet keine Sicherheits-Sandbox und keine ihrer Einschränkungen. Der Zugriff auf Variablen auf der Seite funktioniert einfach, der Aufruf von Funktionen und das Lesen der Ergebnisse funktioniert ebenfalls. Dazu einfach:
// ==UserScript== // @name Grant None Example (can be omitted since GM 2.0) // @include http* // @grant none // ==/UserScript== console.log('This script grants no special privileges, so it runs without security limitations.');
Wenn Sie eine von Greasemonkeys APIs verwenden, sollten Sie explizit darum bitten, dass Ihr Skript dafür vergeben wird:
// ==UserScript== // @name Grant Some Example // @include http* // @grant GM_getValue // @grant GM_setValue // ==/UserScript== var counter = GM_getValue('counter', 0); console.log('This script has been run ' + counter + ' times.'); GM_setValue('counter', ++counter);
In diesem Fall fordert das Skript den Zugriff auf beide GM_getValue
und jeweils GM_setValue
einen in jeder @grant
Zeile. Geben Sie den Namen einer Greasemonkey-API an, der Zugriff darauf gewährt werden soll. (Alle Skripte werden immer GM_info
ohne ausdrückliche Anforderung abgerufen.) Vorübergehend würde dies auch funktionieren:
// ==UserScript== // @name Grant Legacy Example // @include http* // ==/UserScript== var counter = GM_getValue('counter', 0); console.log('This script has been run ' + counter + ' times.'); GM_setValue('counter', ++counter);
Dieses Beispiel funktioniert in Greasemonkey Version 1.0. Wenn keine @ grant-Zeilen vorhanden sind, versucht Greasemonkey festzustellen, welche APIs verwendet werden, und verhält sich so, als wären diese @ grant-Zeilen angegeben worden. Diese Erkennung kann in bestimmten Fällen fehlschlagen, insbesondere wenn eval()
verwendet wird.
Alle vor @grant geschriebenen Skripts sollten aus diesem Grund weiterhin funktionieren. Sie sollten Ihre Skripts jedoch so ändern, dass sie @grant so bald wie möglich angeben, damit sie in Zukunft nicht kaputt gehen. Kompatibilitätsebene
Viele der Greasemonkey-APIs wurden durch Webstandards wie DOM Storage dupliziert. Wenn Sie immer davon ausgehen, dass Ihr Skript nur in einer einzigen Domäne ausgeführt wird, können Sie @grant none verwenden und die Kompatibilität erhöhen, ohne dass dabei sofort Nachteile entstehen. Verwenden Sie einfach eine @require-Bibliothek, um Greasemonkey-APIs mit jetzt standardmäßigen Browserfunktionen zu emulieren:
// ==UserScript== // @name Grant None Example, With Shim // @include http://www.example.com/* // @grant none // @require https://gist.githubusercontent.com/arantius/3123124/raw/grant-none-shim.js // ==/UserScript== var counter = GM_getValue('counter', 0); console.log('This script has been run ' + counter + ' times.'); GM_setValue('counter', ++counter);
Dieses Skript funktioniert genauso wie das obige Beispiel, mit der Ausnahme, dass das Grant-None-Shim die API-Emulation mit Standardbrowserfunktionen bereitstellt. Wenn die Shim-Kompatibilitätsebene gut genug für Ihr Skript funktioniert, ist dies das Beste aus beiden Welten. Umfang
In diesem Fall hat das Benutzerskript immer noch einen eigenen globalen Gültigkeitsbereich, der sich vom globalen Gültigkeitsbereich der Inhaltsseite unterscheidet. Dies bedeutet, dass eine oberste Ebene var x = 1;
für den Inhaltsbereich nicht sichtbar ist und somit die Seite nicht beschädigt wird (dh, wenn eine Variable x einen anderen Wert hat.) Um Werte in den Inhaltsbereich zu schreiben, tun Sie window.x = 1;
.
Wenn Sie @require
eine Version von jQuery, wird es zuweisen implizit window.$
und window.jQuery
. Wenn die von Ihnen ausgeführte Seite von einer anderen Version von jQuery abhängt, kann dies die Seite beschädigen. Führen Sie auf der obersten Ebene Ihres Skripts Folgendes aus, um dieses Problem zu umgehen:
this.$ = this.jQuery = jQuery.noConflict(true);
Dieser Code speichert einen jQuery-Verweis (in den globalen Gültigkeitsbereich des Skripts, wenn dieser im Grant-None-Modus ausgeführt wird), entfernt ihn jedoch aus dem Fenster (dem globalen Inhaltsbereich) und stellt alles wieder her, was dort ursprünglich gespeichert wurde.