2010-12-17 7 views
4

私は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を修正するように見えることを示しています。この特定のコードスニペットをどのように動作させるかを理解できると確信していますが、私はこれと同様にさらに多くの問題に遭遇するだろうと心配しています。同様のプロセスであり、私が知っておくべきヒントがあります。

大変申し訳ございません。 は、ここで私が本当に求めているものです:

  1. あなたが同時にFirefoxの3とFirefox 4の両方と互換性のあるアドオンを維持しようとするために必要がありますどのようなアドバイスはありますか?
  2. 3.x用に1つのバージョンを、4.xに1つのバージョンを持つようにコードを分岐する考えはどう思いますか?両方のバージョンに新しい機能を適用して両方のバージョンなどでテストする必要があります。
  3. 一般的に、私がif (Application.extensions) ...で行ったように、特定の機能が存在するかどうかをテストすることをお勧めします。/catch)、またはApplication.versionが '3'か '4'で始まるかどうかをチェックするだけですか?私getVersion()機能のためのMozilla #addons IRCチャンネルから
+0

もちろん、Firefox 4がリリースされた直後にFirefox 3.xのサポートを中止することもできますが、Firefox 3.xのユーザーがアップグレードを躊躇しているかどうかを確認するのが良いでしょう。 – MatrixFrog

+1

誰かが不思議に思っていた場合、try/catchの解決策は、両方のバージョンで完全に動作する 'doc.body.appendChild(doc.importNode(myElement))'を実行することです。 – MatrixFrog

+0

'doc.body.appendChild(doc.importNode(myElement))'を書くのではなく、他のドキュメントを使って 'myElement'を作成するのではなく、' doc.createElement'を使って 'myElement'を作成できませんか? – Neil

答えて

1

アドオンをFirefox 3とFirefox 4の両方に同時に対応させるためのアドバイスはありますか?

最近の2つのメジャーバージョンには、単一のXPIをお勧めします。古いバージョンの人は紛失してしまい、さまざまな「アクティブ」バージョンの2つのXPIを持つことは混乱しています(私は最近、AMOがこれを提示する方法を実験しませんでしたが、これは私の古い印象です)。

私たちが3.xのバージョンと4.xのバージョンを持つようにコードを分岐する考え方についてどう思いますか?両方のバージョンに新しい機能を適用して両方のバージョンなどでテストする必要があります。

コードがスパゲッティになってしまった場合にのみ実行します。愛好者として、古いバージョンのアップデートをやめて、古いバージョンのFirefoxを使用する人に残しておきます。 Firefoxの新しいバージョンの採用率を確認するために、AMOの拡張機能の統計情報を見ることができます(統計ページはあまり使いやすいとはいえません)。

一般に、あなたが望む特定の機能(if(Application.extensions)...やtry/catchのように)、またはApplication.versionが '3'か '4'で始まるかどうかをチェックするだけですか?

能力ベースの分岐はここでは重要ではありません。ウェブページとは異なり、ホストアプリケーションの固定セットを扱っているためです。

はいえ、心の中で可能な副作用を保持:

  • あなたのコードの一部のみの機能を、プラットフォームの機能を使用していないので、もし、アプリケーションのバージョンは、他のアプリケーションへのポートに難しく、それを行いますチェック特定のアプリケーションでは、プラットフォームのバージョンをテストする方が合理的です。
  • try..catchは、あなたが期待しているものとは関係のない、他のエラーも捕捉できます。私はそれを避けるだろう。

P.S.

1)(それらの多くがある場合)私はThread.processNextEvent技術が危険であると信じていappversion in chrome.manifest

2)、あなたがするので、経由で異なるバージョンの異なるスタイルを使用することができ、未知のプロパティについてCSSの警告を回避するには完了するまで呼び出しスタックが巻き戻されるのを防ぎます。

+0

"他のアプリケーション"とは、Seamonkeyのような他のMozilla製品を意味しますか? – MatrixFrog

+0

Thread.processNextEventが危険な理由を説明したり、それを記述するリンクを投稿できますか? – MatrixFrog

+1

@MatrixFrog:1)はい。 2)あなたがリンクしたページは、これについて警告します。あなたのイベントが、AddonManager.getAddonByIDがそのコールバックを呼び出す前に返さなければならない関数Fから呼び出されたとします。Fに制御を戻さないと、内側のprocessNextEventループが無限に実行されます。私はこれがあなたの場合に起こると言っているわけではない、ちょうどあなたが使用している非公式のテクニックだということです。 – Nickolay

1

1つの提案、:nsIExtensionManagerに裏打ちされていますAddonManagerのモックアップを作成します。 Or use this one。そうすれば、関数自体がif/thenパターンを持つ必要はありません。

関連する問題