2009-07-03 10 views
6

Estoy intentando exportar un complemento de Internet Explorer a Firefox, pero no estoy seguro de dónde buscar lo que necesito.¿Cómo puedo implementar un convertidor de contenido en Firefox para todos los elementos de la página?

Básicamente, necesito poder filtrar todo el contenido que recibe el navegador con un determinado encabezado de tipo de contenido. Intenté implementar un convertidor de flujo, y esto funciona, pero solo para el documento de nivel superior en la página, marco o marco flotante. Tuve el mismo problema con IE, y eludirlo fue muy chulo, y como idealmente me gustaría que fuera multiplataforma, me gustaría poder hacer esto en Firefox sin recurrir a los hackers de vtable.

El contenido se sirve comprimido con un formato de compresión patentado. De modo que necesito recibir los datos, descomprimirlos y cambiar el tipo de contenido a lo que debería tener el archivo original sin comprimir.

Si hay una manera de simplemente filtrar todos los datos recibidos, eso probablemente sería aceptable, podría encargarme de analizar el encabezado.

Gracias

Respuesta

3

Creo que he encontrado lo que necesitaba. Me encontré con este enlace que se utiliza para rastrear llamadas HTTP: http://blues.ath.cx/firekeeper/resources/http_tracer.html

Parece que hay algunos problemas con la implementación de JavaScript por alguna razón, y no soy un gurú de JavaScript para resolverlo, pero he implementado en C++ y los resultados iniciales sugieren que debería poder modificarlo para mis necesidades.

Básicamente estamos reemplazando el servicio nsIHttpProtocolHandler con nuestra propia implementación, que guarda una referencia a la implementación inicial. Cuando se realiza una llamada al servicio, simplemente lo sustituimos por la implementación original guardada. Luego proporcionamos nuestra propia implementación de nsIHttpChannel y nsIStreamListener que también usamos como proxies.

De nuevo transferimos la mayoría de las llamadas a los controladores originales. Pero en OnDataAvailable, en lugar de pasar los datos al nsIStreamListener subyacente, lo guardamos usando nsIStorageStream. Luego, en OnStopRequest, después de haber obtenido todos los datos, podemos descomprimirlo y luego llamar a OnDataAvailable en el controlador original, seguido de OnStopRequest.

Hasta ahora ha funcionado en algunas pequeñas pruebas simples, pero tendré que someterlo a algunas pruebas más rigurosas ... También tendré que averiguar si puedo hacer lo mismo con HTTPS.

El mayor problema que veo en este momento es que se basa en algunas interfaces no congeladas, como nsIHttpChannelInternal. Sin embargo, no puedo evitarlo, y los requisitos de compatibilidad de mi versión son muy pequeños, así que puedo vivir con eso si es necesario.

Mientras tanto, si alguien tiene alguna sugerencia, soy todo oídos: D

+0

He estado usando una técnica como esta para una extensión que estoy trabajando - pero parece que han dejado de trabajar en FF17. ¿Has seguido trabajando en esto? – Daniel

Cuestiones relacionadas