firebreath JSAPI 在 firefox 中不会被识别

2024-03-23

首先介绍一下我使用 Firebreath 所做的一些背景知识。

  1. 我正在使用 firebreath 在浏览器中开发渲染查看器插​​件。
  2. 我在插件中定义了两种 MIME 类型,一种用于主查看器,另一种用于 2D 平面图。
  3. 在每个页面中,仅允许一个主查看器,但可以有多个 2D 平面图。它们都共享在主查看器中打开的相同模型文档。
  4. 因此,在实例化 2D 平面图之后,我需要将文档对象(firebreath JSAPI)传递给 2D 平面图。

然后,假设主查看器和平面图都已加载,命名为“mainviewer”和“planview”,我将把文档附加到平面图查看器,如下所示,

planview.attach(mainviewer.doc); 
(the signature is "bool attach(const FB::JSObjectPtr& myDoc)" and 
The mainviewer.doc is just a firebreath JSAPI)

问题是在 firefox 中,通过调用传递的 JSObject 无法被识别为 JSAPI

FB::JSAPIPtr jsAPI = myDoc->getJSAPI(); // THIS WILL RETURN **NULL**.
m_main_doc = FB::ptr_cast<LcFbViewerDocumentAPI>(jsAPI); // Cast to my document API.

仅当主机浏览器为 Firefox 时才会出现此问题,IE/Chrome 运行良好。

那么,使用firefox时传递的JSAPI发生了什么变化呢?


事实证明,大多数浏览器(包括 FireFox)都会在将 NPObject 传递到另一个函数调用之前对其进行包装;因此,您无法获取最初传递给浏览器的底层 C++ 类。因为 FireBreath 无法获取真正的 NPJavascriptObject(FireBreath 用于包装 JSAPI 对象以提供给浏览器的 NPObject),所以它也无法获取原始 JSAPI 对象。

考虑为 JSAPI 对象的每个实例创建一个静态 ID。然后,您可以将instance_id公开为JSAPI属性,然后创建一个全局std::map,您可以使用它来存储映射以获取您的对象。

// in the class def
static int counter;
int instance_id;

// In the .cpp file
int MyPluginAPI::counter(0);

std::map<int, FB::JSAPIWeakPtr> apiMap;
FB::JSAPIPtr getJSAPIObjectById(int id) {
    std::map<int, FB::JSAPIWeakPtr> fnd = apiMap.find(id);
    if (fnd != apiMap.end()) {
        return fnd.second->lock(); // it's a weak pointer, lock to get the shared_ptr
    } else {
        return FB::JSAPIPtr(); // Alternately throw an exception
    }
}

MyPluginAPI::MyPluginAPI() {
    instance_id = counter++;
    // Note that you can't get at the shared_ptr in the constructor,
    // so you'll have to call an init function after creating the JSAPI object

    registerProperty("instance_id",
                 make_property(this,
                    &FBTestPluginAPI::get_instId));
}

int MyPluginAPI::get_instId() { return instance_id; }

void MyPluginAPI::init() {
    apiMap[instance_id] = shared_from_this();
}

如果您不遍历映射并清除过期的弱指针,这当然最终会泄漏少量内存,但它应该可以满足您的需要。当您获得一个应该是 JSAPIPtr 对象的对象时,您可以将其视为 JSObjectPtr。

void doSomethingWithAnAPI(const FB::JSObjectPtr& obj) {
    if (obj) {
        int id = obj->GetProperty("instance_id");
        FB::JSAPIPtr ptr = getJSAPIObjectById(id);
        if (ptr) {
            // Hurray! We have the object
        }
    }
}

我还没有测试过上面的代码,但它应该非常接近。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

