Autoridade Chrome

A API usada para ganhar acesso ao Chrome atualmente é uma característica experimental do SDK, e deve mudar em lançamentos futuros.

Usando Autoridade Chrome

Os módulos de baixo-nível mais poderosos são executados com "chrome privileges", que nos dão acesso ao infame Objeto Components, que concede acesso irrestrito ao host. A partir daí, o módulo pode fazer praticamente qualquer coisa que o navegador é capaz. Para obter estes privilégios, o módulo deve declarar sua intenção com uma declaração como a seguinte:

var {Cc, Ci} = require("chrome");

O objeto retornado pelo require("chrome"), quando desempacotado com a característica destructuring assignment disponível no ambiente JS do Mozilla, fornecerá os redutores comuns dos Components.*:

Cc

Um redutor para Components.classes.

Ci

Um redutor para Components.interfaces.

Cu

Um redutor para Components.utils.

Cr

Um redutor para Components.results.

Cm

Um redutor para Components.manager.

components

Uma outra forma de chamar Components por si mesmo (note as letras minúsculas). A partir daí você pode acessar propriedade de uso menos frequente como Components.stack e Components.isSuccessCode.

Nota: a declaração require("chrome") é o único modo para acessar as funcionalidades do chrome e da API Components. O objeto Components não deve ser acessado de módulos. A ferramenta SDK emitira um aviso se ela vir código em móduo que referencie o Components diretamente.

Seu módulo deve evitar usar privilégios do chrome a menos que seja absolutamente necessário. Uso da Autoridade do Chrome deve receber revisão extra de segurança, e a maioria dos bugs nestes módulos são críticos a segurança.

Geração do Manifesto

O manifesto é uma lista, incluída no XPI gerado, que especifica quais módulos requisitação accesso require() para quais outros módulos. Ele também grava quais módulos requisitam acesso chrome. Esta lista é gerada pelo mapeamento de todos os módulos incluído pela declaração require(XYZ) e grava a string "XYZ" que eles referênciam.

Quando a implementação do manifesto estiver completa o carregador do programa  vai impedir os módulos de usar require()  para solicitar módulos que não estão listados no manifesto. Também, evitará que os módulos consiga autoridade chrome a menos que o manifesto indique que eles pediram para ele. Isto irá assegurar que os revisores enxerguem as mesmas restrições de autoridade que são aplicadas sobre o código em execução, aumentando efetivamente o tempo gasto revendo o add-on. (até que este trabalho seja concluído, os módulos podem ser capazes de burlar essas restrições).

O manifesto é construído com um mapeador baseado em expressão regular, não um análisador Javascript. Os desenvolvedores devem manter as declarações require simples, com uma única string estática, uma por linha de código. Se o mapeador falhar para enxergar a entrada require, o manifesto não incluirá aquela entrada, e (uma vez que a implementação esteja completa) o código em execução lança uma exceção.

Por exemplo, nenhum dos códigos a seguir serão encontrados pelo mapeamento do manifesto, levando a uma exceção em tempo de execução, quando a chamada require() é proibida de importar os módulos chamados:

// todos estes falharão
var xhr = require("x"+"hr");
var modname = "xpcom";
var xpcom = require(modname);
var one = require("one"); var two = require("two");

A intenção é que os desenvolvedores usem a declaração require() para dois propósitos: declarar (ao revisores de segurança) qual a classificação dos poderes que os modulos querem usar, e controlar como estes poderes serão mapeados dentro do namespace do módulo local. Suas declarações devem então ser claras e fáceis de analisar. Um formato de manifesto futuro deve mover a porção de declaração para um arquivo separado, para permitir expressões mais granuladas de autorização.

Comandos que constroem um manifesto, como "jpm xpi" ou "jpm run", mapearão todos os módulos incluídos pelo uso dos atalhos Cc/Ci (ou a forma expandida Components.classes). Emitirá um aviso se ele visualizar a forma expandida ou ver o uso e.g. "Cc" sem a entrada correspondente na declaração require("chrome"). Estes avisos servem para guiar os desenvolvedores para o usar o padrão correto. Todos os desenvolvedores de módulos devem reparar os avisos e corrigir seus códigos até que os avisos tenham desaparecido.

Etiquetas do documento e colaboradores

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