灯台下暗し -カッターナイフで恐竜を腑分けした記録-

仕事で携帯向けアプリを書いて、趣味で携帯電話を買い、趣味で同人小説を書いて、何もしていません。

ブラウザを立ち上げ損ねても気にしない話

2004-11-20 00:50:18 | Mozilla
mozillaZine 日本語版に、Thunderbird は Windows の標準ブラウザの設定が壊れていると http:// のリンクをクリックしても反応しないという話が投稿されていました。投稿主は、Eudora のように実行ファイルが見つからないときはファイル選択のダイアログを出すなど対策をとるべきだとお怒りの様子。

そこでソースコードを見てみました。

リンクを選択したときのメソッドから見るのではなく外部アプリケーションを呼び出すコードからボトムアップに見ているので間違えているかも知れませんが。

不満を漏らした人は Thunderbird がブラウザへのパスを記憶していると思い込んでいる節がありますが、私は Thunderbird はブラウザへのパスを記憶していないと思っています。なぜなら Windows には URL だけ渡せば関連付けされたアプリケーションを呼び出す ShellExecute() という API があるから。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shellexecute.asp

Thunderbird も、この API を使用しています。
http://lxr.mozilla.org/mozilla/source/uriloader/exthandler/win/nsOSHelperAppService.cpp#251

しかし、この API がアプリケーション起動に失敗したことを無視するとしたらちょっとおかしいです。API リファレンスを見てもエラーを示す返り値が返ります。では Thunderbird がこのエラーコードを見ているのかという話ですが。

ShellExecute() を呼び出しているのは nsOSHelperAppService::LoadUriInternal() というメソッドで、LoadUriInternal() というメソッドを呼び出すのは nsExternalHelperAppService::handleExternalLoadEvent() というメソッドだけ。このメソッドがエラーコードを握りつぶしています(返り値を変数に代入することも return 文で返すこともしていません)。
http://lxr.mozilla.org/mozilla/source/uriloader/exthandler/nsExternalHelperAppService.cpp#1088
このメソッドは OS 中立のモジュールなので、どの OS でもブラウザの立ち上げに失敗したことは見ていないことになります。

じゃあエラーコードを返せばいいのかというと、本当はここからが大変なんです。ユーザにエラーを伝えて、リカバリーして。私にはそこまでの技術力がありません。
コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« Bug 61363 が起きる原因を見... | トップ | 身の程に合ったやり方 »
最新の画像もっと見る

コメントを投稿

Mozilla」カテゴリの最新記事