私はDelphiでnsIProtocolHandlerを実装しています。 (more here) これはすでに動作しています。モジュールビルドのデータは、nsIInputStreamを介してストリーミングされます。私はすべてのnsIRequest、nsIChannel、およびnsIHttpChannelのメソッドとプロパティを持っています。nsIProtocolHandler:htmlページの画像の読み込みに問題があります
私はテストを始めました。私は奇妙なことに遭遇しました。 Firefoxで作業
<img src="a.png">
どちらも "xxm::://test/a.html" と "//test/a.png xxm" 私はこの単純なHTMLでページ "a.html" を持っています上記のHTMLまたはPNG画像データを渡すことができます。 問題はHTMLページを表示することで、画像が読み込まれないことです。私はデバッグするとき、私は以下を参照してください(Firefoxはa.htmlにOnDataAvailable通知を処理しているとき)
- NewChannelが
- NotificationCallbacksが設定されている、a.pngのために呼び出されます(私は唯一の参照を保持する必要があり、右?)
- RequestHeader「
Accept
」が「image/png,image/*;q=0.8,*/*;q=0.5
」 - 設定されているが、その後、チャネルオブジェクトが他のrequを見てみると
)最もおそらくゼロ参照カウントに(解放されます私はいくつかの他のプロパティ(LoadFlagsやOriginalURIなど)を取得し、AsyncOpenが呼び出されて、どこから要求が返ってくるかを知ることができます。
誰でもこれを認識できますか?私は何か間違っているのですか?おそらくLoadFlagsやLoadGroupで?私は、LoadGroupのAddRequestとRemoveRequestを呼び出すタイミングがわからないので、nsHttpChannelとnsBaseChannelから覗いています。OnStartRequestまたはOnStopRequestの前または後にRemoveRequestを早くまたは遅く呼び出す方が良いとは思いませんか?
アップデート:<img src="xxm://test/a.png" />
と:「//test/a1.htmlファイルを」さらに問題を特定しようとするために、私は試してみてください。は、まだ同じ
更新したばかりの新しいFirefox 3.5の上でチェック起こっているイベントのシーケンスの上にしか到達しません。 私は、ロードグループにAsyncOpenを呼び出すために、このsecundaryリクエストを追加することになっていますが、どこへの参照を取得するかはわかりません。
詳細:リクエストヘッダに追加される「受け入れる」文字列のone instanceが見つかりました。新しいチャネルを作成した直後にnsIHttpChannelInternalを照会しましたが、このQueryInterfaceコールは取得されません。 (私はそれを投稿here)
これは非常に混乱しています。私は非常に匹敵する場所で私のAddRequest/RemoveRequest呼び出しを持っていますが、どちらもSetLoadGroupまたはAsyncOpenがPNGのチャンネルで呼び出されることはありません。 ViewSourceChannelはnsIStreamListener.OnStartRequest呼び出しで設定される "mChannel"を使用しますが、nsIStreamListenerを自分のチャンネルに追加すると、そのメソッドは呼び出されません。 –
質問についてはsecond updateを参照してください。 –
@Stijn Sanders、私は答えを更新しました。 –