Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

Modificando Página Web Baseado na URL

Para seguir este tutorial, você precisará instalar o SDK e ter conhecimento básico de jpm (Firefox 38 em diante) ou básico de cfx.

Para modificar qualquer página que combine com um padrão particular (por exemplo, "https://example.org/") a medida que elas são carregadas, use o módulo page-mod.

Para criar um page-mod, você precisa de duas coisas:

  • Um ou mais content scripts(script de conteúdo) para executar cuja tarefa é interagir com o conteúdo web.
  • Um ou mais patterns(padrões) para combinar com URLs que você quer modificar.

Um trecho simples de códingo onde o script de conteúdo é fornecido com a opção contentScript e o padrão de busca da URL é dado pela opção include como a seguir:

// Importe a API page-mod
var pageMod = require("sdk/page-mod");
 
// Crie um page-mod
// Ele executará um script toda vez que uma URL ".org" é carregada
// O script substitui o conteúdo da página por uma mensagem
pageMod.PageMod({
  include: "*.org",
  contentScript: 'document.body.innerHTML = ' +
                 ' "<h1>Page matches ruleset</h1>";'
});

Faça o seguinte:

  • Crie um novo diretório navegue para ele.
  • Execute jpm init ou cfx init
  • Abra o arquivo index.js e adicione o código acima (lib/main.js se estiver usando cfx)
  • Execute jpm run ou cfx run.
  • Abra no navegador o site ietf.org.

Abaixo é o que você deve ver.

Especificando o Padão a Combinar

O padrão de combinação usa a síntaxe match-pattern. Você pode passar uma única string como padrão a combinar ou um array.

Mantendo o Conteúdo do Script em um Arquivo Separado

No exemplo acima, nós fornecemos o script de conteúdo como uma string.

A menos que o script seja extremamente simples, é melhor manter o script em um arquivo separado. Isso torna o código mais fácil para manter, depurar, e revisar. Para fazer isso, você precisa:

  • Salvar o script no diretório "data" do add-on.
  • Use a opção contentScriptFile ao invés de contentScript e passe para ela a URL do script que pode ser obtida usando self.data.url("my-script.js"). A partir do Firefox 34, você pode usar "./my-script.js".

Por exemplo, se você salvar o script acima no diretório data do add-on em um arquivo chamado my-script.js:

// Importe a API page-mod
var pageMod = require("sdk/page-mod");
// Importe a API self
var self = require("sdk/self");
 
// Crie um page-mod 
// Ele executará um script toda vez que uma URL ".org" é carregada 
// O script substitui o conteúdo da página por uma mensagem
pageMod.PageMod({
  include: "*.org",
  contentScriptFile: self.data.url("my-script.js")
});

Ou a partir do Firefox 34:

// Importe a API page-mod
var pageMod = require("sdk/page-mod");
 
// Crie um page-mod
// Ele executará um script toda vez que uma URL ".org" é carregada
// O script substitui o conteúdo da página por uma mensagem
pageMod.PageMod({
  include: "*.org",
  contentScriptFile: "./my-script.js"
});

Carregando Múltiplos Scripts de Conteúdo

Você pode carregar mais do que um script, e eles podem interagir um com o outro.

Por exmeplo, você poderia reescrever o my-script.js para usar o jQuery.

$("body").html("<h1>Page matches ruleset</h1>");

Então baixe o jQuery para o diretório data do add-on, e carregue o script e o jQuery juntos (tenha certeza de carregar o jQuery primeiro).

// Importe a API page-mod
var pageMod = require("sdk/page-mod");
// Importe a API self
var self = require("sdk/self");
 
// Crie um page-mod
// Ele executará um script toda vez que uma URL ".org" é carregada
// O script substitui o conteúdo da página por uma mensagem
pageMod.PageMod({
  include: "*.org",
  contentScriptFile: [self.data.url("jquery-1.7.min.js"), self.data.url("my-script.js")]
});

Você pode usar ambos contentScript e contentScriptFile no mesmo page-mod. Se você fizer isto, o script carregado usando contentScriptFile são carregados primeiro.

// Importe a API page-mod
var pageMod = require("sdk/page-mod");
// Importe a API self
var self = require("sdk/self");
 
