gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:48:07 25 4
gpt4 key购买 nike

我试图按照以下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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com