2013年7月2日

ロケーションバーの内容

UnMHT は MHT ファイルを開く際に、unmht: で始まる URI に変換して、そのプロトコルハンドラが生成したチャネルを通して展開した内容を返す、という形をとってて、実際 MHT ファイルを開いてみるとロケーションバーには unmht: で始まるアドレスが表示される。

もちろんこのアドレスは UnMHT 内でしか通用しないものなので、他人に渡したりするアドレスとしては不適切。とはいえ、ユーザはそんな内部の事情は気にしないので、昔から時々 unmht: で始まるアドレスをウェブ上で見かけたりしてて、なんとかしないといけないなー、と思ってた。情報パネルから本来のアドレスをコピーできるようにしたけど、そもそも MHT ファイルを開いた時だけそういう手順を踏まないといけないっていう事自体が分かりにくいと思う。

で、今度こそなんとかしよう。

対策その1:nsIStreamConverter を使用して元のアドレスのまま開始パートを返す
もちろんそういう方法もアリだけど、MIME-Type が適切じゃないファイルは開けないので却下

対策その2:ロケーションバーの内部を弄って表示するアドレスを変える
どこにもそういうインターフェースが無いので、無理矢理な感じになっちゃう。当然バージョンアップで壊れる。却下

対策その3:適当なタイミングでロケーションバーの表示内容を変更する
現時点で、tabbrowser の nsIWebProgressListener.onLocationChange イベントでロケーションバーに情報パネル用のアイコンを表示してるので、そのタイミングでやってみよう。

と、やってみたら実はブラウザ側もそのタイミングでロケーションバーの内容を変更してて、イベントハンドラの登録順序次第で表示内容が変わったりする。

イベントハンドラの登録を遅くするっていうのも手だけど、あんまり安定した解決策でもない。
なので、setTimeout を 0ms で呼び出して、イベントハンドラから抜けた後で実行する形で対応してみた。

という感じで Ver.6.4.0b3 を出したので、8月までにはリリース版に入るんじゃないかな。