Um script greasemonkey pode saber o que foi carregado em outra guia?

1

Estou planejando escrever um script Greasemonkey que será executado em uma determinada URL (@include ou @ match), mas, gostaria de tê-lo para que, se eu abrir uma ou mais guias adicionais com o mesmo URL, o script Greasemonkey NÃO será executado na segunda (e mais) página duplicada.

Por exemplo, digamos que eu tenha um script Greasemonkey que faça alterações de "estilo" em uma página da Web (ou, de alguma outra forma, "modifique") quando eu abro o "google.com". Eu quero ser capaz de abrir outra guia para "google.com", onde o script Greasemonkey não será executado. Ou, mais corretamente, será executado, mas irá detectar que ele já está sendo executado e "modificando" a página na primeira guia e, em seguida, "sair" na segunda guia. A segunda guia permanecerá aberta, mas é "não afetada" pelo script.

Eu não sei se um script Greasemonkey pode "ver" outras abas abertas, mas se puder, meu primeiro pensamento foi verificar se outra aba já estava carregada naquela página e, em seguida, sair se ela achasse que estava.

Mas teria que ser um pouco mais complicado do que isso porque:

  1. Se a primeira guia foi fechada e uma nova guia ("terceira") foi aberta para essa URL, eu gostaria que o script Greasemonkey fosse executado e "modificasse" essa página como ela teria na primeira página.
  2. Da mesma forma, se eu "atualizar" a primeira guia (digamos, depois de editar o script Greasemonkey ou por outro motivo), eu gostaria que o script Greasemonkey fosse executado e "modificasse" a página recarregada.

Então, parece que o script Greasemonkey teria que:

  1. Verifique a URL da outra guia para encontrar uma "correspondência" e, em seguida, "Visualizar essa guia" para ver se o script Greasemonkey estava modificando "ativamente" essa página (talvez procure um DIV oculto, vazio, chamado "DIV"). "ou outro elemento).
  2. Use algum tipo de "armazenamento local" ou "variáveis globais (superglobais?) de referência cruzada" para acompanhar as guias quando elas são abertas e fechadas.

Não estou procurando alguém para escrever este roteiro para mim, sinto que sou capaz de escrever o roteiro se soubesse como fazer algumas coisas. Se um script que faz tudo ou a maior parte disso já existe, então seria ótimo também.

Para começar, preciso saber se (e como) um script do Greasemonkey:

  1. Pode "ver" outras guias.
  2. É possível ler os URLs (e talvez o texto "título") das outras guias.
  3. Verifique a existência de elementos (e talvez leia, mas não escreva) na outra guia.
  4. Gerenciar "armazenamento local (computador)" ou gerenciar "variáveis globais de referência cruzada" (se isso pode ser feito até mesmo).
por Kevin Fegan 25.11.2015 / 19:11

1 resposta

4

O Greasemonkey não pode:

  1. Veja outras guias.
  2. Verifique os URLs de outras guias.
  3. Verifique se há nós / elementos DOM em outras guias.

O motivo é que o Greasemonkey, o Tampermonkey, etc. não expõem essas APIs a / para scripts de usuários.
(Completas extensões de navegador podem fazer todas essas coisas.)


Greasemonkey pode:

  1. Cruze a comunicação entre instâncias de script usando GM_setValue() Doc e GM_getValue() Doc .
  2. Às vezes, você também pode usar .postMessage() . ( Exemplo )
    Isso provavelmente só funcionará se você usar window.open para criar a nova guia.
  3. Como você está no mesmo domínio, também é possível usar localStorage ou cookies para comunicação cruzada.
  4. Finalmente, se as novas guias forem abertas na guia principal, você se comunicará com a nova guia por meio de parâmetros de URL (ou o hash). Veja este userscript para um exemplo disso. (Observe como os links do SEMC são tratados.)

I'm not looking for someone to write this script for me, I feel I'm capable of writing the script if I knew how to do a few things. If a script that does all or most of this already exists then that would be great too.

Todos os bits e peças foram abordados no Stack Overflow, mas não em nenhuma pergunta que eu me lembre.

Se você usar variáveis para se comunicar (métodos 1 ou 3), certifique-se de ter algo como um manipulador de eventos beforeunload para limpar as variáveis antes que a página mestra seja fechada.

    
por 25.11.2015 / 21:02