私はFirefox 3.6向けに書かれたアドオンを持っていますが、現在はFirefox 4.0用にアップグレードしていますが、3.6との互換性を維持しようとしています。誰もがこれをやろうとすることで何か経験を持っているのですか、またはコードがあまりにもスパゲッティになっていない状態でそれを行う方法についてのヒントはありますか?Firefox 4.0と互換性があるようにアドオンをアップグレードしますが、3.xとの互換性を保ちます。助言?
両方のバージョンとの互換性を維持することは、このような何かやって意味のいくつかの場所があります。
.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('[email protected]').version;
}
else { // Fx 4.x
Components.utils.import('resource://gre/modules/AddonManager.jsm');
AddonManager.getAddonByID('[email protected]', function(addon) {
version = addon.version;
});
sleepUntil(function() {
return version;
}
}
return version;
}
Application.extensions
が定義されているかどうかを確認するだけで直接Application.version
文字列をチェックするよりもクリーンようだ(sleepUntilはThread.processNextEvent
technique使用する効用関数である)は、しかし、おそらく私が知りませんが、そのアプローチのいくつかの欠陥がありますか?
ウェブページにコンテンツを挿入する際に問題が発生しています。あるケースでは、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);
}
を上記のコードは動作しませんが、私はそれからちょうどdoc.body.appendChild(myElement)
前にthrow new Error('')
を挿入した場合Firefox 4でappendChild
呼び出しがエラーを投げる前に何らかの形でmyElement
を修正するように見えることを示しています。この特定のコードスニペットをどのように動作させるかを理解できると確信していますが、私はこれと同様にさらに多くの問題に遭遇するだろうと心配しています。同様のプロセスであり、私が知っておくべきヒントがあります。
大変申し訳ございません。 は、ここで私が本当に求めているものです:
- あなたが同時にFirefoxの3とFirefox 4の両方と互換性のあるアドオンを維持しようとするために必要がありますどのようなアドバイスはありますか?
- 3.x用に1つのバージョンを、4.xに1つのバージョンを持つようにコードを分岐する考えはどう思いますか?両方のバージョンに新しい機能を適用して両方のバージョンなどでテストする必要があります。
- 一般的に、私が
if (Application.extensions) ...
で行ったように、特定の機能が存在するかどうかをテストすることをお勧めします。/catch)、またはApplication.version
が '3'か '4'で始まるかどうかをチェックするだけですか?私getVersion()
機能のためのMozilla #addons IRCチャンネルから
もちろん、Firefox 4がリリースされた直後にFirefox 3.xのサポートを中止することもできますが、Firefox 3.xのユーザーがアップグレードを躊躇しているかどうかを確認するのが良いでしょう。 – MatrixFrog
誰かが不思議に思っていた場合、try/catchの解決策は、両方のバージョンで完全に動作する 'doc.body.appendChild(doc.importNode(myElement))'を実行することです。 – MatrixFrog
'doc.body.appendChild(doc.importNode(myElement))'を書くのではなく、他のドキュメントを使って 'myElement'を作成するのではなく、' doc.createElement'を使って 'myElement'を作成できませんか? – Neil