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

Is Javascript the only choice for DOM interaction when embedding a web browser?

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

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

我错过了什么?

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

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

就是说,在 C++ 方面,您可以做一些任意的事情,例如 inspecting/mangling http 请求(例如,它允许您将 javascript 注入页面)和 运行 直接来自 C++ 的任意 javascript 代码,它可以轮流通过不同的路径异步回调到 C++ 代码(ajax -> C++ 中的 http 处理,或者你可以直接编码的 V8 扩展在 C++ 中。

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

可以自定义 CEF 或直接使用 Chromium 源代码,但那东西太大了。我听说的其他解决方案在 API 限制方面或多或少相似,即 Awesomium, Mozilla's Gecko