gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:43:53 31 4
gpt4 key购买 nike

我有一个 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,registers an nsIContentPolicy implementation在运行时,就像您的 SDK 一样。可能有一些 SDK 附加组件在运行时注册组件,但我不知道有什么开源的,我会建议您立即查看。

    关于 ABP 实现的几点说明以及为了使其与 SDK 一起工作而需要进行的更改:

  • 类别管理器可通过 Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager) 获得.
  • 还需要 components 才能使用组件注册器。来自 chrome模块,然后 components.manager.getService(Ci.nsIComponentRegistrar) .
  • 作为 Adblock Plus,您必须自己注销您的组件 on unload .
  • 不幸的是,卸载部分也有点欺骗,因为您无法同步取消注册组件和类别条目,因为 Bug 753687 . Adblock Plus 因此使用 Util.runAsync 进行异步处理,它只是将一个可运行的(事件,如果你喜欢的话)分派(dispatch)到主线程。我不认为你可以在这里使用任何 SDK 的东西,因为 SDK 会在任何异步代码有机会运行之前清理,所以你需要自己使用低级别的 XPCOM 可运行(或计时器)。
  • 您的代码将在运行时注册您的组件。你不会碰harness-options或类似的东西。

  • (我自己也实现了一个 generic component register 函数,但这又不是 SDK 代码,需要适应在 SDK 中运行,就像 ABP 一样。它也与 ABP 非常相似。)

    关于firefox-addon - 如何在引导的 Firefox 扩展中实现 XPCOM 组件(nsIContentPolicy),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18354668/

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