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

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

もずはっく日記(2016年1月)

2016年1月19日

TweetDeckでFirefoxから日本語が入力できなくなっている件 (Bug-org 1240170Bug-org 1240336)
初回投稿日時: 2016年01月19日16時34分29秒
最終更新日時: 2016年01月20日23時52分46秒
カテゴリ: Events Firefox HTML IME Mozilla Core バグ原因判明
SNS: (list)

先日、TweetDeckでFirefoxから日本語が入力できなくなっているという話を聞きました。実際に試してみると、IMEで一文字入力する度に、未確定文字列が強制的に確定されてしまいます。

Army of Awesome上ではかなりこの件で悲鳴を上げている方が多く、また、検索結果から原因を誤解してFirefoxが悪いんだと悪評を広めてくれている人を多々見かけましたので、何が原因で、どういう状況なのかをまとめておきます。

私は今回の原因はTweetDeckの開発者のテスト不足が原因だと思っています。ちなみに、Firefox側のアップデートで発生した訳でも、OSのアップデート等で発生した訳でもなく、TweetDeck側のメンテナンス作業の結果、発生しているregressionです。

何が起きているのかというと、実際のコードを確かめられた訳ではありませんが、スタックトレースやFirefox 41以降で発生するということから、以下のようなJavascriptのコードが実行され、その結果、Firefoxでのみ未確定文字列が強制的に確定されるという状況に陥っていることが分かりました。

var textarea = document.getElementsByTagName("textarea")[0];
textarea.addEventListener("input",
  function (event) {
    textarea.value = textarea.value;
  });

実際のテストケースで動作を確認できますが、非常に無意味な処理です。実際にはセットしている値は変数等に格納されているのでしょうが、複雑なWebアプリだから発生しているイージーミスのように見えます。

では、このケース、どのように動作すべきだと思いますか? 実は、未定義なのです。 WHATWGに昔、加藤誠さんが未確定文字列がある場合に値がセットされた場合、未確定文字列をどうすべきかとポストしたのですが、それに対するHixieの返事は、

Well the value should definitely get set, per spec. Whether the IME should reset state is a UI issue, so the spec doesn't address that.

I've specced what should happen to the cursor and selection, though only as a "should". I haven't specced what should happen with IME since, as mentioned above, it seems like this is just a UI issue that doesn't affect interop (you can't detect the IME state unlike the selection state, for example).

というものでした。IMEの動作についてどうあるべきかはUIの問題であり、それは(少なくとも)HTML5では定義しないということです。

Firefox 41でのBug-org 549674の修正まで、Geckoは未確定文字列があるままに値を設定されると、未確定文字列の表示が壊れるものの、IMEは未確定文字列を持ち続けるという状態の齟齬があり、これがいくつかのWebアプリで問題になっていました。この修正時に、<input><textarea>の値がセットされた際には、常に未確定文字列を強制的に確定するようにしましたが、それが今回、あだとなってしまったわけです。

実際には他のブラウザはセットされた値によって、実際に値が変化する場合のみ、未確定文字列を強制確定していました。この違いが、今、Firefoxでのみこの問題が起きている理由です。

今回の件は非常に発生タイミングも悪く、Firefox 44でのGecko側での修正にはスケジュール的に難色が示されています

また、今回の問題を引き起こしたTweetDeck側にもいくつかの方法でコンタクトを試みていますが、今のところ、修正はされていないようです。

TweetDeckに対するEvangelismバグ
Bug-org 1240170: Japanese IME won't join a consonant and a vowel on TweetDeck's Tweet field
Gecko側の動作を他のブラウザと同じ様に修正するバグ
Bug-org 1240336 At setting either <textarea>.value or <input>.value, we shouldn't commit composition if the value won't be changed

TweetDeckの開発者と思われる方からコンタクトがあり、修正方法を提案しておきました。その後、今日明日中に修正できたらいいな、という旨のツイートをされていました。

TweetDeck側で無事、修正されました。まだ再現する人はリロードしてみてください。

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

bug-org 1240170を含むエントリ