【问题标题】:Firefox binary extension: nsISupports to JS::ValueFirefox 二进制扩展:nsISupports 到 JS::Value
【发布时间】:2013-03-28 23:30:22
【问题描述】:

我正在尝试实现 nsIDOMGlobalPropertyInitializer::Init()。

我有一个现有对象(基于 Google Gears),我正在尝试扩展它以支持 JAVASCRIPT_GLOBAL_PROPERTY_CATEGORY(因为 JAVASCRIPT_DOM_CLASS 似乎不再在 FF17 中工作)。

正在调用我的 nsIDOMGlobalPropertyInitializer::Init() 实现,但是如何将我的 C++ 对象(它实现 nsISupports 并公开适当的 IDL)转换为 JS:Value 以使我的对象在 Java Script 中可用?

如果我返回 NS_ERROR_NOT_IMPLEMENTED 或没有实现 nsIDOMGlobalPropertyInitializer 接口,FF(理所当然地)抱怨对象没有公开任何方法或属性。

【问题讨论】:

  • 也许通过 nsXPConnect::WrapNativeToJSVal?
  • 但是 nsXPConnect 来自哪里?
  • nsXPConnect* xpc = nsXPConnect::GetXPConnect();
  • 但是 nsXPConnect.cpp 存在于 js\xpconnect\src\ (这是 FF 源代码树)中,它不在 SDK 中(我正在链接)。
  • @DmitryStreblechenko 你成功了吗?我正在尝试为 FF 实现 C++ 扩展,它应该将它的接口暴露给 JS,并担心它根本不可行......

标签: firefox firefox-addon firefox-addon-sdk xpcom


【解决方案1】:

您不必将对象转换为 JS:Value。如果你实现了像 nsISupports 这样的 XPCOM 接口,它们将在 JavaScript 中可用。从您的描述中不清楚您的对象究竟做了什么,但您可能必须在 IDL 中编写一个自定义接口并在您的对象中实现它。然后你可以通过这个接口在 JS 中操作它。您可能也应该实现nsISecurityCheckedComponentnsIClassInfo

【讨论】:

  • 是的,我的对象已经实现了 nsISupports。 JAVASCRIPT_GLOBAL_CONSTRUCTOR_CATEGORY 不再在 FF 17 中工作,所以我正在尝试实现 JAVASCRIPT_GLOBAL_PROPERTY_CATEGORY。但是如果我这样做,FF 不会看到我的对象上的任何属性或方法,因为它需要实现 nsIDOMGlobalPropertyInitializer 接口。为了实现 nsIDOMGlobalPropertyInitializer::Init,我需要将我的对象转换为 JS::Value。
  • 你试过实现nsISecurityCheckedComponent吗?这更有可能是 JS 看不到您的组件属性的原因。据我所知,您不需要实现nsIDOMGlobalPropertyInitializer,除非您希望您的组件能够访问窗口(尽管他们可能已经改变了这一点,因为我喜欢实现一个 JS 全局属性)。
  • nsIDOMGlobalPropertyInitializer 没有帮助 :-( FF 甚至没有查询我的对象以获得该接口。
  • 至于 nsIDOMGlobalPropertyInitializer,我可以看到 FF(来自 nsDOMClassInfo.cpp 中的 nsWindowSH::GlobalResolve())创建了我的全局属性的实例并将其值默认为 JSVAL_VOID。然后它继续向我的对象查询 nsIDOMGlobalPropertyInitializer 并调用 nsIDOMGlobalPropertyInitializer::Init(),这是我遇到问题的方法...
  • 你可能是对的。看起来bug 773803 中的行为发生了变化,所以现在可能需要nsIDOMGlobalPropertyInitializer。您可以使用 XPCOM 实例化 XPConnect(基本上是 nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID()));),但我不确定您如何从窗口中获得正确的 JSContext 来创建 JSVal。您不能简单地在 JavaScript 中实现全局属性的任何特殊原因?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
  • 2011-07-29
  • 2013-10-25
  • 1970-01-01
相关资源
最近更新 更多