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

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

もずはっく日記(2013年9月)

2013年9月30日

Bug-org 911951 nsIDOMWindowUtils::SendTextEvent() should be able to treat 4 or more clauses
初回投稿日時: 2013年09月30日21時36分49秒
カテゴリ: Firefox OS Mozilla Core Mozilla26 バグ修正
SNS: (list)

nsIDOMWindowUtils::SendTextEvent()は、trustedなnsTextEventイベントをJavascriptから生成し、IMEの未確定文字列や、確定文字列を擬似的に生成するAPIです。ただし、これは自動テストで、XPレベルのIMEハンドリングを検査するために設計したものなので、未確定文字列内を最大で3つの文節にしか区切れませんでした。ところが、Firefox OSでは、このAPIをIMEの未確定文字列生成に使うことになってしまったので、日本語のIMEの開発には大きな障害となっていました。その制限を無くそうというのがこのバグです。

このバグでは、nsIDOMWindowUtils::SendTextEvent()を廃止し、nsIDOMWindowUtils::CreateCompositionStringSynthesizer()というAPIを追加しました。これを呼び出すと、nsICompositionStringSynthesizerというインターフェースを持った、XPCOMオブジェクトのインスタンスが生成され、返されます。

nsICompositionStringSynthesizerのインスタンスは、そのDOM windowへのweak referenceを保持していて、このwindowが生存している限りは再利用可能になっています(実際に再利用しているコードはありませんが)。

nsICompositionStringSynthesizer::SetString()で未確定文字列、もしくは確定文字列を指定します。

nsICompositionStringSynthesizer::AppendClause()で、文節の長さと、属性を指定し、文節を追加します。これはメモリ容量が許す限り、何度でも呼び出すことができますので、最大、未確定文字列の文字数分の文節を作り出すことができます。確定文字列生成の場合は呼び出してはいけません。

nsICompositionStringSynthesizer::SetCaret()はキャレットの位置と長さを指定できますが、Gecko自体は、1文字以上に渡る、ワイドキャレットはまだサポートしていませんが、一応指定自体は可能です。これは、不要なら呼び出す必要はありません。

最後に、nsICompositionStringSynthesizer::DispatchEvent()を呼び出すと、イベントをディスパッチし、全ての情報がクリアされ、再利用可能な状態になります。

ちなみに、nsICompositionStringSynthesizer::DispatchEvent()が呼び出された際に、文節情報や、キャレット情報が、文字列の長さに対して矛盾している場合、例外が発生し、イベントのディスパッチには失敗しますが、全ての情報はクリアされ、再利用可能な状態になります。

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

bug-org 911951を含むエントリ