firebreath JSAPI 在 firefox 中不会被识别 的相关文章

  • (obj == null) vs (null == obj)?

    我的老板说我应该使用null obj 因为它比obj null 但他不记得为什么要这样做 有什么理由使用null obj 我以某种方式感觉到了 相反 经过谷歌搜索后 我唯一发现的是 在 C 中 它可以防止您意外地在条件结构中键入 obj n
  • iPhone文档文件夹库/缓存安全问题

    我开发了一款iOS应用程序 出于安全原因 我将所有音频 视频文件下载到下的 Documents 文件夹中库 缓存 对于使用 iTunes 最终用户无法备份此视频 但有些外部软件很容易打开库 缓存并从此文件夹下载所有文件 我的问题是如何保护此
  • 如何在IntelliJ 2021.2.2中使用Lombok插件?

    我是从 C 开始接触 Java 的 我一直在努力熟悉这门语言 我正在尝试使用 IntelliJ IDEA 的 lombok 插件 但它似乎根本不适合我 这是我的IDEA无法识别 value 注释的屏幕截图 https i stack img
  • 您能否将多个不同的值类型分配给重复的 Protobuf 消息中的一个字段?

    我正在尝试对客户端进行逆向工程 该客户端将音频文件上传到服务器 然后在单独的请求中上传文件的元数据 元数据在 Protobuf 中序列化 并且使用相当简单且可读的结构 这是之后的样子protoc decode raw 1 1 title 2
  • 对 Django 模板中的相关项目进行排序

    是否可以对 DJango 模板中的一组相关项目进行排序 即 这段代码 为了清楚起见 省略了 HTML 标签 for event in eventsCollection event location for attendee in event
  • laravel 一个帐户下有多个电子邮件地址

    我的 Laravel 应用程序要求用户可以拥有多个可用于登录的电子邮件地址 我的问题是 如何允许用户在一个帐户下拥有多个电子邮件地址 我必须记住 每封电子邮件只能由一个用户使用 我的想法是为电子邮件创建一个单独的表 其中包含用户 ID 我仍
  • delphi 7 中的 utf8 解码

    我需要使用 delphi 7 将字符串从 utf8 转换为宽字符串 谁能告诉我为什么下面的代码在delphi 7中不起作用 Utf8Decode 函数的参数只是一个示例 var ws WideString begin ws Utf8Deco
  • C# 如何杀死阻塞的线程?

    我有一个线程 void threadCode object o doStuffHere o Blocking call Sometimes hangs 我这样称呼它 Thread t new Thread new ThreadStart d
  • 如何在 Keras 中定义自定义精度以忽略具有特定金色标签的样本?

    我想在 Keras 中编写一个自定义指标 我正在使用张量流后端 相当于categorical accuracy 但是具有特定金色标签的样本的输出 在我的例子中是 0 来自 y true 必须被忽略 例如 如果我的输出是 预测 1 金 0 预
  • 如何验证 angular2 中的 FormArray 长度

    我有一个 angular2 数据驱动形式 如下所示 this formBuilder group name Validators required description Validators required places this fo
  • android: 需要为元素 显式指定导出

    我在 AndroidManifest xml 中遇到 Flutter 构建错误 android exported 需要为元素 显式指定 面向 Android 12 及更高版本的应用需要指定 显式值android exported当相应的组件
  • 直接调用分配给对象属性的闭包

    我希望能够直接调用分配给对象属性的闭包 而无需将闭包重新分配给变量然后调用它 这可能吗 下面的代码不起作用并导致Fatal error Call to undefined method stdClass callback obj new s
  • Ruby 中的“sys.stdout.write()”等价物是什么?

    正如 Python 中所见 什么是sys stdout write Ruby 中的等价物 在 Ruby 中 您可以使用以下方式访问标准输出 stdout or STDOUT 所以你可以使用write http ruby doc org co
  • NLP 中的否定处理

    我目前正在开发一个项目 我想从文本中提取情感 由于我使用的是conceptnet5 一种语义网络 因此我不能简单地在包含否定词的句子中添加单词前缀 因为这些单词根本不会出现在conceptnet5 的API 中 这是一个例子 这部电影不太好

