Bug-org 1137572 Add some useful methods to TextEventDispatcher for native key and IME handlers
初回投稿日時: 2016年10月15日20時55分24秒
最終更新日時: 2016年10月15日21時06分23秒
カテゴリ: Events IME KeyboardEvent Mozilla Core Mozilla48 バグ修正
固定リンク: id=2016031600
SNS:
Tweet (list)
widgetのコードが、OSから送信されてくる、キーボードやIMEの入力イベントから、DOMイベントのもとになる、WidgetEvent
を生成する部分をできる限りプラットフォーム非依存のコードに置き換えようという修正のための準備です。
自動テストでキーボードやIMEの入力をエミュレーションする際に、現在はJavascriptから、nsITextInputProcessor
を利用します。nsITextInputProcessor
はmozilla::TextInputProcessor
として実装され、内部ではmozilla::widget::TextEventDispatcher
にイベントを生成しています。
順序が逆になりますが、このTextEventDispatcher
が実際のユーザの入力イベントからも利用されるようになると、自動テストがより多くのコードをテストできるようになります。しかも、これまで、widgetのコードはネイティブイベントを受け取ると、他のブラウザや、策定中のUI Eventsにあわせたイベントの生成をそれぞれ固有のコードで行っていましたが、これをプラットフォーム非依存にすれば、プラットフォーム間でのGeckoの動作がより確実に均一なものになり、動作を変更する際のコストも大きく下がります。
これを実現するためには、TextEventDispatcher
にいくつか、widgetから使いやすい形のメソッドを新たに追加しておく必要がありました。それを実装したのがこのバグ修正です。
まず、TextEventDispatcher
は入力のトランザクションという概念を持っています。例えば、あるオブジェクトが未確定文字列を持っている際に、他のオブジェクトが新たに未確定文字列を生成しようとしたりすると、大混乱に陥ります。そのため、イベントを発生させるメソッドを呼び出す前に、トランザクションを確立する必要があります。この際に、トランザクションのタイプを指定できるようにしました。widgetがユーザからの入力イベントを処理する際にはeNativeInputTransaction
を用いることで、ユーザの入力が悪意、もしくはバグのあるアドオンによって妨害されることを阻止することができるようになっています。
次に、TextEventDispatcher
のインスタンスはnsIWidget
のインスタンスごとに作成されるようになり、nsIWidget::NotifyIME()
はTextEventDispatcher
経由で、TextEventDispatcherListener
クラスの派生クラスで受け取るように変更されました。
TextEventDispatcherListener
のインスタンスは各OSのネイティブIMEのコンテキストの数だけ存在していなければならず、nsIWidget::GetNativeTextEventDispatcherListener()
でnsIWidget
のインスタンスに関連付いたネイティブIMEコンテキスト用のTextEventDispatcherListener
を取得できるようにしなければいけません。
この設計により、エディタから送信されてくるコンテンツの変更に関する情報や、未確定文字列の確定や破棄のリクエストを現在、トランザクションを確立しているTextEventDispatcherListener
に通知することができるようになっており、また、フォーカスの移動といった、トランザクションが確立していなくても受け取る必要のあるものを複数のTextEventDispatcherListener
インスタンスに配信できるようになっています。
さらに、keypress
イベントに"key hell"に対応するために、キーの様々なモディファイアキーの状態での入力文字列を簡単に追加できるように、TextEventDispatcher
はeKeyPress
イベントの発火直前にTextEventDispatcherListener::WillDispatchKeyboardEvent()
を呼び出します。この際に、WidgetKeyboardEvent::mCharCode
、WidgetKeyboardEvent::mAlternativeCharCodes
を上書きできるようになっています。これにより、既存のwidgetの"key hell"対応コードを単に、このメソッド内にカット・アンド・ペーストするだけで新設計に移行できます。
他にもいくつかメソッドを追加していますが、それは実際に利用される際にヘッダファイルを参照してください。