Pregunta

¿Puede un componente XPCOM de Firefox leer y escribir contenido de la página en varias páginas?

Escenario: Un montón de HTML local y archivos javascript. Un " Main.html " el archivo abre una ventana " pluginWindow " ;, y crea un complemento usando:

netscape.security.PrivilegeManager.enablePrivilege ('UniversalXPConnect');
var obj = Components.classes [cid] .createInstance ();
plugin = obj.QueryInterface (Components.interfaces.IPlugin);
plugin.addObserver (handleEvent);

El complemento que tiene 3 métodos.

IPlugin.Read - Lee los datos del complemento
IPlugin.Write : escriba datos en el complemento
IPlugin.addObserver : agrega un controlador de devolución de llamada para la lectura.

El " Main.html " luego llama a pluginWindow e intenta llamar al método plugin Write.

Recibo un error:

Permiso denegado para llamar al método UnnamedClass.Write

¿Fue útil?

Solución

Primero, ¿es realmente tu código C ++ un plugin o un componente XPCOM , posiblemente instalado como parte de un extension ? Suena como si fuera más tarde.

Si es así, no se puede utilizar desde un código JS no confiable: cualquier página web o un archivo HTML local. Es totalmente utilizable desde el código privilegiado, el tipo más común de los cuales es el extensión .

Está solucionando este problema al crear el componente utilizando la llamada enablePrivilege ('UniversalXPConnect') . Esto no es realmente recomendable, a menos que no se distribuya a los usuarios (ya que esta llamada muestra un cuadro confuso y si configura una preferencia para permitir siempre el archivo: // los scripts usan XPCOM, puede ser un problema de seguridad, ya que no todos los locales las páginas son de confianza - piensa en páginas web guardadas).

Su llamada Write falla por la misma razón: file: // las páginas no son confiables para usar componentes XPCOM. Probablemente pueda hacer que funcione si agrega otra llamada enablePrivilege en la misma función que la llamada de escritura en sí misma.

Dependiendo de la situación, puede haber una mejor solución.

Si sus archivos deben tratarse como de confianza, es posible que desee empaquetarlos como una extensión y acceder a ellos a través de una URL chrome: //. Esto le da al código en esas páginas permisos para llamar a cualquier componente XPCOM, incluido el suyo.

Si los métodos del componente son seguros de usar desde cualquier página o si el entorno está controlado y no se cargan páginas no confiables en el navegador, puede hacer que su componente sea accesible al contenido (busque nsSidebar en código mozilla para un ejemplo y también para nsISecurityCheckedComponent ).

Ah, y cuando no obtengas buenas respuestas aquí, definitivamente deberías probar los grupos de noticias / listas de correo de Mozilla.

[editar en respuesta a un comentario] Considere colocar el código que necesita llamar al componente en un script chrome: //. Alternativamente, deberías poder " bendecir " sus páginas con los privilegios de Chrome usando código como this (tenga en cuenta que hace lo contrario a lo que necesita: eliminar los privilegios de Chrome).

Otros consejos

¿Se ejecuta Main.html y esa otra ventana con privilegios de Chrome? Si accede a Main.html " normalmente " ;, simplemente colocándolo en la barra de ubicación de Firefox, entonces tendrá restricciones sobre lo que puede hacer (de lo contrario, una página web arbitraria podría hacer exactamente lo mismo).

Si está creando un complemento de Firefox, coloque su código en una superposición XUL.

Si realmente desea permitir que cualquier página web haga lo que hace su complemento, puede establecer algún mecanismo a través del cual la página puede pedirle al complemento que realice la operación con sus privilegios de Chrome y luego enviar el resultado a la página. .

Si NO estás haciendo una extensión de Firefox ... entonces me temo que no entendí algo, ¿podrías explicarlo más?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top