Bug-org 917322 nsIDOMWindowUtils::SendCompositionEvent() and nsICompositionStringSynthesizer::DispatchEvent() should be able to dispatch events without setting mIsSynthesizedForTests
初回投稿日時: 2015年01月30日21時56分18秒
カテゴリ: Events Firefox OS Mozilla Core Mozilla38 バグ修正
SNS:
Tweet (list)
もともと、Geckoでは、テストでの利用目的で、nsIDOMWindowUtils::SendCompositionEvent()
や、nsICompositionStringSyntesizer
を利用して、IMEの動作をJavascriptからエミュレーションできるようにしていました(要chrome権限)。そして、Firefox OSのJavascriptで実装されているIMEは、Firefox OSが用意しているAPI経由で、これらを利用し、テスト用のイベントを発行しているという状態でした。
Firefox OSのIMEにはGeckoからのリクエストを聞く手段が無いという大きな問題もあり、テストと、Javascript IMEのために、よりしっかりとしたAPIが必要という結論に至りました。
そこで、このバグでは、nsITextInputProcessor
というインターフェースを新設しています。これは、インスタンスを生成後に、init()
もしくは、initForTests()
でDOMウインドウと関連付けてから編集を開始する、というものです。今までのAPIとは異なり、あるインスタンスがすでに編集を開始している場合、他のインスタンスが、既に存在するものと同じトップレベルウインドウに所属しているDOMウインドウでは初期化に失敗するようにしましたので、排他処理も若干、設計に含めています。
また、上述のメソッドで初期化する際に、nsITextInputProcessorCallback
というインターフェースを持つオブジェクトを渡すことで、GeckoからIMEへのリクエストや通知を受け取れるように設計しています。
これらAPIの詳しい情報については、以下の、MDNのドキュメントを参照してください。
内部の設計的には、nsITextInputProcessor
はただのJavascript向けのラッパークラスで、実際にイベントの発火や、排他処理、編集のトランザクションを管理しているのは、mozilla::widget::TextEventDispatcher
というクラスになります。
将来的には、このクラスをネイティブのIMEイベントハンドラも利用することで、DOMイベント仕様の変更による細かな挙動修正で、各OS向けのコードをメンテナンスするコストを極力下げておき、なおかつ、アドオンが内蔵しているかもしれない、Javascript-IMEとの排他処理を実現できるようにしたいと考えています。