从浏览器插件 (NPAPI) 生成异步 Javascript 事件

2023-11-28

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

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

解决此问题的一种方法是 NPN_PluginThreadAsyncCall 函数。但这是一个相对较新的功能。例如,仅 Firefox 3 及以上版本才支持它。

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


答案是是……又不是……

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

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

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

也许有一种方法可以在Linux上做到这一点,但我不知道它是什么。

您可以在以下位置找到 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));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从浏览器插件 (NPAPI) 生成异步 Javascript 事件 的相关文章

随机推荐

  • 实现支持方法链的 Scala 特征的最佳实践

    我想创建一个特征 向类添加一些属性并使链接方法成为可能 在 Scala 2 8 1 中测试 trait SomeProperty var prop String default def setProp s String prop s thi
  • Airflow 2 的 Docker 撰写文件(版本 2.0.0)

    我正在寻找编写 docker compose 文件以在类似的生产环境中本地执行气流 对于较旧的 Airflow v1 10 14 docker compose 工作正常 但相同的 docker compose 不适用于最新的稳定版本 气流调
  • Ant 类路径顺序

    如何在 ant 中设置类路径顺序 具体来说 当我尝试运行 ant 构建时 我需要它来选取 jar jaxws api jar 中的类 而不是 jre 中的同一类 我目前正在设置类路径以显式包含这些 jar 但它似乎仍然首先选择 jre 我正
  • iphone 动画:为什么围绕 X 轴旋转 UILabel 会切断其下半部分?

    我想围绕 X 轴旋转 UILabel 并为其设置动画 但是当动画开始时 标签的文本会被水平切成两半 下半部分消失 上半部分在旋转 为什么 这是代码 CATransform3D 3Dt CATransform3DMakeRotation ra
  • 如果 *any* 属性匹配,JQuery 选择元素

    我想要一个像这样的选择器 author 如果 author 是任何属性的值 而不仅仅是类的值 则将选择一个元素 E g selector text 对于以下每一页 应给出 Emily Ekins a href http reason com
  • Pyspark - 如何回填 DataFrame?

    你怎么能做同样的事情df fillna method bfill 对于带有 a 的 pandas 数据框pyspark sql DataFrame pyspark 数据框具有pyspark sql DataFrame fillna方法 但是
  • 多列重复

    我有一个像这样的数据框 gt df a b c d 1 1 2 A 1001 2 2 4 B 1002 3 3 6 B 1002 4 4 8 C 1003 5 5 10 D 1004 6 6 12 D 1004 7 7 13 E 1005
  • 如何在 Windows 上安全地转义 cmd.exe shell 的命令行参数?

    好的 我有一些必须执行的命令shell True mode os system or subprocess Popen shell True 该命令包含字符串替换 例如 cmd some secret command 0 format st
  • 我无法连接到 https waitress wsgi 服务器

    我已经尝试过python金字塔框架的教程 但是 https连接 无论如何都无法服务员 http docs pylonsproject org projects pyramid en latest tutorials wiki2 instal
  • 全高内容和尽可能最小的宽度

    我从来不认为这是可能的 但这里有很多聪明的人 所以我想我会问 我正在寻找一种方法来拥有一个全高容器 其宽度取决于内容的多少 我希望文本填充占据整个高度的区域 同时使用尽可能小的宽度 高度是已知的并且是硬编码的 但内容的数量却不是 我正在与像
  • apache tomcat 7.0.30 datasourcerealm javax.naming.NameNotFoundException:名称 [jdbc/proto] 未在此上下文中绑定。找不到[jdbc]

    先描述一下环境 环境 Mac OS X Java 版本 1 6 0 35 b10 428 11M3811 阿帕奇 tomcat 7 0 30 mysql 5 5 27 tomcat lib gt mysql connector java 5
  • java中无效的字符常量

    return int feetPart inchesPart 为什么上面的字符常量无效 这在 JavaScript 中完美运行 我想以英尺和英寸为单位显示高度 并且正在使用此客户端 但是当我在服务器端使用相同的内容时 它会显示Invalid
  • Prometheus:无法从连接的 Kubernetes 集群导出指标

    问题 我在 Kubernetes 集群之外有一个 Prometheus 所以 我想从远程集群导出指标 我从以下位置获取了配置示例普罗米修斯 Github 存储库并对此进行了一些修改 所以 这是我的工作配置 job name kubernet
  • 错误:缺少 JavaFX 运行时组件,并且需要在 Eclipse 中运行此应用程序

    我是 JavaFX 的初学者 并尝试在 Ubuntu 上的 Eclipse 中运行 JavaFX 我的电脑上安装了 openjfx 但出现错误 JavaFX 运行时组件缺失 并且需要运行该应用程序 我已经搜索了很多但没有得到任何解决方案 尝
  • 是否无法在标题属性中使用 HTML 实体?

    上面的屏幕截图来自 Firefox 光标悬停在图像左侧的黄点上 它是一个 img 元素 实际上它是一个图像以及包含单个圆形的图像映射 area 元素 但我认为这种区别并不重要 它是在 JavaScript 中创建和设计的 包括标题属性的应用
  • 处理发送到 C# 托盘应用程序的 WM_CLOSE 消息

    我发现有几篇文章告诉我如何使用 WM CLOSE 消息 但我的应用程序仍然是必须处理 WM CLOSE 消息的应用程序 有没有办法连接 WM CLOSE 并处理它 因为WM CLOSE只是关闭托盘图标但不终止进程本身 Regards 为此
  • Web 应用程序和客户端/服务器应用程序有什么区别?

    我从另一个那里拿走了这个question I had 在 sqlite 的适当用途下 它具有 SQLite 运行良好的情况 网站 SQLite 通常会很好地工作 因为 低到中数据库引擎 流量网站 也就是说 99 9 的网站 SQLite 可
  • 正则表达式获取大括号之间的字符串

    不幸的是 尽管在我记忆中 我每年至少尝试学习一次正则表达式 但我总是忘记 因为我很少使用它们 今年我的新年决心是不再尝试学习正则表达式 所以今年为了不让我流泪 我会把它交给 Stack Overflow 去年圣诞节混音 我想传入一个这种格式
  • R 中具有不同摘要的相同数据帧?

    我有两个大数据框 a and b为此identical a b is TRUE as is all equal a b but identical digest a digest b is FALSE 什么可能导致这种情况 更重要的是 我尝
  • 从浏览器插件 (NPAPI) 生成异步 Javascript 事件

    我正在编写一个网络浏览器插件 NPAPI 我的插件启动一个工作线程 随着工作线程的进展 我想将事件传递回 Javascript 但由于 NPAPI 线程模型 工作线程直接回调 NPAPI 是不合法的 因此工作线程无法调用 Javascrip