嵌入 Web 浏览器时,Javascript 是 DOM 交互的唯一选择吗?

Fru*_*lax 3 javascript dom xulrunner chromium-embedded

我研究了将 Web 浏览器嵌入应用程序的各种方法(例如通过特定于操作系统的方式的 IE 或 Safari,或通过 XULRunner 的 Firefox/Mozilla,或通过 Chromium 嵌入式框架的 Chrome),并且我设法集成了 CEF我的应用程序达到了我确信它会按预期工作的程度。现在,在我看来,无论何时我想修改 DOM(例如添加或删除元素),我都必须通过 Javascript 来完成,即我的应用程序调用 Javascript 来完成实际工作。

我想知道为什么会这样。我(天真?)的信念是,例如,如果我调用appendChildJavascript,附加子项的实际“工作”最终将由 C/C++ 函数执行,因为浏览器本身是用 C/C++ 编写的,而不是用 Javascript 编写的。所以,我想知道为什么在嵌入式 Web 浏览器中我不能直接调用这个 C/C++ 函数而不是通过 Javascript。我知道对于一般脚本,出于安全原因,您不希望使用除 Javascript 之外的其他语言,但是如果浏览器嵌入到应用程序中,我无论如何都可以控制,这不应该是原因,对吗?

我错过了什么?

Ale*_*nes 5

CEF 被实现为铬的内容 api和您的应用程序之间的层。使用 CEF 时,Chromium 是 CEF 中的一个库,您只能访问 CEF 的公共 API,该 API 或多或少地仅限于任何铬内容 API 的利用(请记住,没有浏览器被创建为可嵌入的插件,然后演变成一个应用程序,它总是相反)。内容 API 是谷歌工程师必须将某些形式的内省形式化的方式,但它们并没有完成,因为浏览器本身并不是完全模块化的。铬代码的工作正在进行中,以将特定的“全能”组件分离为您可以随意选择的更通用的组件。

因此,在使用 CEF 时,您不能简单地挂钩 Chromium 的实现细节:您需要修补它以实现它本身不会公开的内容。CEF 实现了一个用于 DOM 遍历的类(请参阅此处),但您只能选择 DOM,而不能更改它。

也就是说,在 C++ 方面,您可以做一些任意的事情,例如检查/修改 http 请求(例如,允许您将 javascript 注入页面),以及直接从 C++ 运行任意 javascript 代码,这可以由它自己轮流, 通过不同的路径异步回调 C++ 代码(ajax -> C++ 中的 http 处理,或可以直接在 C++ 中编码的 V8 扩展。

有关更多详细信息,请参阅https://bitbucket.org/chromiumembedded/cef/wiki/JavaScriptIntegration

可以自定义 CEF 或直接转到铬源代码,但那是巨大的。我听说过的其他解决方案在 API 限制方面或多或少相似,即AwesomiumMozilla 的 Gecko等。