2009-07-03 17 views
6

Sto tentando di eseguire il porting su un plug-in di Internet Explorer per Firefox, ma non sono sicuro di dove cercare ciò di cui ho bisogno.Come posso implementare un convertitore di contenuti in Firefox per tutti gli elementi della pagina?

Fondamentalmente, devo essere in grado di filtrare tutto il contenuto ricevuto dal browser con una determinata intestazione Content-Type. Ho provato a implementare un convertitore di stream e questo funziona, ma solo per il documento di livello superiore nella pagina, frame o iframe. Ho avuto lo stesso problema con IE, e girarlo era davvero hacky, e dato che mi piacerebbe che fosse una cosa simile per essere multipiattaforma mi piacerebbe davvero essere in grado di farlo in Firefox senza ricorrere a hack vtable.

Il contenuto è servito compresso con un formato di compressione proprietario. Quindi ho bisogno di ricevere i dati, decomprimerli e modificare il Content-Type su ciò che il file originale non compresso dovrebbe avere.

Se esiste un modo per filtrare tutti i dati ricevuti, sarebbe probabilmente accettabile, potrei gestire l'analisi dell'intestazione.

Grazie

risposta

3

Penso di aver trovato ciò di cui avevo bisogno. Mi sono imbattuto in questo link che viene utilizzato per rintracciare le chiamate HTTP: http://blues.ath.cx/firekeeper/resources/http_tracer.html

Sembra esserci qualche problema con l'implementazione JavaScript per qualche motivo, e io non sono un guru JavaScript per capirlo, ma ho implementato in C++ e i risultati iniziali suggeriscono che dovrei essere in grado di modificarlo per le mie esigenze.

Fondamentalmente stiamo sostituendo il servizio nsIHttpProtocolHandler con la nostra implementazione, che mantiene un riferimento all'implementazione iniziale. Quando viene effettuata una chiamata al servizio, si procede semplicemente alla sua implementazione originale salvata. Quindi forniamo la nostra implementazione di nsIHttpChannel e nsIStreamListener che usiamo anche come proxy.

Anche in questo caso, la maggior parte delle chiamate viene restituita ai gestori originali. Ma in OnDataAvailable, invece di passare i dati al sottostante nsIStreamListener, lo salviamo usando nsIStorageStream. Quindi in OnStopRequest, dopo aver ottenuto tutti i dati, possiamo decomprimerlo e quindi chiamare OnDataAvailable sul gestore originale, seguito da OnStopRequest.

Ha funzionato su alcuni piccoli test semplici finora, ma dovrò passare attraverso alcuni test più rigorosi ... Dovrò anche capire se posso fare la stessa cosa con HTTPS.

Il problema più grande che vedo al momento è che si basa su alcune interfacce non congelate come nsIHttpChannelInternal. Non posso essere aiutato, per quanto posso dire, e i miei requisiti di compatibilità delle versioni sono piuttosto piccoli, quindi posso conviverci se necessario.

Nel frattempo, se qualcuno ha qualche altro suggerimento, io sono tutte le orecchie: D

+0

ho utilizzato una tecnica simile per un prolungamento su cui sto lavorando - ma sembra aver smesso di lavorare in FF17. Hai continuato a lavorare su questo? – Daniel

Problemi correlati