Firefox 8 の後方互換性に関わる修正

Firefox 8 は現在 11/8 の正式リリースに向けて開発が進められています。Firefox は新しいバージョンになっても可能な限り Web サイトの後方互換性が維持されるように開発されていますが、他のブラウザとの相互運用性や最新 Web 標準仕様への準拠のため、後方互換性に関わる修正も含められます。そのような修正点についてまとめましたので、Firefox 8 での動作検証をしていただくときなど、参考にしていただければ幸いです。

ここでは新機能ではなく後方互換性に影響し得る修正のみを説明します。後方互換性に関わるものに限らず、Firefox 7 の主な新機能や変更点については次のページをご覧ください:

引数なしで String.search() または String.match() を呼び出したときの動作が修正されます

String オブジェクトの search() または match() メソッドを引数なしまたは引数が undefined で呼び出した場合、Firefox 7 までは "undefined" を引数として指定した場合と同じ結果になっていました。これは ECMAScript 5th の仕様に反するため、Firefox 8 からは仕様通り引数として "" (空文字列) または // (空の正規表現) が与えられた場合と同じように修正されます

// Firefox 7 以前の場合
"firefox".search(); // -1 (/undefined/ でマッチ)
"012345undefined".search(); // 6 (/undefined/ でマッチ)
"012345undefined".search(undefined); // 6 (/undefined/ でマッチ)
"012345undefined".search(/undefined/); // 6
// Firefox 8 以降の場合
"firefox".search(); // 0 (空の正規表現でマッチ)
"012345undefined".search(); // 0 (空の正規表現でマッチ)
"012345undefined".search(undefined); // 0 (空の正規表現でマッチ)
"012345undefined".search(/undefined/); // 6

引数なしで呼び出された search() または match() メソッドは任意の String オブジェクトに対して常にマッチするようになるので注意してください。

引数なしで RegExp.exec() または RegExp.test() を呼び出したときの動作が修正されます

RegExp オブジェクトの exec() または test() メソッドを引数なしで呼び出した場合、Firefox 7 までは最後に exec() または test() メソッドの引数として渡した文字列に対して再度マッチしていました。これは ECMAScript 5th の仕様に反するため、Firefox 8 からは仕様通り引数として "undefined" が与えられた場合と同じように修正されます

// Firefox 7 以前の場合
/firefox/.test(); // SyntaxError: no input for /firefox/
/firefox/.test("firefox"); // true
/firefox/.test(); // true (前回の引数 "firefox" にマッチ)
/undefined/.test(); // false (前回の引数 "firefox" にマッチしない)
/undefined/.test(undefined); // true (undefined も新しい引数扱い)
/undefined/.test(); // true (前回の引数 undefined にマッチ)
// Firefox 8 以降の場合
/firefox/.test(); // false ("undefined" にはマッチしない)
/firefox/.test("firefox"); // true
/firefox/.test(); // false ("undefined" にはマッチしない)
/undefined/.test(); // true ("undefined" にマッチ)
/undefined/.test(undefined); // true
/undefined/.test(); // true ("undefined" にマッチ)

document.getSelection() が文字列ではなく Selection オブジェクトを返すようになります

これまで document.getSelection() メソッドは選択範囲に含まれる文字列を返していましたが、Firefox 8 からは window.getSelection() 同様に Selection オブジェクトが返されるようになります。これまでのように選択範囲の文字列が欲しい場合は document.getSelection().toString() などとしてください。

contenteditable 要素編集時に生成される要素が変更されました

contenteditable 属性が true の要素はクリックするとキャレットが表示され直接編集できるようになります。contenteditable な要素において、見出し要素の編集中にリターンキーを押して改行した場合、もしくはリスト要素の編集中にリターンキーを二度押してリストを閉じた場合、これまでは <br> 要素が挿入されていましたが、Firefox 8 からは <p> 要素が挿入され新しい段落が作成されるようになります。

MIME/HTTP ヘッダで日本語などを扱う場合に二重引用符がデリミタとして扱われなくなります

Content-Disposition HTTP ヘッダで日本語ファイル名を指定する場合など、MIME ヘッダや HTTP ヘッダで iso-8859-1 以外の文字エンコーディングを利用する場合、RFC 2231 および RFC 5987 に従って、二重引用符 " がデリミタ記号として扱われないようになりました

例えばこれまで次のような不正なヘッダを送信した場合でもファイル名に Alpha-日本語.html が指定されたと解釈されました:

Content-Disposition: attachment; filename*="UTF-8''Alpha-%e6%97%a5%e6%9c%ac%e8%aa%9e.html"

しかし Firefox 8 以降では RFC に従って二重引用符で括らず次のようなヘッダを送信する必要があります:

Content-Disposition: attachment; filename*=UTF-8''Alpha-%e6%97%a5%e6%9c%ac%e8%aa%9e.html

以前から RFC に適合したヘッダを送信していた場合は影響ありません。

JavaScript 無効化時には JavaScript ファイルをダウンロードしなくなりました

<script> タグによる外部 JavaScript ファイルはユーザが設定で JavaScript を無効化している場合でもダウンロードされていました。Firefox 8 からはユーザが JavaScript を無効化している場合、スクリプトを実行しないだけでなく外部 JavaScript ファイルをダウンロードもしなくなります。

Android 版の Firefox で JavaScript を無効化して転送量を減らしたいユーザを考慮しての修正です。基本的には影響ないはずですが、<script> タグによるアクセスに応じてサーバ側で何か処理している場合には注意してください。

Firefox 7 以前のバージョンについて

Firefox 7 以前のバージョンについても同様に、後方互換性をまとめています。必要に応じてご参照ください。