通知来自XPcom的外部事件的JavaScript

Notifying JavaScript of external event from XPcom

本文关键字:外部 JavaScript 事件 XPcom 通知      更新时间:2023-09-26

我一直在努力寻找一个相对简单的场景的解决方案。我在一个html页面中运行JavaScript,该页面调用我用C++编写的XPcom。到目前为止,一切都很好。

该XPcom检索对观察者服务(do_GetService("@mozilla.org/observer-service;1"))的引用;激发一个被JavaScript"看到"的通知;XPcom创建一个windows线程(AFX),传递观察器服务引用的副本并返回给JavaScript调用程序;期望XPcom线程在适当的时间(基于外部事件)发送额外的通知。

然而,通知无法到达JavaScript,我最初的想法是notify方法不会从"不同"线程传递通知。我已经使用VStudio调试器来确认程序序列如预期;即线程正在接收外部事件,并且正在调用notify方法。。。但是,没有通知事件到达。

我在网上读了不少帖子,但没有什么能真正"确定"我想要解决的特定场景。我不赞成使用通知:

  • 我已经尝试过通过CCD_ 2进行事件通知,但这也不起作用,因为我没有";事件";从JavaScript端交付。我可以在XPcom的上下文中创建自己的一个,我可以"通知它";但是,这只是一个证明我可以从XPcom交付活动的POC;现在我需要JavaScript端给我一个事件通知
  • 我尝试将一个新的对象作为nsiSupports arg传递;但是,DispatchToCurrentThread想要一个nsiRunnable,我不知道如何传递其中一个(idl文件不支持)
  • 我还考虑过用某种与nsiSupports兼容的对象"包装"事件;但是,我不确定这样做的细节

目标很简单。将异步事件或通知从XPcom线程传递到JavaScript的主线程,甚至子线程;但是,我在这里的牵引力还不到10%。有人完成了这项工作吗?或者有关于如何完成这项工作的想法吗?

您是对的,观察器服务只在主线程上工作(检查Notify()调用的返回值,它应该是NS_ERROR_UNEXPECTED)。就解决方案而言,您也是正确的——通过NS_DispatchToMainThread()将事件调度到主线程。至于实际实现,函数NS_NewRunnableMethod()应该会有所帮助(除非您想创建自定义nsIRunnable实现,例如传递参数)。你可能想做这样的事情:

nsCOMPtr<nsIRunnable> event = NS_NewRunnableMethod(xpcomComponent, &nsMyComponent::processEvent);
nsresult rv = NS_DispatchToMainThread(event);

这里xpcomComponent将是对XPCOM组件实例的引用,nsMyComponent::processEvent是需要在主线程上调用的方法。这种方法将能够通知观察员。