この日記はMozilla Japanのプロダクトへの貢献を中心に書いていますが、断り書きがある場合を除き、 オフィシャルな発表ではありません。あくまでも個人的なものです。 Mozilla Japan、Mozilla Foundation、Mozilla Corporation、及び関連企業の公式情報ではないことに注意してください。
ちなみに、誰の日記なのかよく分からないという方はInside Mozilla Japan内の 私の自己紹介 を参照してください。
先日、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側にもいくつかの方法でコンタクトを試みていますが、今のところ、修正はされていないようです。