Bug-org 587243 Textbox of tab group lost focus immediately by keypress Eenter(Conversion Enter Commit) while IME composition
初回投稿日時: 2010-09-12 12:53:20
最終更新日時: 2010-09-12 13:09:53
カテゴリ: Mozilla Core バグ修正
SNS:
Tweet (list)
IMEで確定する時のEnterキーや、キャンセル時のESCキーの入力でtab group名を入れるエディタからフォーカスが失われてしまう、というバグです。
今回のtab candyはjQueryとHTMLで実装されているようで、このjQueryがバグの原因でした。
Geckoの流儀ではキーの入力処理は基本的にkeypressイベントを活用します。しかし、jQueryはおそらくクロスブラウザな動作を実現するためにESCキーのような文字を入力しないキーではkeypressイベントを発生させていません。このため、代わりにkeyupイベントが利用されていたことが直接の原因です。
GeckoのキーイベントとIMEのイベントの関係は次のようになっています。
| アクション | 発生するイベント |
|---|---|
| 最初の一文字のキー入力 |
|
| 途中のキー入力 |
|
| 最後のキー入力 |
|
そう、未確定文字列を確定、もしくはキャンセルさせた場合、keyupイベントは発生しているのですが、これはすでにOS側で消費されているはずのキー入力なのにもう一度アクションを起こしてしまうから変な動きになっていたのです。
対策として、EnterキーとESCキーで未確定文字列が発生することは無いことを利用してkeydownでフォーカスまわりの処理を行うようにし、またそのイベントをそこで消費してしまうようにしました。ただし、ラベルの保存等はkeydownイベントではテキストの入力がまだ終わっていない可能性が高いので引き続きkeyupイベントハンドラに残したままにしています。
テスト用URI
data:text/html,<script type="text/javascript">
function printEvent(e) {
var p = document.getElementById('p');
p.innerHTML = e.type + "<br>" + p.innerHTML;
}
</script>
<body onload="document.addEventListener('compositionstart',
function (e) { printEvent(e); }, false);
document.addEventListener('compositionend',
function (e) { printEvent(e); }, false);
document.addEventListener('text',
function (e) { printEvent(e); }, false);">
<input onkeypress="printEvent(event);"
onkeydown="printEvent(event);"
onkeyup="printEvent(event);">
<p id="p"></p>
</body>