我试图按照以下tutorial加载框架脚本:
mm.loadFrameScript("chrome://myextension/content/content.js", true);
我的扩展名是附加SDK类型。本教程说,我需要先在
content
中指定chrome.manifest
。我什至没有那个文件(只有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 registration页面上找不到我的问题的任何线索。
最佳答案
该教程通常针对XUL或restartless/bootstrap加载项。该层次结构中更合适的教程是:Multiprocess Firefox and the SDK。该页面的要旨是,如果您继续使用附加SDK的API,则您的扩展程序应仅在多进程Firefox中运行,否则,它应为bug in the Add-on SDK。
通常,附加SDK扩展将使用High Level APIs之一来加载content scripts。将使用的主要API是tabs和page-mod,但还有其他一些API(例如context-menu和page-worker)。还有Low-Level APIs和remote/parent的remote/child处理processes和frames。
但是,如果需要,可以使用frame scripts。附加SDK扩展实际上是无重启/引导扩展,由附加SDK包装。因此,如果您确实想这样做,则可以执行大多数操作,这些操作可以在附加SDK扩展中的引导扩展中完成。但是,最好保留在附加SDK提供的API中。如果您遍历这些API,那么您将失去附加SDK所提供的一些优势(例如,将实际实现隐藏在不希望更改的API后面)。
存在框架脚本和内容脚本以执行相同的功能:访问已加载到可能受其他进程(e10s)控制的区域中的内容(例如HTML页面)。在很大程度上,两个不同名称所指的事物非常相似。但是,您几乎只会看到术语“框架脚本”仅用于XUL和引导扩展,而“内容脚本”几乎总是指附加SDK脚本。
同样,最好使用附加的SDK API加载用于访问可能在另一个进程中的内容的脚本。
附加SDK:使用data
目录:
对于附加SDK扩展,代替使用chrome://
URL,更适合使用[附加基本目录] / 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]
这是至少三个由空格分隔的字段,其中一个或多个用于flags的可选附加字段。
第一个字段是
content
,表示这是定义chrome://packagename/content
URL的方式的行。第二个字段是
packagename
。这是由您组成的名称,不得与Firefox已在使用的其他软件包名称或其他扩展添加的软件包名称冲突。通常,这将是您用于附件的name
,或者如果使用多条name
行,则是id
或content
的某些排列。附加SDK的名称和ID通常是name
文件中包含的id
和package.json属性的值,但可能是somewhat different。 packagename
不必是您的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。您的特定问题:
当您声明要遵循tutorial时,实际上并没有针对chrome.manifest文件的内容进行此操作。同样,当您更改该文件包含的内容时,也没有遵循
content
行应包含的内容的description。但是,即使您完全按照本教程进行操作,也不会以正常运行的附件结尾,因为该教程对于该文件中的内容是不正确的。本教程中的行实际上是无效的。我已经在MDN documentation中更正了该行。您需要在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
并不是唯一的,并且在其他随机扩展名中也存在合理的机会。如果是这样,则可能会或可能不会导致您的一个或两个扩展出现故障。
关于javascript - 在Firefox附加SDK扩展程序中使用chrome://myAddon/content/URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37896743/