Firefox extension and nsIMutationObserver

Firefox extension and nsIMutationObserver

本文关键字:nsIMutationObserver and extension Firefox      更新时间:2023-10-16

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

我理解原因,但理解后果,我仍然需要访问DOM突变事件。我在某个地方读到,nsIMutationObserver在页面加载期间仍然会被调用(它比DOM突变事件更高效,因为不必在DOM树上查找侦听器),但它只适用于本机代码。

所以我有以下问题:

  1. nsIMutationObserver和nsIMutation Observer 2可用于Firefox扩展吗
  2. 如果是,我如何用C++编写一个简单的Firefox扩展来访问它并将其公开给Javascript
  3. 如果人们能给我指出一个现有的扩展,它可以从C++land转发到JS,我们将不胜感激
  4. 或者,我可以使用JS CTypes从基于Javascript的扩展中访问该功能吗

顺便说一句,我在Firefox的扩展论坛上问了这个问题,但没有得到回复。

提前感谢

nsIMutationObserver和nsIMutation Observer 2可用于Firefox扩展吗?

是的,二进制Firefox扩展可以使用它。当然,缺点是你的二进制XPCOM组件只能与一个Firefox版本一起使用——每个新版本都必须重新编译。

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

您可以创建一个XPCOM组件(请参阅示例代码)并实现nsIMutationObserver接口。然后将这个突变观察者附加到这样的文档中:

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

参考:nsINode接口

如果人们能给我指出一个现有的扩展,它可以从C++land转发到JS,我们将不胜感激。

对不起,一个都不认识。但是您的XPCOM组件可以公开JavaScript代码将使用的附加接口,例如注册回调。您必须考虑,当调用突变观测器时,运行JavaScript可能不安全。此处的重要方法:nsContentUtils::IsSafeToRunScript()nsContentUtils::AddScriptRunner()(请参见nsContentUtils.h)。

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

不,你不能。这些是Gecko内部,它们没有暴露在js-cypes中。

二进制扩展可以使用nsIMutationObserver,但除非它在收到通知时非常小心(请参阅接口声明上方的大警告),否则它会导致崩溃和其他各种破坏行为,并可能引入安全漏洞。像任何其他内部API一样,这是一个步兵枪;如果不小心使用,可能会致命。在DOM突变监听器中可以做的事情在nsIMutationObserver中是不好的。

相关文章:
  • 没有找到相关文章