Bug-org 1151186 Japanese IME input is not working Google spreadsheet
初回投稿日時: 2015年04月17日10時57分55秒
カテゴリ: Mozilla Core Mozilla40 TSF バグ修正
SNS:
Tweet (list)
Googleスプレッドシートで日本語入力中に、一度、他のアプリをアクティブにして、再びFirefoxにフォーカスを戻すと、TSFと、IMMを問わず、しかし、症状が異なるバグり方で、正常に日本語入力ができなくなるというバグです。
調査してみると、すぐに、IMEの状態管理に問題があることが分かりました。最初にスプレッドシートを開くと、どのセルも編集モードになっていなくても、IMEをオンにできてしまいます。また、スプレッドシートを表示している状態で設定タブを開き、スプレッドシートのタブに戻ってくると、セルの編集を開始しても、IMEが無効になったままでした。
そこで、IMEStateManager
のログ等からGoogleスプレッドシートの挙動を調べて見ると、まず、ドキュメントがフォーカスを得た時に、contenteditable
な要素にフォーカスを移動させている事が分かりました。ただ、問題は、ドキュメントのfocus
イベントハンドラ内で、フォーカスを移動させていたことにあります。このため、ドキュメントがフォーカスを得たことで、IMEを無効化しようとしますが、それを行う前に、エディタがフォーカスを得ることで、IMEを先に有効化してしまいます。そしてその後で、ドキュメントのフォーカス処理に戻って、IMEの無効化が完成します。
まず、最初のパッチでは、ドキュメントのフォーカス処理の最中に、別の要素にフォーカスが移動していたら、IMEの状態管理は(既に行われているはずなので)行わないように修正しました。
しかし、これだけではうまく動作しませんでした。さらに調査してみると、Googleスプレッドシートは、フォーカスの移動をブラウザに任せておらず、ドキュメントがフォーカスを得るときに、自身でフォーカスを行ったん別の要素に設定し、その後、元のフォーカスを持っていた要素にフォーカスを設定するということを行っていました。
ドキュメントにひとつしか存在しないnsHTMLEditor
は、入力イベントが来る度に、自分自身が管理すべき要素がフォーカスを持っているのかどうかを検査します。しかし、Googleスプレッドシートの自前フォーカス管理によって、この検査で「フォーカスを持っていない」と判断し、一部のCompositionEvent
を捨て、フォーカス移動によって発生している強制確定のリクエストを無視してしまっていました。
以前より、CompositionEvent
は、TextComposition
クラスが、compositionstart
からcompositionend
まで、必ず同じ要素上で発火するようにしています。そこで、これを利用して、nsHTMLEditor
はCompositionEvent
のターゲットが自分自身が管理しなくてはいけない要素のうちの一つであれば、フォーカスを持っていなくても処理を行う様に修正しました。