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:
Tweet (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
、そしてこれらのコンクリートクラスである、nsPrivateTextRange
とnsPrivateTextRange
を削除することができました。
そして、TextRangeArray
は、TextComposition
がnsEditor
の代わりに保存するようになりしました。これにより、文節情報にはエディタ外からでも簡単に参照可能になっています。これにより、nsEditor
と、IMETextTxn
クラスの関係を今までよりも疎遠にすることに成功しています。
言葉では非常に伝わりにくいですが、興味のある方はパッチを参照してみてください。かなり、エディタやイベント周りのコードがシンプルになったことが分かると思います。