componente Firefox XPCOM - Permissão negada para chamar o método UnnamedClass
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
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?