IME を有効にしているとパスワード入力用テキストボックスの挙動がおかしくなる

Firefox を使っていると認証系の画面でおかしな挙動になる事がある。
発生条件は2つ
・パスワード入力用のテキストボックス(文字が * で表示される奴)に入力する際に
IME が有効になっている状態で文字入力をしてしまった場合
以上の条件が揃うと、その後正しいパスワードを入力したとしても認証は失敗する。


例えば、認証画面においてパスワードを入力しようとした際、IME が有効になっていたため日本語変換モードで入力しかけた。すぐに気づいて IME をオフにしてから正しいパスワードを入力し直した。この時、正しいパスワードだったにもかかわらず認証に失敗してしまう、といった現象が起こる。


いろいろ試した結果、どうやら Firefox のパスワード入力用テキストボックスは IME が有効になっている状態で入力された一文字目を無条件にバッファに格納してしまっているようだ。
例をあげると、ローマ字入力モードで「おけ」と入力すると内部的には「おおけ」という文字列が格納される。また、「おけ」と入力して確定せずキャンセルした場合でも「お」という文字列が格納される。一文字目は問答無用で保持してしまうのだ。
この時、バッファに格納されるのはキー入力時に変換フィールドに表示される文字で、ローマ字入力モードの場合「a」を入力すると「あ」が、「b」を入力すると「b」が入る。


といった訳で IME 経由で一回入力する度に一文字余計に格納されてしまうのだが Firefox は表示した文字数分しか入力されなかったと勘違いしているようだ。
例えば、「ほげ」と入力を行った後の状態は以下のようになる。

Firefox の認識現実
格納された文字列ほげhほげ
格納された文字数23
カーソル位置"げ"の後ろ"ほ"と"げ"の間


このように意図せず格納される文字が発生するのだがこの文字の分の * はテキストボックスには表示されない。しかし、フォームをサブミットするとサーバにはしっかり送信される。そのため、最初の例のように認証に失敗してしまうのである。


見えない文字を消す方法だが「テキストボックスに一文字以上入力された状態かつカレットが文字列の最後にある状態でデリートキーを押下」すればよい。デリートキーは文字数分押下する事。
一文字以上入力した後で、と書いたのはデータが無い状態だとデリートキーが機能しないから。
そして、この見えない文字はテキストボックスに何もデータが無い状態ではカレットの後ろに存在しているようで、新規に入力された文字は見えない文字の前に挿入される。つまり、見えない文字は常に表示されている文字の後方に存在している。よって削除はデリートキーで行う事になる。


ちょっと気になったのは、カーソル位置は表示されている文字数の範囲でしか移動できないよう制御しているのだが、見えない文字を消す時には表示されている文字数に関係無くデリートキーを押した数だけ後続の文字が削除される事。Firefox は自分が認識している文字数以上のデータを消しにいってる事になる訳だが問題ないのかな?