【问题标题】:Generating async Javascript events from browser plugin (NPAPI)从浏览器插件 (NPAPI) 生成异步 Javascript 事件
【发布时间】:2009-12-19 03:48:35
【问题描述】:

我正在编写一个网络浏览器插件 (NPAPI.)

我的插件启动了一个工作线程,随着工作线程的进展,我想将事件传递回 Javascript。但是由于NPAPI线程模型,工作线程直接回调NPAPI是不合法的,所以工作线程不能调用Javascript。

一个解决方案是 NPN_PluginThreadAsyncCall 函数。但这是一个相对较新的功能。例如,仅从 Firefox 3 开始支持。

有什么方法可以在不使用 NPN_PluginThreadAsyncCall 的情况下从 NPAPI 插件获取异步事件传递/javascript 执行?在添加这个功能之前人们做了什么?

【问题讨论】:

    标签: javascript browser plugins npapi


    【解决方案1】:

    答案是肯定的……而且不是……

    如果您需要支持旧版浏览器(firefox 3 之前),您可以自己实现 NPN_PluginThreadAsyncCall 函数。在 Windows 上,您可以通过创建一个可以保存函数指针和 void* 不透明指针的数据结构来做到这一点,然后将自定义消息发布到主窗口,并将指向您的数据结构的指针作为 LPARAM。

    主窗口 WINPPROC 在 UI 线程上运行,该线程可以与 Javascript 对话。因此,当您在 WINPROC 中收到该消息时,您只需将 LPARAM 转换回指针,使用不透明数据调用方法,然后释放数据结构。

    在 Mac 上,您可以使用队列执行类似的操作来存储事件,然后在 NULL 事件(Mac OS 大约在每个滴答声中发送)检查其中是否有任何内容。如果是这样,请将其弹出,调用该方法,释放它,然后继续。

    在 linux 上可能也有办法做到这一点,但我不知道它是什么。

    您可以在firebreath project 中找到windows 版本的示例。

    winproc 消息的处理在这个文件中: https://github.com/firebreath/FireBreath/blob/master/src/PluginWindow/Win/PluginWindowWin.cpp

    事件和数据结构在其头文件中定义: https://github.com/firebreath/FireBreath/blob/master/src/PluginWindow/Win/PluginWindowWin.h

    触发该事件的方法在这里:

    void ActiveXBrowserHost::ScheduleAsyncCall(void (*func)(void *), void *userData)
    {
        if (m_hWnd != NULL) 
            ::PostMessage(m_hWnd, WM_ASYNCTHREADINVOKE, NULL, 
                (LPARAM)new FB::WINDOWS_ASYNC_EVENT(func, userData));
    }
    

    【讨论】:

    • 谢谢!知道平台 GUI 事件循环线程对于 NPAPI 调用是安全的非常有帮助。我一定会去看看 Firebreath。 FWIW,在 Mac 上,如果你可以依赖 Cocoa,在 GUI 线程上运行代码的简单方法是 NSObject 方法 performSelectorOnMainThread。
    • 是的,我想有人告诉我有关 performSelectorOnMainThread 的事情,但到目前为止我还不需要使用它。现在仍在使用 Firefox 2 的用户比例太小了,我决定不再支持它。使用 FireBreath,如果有人非常需要它(或者他们可以),我们可以添加支持,但我的任何东西都不需要它。 =] 有几个非常好的功能直到 Firefox 2 才实现;例如,NPN_Enumerate 和 NPN_Construct。另外,firefox 2 有一个已知的 bug,它无法在 windows 中看到注册在 HKCU 中的插件,所以你必须是管理员。
    猜你喜欢
    • 2012-01-29
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2023-03-26
    相关资源
    最近更新 更多