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

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

もずはっく日記(2014年3月)

2014年3月8日

Bug-org 974318 WidgetTextEvent should store text ranges with a class inherited from nsTArray
初回投稿日時: 2014年03月08日20時59分51秒
最終更新日時: 2014年03月08日21時02分22秒
カテゴリ: Mozilla Core Mozilla30 バグ修正
SNS: (list)

GeckoのIMEまわりのコードを見たことある人は分かると思いますが、現在のGeckoでは、widget側で様々なルールに則ってイベントを発行しなければエディタが正確にハンドリングできない上、DOMイベントの発生順序等にもプラットフォーム毎にバグが混入する可能性があります。そこで、これを簡素化し、プラットフォーム間の違いが発生しにくいように再設計することにしました。

このバグではまず、リファクタリングを行いやすい様に、WidgetTextEventの保持する文節情報をnsTArrayの派生クラスで処理しやすくし、また、Netscape時代から続く、WidgetTextEventの未確定文字列の文節情報をnsDOMTextEventでコピーする、という無駄で分かり難い設計を改善することをゴールにしました。

この修正により、WidgetTextEventは、新たに定義された、TextRangeArrayクラスのインスタンスを必要な場合にのみヒープに確保して、それへの参照を保持するようになりました。このため、スタックに文節情報を保存し、メモリの断片化を抑えるという手法が使えなくなりましたが、TextRangeArrayは、nsAutoTArray<TextRange, 10>の派生クラスで、9文節とキャレットの情報、または10文節の情報を、再アロケーション無しで取り扱えるため、今回の修正による新たなメモリ断片化は起きづらいのでは無いかと思います。

またこのクラスは動的にアロケーションし、参照カウンタで管理するようになっています。このため、nsDOMTextEvent内でコピーを作成する必要が無くなり、その結果、nsDOMTextEvent、その固有のインターフェースであるnsIPrivateTextEvent、文節の情報をXPCOMとして表現するnsIPrivateTextRange、これを配列として表現するnsIPrivateTextRangeList、そしてこれらのコンクリートクラスである、nsPrivateTextRangensPrivateTextRangeを削除することができました。

そして、TextRangeArrayは、TextCompositionnsEditorの代わりに保存するようになりしました。これにより、文節情報にはエディタ外からでも簡単に参照可能になっています。これにより、nsEditorと、IMETextTxnクラスの関係を今までよりも疎遠にすることに成功しています。

言葉では非常に伝わりにくいですが、興味のある方はパッチを参照してみてください。かなり、エディタやイベント周りのコードがシンプルになったことが分かると思います。

関連するかもしれないエントリ

bug-org 974318を含むエントリ