2010-12-17 43 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; 
} 

(其中sleepUntil是使用Thread.processNextEvent technique效用函數)

檢查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) ...或嘗試做/ catch)還是隻檢查Application.version是以'3'還是'4'開始?
+0

當然,一種選擇是在Firefox 4發佈後立即放棄對Firefox 3.x的支持,但可能會等待並觀察Firefox 3.x用戶是否猶豫升級...... – MatrixFrog 2010-12-17 21:54:48

+1

在任何人想知道的情況下,try/catch的解決方案就是執行'doc.body.appendChild(doc.importNode(myElement))',這兩個版本都能很好地工作。 – MatrixFrog 2010-12-18 00:16:59

+0

而不是編寫'doc.body.appendChild(doc.importNode(myElement))',你不能使用'doc.createElement'創建'myElement'而不是使用其他文檔創建'myElement'? – Neil 2011-01-16 00:28:30

回答

1

你有什麼建議,試圖保持一個插件兼容的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還可以捕獲其他錯誤,與您所期望的無關。我會避免它。

P.S.

1)爲避免有關未知屬性CSS警告(如果有很多很多的),您可以通過使用不同的版本,不同的風格appversion in chrome.manifest

2)我相信Thread.processNextEvent技術是危險的,因爲它阻止了調用堆棧的展開,直到完成。

+0

「其他應用程序」是指其他Mozilla產品,如Seamonkey? – MatrixFrog 2011-01-10 00:16:12

+0

你能詳細說明爲什麼Thread.processNextEvent很危險,或者發佈一個描述它的鏈接嗎? – MatrixFrog 2011-01-10 00:16:42

+1

@MatrixFrog:1)是; 2)您鏈接的頁面會對此發出警告。想象你的事件是從函數F調用的,它必須在AddonManager.getAddonByID調用其回調之前返回。不將控制權返回給F會使內部processNextEvent循環無止境地運行。我並不是說你的情況會發生這種情況,只是這是你使用的非猶太教技術。 – Nickolay 2011-01-10 08:39:39

1

來自Mozilla #addons IRC頻道的一個建議,對於我的getVersion()函數:編寫一個由nsIExtensionManager支持的AddonManager模型。 Or use this one。這樣,函數本身不會有那個if/then模式。