2006年01月13日
firefox拡張で、リクエスト生成時、レスポンス完了時のフック->ヘッダ取得がしたいのだが
どうすればいいのだろう?
このエントリに書いたようなことを実現するための実証環境の実装を、本当にぼちぼちとだけど始めてるのだけれども...よく判らない。
firefoxの拡張の作成方法自体は、ここ見て判った。
静的な機能の実装はほとんどできそうな感じ。
でもフックのかけ方とかが判らん。
やりたいのは、
- Topウィンドウでのリクエスト生成時にフックして、ある条件を満たしていればHTTPリクエストヘッダにカスタムヘッダを加える
- Topウィンドウでのレスポンス完了時にフックして、HTTPリクエストヘッダ、或いはHTMLヘッダのHTTP-EQUIVのカスタムヘッダの設定値を得る
だけなんだけれども。
似たようなフックをしてそうなLiveHTTPHeader、HTMLValidator、HeaderMonitor(0.2以前)とかを時間の許す限りで読んでみたけど、それぞれ微妙に違うやり方をしてるみたいで、やりたい事を満たすのに必要十分な(かつできればもっとも簡単な)やり方がさっぱり判らない。
誰か知ってたら教えてケロ。
本も買ってみたけど、届いたFirefoxの改造テクニックって本は、得られる情報は先の参考サイトやその周辺、他の拡張読んで判るレベルだけで、 それらがまとまっているのでレファレンスにはなり得るけど全く解決にもならなかった。
オンライン書籍購入はやっぱこういうリスクはあるな。
もう一冊届くFirefox Hacksはどうなんだろうか...。
毎日コミュニケーションズ (2005/09)
売り上げランキング: 8,968

順を追ってカスタマイズ方法を理解できる本です
オライリージャパン (2005/08/27)
売り上げランキング: 2,557

内容はいいのですが...
おすすめです。
Firefoxを使うすべての人に必携の一冊Greasemonkeyではできないんでしょうかね。
Greasemonkey のユーザースクリプトでは、読み込み後のコンテンツでしか動かないので無理ですね。
> firefoxの拡張の作成方法自体は、ここ見て判った。
それはちょっと古くて Firefox 1.0 向けです。1.5 でもそのまま使えますが、
1.5 で導入された chrome.manifest ファイルを使うと、
それまで書くのが面倒だった、contents.rdf や、install.rdf の em:file の記述が不要になります。
まあ、一度書いてしまえばおしまいなので、どちらか好きなほうでよいのですが
詳しくは http://www.mozilla-japan.org/projects/firefox/extensions/packaging/extensions.html で。
> 似たようなフックをしてそうなLiveHTTPHeader、HTMLValidator、HeaderMonitor(0.2以前)とか
その中では、
> * Topウィンドウでのリクエスト生成時にフックして、ある条件を満たしていればHTTPリクエストヘッダにカスタムヘッダを加える
に似たようなことをしてるのは LiveHTTPHedaers ですね。
LiveHTTPHeaders.js の
> observe: function(aSubject, aTopic, aData) {
> if (aTopic == 'http-on-modify-request') {
> aSubject.QueryInterface(Components.interfaces.nsIHttpChannel);
の次の行に
aSubject.setRequestHeader("X-YADIS-ID", "hoge", false);
とでも加えると、LiveHTTPHeaders 起動中の全リクエストにカスタムヘッダがつきます。
# 「Topウィンドウ」と「リクエスト生成」は、層が全然違うので
# 「Topウィンドウでのリクエスト生成時にフック」は無理だと思うんですが…
# Topウィンドウ以外ではつけちゃダメですか?
で、ここが呼ばれるように登録しているのはどこか、というと
LiveHTTPHeaders 起動時に LiveHTTPHeaders.js 32行目の startHeaderInfoLive() が呼ばれて
そこから 44行目の addToListener() が呼び出されて、
実際に登録しているのはその中の
> var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
> observerService.addObserver(obj, "http-on-examine-response", false);
というところです。
あとは、いらないところを削るか、あるいは LiveHTTPHeaders もそのまま使うか…
> * Topウィンドウでのレスポンス完了時にフックして、HTTPリクエストヘッダ、或いはHTMLヘッダのHTTP-EQUIVのカスタムヘッダの設定値を得る
# リクエストではなくレスポンスですね?
HTTP のヘッダと、HTMLと、両方見ないといけないんですよね?
そうすると、ヘッダはヘッダであらかじめどこかに保持しておいて、
読み込み完了後に、保持しておいたヘッダと、HTMLとを見る、等としないといけないと思います。
まずその前半の、「ヘッダはヘッダであらかじめどこかに保持」については、
LiveHTTPHeaders の components/nsHeaderInfo.js を丸ごとパクるのが簡単で、かつ必要十分じゃないかと…
これが拡張機能の components ディレクトリに入れてあれば、ページ読み込み後にロケーションバーに
javascript:alert(window.headers.responseHeaders['X-YADIS-Location'])
と入れてみれば、保持できているのが確認できると思います。
後半については、また時間が取れたら…
ところで、このコメントを書くときに、Email Address を入れると、どう使われるんでしょう?
Posted by: あ at 2006年01月14日 10:39うわ、丁寧にありがとうございます。
もういっぺんチャレンジしてみます。
># Topウィンドウ以外ではつけちゃダメですか?
うーんと、フレーム内に別ページが表示されたらどうしようかとか思ったのですが、よく考えればURI単位でフィルタリングするので、別に構わないですね。
>ところで、このコメントを書くときに、Email Address を入れると、どう使われるんでしょう?
すみません、コメント周りはMTのデフォのままいじってなかったので、リンクされるようになってました。
今、リンクしないようにしました。
![[ここギコ!]](http://kokogiko.net/logo.png)





・MovableType 3.2、MT::App::Trackback.pmの修正(Jak)
・MovableType 3.2、MT::App::Trackback.pmの修正(ambox.su)
・MovableType 3.2、MT::App::Trackback.pmの修正(ambox.su)
・わしズムを読んで「アイヌは民族じゃないよ だから先住民族ではあり得ない」というような奴には、「国連先住『部族』の権利に関する宣言だよ」で問題ない(kokogiko)
・わしズム内の一服の清涼剤「るいるいかむい」(kokogiko)
・大和民族の定義云々について(kokogiko)
・大和民族の定義云々について(kokogiko)
・「定義できない」とのたまうものを自説根拠の説明の中で延々と使う不誠実(笑)(kokogiko)
・わしズム内の一服の清涼剤「るいるいかむい」(むにゅう!)