Pergunta

Pode uma página de leitura e escrita de componentes e conteúdo firefox XPCOM em várias páginas?

Cenário: Um monte de arquivos HTML e JavaScript locais. Um arquivo "main.html" abre uma janela "pluginWindow", e cria um plugin usando:
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
var obj = Components.classes[cid].createInstance();
plugin = obj.QueryInterface(Components.interfaces.IPlugin);
plugin.addObserver(handleEvent);

O plugin que tem 3 métodos.

IPlugin.Read - Ler dados de plug-in
IPlugin.Write - escrever dados para o plugin
IPlugin.addObserver -. Adicionar um manipulador de retorno de chamada para a leitura

O "main.html", em seguida, chama o pluginWindow e tenta chamar o método plug-in Write.

Eu recebo um erro:

Permission denied to call method UnnamedClass.Write

Foi útil?

Solução

Em primeiro lugar, é o seu código C ++ realmente um plug-in ou um XPCOM componente, possivelmente instalado como parte de uma extensão ? Soa como se fosse o mais tarde.

Se assim for, não é utilizável a partir do código JS não confiável - qualquer página web ou um arquivo HTML local. É totalmente utilizável a partir do código privilegiado, o tipo mais comum de que é o código de extensão .

Você está trabalhando em torno este problema ao criar o componente usando a chamada enablePrivilege('UniversalXPConnect'). Isto não é realmente recomendado, a menos que isso não vai ser distribuído para os usuários (uma vez que esta chamada aparece uma caixa confundindo e se você definir uma preferência para permitir sempre file: // scripts usam XPCOM, pode ser um problema de segurança, uma vez que nem todos os locais páginas são confiáveis ??-. pensar páginas da web salvas)

A sua chamada Write falhar pela mesma razão - file: // páginas não são confiáveis ??para componentes uso XPCOM. Provavelmente, você pode fazê-lo funcionar se você adicionar outra chamada enablePrivilege na mesma função que a gravação em si chamada.

Dependendo da situação, pode haver uma solução melhor.

Se os seus arquivos devem ser tratados como confiável, você pode querer empacotá-los como uma extensão e acessá-los através de um chrome: // URL. Isto dá ao código nesses permissões páginas para ligar para qualquer componente XPCOM, incluindo o seu.

Se os métodos do componente são seguros para uso em qualquer página ou se o ambiente é controlado e há páginas não confiáveis ??são carregados no navegador, você pode fazer o seu componente acessível para o conteúdo (procurar nsSidebar em código mozilla para um exemplo e também para nsISecurityCheckedComponent).

Oh, e quando você não obter boas respostas aqui, você deve definitivamente experimentar o newsgroups Mozilla / listas de discussão.

[editar em resposta a um comentário] Considere colocar o código que precisa chamar o componente em um chrome: // script. Alternativamente, você deve ser capaz de "abençoar" as páginas com os privilégios de cromo usando código como este (note que ele faz o oposto do que você precisa - acabar com os privilégios de cromo).

Outras dicas

O main.html e que outra janela correr com cromo privilégios? Se você acessar main.html "normalmente", apenas colocá-lo na barra de localização do Firefox, então ele vai ter restrições para o que pode fazer (Caso contrário, uma página web arbitrário poderia fazer exatamente o mesmo).

Se você estiver criando um plugin firefox, coloque seu código em uma sobreposição XUL.

Se você realmente quer permitir que qualquer página web para fazer o que é o seu plugin faz, você pode estabelecer um mecanismo através wich a página pode pedir o plugin para fazer a operação com os seus privilégios de cromo e enviar o resultado para a página mais tarde .

Se você não está fazendo uma extensão do Firefox ... então eu tenho medo Eu mal entendido alguma coisa, você poderia explicar mais?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top