4

私は 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この特定のコード スニペットを機能させる方法を理解できると確信していますが、このような問題がさらに多く発生するのではないかと心配しているので、他の誰かが既に経験しているかどうかを確認したいと思います。同様のプロセスであり、知っておくべきヒントがあります。

長々と質問すみません。これが私が本当に求めていることです:

  1. アドオンを Firefox 3 と Firefox 4 の両方で同時に互換性を保つために、どのようなアドバイスがありますか?
  2. 3.x 用のバージョンと 4.x 用の別のバージョンがあるようにコードを分岐するというアイデアについてどう思いますか? 次に、新しい機能を両方のバージョンに適用し、両方のバージョンでテストする必要があります。
  3. 一般に、必要な特定の機能の存在をテストする方が良いですか (if (Application.extensions) ...または try/catch で行ったように)、それともApplication.version'3' または '4' で始まるかどうかを確認するだけですか?
4

2 に答える 2

1

Mozilla #addons IRC チャンネルからの 1 つの提案: 私のgetVersion()機能について: nsIExtensionManager に支えられた AddonManager のモックアップを書いてください。または、これを使用します。そうすれば、関数自体がその if/then パターンを持つ必要がなくなります。

于 2010-12-18T20:39:57.783 に答える
1

アドオンを Firefox 3 と Firefox 4 の両方で同時に互換性を保つために、どのようなアドバイスがありますか?

最新の 2 つのメジャー バージョンに対して単一の XPI をお勧めします。古いバージョンの人々は失われたケースであり、異なる「アクティブな」バージョンに 2 つの XPI があると混乱します (私は最近、AMO がこれを提示する方法を試していませんが、それが私の古い印象です)。

3.x 用のバージョンと 4.x 用の別のバージョンがあるようにコードを分岐するというアイデアについてどう思いますか? 次に、新しい機能を両方のバージョンに適用し、両方のバージョンでテストする必要があります。

コードがスパゲッティになりすぎた場合にのみ、私はそれを行います。愛好家として、私は古いバージョンの更新をやめて、古いバージョンの Firefox を使用している人々のために残します。AMO で拡張機能の統計を表示して、新しい Firefox バージョンの採用率を確認できます (統計ページが使いにくい場合でも)。

一般に、必要な特定の機能の存在をテストする方が良いですか (if (Application.extensions) ... または try/catch で行ったように)、または Application.version が '3' で始まるかどうかを確認するだけですか? 「4」?

Web ページとは異なり、固定された一連のホスト アプリケーションを扱っているため、機能ベースの分岐はここでは問題になりません。

ただし、考えられる副作用に注意してください。

  • アプリケーションのバージョンを確認すると、他のアプリケーションへの移植が難しくなるため、コードの一部が特定のアプリケーションの機能ではなく、プラットフォームの機能のみを使用している場合は、プラットフォームのバージョンをテストする方が理にかなっています。
  • try..catch は、予期しているエラーとは関係のない他のエラーをキャッチすることもできます。私はそれを避けるだろう。

PS

1) 不明なプロパティに関する CSS の警告を回避するために (それらが多数ある場合)、 chrome.manifest の appversionを使用して、バージョンごとに異なるスタイルを使用できます。

2) Thread.processNextEvent 手法は危険であると考えています。これは、終了するまでコール スタックが巻き戻されないようにするためです。

于 2011-01-09T19:14:09.613 に答える