[英]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.json
和index.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是tab和page-mod ,但還有其他一些API(例如context-menu和page-worker )。 還有遠程/父級和遠程/子 級的低級API ,它們處理進程和框架 。
但是,如果需要,可以使用框架腳本 。 附加SDK擴展實際上是無重啟/引導擴展,由附加SDK包裝。 因此,如果您確實想這樣做,則可以執行大多數操作,這些操作可以在附加SDK擴展中的引導擴展中完成。 但是,最好保留在附加SDK提供的API中。 如果您遍歷那些API,那么您將失去附加SDK所提供給您的一些優勢(例如,將實際實現隱藏在不希望更改的API后面)。
存在框架腳本和內容腳本來執行相同的功能:訪問已加載到可能受其他進程(e10s)控制的區域中的內容(例如HTML頁面)。 在很大程度上,兩個不同名稱所指的事物非常相似。 但是,您幾乎只會看到術語“框架腳本”僅用於XUL和引導擴展,而“內容腳本”幾乎總是指附加SDK腳本。
同樣,最好使用附加的SDK API加載用於訪問可能在另一個進程中的內容的腳本。
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);
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文件中包含的name
和id
屬性的值,但可能有所不同 。 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.manifest的content
行應為:
content myAddOnName chrome/content/
注意:即使你使用myextension
在你的問題(在你的chrome://
URL只),為你的packagename
,我沒有用在這里,試圖更清晰地表明, packagename
應該是您選擇的名稱是唯一的你添加在。 我不清楚您在問題中使用myextension
作為您在擴展程序中實際使用的占位符。 如果這是您使用的實際文本,而不是您的問題的占位符,那么我會提醒您, myextension
不是唯一的,並且在其他隨機擴展中也存在合理的機會。 如果是這樣,則可能會或可能不會導致您的一個或兩個擴展出現故障。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.