この日記はMozillaのプロダクトへの貢献者としての私の成果を中心に、気になったバグやWeb界隈の話題について書いていますが、 断り書きがある場合を除き、いかなる団体のオフィシャルな見解ではありません。あくまでも個人的なものです。 Mozilla Foundation、Mozilla Corporation、及び関連企業の公式情報ではないことに注意してください。

現在、XHTML 1.0 (もどき)から、HTML5なコンテンツに修正中です。古い日記は修正が完了していませんので表示が崩れます。 順次、修正していく予定ですのでしばらくお待ちください。

もずはっく日記(2011年9月)

2011年9月29日

Bug-org 669028 DeCOMtaminate nsILookAndFeel 初回投稿日時: 2011年09月29日15時43分30秒
カテゴリ: Mozilla9 バグ修正
固定リンク: id=2011092900
SNS: (list)

長らく更新していませんでしたが、今月の修正分です。

nsILookAndFeelを削除しました。バイナリコンポーネントを利用した拡張ならアクセスできるAPIでしたが、バイナリコンポーネントならネイティブAPIがそのまま使えるので特に問題無いと思います。

XPCOMコンポーネントとしての役割を削除した代わりに、mozilla::LookAndFeel::GetInt()mozilla::LookAndFeel::GetFloat()や、mozilla::LookAndFeel::GetColor()でGecko内からはアクセスできるようになっています(詳細)ので、prefsの時と同様、ハッシュテーブルへアクセスしてインスタンスを取得する手間とコストが削減されています。

Bug-org 543789 Implement DOM3 composition events 初回投稿日時: 2011年09月29日15時56分38秒
最終更新日時: 2011年09月29日16時04分14秒
カテゴリ: Mozilla9 バグ修正
固定リンク: id=2011092901
SNS: (list)

D3EのCompositionイベントの実装が終わりました。一点を除き、仕様通りという点ではGeckoが初の実装になっています(WebKitはcompositionstartdata属性の実装が間違っていて、compositionupdateが最初に発行されません)。

なお、問題のcompositionstartdata属性の値は、compositionstartイベントを発行する時点での選択範囲の値となっていて、リアルタイムの値ではありません。つまり、compositionstartイベントに複数のハンドラがあって、そのうちの一つが選択範囲を変更したとしても、それ以降のハンドラで取得できるdata属性値は、変更前のものです。こうしなければ、受け取ったcompositionstartイベントをグローバル変数等に保存した場合の扱いが難しくなるので、このようになっています。

ちなみに、仕様通りに実装していない一点とは、compositionstartイベントがキャンセル可能ではない、という点です。仕様書にはcompositionstartイベントでpreventDefault()を呼び出すと、IMEの始動をキャンセルできるとありますが、compositionstartイベントはIMEに一度処理を渡して、始動したことが分かった時に発行するものですので、もうキャンセル不能な状況だからです。

また、locale属性は実装はしていますが、Geckoから発行されるイベントでは常に空文字列が返ります。ですが、initCompositionEvent()からは初期化可能で、またその値を取得することはできますので、他のブラウザとの互換性はできるだけ維持しています。将来的には実装すると思いますが、今のところ意義があまり無いと思われるので優先順位は低めです。

textinputイベントの実装の方に、テストケースを用意しているので、ブラウザ間の動作の違いを確認するのに利用してみてください。

Bug-org 432698 mouseenter and mouseleave events are not supported 初回投稿日時: 2011年09月29日16時14分08秒
カテゴリ: Mozilla9 バグ修正
固定リンク: id=2011092902
SNS: (list)

私の修正ではありませんが、D3E関連の修正です。mouseenterイベントと、mouseleaveイベントも実装されました。

mouseovermouseoutとの違いは仕様書で確認してもらうとして、mouseentermouseleaveは、そのDOMツリー構造を検査しないといけない分、低速です。Geckoでは一度、addEventListener()でこれらのイベントリスナをインストールするか、属性値を利用した場合に、そのドキュメント内では常に発行されるようになりますので、mouseoverや、mouseoutで代用できる処理であれば、mouseentermouseleaveを使わない方が端末への負荷を減らすことができます。つまり、拡張機能を含む、chromeのコードではこれらのイベントを使うべきではありません。特に、FirefoxやThunderbird等のchromeで利用した場合、デバッグビルドでは警告が出力されるようになっていますので、開発者の方は絶対に利用しないようにしてください。