通过sdk/system/events在修改请求观测器上测试http

Test http-on-modify-request observer via sdk/system/events?

本文关键字:观测器 测试 请求 http sdk system events 通过 修改      更新时间:2023-09-26

是否可以测试http-on-modify-request-观测器?

events模块提供了一种emit(type, event)方法来创建Firefox事件。要测试侦听http-on-modify-request的模块,可以将类型设置为http-on-modify-request。问题是如何设置event参数以模拟web请求?文件说明

event:object
具有数据和主题属性的可选对象。data指的是要传递的字符串通过这次活动。主体应指实际的行动者/主体此事件的对象(即:发出事件的对象)。

设置event.data会被传递为观察器的data参数,例如字符串和event.subject也是如此,但当我试图传递带有QueryInterface-函数的对象时,它不起作用:

events.emit("http-on-modify-request", {"subject": {
    QueryInterface : function() {
        return {"URI": {"spec": 'mock://URI.spec'}}
    }}});

要测试的代码与https://developer.mozilla.org/en-US/Add-ons/SDK/Low-Level_APIs/system_events.


@人形机器人使用的答案

obs.notifyObservers(
    { QueryInterface : function() {
        return {"URI": NetUtil.newURI("mock://URI.spec") };
    }},
    "http-on-modify-request",
    null);

失败

JavaScript错误:"NS_NOINTERFACE:组件返回的故障代码:0x80004002(NS_NOINTERFACE)[nsISupports.QueryInterface]"{文件:"resource://gre/modules/commonjs/toolkit/loader.js->resource://addon-id/caller.js"行:xy}]

sdk/system/events中的emit方法对于创建看起来像Firefox中通知的观察者通知没有用处,因为它添加了包装来确保弱引用。

相反,我建议使用"vanilla"观察器服务,例如Services.jsm:

const { Services: { obs } } = require("resource://gre/modules/Services.jsm");