Javascript 如何观看nsIHandlerService.store(handlerInfo)

Javascript 如何观看nsIHandlerService.store(handlerInfo),javascript,firefox-addon,Javascript,Firefox Addon,每当有人在mailto协议的handlerInfo上存储时,我需要通知选项卡。因此,我可以通知我的标签,它已更新,它应该参考,以显示最新的信息 这是我需要看的: var handlerInfo = Cc['@mozilla.org/uriloader/external-protocol-service;1'].getService(Ci.nsIExternalProtocolService).getProtocolHandlerInfo('mailto'); Cc['@mozilla.org/u

每当有人在
mailto
协议的
handlerInfo
上存储
时,我需要通知选项卡。因此,我可以通知我的标签,它已更新,它应该参考,以显示最新的信息

这是我需要看的:

var handlerInfo = Cc['@mozilla.org/uriloader/external-protocol-service;1'].getService(Ci.nsIExternalProtocolService).getProtocolHandlerInfo('mailto');
Cc['@mozilla.org/uriloader/handler-service;1'].getService(Ci.nsIHandlerService)store(handlerInfo)
我检查了MXR并发现:


它说它更新了
数据存储
,而
存储
功能中没有代码。我想知道如何才能看到这个
数据存储的更新?

您发现的不是实现,而是定义API的接口

是用JavaScript编写的,实际上是一种易怒的遗留代码

没有受支持的查看更改的方式(没有观察者,或诸如此类)。所以你基本上只剩下两个

  • 覆盖(代理)整个服务
  • 重复轮询服务
  • 或者检查底层文件
(除了尝试在mozilla central中安装补丁之外;我认为在这一点上不太受欢迎,因为重写整个实现以不再使用RDF可能具有更高的优先级:p)

按照@Blagoh的建议进行编辑,可以通过再次打开
UMimTyp
文件作为数据源并调用将在新断言(新值)和更改时通知的文件,潜在地添加
RDF
观察者

虽然观察者是每个实例的,并且通常在创建另一个实例时,不会通知您对以前和以后的实例所做的更改,但RDF服务实际上会在命名数据源之前通过
.RegisterDataSource
注册时缓存这些数据源。因此,对于相同的
UMimTyp
文件再次调用
.GetDataSource(Blocking)
实际上应该总是再次返回相同的实例,因此观察者会被添加到右侧的“共享”/“缓存的数据源实例”


然而,我并没有真正尝试过这个,但它似乎很有希望。

谢谢各位,这对我来说很有用:

/* start - aRDFObserver structure */
// is a nsIRDFObserver
var aRDFObserver = {
  onChange: function(aDataSource, aSource, aProperty, aOldTarget, aNewTarget) { 
   console.log('onChange', {'aSource': aSource, 'aProperty': aProperty});
    if (aSource.ValueUTF8 == 'urn:scheme:handler:mailto') {
     //refresh my page
    }
  }
};
/* end - aRDFObserver structure */

Cu.import('resource://gre/modules/FileUtils.jsm');
var rdfs = Cc['@mozilla.org/rdf/rdf-service;1'].getService(Ci.nsIRDFService);
var file = FileUtils.getFile('UMimTyp', []);
var fileHandler = Services.io.getProtocolHandler('file').QueryInterface(Ci.nsIFileProtocolHandler);
var ds = rdfs.GetDataSourceBlocking(fileHandler.getURLSpecFromFile(file));

ds.AddObserver(aRDFObserver);
看起来怎么样

问题是当rdf上的4个不同属性发生更改时,
onChange
会触发4次。有没有人知道最后一次
onChange
是什么时候触发的?否则我的页面将刷新4次lol

我还应该测试
资源值utf8
?或
a源值
?在我看来,他们都有同样的价值


这是完整的nsIRDFObserver的结构:

啊,所以它更新了一个rdf文件,所以我可以使用file watcher,一旦它完成()我现在就去寻找rdf文件并更新它。如果你知道我在哪里可以找到它,请分享,否则不用担心,我无论如何都会做一些挖掘。
gRDF.GetDataSourceBlocking(fileHandler.getURLSpecFromFile(file))的
AddObserver
怎么样?
这里:@Noitidart这个mxr链接告诉你从哪里获取文件。@Blagoh。好主意!我修改了我的答案,试图思考为什么这真的应该有效。谢谢大家。顺便说一句,mime类型的rdf文件位于
FileUtils.getFile('UMimTyp',[])
,对我来说,它是
C:\Documents and Settings\Noit\Application Data\Mozilla\Firefox\Profiles\vr10qb8s.default\mimeTypes.rdf
对于抛出的4次等,我所做的是每次调用之间的最大时间。我看到它在160毫秒左右,大部分时间是1毫秒。所以我做了一个500毫秒的setTimeout,清除超时并在每次更改时重新启动它。因此,仅在最终更改后500毫秒,它将进行更改。如果你们有任何其他想法,请分享,这将是可怕的,看看别人会怎么做。
/* start - aRDFObserver structure */
// is a nsIRDFObserver
var aRDFObserver = {
  onChange: function(aDataSource, aSource, aProperty, aOldTarget, aNewTarget) { 
   console.log('onChange', {'aSource': aSource, 'aProperty': aProperty});
    if (aSource.ValueUTF8 == 'urn:scheme:handler:mailto') {
     //refresh my page
    }
  }
};
/* end - aRDFObserver structure */

Cu.import('resource://gre/modules/FileUtils.jsm');
var rdfs = Cc['@mozilla.org/rdf/rdf-service;1'].getService(Ci.nsIRDFService);
var file = FileUtils.getFile('UMimTyp', []);
var fileHandler = Services.io.getProtocolHandler('file').QueryInterface(Ci.nsIFileProtocolHandler);
var ds = rdfs.GetDataSourceBlocking(fileHandler.getURLSpecFromFile(file));

ds.AddObserver(aRDFObserver);