如何在引导的 Firefox 扩展中实现 XPCOM 组件 (nsIContentPolicy)

2024-01-12

我有一个 Firefox 的引导扩展。 现在我想实现 nsIContentPolicy XPCOM 组件。 我写了一个组件模块代码。 现在我想注册这个组件。 我想注册组件的原因是我想将我的组件添加到nsICategoryManager.addCategoryEntry与“内容政策”类别。

var {Cc, Ci, Cu} = require("chrome");

Cu.import("resource://gre/modules/XPCOMUtils.jsm");

//console.error("Running interceptor");

function Interceptor() 
}

Interceptor.prototype = {

    classDescription: "DeferredTo HTTP requests Interceptor",
    classID: "{B5B3D9A0-08FC-11E3-8253-5EF06188709B}",
    contractID: "@deferredto.com/Interceptor;1",
    QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentPolicy]),

    shouldLoad : function dt_shouldLoad(aContentType, aContentLocation, aRequestOrigin, aContext, aMimeTypeGuess, aExtra) {
        console.log("dt_shouldLoad");

        if (contentLocation.scheme != "http" && contentLocation.scheme != "https")
            return Ci.nsIContentPolicy.ACCEPT;

        let result = Ci.nsIContentPolicy.ACCEPT;

        // we should check for TYPE_SUBDOCUMENT as well if we want frames.
        if ((Ci.nsIContentPolicy.TYPE_DOCUMENT == aContentType) &&
            SOME_REGULAR_EXPRESSION.test(aContentLocation.spec)) {
            // do stuff here, possibly changing result.
        }
        return result;
    },

    shouldProcess: function ILO_shouldProcess() Ci.nsIContentPolicy.ACCEPT,

    _xpcom_categories: [
        { category: "content-policy", service: true }
    ],
    classInfo: XPCOMUtils.generateCI(
    {classID: Components.ID("{B5B3D9A0-08FC-11E3-8253-5EF06188709B}"),
     contractID: "@deferredto.com/Interceptor;1",
     classDescription: "Interceptor implements nsIContentPolicy to block images that are not yet at screen @DeferredTo",
     interfaces: [
                  Ci.nsIContentPolicy,
                  ],
     flags: Ci.nsIClassInfo.SINGLETON})
}

var components = [Interceptor];

var NSGetFactory = XPCOMUtils.generateNSGetFactory([Interceptor]);

问题:

  • 是否可以从引导扩展注册组件?
  • 是否可以从无需重新启动的扩展中注册组件?
  • 是否可以使用 nsICategoryManager.addCategoryEntry“content-policy”而无需 成分?
  • 如何在引导扩展中注册组件或以某种方式添加 新的“内容政策”类别条目?

我已添加到harness-options.js

"requirements": {
"sdk/page-mod": "sdk/page-mod",
"sdk/self": "sdk/self",
"chrome": "chrome"},

这就是我尝试导入模块的方式:

var {Cc, Ci, Cu} = require("chrome");
Cu.import("resource://deferredto/lib/interceptor.js");

我尝试了很多路径)))但没有一个有效。 chrome.manifest 文件中的资源条目不允许用于引导扩展。组件模块文件的路径是:resources/deferredto/lib/interceptor.js


Adblock Plus,无需重启但不使用SDK,注册一个nsIContentPolicy执行 https://hg.adblockplus.org/adblockplus/file/0d76ad7eb80b/lib/contentPolicy.js#l365在运行时,就像您的 SDK 一样。可能有一些 SDK 附加组件在运行时注册组件,但我不知道有哪些开源附加组件是我推荐立即查看的。

关于 ABP 实现以及需要更改哪些内容才能使其与 SDK 配合使用的几点:

  • 类别管理器可通过Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager).
  • 组件注册商也应该可以通过要求获得components来自chrome模块然后components.manager.getService(Ci.nsIComponentRegistrar).
  • 作为 Adblock Plus,您必须自己取消注册您的组件卸载时 https://addons.mozilla.org/en-US/developers/docs/sdk/latest/dev-guide/tutorials/load-and-unload.html.
  • 不幸的是,卸载部分也有点欺骗,因为您无法同步取消注册组件和类别条目,因为错误 753687 https://bugzilla.mozilla.org/show_bug.cgi?id=753687。 Adblock Plus 因此使用异步Util.runAsync https://hg.adblockplus.org/adblockplus/file/0d76ad7eb80b/lib/utils.js#l219,它只是将一个可运行的(事件,如果你愿意的话)分派到主线程。我认为您不能在这里使用任何 SDK 内容,因为 SDK 会在任何异步代码有机会运行之前进行清理,因此您需要自己使用低级 XPCOM 可运行程序(或计时器)。
  • 您的代码将在运行时注册您的组件。你不会碰harness-options或类似的东西。

