スポンサーサイト

■ スポンサー広告 Posted by ひぐま (Higmmer) on -------- at --:--:--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Firefox/Linky 2.7.1に対する割と大掛かりな修正 [人柱版]

■ ネット Posted by ひぐま (Higmmer) on 2006-06-30 at 22:13:29

◆共有テーマ: Firefox [コンピュータ]

Firefox 1.5.0.4にバージョンアップしてから1週間経ったところで、拡張機能のひとつ「Linky 2.7.1」(日本語版はこちら)に思わぬ不具合を発見しました。「リンクのダウンロード」機能が全く働かなくなっているのです(*)。少しネット上の情報に当たってみましたが、同様の報告をされている方はいないもよう…。うちの環境のせいということでしょうか? それとも他にダウンローダーを使っているのでこの機能を使っている方はいないということ? ちょっとしたファイルをまとめてダウンロードするのには割と便利な機能だったんですが…(´・ω・`)

(*) 新しく公開された日本語バージョン 2.7.1aではこの問題は解消されています。修正内容の詳細を知りたい方は以下を参照して下さい(7/4追記)。

しょうがないので、自力で調査を始めることにしました。今回はFirefoxの内部動作に踏み込んでの調査が必要だったので一筋縄ではいかなかったわけですが、四苦八苦の末、なんとか動作させることに成功しましたので報告します。

動作を追ってみたところ、どうも"main.js"の1015行目で例外が発生しているようでした。

var sniffer = new nsHeaderSniffer(u, linkyContext.myfoundHeaderInfo, data);

このnsHeaderSnifferというのはURLからファイル名への変換を仲介するクラスのようなのですが、XPCOMのリファレンス等を当たっても手がかりとなる情報は得られませんでした。唯一分かったのは、このクラスはどうやらFirefox 1.5では廃止されたらしいということ。どうにかしてこの部分を別の方法で実現する必要に迫られたわけですが…。

最終的には"chrome://global/content/contentAreaUtils.js"に含まれる関数群を参考に、nsHeaderSnifferの代わりにFileInfoオブジェクトを使い、関連する部分をごにょごにょ……することでなんとか動作するようになりました。内部動作についてはよく分からないままいじってます(*)ので、今回の修正版は人柱版ということにします。よって何か不具合があっても自分で何とかできる方だけ使って下さい。

(*) このnsHeaderSnifferというクラスはFirefox 1.0.x系では"contentAreaUtils.js"に含まれているのを見つけたのですが、ややこしすぎて解析を断念…。どなたか正しい対処法をご存知の方いませんか?

尚、いろいろ検証している間に他にも幾つかバグを発見しましたので、ついでに修正しておきました。これにより、オリジナルのLinky 2.7.1に対して修正される内容は以下となります。

  1. 「リンクのダウンロード」でダイアログを開いてリンクを選択した後、「選択されたリンクをダウンロード」ボタンを押してもダウンロードが始まらなかった不具合(Firefox 1.5系で発生)を修正
  2. ページ内にリンクがあるにも関わらず、テキストが選択されていない状態では「すべてのリンクをダウンロード」が無効となってしまうバグを修正
  3. 「選択されたリンクのダウンロード」において、<a id="...">のようなURLを含まない「A要素」が選択範囲にあると、空のURLが登録されてしまうバグを修正
  4. 「選択されたテキストのリンクを○○で開く」メニューが、URLとなり得るテキストを選択しているにも関わらず無効となってしまうことがあったのを修正
  5. 「選択されたテキストのリンクを○○で開く」で、URL末尾がスラッシュで終わっていない場合に勝手にスラッシュが追加されてしまうのを修正

1に関しては既に説明しました。2についてはすぐに試せるので省略。3に関しては以下を見て下さい。

はなもげら

上記の「はなもげら」を選択した状態で「選択されたリンクのダウンロード」を実行すると、空のURLが登録されてしまっているのが分かると思います。

4と5については以下を参照。

www.google.co.jp
www.google.co.jp/
www.google.co.jp/about.html

Linkyのオプションで「選択されたテキストのリンクを開く」を有効にした状態で上記のテキストを選択し、コンテキストメニューを何回も出したり消したり(他のメニューにカーソルを合わせて戻すだけでOK)していると、たまに「選択されたテキストのリンクを○○で開く」メニューが無効になってしまうのが分かると思います。また、実際に実行すると3番目のリンクが「http://www.google.co.jp/about.html/」に変わってしまいます(*)。

(*) 自分はこの機能の代わりに「Text Link」を使っているのでこれでも特に支障はないのですが、なんとなく気持ち悪いので…。

これらの症状が実際に発生し、かつどうしても直したい方のみ、以下の修正版を自己責任で試してみて下さい。前述したように今回の修正はイマイチよく分からずいじっている部分がありますので、今のままでも特に困っていないという方や、もし何らかの不具合が起こったときに元に戻せる自信が無いという方はやめておいた方が無難です。繰り返しますが、何が起こっても当方では一切責任を持てませんので…。

修正版の適用方法

Norahさんのサイトで下記修正版を取り込んだ日本語バージョン 2.7.1aが公開されています。
直接インストールしたい方はそちらをご利用下さい。

こちらでの配布は終了しました。

以下のいずれかの方法をご利用下さい。修正の対象となるLinkyのバージョンは2.7.1です。

  • パッチファイル … patch-linky_2.7.1[main.js]-HG-060630.txt
    → "linky.jar"に含まれている"content/main.js"に対して適用して下さい。
  • ZIPファイル … diff-linky_2.7.1-HG-060630.zip (要・拡張子変更→".zip")
    → このファイルに入っている"content/main.js"を"linky.jar"内の該当するフォルダに突っ込んで下さい。
  • XPIファイル … linky_2.7.1-HG-060630.xpi (要・拡張子変更→".xpi")
    → ダウンロード後、ファイルをFirefoxのウィンドウにドラッグ&ドロップしてインストールして下さい。

※いずれの場合も、オリジナルの"linky.jar"をバックアップしておくのをお忘れなく!

トラックバック

この記事について書く(FC2ブログユーザー)
※言及リンクの無いトラックバックは無効です

PageTop▲

コメント

Posted by norah (ID:-) [URL on 2006-07-01 at 03:38:45 [編集]
私も調査している所なので、まだ決めていないのですが、もし ひぐまさんの方法が一番ベターならパッチを日本語版に取り込んで配布しても良いですか?
■ ありがとうございます
Posted by ひぐま (ID:z1/vyMRg) [URL on 2006-07-01 at 10:36:40 [編集]
本文にも書いたようにイマイチ自信がないので不安ですが…
もし問題ないことが確認できれば、組み込んでいただけるのはむしろ大歓迎です。
よろしくお願いします。
Posted by norah (ID:-) [URL on 2006-07-01 at 18:23:23 [編集]
調べたところ、nsHeaderSnifferはFileInfoに置き換えになっているそうなので、FileInfoで間違いは無いそうです。

ただFileInfoのドキュメントが見つけられなくて^^;。ひぐまさんは1.0系と1.5系のcontentAreaUtils.jsを比較して実装したのですか?
■ なるほど
Posted by ひぐま (ID:z1/vyMRg) [URL on 2006-07-01 at 20:04:14 [編集]
いえ、先に1.5系の実装を見て、InternalSave関数に目を付けました。
そしてFileInfoがnsHeaderSnifferと似たメンバを持っているのを見つけました。
myfoundHeaderInfoがコールバックされているのは想像が付いたので、
直接呼び出す形に変えて、FileInfoを引数にして、それを参照している部分を書き変えて…
とやったら動いちゃったという感じです。運が良かったとしか(笑)

その後、念のため1.0系の実装を調べて一応nsHeaderSnifferがあるのを見つけたのですが、
いろいろ多機能(*)なクラスで複雑な処理をやっているようだったので解析を断念しました。
もしかすると最初からnsHeaderSnifferをそのまま移植した方が良かったのかも知れませんが、
私の実力ではたぶん動かなかったと思います(^^; XPCOMとか全然理解してないので…。

(*) 私の修正版ではMIMEタイプは"application/octet-stream"で決め打ちしていますが、
  nsHeaderSnifferにはレスポンスヘッダからMIMEタイプを調べる機能もあるようです。
  他にもファイルの存在確認したり、サーバーの提示するファイル名を取得したり…
  まさに"ヘッダを覗き見る"クラスというわけですね…納得。

PageTop▲

コメントの投稿

 
 
 
 
 
 (後で編集・削除したいなら必須)
 
  

PageTop▲

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。