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

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

もずはっく日記(2015年1月)

2015年1月30日

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: (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との排他処理を実現できるようにしたいと考えています。

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

bug-org 917322を含むエントリ