(我还实现了通用组件寄存器 https://github.com/downthemall/downthemall-mirror/blob/master/modules/components.js我自己编写了一个函数,但这又不是 SDK 代码,需要进行调整才能在 SDK 中运行,就像 ABP 一样。它也与 ABP 非常相似。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在引导的 Firefox 扩展中实现 XPCOM 组件 (nsIContentPolicy) 的相关文章

  • 评估 XML 中的 XPath 表达式

    使用Add on SDK创建Firefox插件时 如何处理XML文件 使用 XPath 评估会引发错误 XPathResult 未定义 我正在尝试处理用这个代码 var iterator xmlDoc evaluate stream xml
  • Firefox 扩展内容脚本不会加载和附加 HTML

    下面的所有内容都可以在 Chrome 扩展中运行 但在移植到 Firefox 时会默默失败 加载中test html除非我删除 from it 附加 test element对身体 Firefox 扩展的样式是否必须放入单独的文件中 为什么
  • 如何在 firefox 扩展中创建 JSON post 请求?

    我正在尝试调用 Google API 这是来自 Firefox 扩展的 JSON post 请求 例如 POST https www googleapis com urlshortener v1 url Content Type appli
  • Firefox 扩展在 main.js 文件中包含脚本

    我正在为 Firefox 编写扩展 但在将脚本包含到 main js 后台 文件中时遇到问题 就我而言 我想包括 jquery js 和 config js 但我不知道如何正确执行它 在我的 chrome 扩展中 我只是在清单文件上执行此操
  • 在 Web 应用程序中将页面打印到不同的打印机

    我想编写一个网络应用程序 可以处理用户演示文稿 该演示文稿在提交后会发送到本地系统打印机 订单的一部分将发送到黑白激光打印机 另一部分将发送到另一台打印机进行另一个处理 理想情况下 它能够在任何主要系统上运行 Linux OSX 或 Win
  • 在新的 Jetpack API 中使用定位“面板”

    我现在使用新版本的 Jetpack API 它允许您使用 JS 框架为 Firefox 创建插件 面板 对象很容易使用 但我正在努力寻找一种定位它的方法 该文档简单地指出 Jetpack 面板 API https builder mozil
  • 使用 firefox addon sdk API 防止关闭选项卡

    我正在寻找一种方法来防止使用 firefox addon sdk 关闭选项卡 有办法实现吗 好的 这就是你想要的 以前的版本是为了看看我是否可以让 onbeforeunload 仅在选项卡关闭时触发 但我无法弄清楚 操作方法如下 我们重写了
  • 如何在 XULRunner (js-ctypes) 中使用 ReadDirectoryChangesW

    我正在尝试实施回答这个问题 https stackoverflow com questions 11495227 how can i monitor a file asynchronously in firefox关于异步监视 Window
  • clearInterval() 不会停止 setInterval() - Firefox 扩展开发

    我正在修改篡改数据 这将允许我将其观察到的 HTTP 请求 响应发送到服务器 到目前为止 该功能已正确实现 下一步是自动化此过程 我希望使用 复选框 类型的工具栏菜单按钮来打开和关闭此功能 到目前为止 我在 XUL 中有这段代码
  • 使用“http-on-modify-request”和“http-on-examine-response”时如何将响应映射到请求?

    使用 HTTP 观察器时如何将传入响应映射到传出请求 https developer mozilla org en Setting HTTP request headers Observers https developer mozilla
  • 向 Firefox 扩展添加屏幕截图功能

    是否有跨平台方法从 Firefox 扩展中获取屏幕截图 理想情况下 我希望能够截取 dom 元素的屏幕截图 无论它在页面上是否可见 例如 var 屏幕截图 屏幕截图 document getElementById example 任何指示或
  • 在 Firefox 插件中访问历史记录

    我正在使用插件生成器开发 Firefox 插件 我想定期扫描浏览器的历史记录 整个历史记录 我正在寻找类似的功能chrome 的历史记录 api http developer chrome com extensions history ht
  • 如何针对 URL 字符串测试 URL 匹配模式

    我可以使用匹配模式获取浏览器选项卡 browser tabs query url https mozilla org b https developer mozilla org en US docs Mozilla Add ons WebE
  • 如何在 Firefox WebExtensions 附加组件中使用 chrome.storage 和 runtime.connect

    我正在尝试创建一个 Firefox 插件来执行以下操作 单击页面主体时向后台脚本发送消息 发送的消息由后台脚本存储 后台脚本检索存储的消息 单击加载项浏览器按钮时 存储的消息将从后台脚本发送到内容脚本 内容脚本显示收到的消息 我正在使用适用
  • Firefox:如何使用附加 SDK (Jetpack) 添加/修改工具栏

    因此 我已经多次查看了 Add on SDK 的文档 但没有在哪里可以看到如何创建工具栏或修改现有工具栏 他们有一个关于创建附加栏图标的教程 但这不是我想要的 附加 SDK 支持吗 如果是的话 有人可以将我链接到示例 教程吗 这对我有用 v
  • ReferenceError:浏览器未定义

    我正在运行这段代码 而 Firefox 给出了错误 未捕获的引用错误 浏览器未定义 const manifest browser runtime getManifest 到目前为止我已经尝试使用这个 var 浏览器 浏览器 铬合金 仍然如此
  • 如何从 SDK 插件数据文件夹加载 dll?

    我们使用 Web IDE 来创建插件 我的 test dll 位于数据文件夹中 如何通过js ctypes加载它 使用像 c test dll 这样的绝对路径没有问题 但我无法使用此路径来分发它 var lib ctypes open c
  • Wappalyzer如何检测网页技术

    Wappalyzer 如何检测站点的后端编程语言 但在某些情况下无法检测 例如 Facebook 使用 PHP 但无法检测并显示 HTTP 2 Wappalyzer 是一个开源社区驱动的平台 其所有源代码都可以在此链接中找到 https g
  • Firefox 扩展中的 localStorage

    我正在尝试从 Firefox 扩展访问页面的 localStorage 我的理解是content给出了参考window当前页面的 当我尝试访问页面的 localStorage 时content localStorage 我想我正在得到它的参
  • 如何动态且安全地设置XUL密钥?

    我正在尝试为我的引导附加组件动态创建一个关键元素 目前 我创建了一个keyset元素并将其附加到document getElementById mainKeyset parentNode with appendChild 然后创建key元素

随机推荐

  • 在 ColdFusion 10 中使用 CF_SQL_NVARCHAR 的详细信息是什么?

    有关更新数据库的 ColdFusion 10 文档有一节介绍ColdFusion 10 中与数据库相关的增强功能 http help adobe com en US ColdFusion 10 0 Developing WSc3ff6d0e
  • 在实例化时设置 PowerShell 类的属性

    是否可以在实例化时定义 PowerShell 类的属性值而不使用构造函数 假设有一个 cmdlet 将返回 Jon Snow 的当前状态 活着或死亡 我希望该 cmdlet 将该状态分配给我的类中的属性 我可以使用构造函数来做到这一点 但我
  • 使用 Python 从 GIF 中提取关键帧

    我想通过从 GIF 中提取 15 个帧来压缩 GIF 图像 这些帧最好应该是不同的 我正在使用 Python 和 Pillow 库 但没有找到任何方法来获取 GIF 中的帧数枕头文档 https pillow readthedocs io
  • 使用 KOIN 设置 WorkManager

    我正在尝试设置工作管理器来完成一些工作 但在初始化时遇到问题 我正在使用 KOIN workmaanger dsl implementation org koin koin androidx workmanager 2 2 0 rc 4 我
  • Delphi 中的运算符重载

    是否有可能 在 Delphi 中 重载类中的运算符 我前段时间读过 它只能用于记录 但我发现对于类的信息也如下面的代码所示 type TMyClass class class operator Implicit a Integer TMyC
  • 具有嵌套集合的类 - 如何填充嵌套类?

    我对如何将一个类与另一个类的嵌套集合进行水合感到有点困惑 我收到错误 AutoFixture 无法从 System Collections Generic IList 1 typename 创建实例 我尝试过使用Fixture Regist
  • 在Java 1.6中File.renameTo()在linux上是原子的吗?

    正如标题所说 在Java 1 6中File renameTo POSIX Linux 上的原子操作 根据这个链接 http linux die net man 2 rename POSIX Linux 中的重命名操作是原子的 但是它成立吗t
  • 如何配置 Ninject 以便根据之前注入的实例注入正确的实例

    我找不到合适的词语来表达我的问题 所以我会让我的代码说话 我有存储库 class Repository public Repository DbContext ctx 然后我有这个绑定 Bind
  • 如何使我所需的包全局化,而不与composer-php发生冲突?

    假设我有一个包裹sprout services我正在使用的另外 3 个软件包require 一旦第一个运行的包需要它 它就会在全局空间中打开 从我的应用程序中的任何地方 我都可以做new SproutServices ServiceLoca
  • 如何为 iPhone 应用程序创建多个主题/皮肤? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我已经准备好一个 iPhone 应用
  • PowerShell 中“@{}”的含义是什么

    我在这里有一行脚本供审查 我注意到带有值的变量声明 function readConfig Param string fileName config Get Content fileName Where Object like ForEac
  • 如何删除codeigniter路径中的“index.php”

    我该如何删除 index php 在 codeigniter 中心某处的每条路径中都突出 我想要干净的非index php fied URLs 如果您使用 Apache 请将 htaccess 文件放入您的 Web 根目录中 其中包含以下内
  • Api 无法在 onEachFeature React leaflet 函数内工作

    我陷入了无法解决的问题 我正在用反应传单制作等值线 问题是我的API数据在highlightFeature函数中不起作用 该函数将其分配给onEachFeature 当我控制台API数据时 我在highlightFeature函数之外得到了
  • 我怎样才能停止 jQuery Mobile 将样式应用到我的特定表单元素

    是否可以指示 jQuery Mobile 不要设置我的输入框和提交按钮的样式 我很擅长自定义 CSS jQuery 移动脚本将其自己的样式应用于我的所有元素 我尝试的一种解决方法是覆盖我的自定义 CSS 中的这些元素 还有其他功能可以让我执
  • 泵送引理(常规语言)

    我需要一些帮助来解决泵引理问题 L a b c a L lt b L lt c L 这是我到目前为止得到的 y uvw is the string from the pumping lemma 我让 y abbc n n 是泵引理的长度 y
  • 从 R 调用 .NET/C#

    我想使用仅在 NET 中可用的 R API 是否有可用于从 R 调用 NET C 代码的标准方法 如果是这样 我该怎么做 本讨论的读者可能会考虑的另一个选择是rClr 包 https github com jmp75 rClr 我已经研究了
  • 实体框架 CTP5,代码优先。可选的导航属性

    我正在使用实体框架 CTP5 代码优先 并且我有两个类 public class Order public int Id get set public decimal SomeOtherProperty1 get set navigatio
  • AWS Elastic Beanstalk NodeJS 和日志

    我想将我的 NodeJS 项目从单个 EC2 迁移到 ElasticBeanstalk 在我当前的代码中 我使用依赖项 log4js 在文件系统上创建日志文件 在 EC2 上 这可以创建 但在 ElasticBeanstalk 中记录某些内
  • CLion 项目中所有错误的列表

    CLion 2016 2 有助于检测您正在编辑的文件中的潜在错误 这些错误可以在代码右侧的验证栏中看到 但这只是一个文件 有没有办法 如工具窗口 来获取整个项目或其特定部分中所有此类警告的列表 如果它还列出了编译器的警告和错误 那就加分了
  • 如何在引导的 Firefox 扩展中实现 XPCOM 组件 (nsIContentPolicy)

    我有一个 Firefox 的引导扩展 现在我想实现 nsIContentPolicy XPCOM 组件 我写了一个组件模块代码 现在我想注册这个组件 我想注册组件的原因是我想将我的组件添加到nsICategoryManager addCat