随机推荐

  • 带有内存缓存的 async/await 的线程安全

    我正在查看有关内存屏障的部分 如中所述http www albahari com threading part4 aspx http www albahari com threading part4 aspx并尝试制作 我们真的需要锁和屏障
  • 为什么 C4062 Visual C++ 警告默认关闭?

    根据 MSDN Visual C 可以发出C4062 警告 http msdn microsoft com en us library fdt9w8tf aspx when 枚举用于switch and 该枚举的至少一个元素没有标签 并且
  • 扩展自定义验证类

    我最近一直在尝试 Laravel 4 并尝试让自定义验证类发挥作用 验证类
  • 在 PHP 或 MySQL 中对小数进行排序

    我正在开发一个分类账应用程序 我的主要问题是我的客户有这样的代码的会计科目表 1 1 1 1 1 2 1 1 10 1 1 11 使用 PHP 或 MySQl 我只能设法将它们排序 1 1 1 1 1 10 1 1 11 1 1 2 有关如
  • 如何在Odoo中获取ID字段值[重复]

    这个问题在这里已经有答案了 我是 Odoo 8 的新手 在获取对象的 ID 值时遇到一些困难 例如 hr employee 的 ID 字段值 您能给我一些这方面的示例吗 请阅读v8 0 官方文档 https www odoo com doc
  • 如何使用 XAML 创建简单的 2D NURBS?

    我需要创建一个具有两个端点和 n 个控制点的样条线 据我所知 贝塞尔曲线仅允许一个控制点 而贝塞尔样条允许两个控制点 但是 我需要能够添加我认为合适的任意数量的控制点 而不仅限于一两个 Here is an example of what
  • 如果产品属于某个类别 WooCommerce,如何设置选项卡(仅)

    我设置了一个选项卡来添加一个包含 WooCommerce 规范的选项卡 我想将其包装到 if 语句中 以便仅在产品属于某个类别时才设置选项卡 add filter woocommerce product tabs woo custom pr
  • 尝试调用 getWritableDatabase() 时不断收到 NullPointerExceptions

    我是 Android 框架的新手 我无法通过 SQLite 的基础知识 我正在尝试构建一个非常简单的应用程序 它有一个 EditText 搜索框 当按下某个键时 它会在 SQLite 数据库上执行 Like word 搜索 以查找在 Edi
  • 带有 ref 变量的函数委托

    public object MethodName ref float y elided 我如何定义一个Func该方法的委托 它不能通过Func但你可以定义一个自定义delegate for it public delegate object
  • 我应该如何为 PHP 中的所有页面设置全局变量

    Question 我要实现 associate name and app key全局变量 这样我就可以在任何我想要的页面上访问它们 下面是我的头文件中的代码 获取变量将出现在索引页中 它在索引页面上工作正常 因为 GET 数据可用 但是当用
  • Powerpoint 演示文稿中可编辑 HTML、CSS 和 Javascript?

    我想知道是否可以在 powerpoint 内有一个可编辑的 HTML 演示界面 如 Plunkr 用于进行有关 HTML JavaScript 等的教育演示 有人这样做过吗 是否可以在 powerpoint 中嵌入带有 plunkr 或本地
  • 树图如何使用红黑树算法

    我读过很多关于红黑树的文章 其中操作需要 O log n 时间 我不太清楚它是如何工作的 以及与二叉搜索树相比 树图实际上如何使用红黑树算法来平衡树 参考链接https www topcoder com community data sci
  • PhoneGap Ripple 模拟器总是报告格式错误的 config.xml

    有谁知道什么会导致最新版本的 Chrome 上的 Ripple 模拟器 最新版本 always报告格式错误或丢失的配置文件 在应用程序的根目录中找不到 config xml 文件或者 XML 格式错误 我有我的config xml完全存在于
  • Azure 上的 PushSharp ASP.net MVC4 问题。 - 无法连接APNS反馈服务

    我有一个 ASP Net MVC4 网站 在 Azure 上运行一个简单的 Web 服务 为我们的移动应用程序提供推送通知服务 它在我的计算机上的本地 IIS 实例上运行时可以工作 但一旦部署到 Azure 它会工作一段时间然后停止 看来P
  • x 轴上只有一个变量的 Corrplot

    我有一个包含大约 200 个变量的数据集 我希望了解其中一个变量如何与所有其他变量相关 但是 当我使用corrplot 它给了我完整的相关矩阵200x200细胞的大小 并且大到可以很好地可视化 我将使用iris可重现示例的数据集 说吧 我只
  • 在 C++ 中是否可以获取作为参数传递的变量名称的字符串? [复制]

    这个问题在这里已经有答案了 我希望能够做这样的事情 int myVar 3 void logger int param std cout lt lt nameOf param lt lt lt lt param lt lt std endl
  • 如何删除SSIS中数据流任务中的列?

    I use SQL Server 2016我很忙DataFlow task In my DataFlow task I use Multicast component因为某些原因 在我的中创建一个新的流程后DataFlow 我需要删除新流程
  • 如何使用 ActionScript 3 在 Flash 中创建文本按钮?

    当我尝试使用文本字段作为按钮时 它似乎没有buttonMode财产 如何在 Flash 项目中使用 ActionScript 以编程方式创建文本按钮 它应该是一个简单的文本 可以点击 您可以添加TextField to a Sprite并将
  • 如何在具有提升权限的 WiX 中创建的 MSI 中运行自定义操作?

    我有一个安装程序需要访问注册表并使用自定义操作复制和删除文件 在 Windows XP 中 安装程序运行良好 但在 Vista 和 7 中 安装程序显示错误 因为它无法访问文件夹 但如果我以管理员身份运行安装程序 则一切正常 因此 我需要安
  • firebreath JSAPI 在 firefox 中不会被识别

    首先介绍一下我使用 Firebreath 所做的一些背景知识 我正在使用 firebreath 在浏览器中开发渲染查看器插 件 我在插件中定义了两种 MIME 类型 一种用于主查看器 另一种用于 2D 平面图 在每个页面中 仅允许一个主查看