c++ - Firefox 扩展和 nsIMutationObserver

标签 c++ firefox firefox-addon

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

我理解原因,但理解后果我仍然需要访问 DOM 突变事件。我在某处读到 nsIMutationObserver 仍然在页面加载期间被调用(并且比 DOM 突变事件更有效,因为不必沿着 DOM 树寻找监听器),但是它仅适用于 native 代码。

所以我有以下问题:

  1. nsIMutationObserver 和 nsIMutationObserver2 是否可用于 Firefox 扩展?
  2. 如果是,我如何用 C++ 编写一个简单的 Firefox 扩展来访问它并将它暴露给 Javascript?
  3. 如果人们可以向我指出一个现有的扩展,可以实现从 C++ 领域到 JS 的这种转发,我们将不胜感激。
  4. 或者我可以使用 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);
}

供引用:nsINode interface

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/

相关文章:

c++ - 代码在 VS 2008 中运行良好,但在更高版本的 VS 中运行不正常

javascript - Firefox 插件 : How to fire event when page load *starts*?

c++ - Visual Studio 2008 错误? "LNK1104 : cannot open file "

c++ - Windows Mobile 上的自有窗口

javascript - 如何在 iMacros 中保存网页图像?

php - PHP的报告是非常缓慢的,并在Firefox崩溃

html - 即使调整大小 : none;,文本区域调整大小 handle 和在 firefox 中可拖动

Firefox 右键菜单太长

javascript - 有没有办法将 chrome 扩展移植到其他浏览器?

c++ - 如何在C++中将字符串转换为字节数组