Обновление аддона до совместимости с Firefox 4.0, но и его совместимость с 3.x тоже.Совет? - PullRequest
4 голосов
/ 18 декабря 2010

У меня есть надстройка, написанная для 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 напрямую, но, возможно, в этом подходе есть какой-то недостаток, о котором я не знаю?

Я также сталкиваюсь с проблемами при попытке вставить контент в веб-страницы. В одном случае 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('') непосредственно перед 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»

Ответы [ 2 ]

1 голос
/ 09 января 2011

Что вы посоветуете для обеспечения совместимости аддона с Firefox 3 и Firefox 4 одновременно?

Я бы порекомендовал один XPI для двух самых последних основных версий. Люди на старых версиях проиграли, и наличие двух XPI для разных «активных» версий сбивает с толку (я недавно не экспериментировал с тем, как AMO представляет это, но это мое старое впечатление).

Что вы думаете об идее ветвления кода, чтобы у нас была одна версия для 3.x и другая для 4.x? Затем мы должны применить любые новые функции к обеим версиям и протестировать их в обеих версиях и т. Д.

Я бы сделал это, только если код стал слишком спагетти. Как любитель, я бы прекратил обновлять старую версию, оставив ее для людей, использующих старые версии Firefox. Вы можете просмотреть статистику своего расширения в AMO, чтобы проверить скорость принятия новых версий Firefox (даже если страница статистики не очень проста в использовании.)

Как правило, лучше проверить наличие определенной функции, которую вы хотите (как я сделал с if (Application.extensions) ... или try / catch), или просто проверить, начинается ли Application.version с ' 3 'или' 4 '?

Разветвление на основе возможностей здесь не имеет значения, поскольку вы имеете дело с фиксированным набором хост-приложений, в отличие от веб-страниц.

Помните о возможных побочных эффектах:

  • Проверка версии приложения затруднит портирование на другие приложения, поэтому, если части вашего кода используют только функции платформы, а не функции конкретного приложения, было бы более целесообразно протестировать версию платформы.
  • try..catch также может отлавливать другие ошибки, не связанные с той, которую вы ожидаете. Я бы избежал этого.

приписка

1) Чтобы избежать предупреждений CSS о неизвестных свойствах (если их много), вы можете использовать разные стили для разных версий через appversion в chrome.manifest

2) Я считаю технику Thread.processNextEvent опасной, поскольку она предотвращает раскручивание стека вызовов до тех пор, пока вы не закончите.

1 голос
/ 18 декабря 2010

Одно предложение от IRC-канала Mozilla #addons для моей функции getVersion(): напишите макет AddonManager, поддерживаемый nsIExtensionManager. Или используйте этот .Таким образом, сама функция не должна иметь такой шаблон if / then.

...