gpt4 book ai didi

firebreath - firefox 无法识别 firebreath JSAPI

转载 作者:行者123 更新时间:2023-12-04 20:12:43 27 4
gpt4 key购买 nike

首先是关于我正在用 Firebreath 做什么的一些背景知识。

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

  • 然后,假设主查看器和平面 View 都被加载,命名为“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)在将 NPObjects 传递给另一个函数调用之前包装它们;因此,您无法获得最初传递给浏览器的底层 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();
    }

    如果您从未通过 map 并清除过期的弱 ptr,这当然最终会泄漏少量内存,但它应该为您提供所需的东西。当你得到一个应该是 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
    }
    }
    }

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

    关于firebreath - firefox 无法识别 firebreath JSAPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15286464/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com