簡體   English   中英

在Firefox附加SDK擴展程序中使用chrome:// myAddon / content / URL

[英]Use a chrome://myAddon/content/ URL in Firefox Add-on SDK extension

我正在嘗試按照本教程加載框架腳本:

mm.loadFrameScript("chrome://myextension/content/content.js", true);

我的擴展名是附加SDK類型。 本教程說,我需要先在chrome.manifest指定content 我什至沒有那個文件(只有package.jsonindex.js )。 所以我用一行創建了myextension/chrome.manifest

content content.js

並創建了一個文件myextension/content/content.js

console.log("content script executed");

問題是,當mm.loadFrameScript("chrome://myextension/content/content.js", true); index.js執行,出現錯誤:

No chrome package registered for chrome://myextension/content/content.js

我想這是因為清單文件錯誤或未一起注冊? 但是在chrome注冊頁面上找不到我的問題的任何線索。

該教程通常針對XUL或無重啟/引導加載項。 該層次結構中更合適的教程是: 多進程Firefox和SDK 該頁面的要旨是,如果您使用附加SDK的API,則您的擴展程序應僅在多進程Firefox中運行,否則,它應該是附加SDK錯誤

通常,附加SDK擴展將使用高級API之一來加載內容腳本 將使用的主要API是tabpage-mod ,但還有其他一些API(例如context-menupage-worker )。 還有遠程/父級遠程/子 低級API ,它們處理進程框架

但是,如果需要,可以使用框架腳本 附加SDK擴展實際上是無重啟/引導擴展,由附加SDK包裝。 因此,如果您確實想這樣做,則可以執行大多數操作,這些操作可以在附加SDK擴展中的引導擴展中完成。 但是,最好保留在附加SDK提供的API中。 如果您遍歷那些API,那么您將失去附加SDK所提供給您的一些優勢(例如,將實際實現隱藏在不希望更改的API后面)。

存在框架腳本和內容腳本來執行相同的功能:訪問已加載到可能受其他進程(e10s)控制的區域中的內容(例如HTML頁面)。 在很大程度上,兩個不同名稱所指的事物非常相似。 但是,您幾乎只會看到術語“框架腳本”僅用於XUL和引導擴展,而“內容腳本”幾乎總是指附加SDK腳本。

同樣,最好使用附加的SDK API加載用於訪問可能在另一個進程中的內容的腳本。

附加SDK:使用data目錄:

對於附加SDK擴展,與其使用chrome:// URL,不如使用[add-on基本目錄] / data /目錄並使用sdk/self API獲取對文件的URL引用更為合適。 您可以這樣做:

var self = require("sdk/self");
let frameScriptUrl = self.data.url("content.js")

然后,您的loadFrameScript()行將是:

mm.loadFrameScript(frameScriptUrl, true);

使用chrome.manifest

content行:
chrome.manifest文件的content行是:

content packagename uri/to/files/ [flags]

這是至少3個由空格分隔的字段,其中一個或多個可選的附加標志字段。

第一個字段是content ,它指示這是定義如何解析chrome://packagename/content URL的行。

第二個字段是packagename 這是由您組成的名稱,不得與Firefox已在使用的其他軟件包名稱或其他擴展添加的軟件包名稱沖突。 通常情況下 ,這將是name您正在使用您的插件,或者一些排列name ,或者id ,如果使用多個content行。 附加SDK的名稱和ID通常是package.json文件中包含的nameid屬性的值,但可能有所不同 packagename name不必是您的name或ID,只需要對Firefox中加載的所有內容都唯一。

第三個字段是指向目錄的URL,該目錄包含您將要引用的文件。 該URL可以是絕對URL,也可以是相對於chrome.manifest文件位置的URL。 該URL必須以/結尾。

Firefox在附加組件的基本目錄(與package.json所在的目錄相同)中查找chrome.manifest文件。 雖然可以使用manifest關鍵字添加其他chrome.manifest文件,但這並不常見。

原型附加組件chrome.manifest將包含以下行:

content packagename chrome/content

chrome.manifest中使用該content 行使之有效的chrome URL時,您將使用chrome://packagename/content/myScriptFile.js類的東西。 這將引用位於[附加基本目錄] / chrome / content /目錄中的名為myScriptFile.js的文件。

另一個例子:
chrome.manifest

content myAddOnName my/special/directory/

在這種情況下, chrome://myAddOnName/content/myScriptFile.js將引用文件[附加基本目錄] /my/special/directory/myScriptFile.js

您的特定問題:
當您說您正在按照本教程進行學習時 ,實際上並沒有對chrome.manifest文件的內容進行此操作。 同樣,當您更改該文件包含的內容時,也沒有遵循content行應包含的content描述 但是,即使您完全按照本教程進行操作,也不會以正常運行的附件結尾,因為該教程對於該文件中的內容是不正確的。 本教程中的這一行實際上是無效的。 我已經在MDN文檔中更正了該行。

您需要在chrome.manifest中用作行的內容取決於您要用於擴展程序的目錄結構。

如果您希望content.js存在於[附加基本目錄] / chrome / content /目錄中 ,並被chrome://myAddOnName/content/content.js引用,則chrome.manifestcontent行應為:

content myAddOnName chrome/content/

注意:即使你使用myextension在你的問題(在你的chrome:// URL只),為你的packagename ,我沒有用在這里,試圖更清晰地表明, packagename應該是您選擇的名稱是唯一的你添加在。 我不清楚您在問題中使用myextension作為您在擴展程序中實際使用的占位符。 如果這是您使用的實際文本,而不是您的問題的占位符,那么我會提醒您, myextension不是唯一的,並且在其他隨機擴展中也存在合理的機會。 如果是這樣,則可能會或可能不會導致您的一個或兩個擴展出現故障。

SDK為框架腳本和過程腳本(除了頁面-mod和制表符附加機制(也依賴於內部的框架腳本)), 遠程/父模塊和遠程/子模塊提供了抽象。 您可以使用remote_require加載流程腳本,然后在流程腳本中使用remote / child枚舉框架腳本全局對象的sdk包裝器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM