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