我正在寫一些我想作爲Chrome擴展和Firefox附加組件發佈的內容。從Firefox附加內容腳本加載附加的JavaScript代碼
Chrome擴展是already available on github。我使用類似於requirejs使用的模塊加載格式將我的代碼分解爲幾個模塊;我這樣做是爲了將Chrome專用部分與我希望在Firefox附加組件中重複使用的部分分開。
具體來說,我分裂不僅後端的工作,同時也是內容的腳本。
在Chrome中,當我的內容腳本需要加載另一個模塊,它發送消息到後臺網頁說:「請加載此模塊」;背景網頁上的腳本,然後做:
function onLoadLibrary(request, sender, sendResponse) {
var allFrames = request.allFrames || false;
chrome.tabs.executeScript(
sender.tab.id, {file: request.library.toLowerCase() + '.js',
allFrames: allFrames},
function() {
sendResponse({});
});
return true;
}
也就是說,我能額外的JavaScript加載到相同的沙箱是要求該代碼的內容腳本。這對於使模塊依賴性起作用是必需的。
在firefox中,我無法弄清楚如何做到這一點。我將通過pageMod
和通過tabs
的「就緒」事件調用tab.attach
來附加我的初始內容腳本。這似乎很簡單,但如果該內容腳本需要加載更多的代碼,我不知道該怎麼做。
似乎沒有辦法從main.js
文件中訪問我的內容腳本正在運行的沙箱,因此我可能會向其中注入更多代碼。即使我以某種方式保留了對相關tab
實例的引用(它只允許我在任何情況下注入頂部框架),看起來每個新調用tab.attach
都會將注入的代碼放入新的沙箱中。傳遞給我準備好的事件句柄的對象tab
不是真正的XUL標籤,我可以傳遞給require("tabs/util").getBrowserForTab
;如果是的話,那麼我認爲我可以通過足夠的sdk代碼來創建我自己的沙盒,但我擔心會留下意外的內存泄漏。
我認爲通過「eval-this-code」消息將代碼傳遞迴內容腳本,但由於安全考慮,我真的不想在我的擴展中使用eval
;我也擔心使用eval
會讓我的Firefox加載項難以無法通過AMO。 (另外,當我的加載項在具有內容安全策略的網站上運行時,這將如何相互作用?)
使用traits
來定義附加API似乎關閉了對象的訪問權限,因此我無法達到Worker
裏面去我的內容腳本執行在沙箱中的參考。在這一點上,似乎我需要在我的附加SDK的幾乎完全複製剛上WorkerSandbox
暴露一個方法。
注意:我正在使用Add-On sdk(該項目以前稱爲JetPack)。我願意使用Components.utils.import
,如果有人能告訴我如何使用來自Add-On SDK管理的內容腳本的內容。
https://bugzilla.mozilla.org/show_bug.cgi?id=929202 –
而且我會看看我是否可以重構一些東西,這樣我就不會在FF端執行延遲加載 - 我仍然會使用我的模塊系統,但在後臺腳本中,我將在製作'page-mod'或'tab.attach'之前計算完整的依賴關係樹,這樣當我在客戶端腳本沙箱中加載模塊時,我可以指定所有東西前面的順序不需要返回錯過的依賴關係。在Chrome和ff之間會出現比我想要的更大的分歧,但它仍然應該保留將來可能會改變的內容,因爲代碼在兩者之間共享。 –
在背景頁面上計算沙盒中的依賴關係樹,然後用所需的一切加載客戶端腳本確實看起來是一種可行的方法。接受答案... –