Firefox 5 の後方互換性に関わる修正のまとめ

先日 Firefox 5 のベータ版が公開されました。Firefox 5 の正式版は 6/22 のリリースを予定しており、Firefox 4.0.1 のユーザは自動的に更新されます

Firefox 4 以降では Rapid Release プロセスと呼ばれる新しいリリースプロセスに移行し、セキュリティと安定性の改善と共に、新機能や高速化を含めた新しいバージョンを 6 週間毎に公開します (Firefox 6 まではプロセス移行に伴い異なる間隔)。

基本的には後方互換性が維持されるよう開発されていますが、最新 Web 標準への対応や、他のブラウザとの互換性確保のため、細部では後方互換性に関わる変更も含まれています。

そこで、後方互換性に関わる Firefox 5 の主な変更点をまとめてみました。Beta 版で互換性テストをされる Web 開発者の皆様などの参考になれば幸いです。

後方互換性に関わるものに限らず、Firefox 5 での主な変更点については次のページにまとめられています:

https://developer.mozilla.org/ja/Firefox_5_for_developers
https://hacks.mozilla.org/2011/06/firefox5

JavaScript の予約語が(再度)追加されます

Firefox 5 からは次世代 JavaScript のため次のキーワードが予約語として追加されます: classenumexportextendsimportsuper

Firefox 4 では Strict モード利用時のみこれらが予約語として扱われていましたが、Firefox 5 では Strict モードがオフの時にも予約語として扱われます。従ってこれらのキーワードは変数名として利用できません。

歴史的経緯などについて詳しくは次の記事を参照してください:

http://whereswalden.com/2011/03/16/

JSON.parse() の構文が厳格化されます (6/8 追記、6/15 更新)

Firefox 5 からは JSON 文字列に八進数リテラル (例: JSON.parse('0123'))、小数点以下省略した数値 (例: JSON.parse('1.')) は許されません

ECMAScript 5th 仕様に JSON サポートが追加されましたが、JSON.parse() による JSON 文字列の構文解釈が以前より RFC 仕様に厳格なものとなります。その結果これまで仕様違反でも許可されていたものがエラーとして処理されます。

この変更について詳しくは次の記事を参照してください:

http://whereswalden.com/2011/06/06/i-feel-the-need-the-need-for-json-parsing-correctness-and-speed/

なお、パース対象文字列中に直接タブ文字を含めること (例: JSON.parse(' “... \t ...” ')) は Firefox 4 から許されなくなっています。もちろん、データとしてタブ文字を扱えないわけではありません。JSON.parse(' "...\\t..." ') のようにしてください。あるいは JSON で受け渡す文字列値データに他の制御文字を含めたい場合は Unicode エスケープを利用します。例えばタブ文字であれば JSON.parse(' "...\\u0009..." ') のように \u に続けて 4 桁の 16 進数でコードを指定します。

setTimeout() の最小時間が変更されます

Firefox 5 からは setTimeout() で指定する最小時間が 10ms から 4ms へと短縮されます。一方でバックグラウンドタブにおいては最大 1 秒 1 回までしか呼び出されなくなります。

setTimeout()setInterval() に指定する最小時間は HTML5 で 4ms と規定されたため、これに合わせた仕様変更です。一方で JavaScript では多数のタイマーを使うと処理が重たくなることが知られています。毎秒数百回もタイマー呼び出しを行うページも珍しくありませんが、表示中でないページについては無駄を減らすため呼び出し間隔に制限を加えます。

アニメーションにタイマーを利用するのであれば、無駄なく高速なアニメーションが可能な Request Animation Frame の利用を推奨します (Chrome も賛同して同様の機能をサポート)。

参考: 他のブラウザでもタイマーの仕様変更が行われています。IE9 では通常 4ms ですがバッテリー動作時には 10~15ms、Canvas 描画処理を伴う場合は約 3ms (仕様違反)、Chrome 11 以降は Firefox 5 同様にバックグラウンドタブでは最大 1 秒 1 回までに制限されます。

Blobslice() メソッドが削除されます

Firefox 5 では Blob (およびその派生である File) インターフェイスから slice() メソッドが削除され、代わりに引数の取り方が異なる mozSlice() メソッドが追加されました

従来の Blob インターフェイスでは Array.slice()String.slice() と引数の取り方が異なっていましたが、これを揃えるように標準変更が進められる見込みで、それに合わせて実装を変更しました。

Canvas まわりの例外処理が変更されます

Canvas 2D API については細かな修正が多数行われています

例えば、Canvas の translate()transform()rect()clearRect()fillRect()strokeRect()lineTo()moveTo()quadraticCurveTo()arc() メソッド呼び出し、あるいは globalAlpha プロパティに不正な値を与えた場合、例外を発生していましたが、Firefox 5 からは何もせず単に無視されます。

その他いくつかの場合で投げられる例外が仕様に合わせて変更されるなどしています。詳しくは Firefox 5 の変更点一覧ページでの説明をご覧ください。

WebGL でも画像に同一生成元ポリシーが適用されます (6/8 追記)

Firefox 5 からは WebGL のテクスチャ画像にも同一生成元ポリシーが適用され、他のサイトの画像を読み込むには CORS を用いる必要があります

WebGL でのテクスチャ画像処理時間を計測することで JavaScript からクロスドメイン画像読み取りが現実に可能であるなどのセキュリティ問題が指摘されたため、その問題を解決するため現仕様より厳しい制限を導入することになりました。詳しくは次のページをご覧ください:

http://blog.jprosevear.org/2011/05/13/webgl-security/
http://hacks.mozilla.org/2011/06/cross-domain-webgl-textures-disabled-in-firefox-5/

正規表現を関数として呼び出せなくなります

Firefox 5 からは /RegExp/("string") のような、正規表現オブジェクトを関数として呼び出す処理が使えなくなります

元々仕様になく、ドキュメント化もされていない機能でした。Firefox の実装に合わせて WebKit でもサポートされていましたが、今回共にこの書き方のサポートを廃止しました。

UTF-7、UTF-32 のサポートが廃止されます

文字エンコーディング UTF-7 と UTF-32 は HTML5 仕様ではサポートされないものとされています。実際に使われていることも殆ど無く、標準準拠のためこれらのエンコーディングのサポートは廃止されます。

Keep-Alive ヘッダを送信しなくなります

これまで Keep-Alive リクエストヘッダを送信してきましたが、書式が正しくなかった上に、そもそも Connection または Proxy-Connection リクエストヘッダの値として Keep-Alive を指定していたため、意味的重複があり無駄でした。