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);