// Crie um page-mod
// Ele executará um script toda vez que uma URL ".org" é carregada
// O script substitui o conteúdo da página por uma mensagem
pageMod.PageMod({
  include: "*.org",
  contentScriptFile: self.data.url("jquery-1.7.min.js"),
  contentScript: '$("body").html("<h1>Page matches ruleset</h1>");'
});

Note, porém, que você não pode carregar um script de um site web. O script deve ser carregado do data.

Comunicando com o Script de Conteúdo

Seu script do add-on e o script de conteúdo não podem acessar diretamente a variável de um ou outro ou chamar função dos outros, mas eles podem enviar mensagens um para o outro.

Para enviar mensagens de um lado para o outro, use o emitente de chamadas port.emit() e receba respostas usando port.on().

  • No script de conteúdo, port é uma propriedade do objeto global self.
  • No script do add-on, você precisa capturar evento no onAttach event passando um objeto worker que contém a port.

Vamos reescrever o exemplo acima para passar uma mensagem do add-on para o script de conteúdo. A mensagem conterá o novo conteúdo para inserir dentro do documento

O script de conteúdo agora precisa parecer com isto:

// "self" é um objeto global no script de conteúdo
// Espera pelas mensagens, e substitui o conteúdo do
// documento com a mensagem recebida
self.port.on("replacePage", function(message) {
  document.body.innerHTML = "<h1>" + message + "</h1>";
});

No script do add-on, nós enviaremos ao script de conteúdo uma mensagem dentro do onAttach.

// Importe a API page-mod
var pageMod = require("sdk/page-mod");
// Importe a API self
var self = require("sdk/self");
 
// Crie um page-mod
// Ele executará um script toda vez que uma URL ".org" é carregada
// O script substitui o conteúdo da página por uma mensagem
pageMod.PageMod({
  include: "*.org",
  contentScriptFile: self.data.url("my-script.js"),
  // Envia ao script de conteúdo uma mensagem dentro de onAttach
  onAttach: function(worker) {
    worker.port.emit("replacePage", "Page matches ruleset");
  }
});

A mensagem replacePage não é uma mensagem embutida: é uma mensagem definida pelo add-on na chamada do port.emit().

Injetando CSS

Note que a característica descrita nesta seção é experimental no momento. Nós devemos provavelmente continuar suportando essa característica, mas os detalhes da API devem mudar.

Em vez de injetar JavaScript na página, você pode injetar CSS definindo a opção do contentStyle do mod-page.

var pageMod = require("sdk/page-mod").PageMod({
  include: "*",
  contentStyle: "body {" +
                "  border: 5px solid green;" +
                "}"
});

Como com o contentScript, há uma opção correspondente para contentStyleFile que leva uma URL de um arquivo CSS situado no diretório "data"; é uma boa prática usar essa opção ao invés de contentStyle se o CSS é muito complexo.

var pageMod = require("sdk/page-mod").PageMod({
  include: "*",
  contentStyleFile: require("sdk/self").data.url("my-style.css")
});

Ou, a partir do Firefox 34, você pode usar a versão mais simples:

var pageMod = require("sdk/page-mod").PageMod({
  include: "*",
  contentStyleFile: "./my-style.css"
});

Aprendendo mais

Para aprender mais sobre o page-mod, veja a referência da API page. Em particular, o construtor PageMod leva várias opções adicionais para controlar seu comportamento:

  • Por padrão, script de conteúdo não são anexados a qualuqer tab que já esteja aberta quando o page-mod é criado, e são anexados à iframes bem como documentos superiores. Para controlar esse comportamento use a opção attachTo.

  • Defina valores somente leitura acessíveis ao script de conteúdo usando a opção contentScriptOptions.

  • Por padrão, o script de conteúdo são anexados depois de todo o (DOM, JS, CSS, imagens) para a página ter sido carregado, no momento o evento window.onload dispara. Para controlar esse comportamento, use a opção contentScriptWhen.

Para aprender mais sobre o script de conteúdo,, veja o guia content scripts.

Etiquetas do documento e colaboradores

 Colaboradores desta página: Pheanor
 Última atualização por: Pheanor,