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

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

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

2015年6月19日

Bug-org 549674 Uncommitted IME means you can't set value of an input
初回投稿日時: 2015年06月19日18時31分19秒
カテゴリ: Firefox Google Chrome IE IME Mozilla Core Mozilla41 バグ修正
SNS: (list)

Geckoは昔から、未確定文字列がある場合に<input>要素や<textarea>要素のvalue属性値を変更しても、IMEは未確定文字列を持ったままで動作がおかしくなるようになっていました。

このバグが長年修正されなかったのは、まず、標準仕様でどうするべきか策定すべきではないかという話がありました。しかし、これは実装側の事情でどうにかしろという話になりました。IE11やGoogle Chromeでは未確定文字列は確定されます(後者はどうにも挙動が怪しいですが)。

もう一つの理由は、LinuxのiBusのように確定のリクエストが非同期で実行される場合にどうすれば良いのかという点がありました。しかし、これはTextCompositionがコンテンツ上での同期的強制確定を保証できている時点で既に問題ではなくなっていました。

今回、IMEまわりの修正を盛大に行っているため、Androidでは一部のサイトでのサジェスト機能がうまく機能しなくなるというregressionが発生してしまっていましたが、その原因の特定やバックアウトが困難なため、今回、この機能の修正に踏み切りました。

今回の修正により、以下のような例では、value属性が変更された場合に、Geckoではtext (Gecko独自イベント)、compositionendinputイベントが発生するようになっています。また、その最中にvalue属性値を取得して処理する際にも期待通りに動作するように、内部では若干、ハッキーな手法をとって、セットした値がそのまま取得されるようになっています。これは、maxlength等を無視することを意味していることに注意してください。

var textarea = document.getElementsByTagName("textarea")[0];

function handler(aEvent)
{
  textarea.value += ", " + aEvent.type;
}

textarea.addEventListener("text", handler);
textarea.addEventListener("compositionupdate", handler);
textarea.addEventListener("compositionend", handler);
textarea.addEventListener("input", handler);

// 未確定文字列("あいうえお")がある状態で
textarea.value += ", " + "setting value";

この結果、textareaの内容は、あいうえお, setting value, text, compositionend, inputとなります。IE 11ではtextcompositionendは発火しません(前者はともかく、後者はバグですが……)。

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

bug-org 549674を含むエントリ