Bug-org 1186799 composition string in contenteditable element isn't committed when you click outside of the editor
初回投稿日時: 2015年08月09日12時08分21秒
最終更新日時: 2015年08月09日12時09分11秒
カテゴリ: IME Mozilla Core Mozilla42 バグ修正
SNS:
Tweet (list)
contenteditable
なエディタ上に未確定文字列が存在している時に、編集不能なその外側をクリックしても未確定文字列は実際には確定されているものの、未確定文字列の見た目がそのまま残ってしまうというバグです。
原因は、nsHTMLEditorEventListener::MouseDown()
が、editing host
の外側でクリックされた場合には何もしていないことが原因でした。
editing host
の外側でクリックが行われると、まず、mosuedown
イベントが発生します。これにより、フォーカス移動が発生し、このcontenteditable
なエディタはフォーカスを失います。この時に内部ではREQUEST_TO_COMMIT_COMPOSITION
が発行され、ネイティブのIMEに未確定文字列の確定を促し、それが実行されると、NS_COMPSOITION_COMMIT_AS_IS
イベント等が発火されます。
通常は、このパターンでもうまくいくはずだったのですが、このケースではcontenteditable
なエディタというのが問題でした。
nsHTMLEditor
は(仕様が同じ形になりましたが)、ドキュメントにひとつだけ存在し、複数のcontenteditable
な要素があっても、フォーカスが移動する度に初期化され、使い回すことになります。このような動作を実現するため、フォーカスを持ったcontenteditable
な要素の外側にある要素は編集不能と判断されます。つまり、どのcontenteditable
な要素もフォーカスを持たない場合、全ての要素が編集不能と判断されます。
このため、フォーカスを失った後にnsHTMLEditor
が受け取った確定イベントは全て、処理に失敗していたのです。
これを修正するために、今回は、フォーカスを失う前段階であるmosuedown
がediting host
外で発生した場合にも強制確定を行うようにしました。若干雑な修正の仕方なのですが、現在、エディタは自分が未確定文字列を管理していない場合には、IMEに対して確定のリクエストを出さないようになっていますので、十分に安全に修正されていると思われます。