私は Firefox 3.6 用に書かれたアドオンを持っていますが、現在は Firefox 4.0 用にアップグレードしていますが、3.6 との互換性も維持しようとしています。これをやろうとした経験や、コードがスパゲッティっぽくなりすぎないようにする方法のヒントはありますか?
両方のバージョンとの互換性を維持することが、次のようなことを意味する場所がいくつかあります。
.myAddonClass {
-moz-background-size: 100% 100%; /* Fx 3.x */
background-size: 100% 100%; /* Fx 4.x */
}
これにより、両方のバージョンで CSS 警告が生成されます。私はそれで暮らすことができます。私がこのようなことをしている他の場所があります:
/** get the current version of this addon */
function getVersion() {
var version;
if (Application.extensions) { // Fx 3.x
version = Application.extensions.get('myaddon@example.com').version;
}
else { // Fx 4.x
Components.utils.import('resource://gre/modules/AddonManager.jsm');
AddonManager.getAddonByID('myaddon@example.com', function(addon) {
version = addon.version;
});
sleepUntil(function() {
return version;
}
}
return version;
}
(sleepUntil はThread.processNextEventテクニックを使用するユーティリティ関数です)
定義されているかどうかを確認することは、文字列を直接Application.extensions確認するよりもきれいに見えApplication.versionますが、そのアプローチには私が知らない欠陥があるのではないでしょうか?
また、コンテンツを Web ページに挿入しようとすると問題が発生します。あるケースでdoc.body.appendChildは、3.x では動作していたが 4.x では動作していなかったので、これを試してみました:
try { // Fx 3.x
doc.body.appendChild(myElement);
}
catch (e) { // Fx 4.x
let span = doc.createElement('span');
doc.body.appendChild(span);
span.innerHTML = outerHTML(myElement);
}
上記のコードは機能しませんが、throw new Error('')直前にa を挿入すると機能します。これdoc.body.appendChild(myElement)は、Firefox 4 では、呼び出しがエラーをスローする前に何らかの方法でappendChild変更されているように見えることを示しています。myElementこの特定のコード スニペットを機能させる方法を理解できると確信していますが、このような問題がさらに多く発生するのではないかと心配しているので、他の誰かが既に経験しているかどうかを確認したいと思います。同様のプロセスであり、知っておくべきヒントがあります。
長々と質問すみません。これが私が本当に求めていることです:
- アドオンを Firefox 3 と Firefox 4 の両方で同時に互換性を保つために、どのようなアドバイスがありますか?
- 3.x 用のバージョンと 4.x 用の別のバージョンがあるようにコードを分岐するというアイデアについてどう思いますか? 次に、新しい機能を両方のバージョンに適用し、両方のバージョンでテストする必要があります。
- 一般に、必要な特定の機能の存在をテストする方が良いですか (
if (Application.extensions) ...または try/catch で行ったように)、それともApplication.version'3' または '4' で始まるかどうかを確認するだけですか?