У меня есть надстройка, написанная для 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
до него выдает ошибку. Я уверен, что смогу понять, как заставить этот конкретный фрагмент кода работать, но я боюсь, что столкнусь с гораздо большим количеством подобных проблем, поэтому я хочу посмотреть, прошел ли кто-нибудь еще аналогичный процесс, и есть какие-либо советы, которые я должен знать.
Извините за давний вопрос. Вот что я действительно спрашиваю:
- Что вы посоветуете для обеспечения совместимости аддона с Firefox 3 и Firefox 4 одновременно?
- Что вы думаете об идее ветвления кода, чтобы у нас была одна версия для 3.x и другая для 4.x? Затем мы должны применить любые новые функции к обеим версиям и протестировать их в обеих версиях и т. Д.
- Как правило, лучше проверить наличие определенной функции, которую вы хотите (как я сделал с
if (Application.extensions) ...
или try / catch), или просто проверить, начинается ли Application.version
с «3» или «4»