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 でもブラウザの立ち上げに失敗したことは見ていないことになります。
じゃあエラーコードを返せばいいのかというと、本当はここからが大変なんです。ユーザにエラーを伝えて、リカバリーして。私にはそこまでの技術力がありません。
そこでソースコードを見てみました。
リンクを選択したときのメソッドから見るのではなく外部アプリケーションを呼び出すコードからボトムアップに見ているので間違えているかも知れませんが。
不満を漏らした人は 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 でもブラウザの立ち上げに失敗したことは見ていないことになります。
じゃあエラーコードを返せばいいのかというと、本当はここからが大変なんです。ユーザにエラーを伝えて、リカバリーして。私にはそこまでの技術力がありません。