Você precisa adicionar um "Grant" a esse script de qualquer maneira ...
O Greasemonkey 1.0 adiciona um imperativo especial do bloco de metadados: @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.
Exemplos
É comum que os scripts (mais da metade na última contagem) não usem APIs especiais. Para esses scripts, solicitar explicitamente que não sejam concedidos privilégios especiais significa que o script será executado diretamente na página de conteúdo. Isso significa que não há área restrita de segurança e nenhuma de suas limitações; portanto, acessar variáveis na página simplesmente funciona, chamar funções e ler seus resultados também funciona. Para fazer isso, basta:
// ==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.');
Se você usa uma das APIs de Greasemonkey, deve solicitar explicitamente que ela seja concedida ao seu script:
// ==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);
Nesse caso, o script está solicitando acesso a ambos GM_getValue
e GM_setValue
, um em cada @grant
linha. Especifique o nome de qualquer API do Greasemonkey para obter acesso a ela. (Todos os scripts sempre são obtidos GM_info
sem a solicitação específica.) Temporariamente, isso também funcionaria:
// ==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);
Este exemplo funcionará no Greasemonkey versão 1.0. Quando não há linhas @grant, o Greasemonkey tenta detectar quais APIs estão sendo usadas e age como se essas linhas @grant tivessem sido especificadas. Essa detecção pode falhar em certos casos, especialmente quando eval()
é usado.
Todos os scripts escritos antes do @grant devem continuar a funcionar por causa disso, mas você deve alterar seus scripts para especificar o @grant o mais rápido possível, para que não sejam interrompidos no futuro. Camada de compatibilidade
Muitas das APIs do Greasemonkey foram duplicadas por padrões da Web como o DOM Storage. Se você espera que seu script funcione em um único domínio, use o @grant none e sua compatibilidade aumentada sem nenhum inconveniente imediatamente. Basta usar uma biblioteca @require para emular APIs do Greasemonkey com os recursos do navegador agora padrão:
// ==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);
Esse script funcionará da mesma forma que o exemplo acima, exceto que o sh concession none está fornecendo emulação de API com recursos padrão do navegador. Quando a camada de compatibilidade com o shim funciona bem o suficiente para o seu script, esse é o melhor dos dois mundos. Escopo
Na concessão de nenhum caso, o script do usuário ainda possui seu próprio escopo global, distinto do escopo global da página de conteúdo. Isso significa que um nível superior var x = 1;
não será visível para o escopo do conteúdo e, portanto, não quebrará a página (ou seja, se depender de uma variável x ter um valor diferente.) Para escrever valores no escopo do conteúdo, faça window.x = 1;
.
Se você @require
possuir uma versão do jQuery, ela será atribuída implicitamente a window.$
e window.jQuery
. Se a página em que você executa depende de uma versão diferente do jQuery, isso pode danificá-la. Para contornar esse problema, em qualquer lugar no nível superior do seu script:
this.$ = this.jQuery = jQuery.noConflict(true);
Esse código salvará uma referência do jQuery (nele, o escopo global do script ao ser executado no modo de concessão de nenhum), enquanto o remove da janela (o escopo global do conteúdo) e restaura qualquer coisa originalmente armazenada nele.