我是 Firefox C++ 扩展新手。我需要在页面加载期间访问我的扩展中的 DOM 突变事件。默认情况下,Firefox 不会在页面加载期间发送 DOM 突变事件以提高页面加载性能。
我理解原因,但理解后果我仍然需要访问 DOM 突变事件。我在某处读到 nsIMutationObserver 仍然在页面加载期间被调用(并且比 DOM 突变事件更有效,因为不必沿着 DOM 树寻找监听器),但是它仅适用于 native 代码。
所以我有以下问题:
- nsIMutationObserver 和 nsIMutationObserver2 是否可用于 Firefox 扩展?
- 如果是,我如何用 C++ 编写一个简单的 Firefox 扩展来访问它并将它暴露给 Javascript?
- 如果人们可以向我指出一个现有的扩展,可以实现从 C++ 领域到 JS 的这种转发,我们将不胜感激。
- 或者我可以使用 JS-CTypes 从基于 Javascript 的扩展中访问该功能吗?
顺便说一句,我在 Firefox 的扩展论坛上问过这个问题,但那里没有回复。
提前致谢
最佳答案
Is nsIMutationObserver and nsIMutationObserver2 available to Firefox extensions?
是的,二进制 Firefox 扩展可以使用它。当然,缺点是您的二进制 XPCOM 组件只能与一个 Firefox 版本一起使用 - 它必须为每个新版本重新编译。
If yes, how can I write a simple Firefox extension in C++ to get access to it and expose it to Javascript?
您创建一个 XPCOM 组件(参见 example code)并实现 nsIMutationObserver
interface .然后,您将这个变异观察者附加到这样的文档中:
NS_IMETHODIMP
MyMutationObserver::AttachToDocument(nsIDOMDocument* document)
{
nsCOMPtr<nsINode> node(do_QueryInterface(document));
node->AddMutationObserver(this);
}
If folks can point me to a existing extension that does this forwarding from C++ land to JS, that will be highly appreciated.
抱歉,一个都不知道。但是您的 XPCOM 组件可以公开您的 JavaScript 代码将使用的附加接口(interface) - 例如注册回调。您必须考虑到在调用变异观察器时运行 JavaScript 可能不安全。这里的重要方法:nsContentUtils::IsSafeToRunScript()
和 nsContentUtils::AddScriptRunner()
(参见 nsContentUtils.h)。
Or can I use JS-CTypes to get access to that functionality from my Javascript based extension?
不,你不能。这些是 Gecko 内部构件,它们不会暴露给 js-ctypes。
关于c++ - Firefox 扩展和 nsIMutationObserver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9798517/