アドオンを Firefox 5 と 6 へ対応させるための注意点

[これは Mozilla Add-ons Blog の記事 Making your add-ons compatible with Firefox 5 and 6 の抄訳です]

以前からお知らせしているように、Firefox は新たな高速リリースサイクルへ移行しており、それぞれ Beta/Aurora チャネルにある Firefox 5 と Firefox 6 のプレビュー版 が既にダウンロード可能となっています。Firefox 5 は数週間以内 [6 月 22 日] にリリースされる可能性が高く、Firefox 6 もそれから 6 週間後に続きます。

リリースサイクルが短縮された結果、これらの新バージョンでは互換性へ影響を及ぼす変更点が非常に少なく、アドオン作者にとって問題となる可能性はこれまでより低くなっています。この記事では、Firefox 5 と 6 に含まれるアドオン互換性に関するすべての既知の問題を取り上げます。もしあなたが何か別の問題に遭遇して、それがここで言及されていないか、どこにも文書化されてない場合は、ぜひお知らせください。

AMO では既に、Firefox 5 への対応が確認されたアドオンの 互換性情報を自動的に更新 しており、同じように 6 へ向けた更新を、今週中、というよりおそらく今日中に行います。

自動更新を行うアドオンはどのように選ばれているのでしょうか? まず Firefox の旧バージョンへ対応していることが前提となります。それから、(通常は再ビルドが必要となる) バイナリコンポーネントを同梱しておらず、以下のような既知の変更点に基づいて Mozilla が作成した特別な互換性テストをパスしたものを機械判定します。

Firefox 5 での変更点

  • navigator.language の値に Firefox の UI 言語設定が反映されなくなりました (Bug 55366)。UI 言語を取得したい場合は、代わりに general.useragent.locale の設定値を使ってください。
  • 待ち時間が設定されていない場合の setTimeoutsetInterval の既定の挙動が変更されました (Bug 610077)。タイマーを非常に小さい値に設定した場合、これまで実際の待ち時間は 10 ミリ秒に丸められていました。Firefox 5 ではその最小値が変更されるとともに、コードがどこで実行されているかによって変わるようになりました。[Web 開発者向け Firefox 5 の後方互換性に関わる修正のまとめ の「setTimeout() の最小時間が変更されます」を参照してください]
  • いくつかの単語が JavaScript の予約語へ追加されました。これらは strict モードを使用していない場合にも適用されます (Bug 637204)。新たに予約された単語は、classenumexportextendsimportsuper です。これらの単語を自分で書いたコード内で使ってはいけません。たとえオブジェクトのプロパティ名であっても使えません。この影響を受ける一部のアドオンは Firefox 5 へ向けて互換性情報が自動更新されている場合がありますので、コードを見直して Firefox 5 で実行中にエラーが出ていないか確認してください。
  • 起動時に nsICertOverrideService (おそらくそれ以外のインタフェースも) をインスタンス化すると、Firefox が機能しなくなる場合があります (Bug 650858)。Mozilla では最近この問題を把握し、まだ影響を見極めているところです。これは load イベントより前にサービスをインスタンス化しようとしたときだけ再現するため、以下のように簡単に回避できます。

間違った例 1

var comp = Components.classes[...].getService(...);
var MyObject = {
  init: function() {},
  ...
}
window.addEventListener("load", function() { MyObject.init(); }, false);<strong></strong>

間違った例 2

var MyObject = {
  comp : Components.classes[...].getService(...),
  init: function() {},
  ...
}
window.addEventListener("load", function() { MyObject.init(); }, false);

正しい例

var MyObject = {
  comp : null,
  init: function() {
    this.comp = Components.classes[...].getService(...);
  },
  ...
}
window.addEventListener("load", function() { MyObject.init(); }, false);

単に load イベントの前にコンポーネントをインスタンス化しなければ良いのです。できれば、Mozilla がまとめている パフォーマンス向上のためのベストプラクティス に従って、必要になるまではインスタンス化しないことをお勧めします。

  • ベータ版向けの Mac OS 用 SDK ビルドがまだ用意されていません (Bug 653971)。これは Mac 用のバイナリコンポーネントをビルドする開発者に影響します。いくつかのバグが原因となっていますが、すべてこのバグで追跡されています。今後数日中に修正される見込みです。
  • その他の変更は Firefox 5 for developers にまとめられています。

Firefox 6 での変更点

  • app.update.timer 設定は app.update.timerMinimumDelay に置き換えられました (Bug 614181)。
  • アドオンで (ごくまれに) 使用されている一部のインタフェースが削除されました。IWeaveCrypto (Bug 651596)、nsIDOMDocumentTraversal (Bug 655514)、nsIDOMDocumentRange (Bug 655513) の 3 つです。
  • window.top は読み取り専用となりました (Bug 654137)。これは chrome スクリプトで top という名前の未定義変数を使用しているアドオンに影響します。
  • ロケーションバーへ入力された javascript:data: URL が、現在表示されているページの権限を継承しなくなりました (Bug 656433)。これはおそらくアドオンには影響しませんが、多くの回避策や変わったコードが出回っているため、これらの種類の URL を使ってコードを実行している場合は再確認した方が良いでしょう。
  • [ツール] メニュー内に [Web 開発者] サブメニューが新設されました (Bug 653221)。Firefox のこれまでのバージョンでいくつかの新たな開発者向けツールが追加されてきたため、それらをサブメニューにまとめることが適当と判断されました。この変更は、移動された開発者向けメニュー項目が [ツール] メニュー直下にあることを前提としている、多くのオーバーレイに影響します。オーバーレイがまったく動かなくなることはありませんが、アドオンで独自に追加する項目が、本来意図した場所ではなく、おそらくメニューの一番下へ追加される形になるでしょう。
  • [履歴] メニュー (Bug 625322) と [ブックマーク] メニュー (Bug 625325) 内の項目の並び順が変更されました。これらのメニューに対してオーバーレイや変更などを行っているアドオンに影響します。
  • clearUserPref メソッドが、元々ユーザ設定値がない場合も例外を投げなくなりました (Bug 487059)。
  • XPCOM バイナリコンポーネントの登録が Module::kVersion を無視しなくなりました (Bug 656331)。
  • サイト別プライバシー設定画面が実装されました (Bug 573176)。これは、メインのオプション画面に存在する特定の設定 (プライバシー、パスワードの記憶など) に依存しているアドオンにしか影響しないはずです。
  • その他の変更は Firefox 6 for developers にまとめられています。

繰り返しますが、もしこれらの一覧に載っていない変更があったら教えてください。よろしくお願いします。