2012-03-21 132 views
1

我是一个Firefox C++扩展新手。我需要在页面加载期间访问我的扩展中的DOM突变事件。默认情况下,Firefox在页面加载期间不发送DOM突变事件,以提高页面加载性能。Firefox扩展和nsIMutationObserver

我明白原因,但了解后果我仍然需要访问DOM突变事件。我在某处读到nsIMutationObserver在页面加载过程中仍然被调用(并且因为不需要在DOM树中寻找侦听器,所以它的效率比DOM突变事件更有效),但是它仅适用于本机代码。

所以我以下的问题:

  1. 是nsIMutationObserver和nsIMutationObserver2提供给Firefox扩展?
  2. 如果是的话,我该如何在C++中编写一个简单的Firefox扩展来访问它并将其暴露给Javascript?
  3. 如果人们可以指向我现有的扩展,从C++土地转移到JS,这将是高度赞赏。
  4. 或者我可以使用JS-CType从我的基于Javascript的扩展中访问该功能吗?

顺便说一句,我问这个问题在Firefox的扩展论坛,但没有答复那里。

在此先感谢

回答

1

是nsIMutationObserver和nsIMutationObserver2提供给Firefox扩展?

是的,二进制Firefox扩展可以使用它。当然,缺点是你的二进制XPCOM组件只能用于一个Firefox版本 - 它将不得不为每个新版本重新编译。

如果是,我该如何在C++中编写一个简单的Firefox扩展来访问它并将它公开给Javascript?

您创建一个XPCOM组件(请参阅example code)并执行nsIMutationObserver interface。然后,这种突变观察者附加到文件是这样的:

NS_IMETHODIMP 
MyMutationObserver::AttachToDocument(nsIDOMDocument* document) 
{ 
    nsCOMPtr<nsINode> node(do_QueryInterface(document)); 
    node->AddMutationObserver(this); 
} 

参考:nsINode interface

如果人们可以指向我一个现有的扩展,可以做从C++土地JS此转发,这将是高度赞赏。

对不起,不知道任何。但是您的XPCOM组件可以公开您的JavaScript代码将使用的其他接口 - 例如注册回调。你必须考虑到当变异观察者被调用时运行JavaScript可能不安全。这里的重要方法:nsContentUtils::IsSafeToRunScript()nsContentUtils::AddScriptRunner()(见nsContentUtils.h)。

或者我可以使用JS-CType从我的基于Javascript的扩展中访问该功能吗?

不,你不能。这些是Gecko内部组件,它们不会暴露于js-ctypes。

1

二进制扩展可以使用nsIMutationObserver,但除非它是非常非常小心,它做什么时,它的通知(见上面的接口声明的大警告),它会造成死机和其他各种不正常的行为,并有可能引入安全漏洞。就像任何其他的内部API一样,这是一种冲锋枪;如果不是非常小心地使用,可能是致命的一个。在一个ns突变监听器中做得很好的事情在nsIMutationObserver中是不行的。