Native Client模块是否可以呈现由C++代码生成的HTML

Can a Native Client module render HTML generated by C++ code?

本文关键字:C++ 代码生成 HTML 模块 Client 是否 Native      更新时间:2023-10-16

我有一些数据分析代码,可以处理输入文件并输出HTML和/或SVG。它是C++和CPU密集型的。

我想创建一个浏览器插件,这样我的代码就可以在不离开浏览器的情况下使用。Google的Native Client框架和Pepper API听起来很有趣,但可能有点过于严格。从本机客户端模块,是否可以通过Pepper执行以下操作?

  1. 访问用户文件系统上的本地文件。我知道NaCl沙箱通常可以防止这种情况,但肯定有办法通过用户选择的文件从Javascript层向下到NaCL?

  2. 将HTML或SVG输出回浏览器。C++有什么方法可以修改包含文档的DOM吗?

我对(1)不太确定,但(2)肯定不直接可能。

对于(1),Pepper API应该允许文件拾取器将文件提供给NaCl模块,就像WebFS允许JavaScript一样。我不确定这方面的实施情况。

对于(2),C++代码不能直接操作DOM。然而,NaCl模块可以使用PostMessage接口将字符串发送到JavaScript代码,然后JavaScript代码可以进行实际的DOM操作。请注意,在Chrome中,NaCl模块是事件处理程序。这意味着,如果计算是由某个事件启动并同步运行的(这是CPU密集型的),则会导致浏览器失去交互响应能力,或者变得不稳定,因为事件处理程序需要很长时间才能返回。更好的方法是生成一个后台线程来完成事件处理程序中的工作(或唤醒一个工作线程),然后立即从事件处理程序返回。当计算完成并准备好结果时,PostMessage会返回结果,让JavaScript线程唤醒(再次作为事件处理程序)并进行DOM操作。请注意,当前PostMessage必须在主线程上调用,因此工作线程必须使用CallOnMainThread来唤醒主事件处理程序线程,以便它可以依次执行PostMessage。

延续传球风格不是很有趣吗?

  1. 可以使用文件输入元素和JavaScript将文件上传到HTML文件系统,然后可以通过JavaScript和NaCl对其进行操作。nacl_io库实现了标准的posix方法,如fread,因此一旦保存了文件,它就非常直接了。JS请参见此处(不要被弃用消息所拖延,它是在Chrome中实现的),NaCl请参见此处。

  2. 正如@Bennet Yee所提到的,NaCl模块不能修改页面,而是将消息传递回浏览器窗口,由JavaScript处理。听起来您可能想要传回一些JSON数据。请参阅此处查看谷歌关于消息系统的文档。