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

标签 javascript firefox firefox-addon firefox-addon-sdk

我试图按照以下tutorial加载框架脚本:

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


我的扩展名是附加SDK类型。本教程说,我需要先在content中指定chrome.manifest。我什至没有那个文件(只有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 registration页面上找不到我的问题的任何线索。

最佳答案

该教程通常针对XULrestartless/bootstrap加载项。该层次结构中更合适的教程是:Multiprocess Firefox and the SDK。该页面的要旨是,如果您继续使用附加SDK的API,则您的扩展程序应仅在多进程Firefox中运行,否则,它应为bug in the Add-on SDK

通常,附加SDK扩展将使用High Level APIs之一来加载content scripts。将使用的主要API是tabspage-mod,但还有其他一些API(例如context-menupage-worker)。还有Low-Level APIsremote/parentremote/child处理processesframes

但是,如果需要,可以使用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行,则是idcontent的某些排列。附加SDK的名称和ID通常是name文件中包含的idpackage.json属性的值,但可能是somewhat differentpackagename不必是您的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/

相关文章:

javascript - 更新绑定(bind)到表格的 observableArray 会导致失去焦点

javascript - 何时更喜欢 JavaScript 中的匿名函数

javascript - 将 "this"传递给 .on 函数似乎不起作用

javascript - 未捕获的异常 : unknown (can't convert to string)

linux - Firefox 在Centos 6.7 那个节点上报错

javascript - Firefox 扩展 page-mod onAttach 速度很慢

javascript - 将普通函数连接到 Redux 的 mapDispatchToProps

html - 我无缘无故收到 Firefox 安全警告

javascript - Firefox 附加组件 : passing value from context menu to contentScriptFile after selection

javascript - 编码浏览器扩展、插件、Firefox、Safari、Chrome 等……这可能吗?