在跨平台Gtk应用程序中嵌入web浏览器
Embed a web browser in a cross platform Gtk application
我需要在gtkmm中嵌入一个非常简单的浏览器(可以解析HTML和JS Ext)。我研究了gtkmozembed,但是c++包装器已经过时了,所以我试着只用c写它,但是我已经致力于Gtk+ 3.0, gtkmozembed不能与Gtk+ 3.0一起工作。是否有一种方法可以扩展Gtk::Widget并在其中放入壁虎解析器?实在找不到任何gecko文档,我一直重定向到gtkmozembed.
任何想法/建议都将非常感谢。
编辑:在我尝试使用Webkitgtk之后,我得到以下输出,应用程序崩溃了。
** (ttocui_gtk:16360): DEBUG: NP_Initialize
** (ttocui_gtk:16360): DEBUG: NP_Initialize succeeded
** (ttocui_gtk:16360): DEBUG: NP_Initialize
** (ttocui_gtk:16360): DEBUG: NP_Initialize succeeded
** (ttocui_gtk:16360): DEBUG: NP_Initialize
** (ttocui_gtk:16360): DEBUG: NP_Initialize succeeded
** (ttocui_gtk:16360): DEBUG: NP_Initialize
** (ttocui_gtk:16360): DEBUG: NP_Initialize succeeded
** (ttocui_gtk:16360): DEBUG: NP_Initialize
** (ttocui_gtk:16360): DEBUG: NP_Initialize succeeded
** (ttocui_gtk:16360): DEBUG: NP_Initialize
** (ttocui_gtk:16360): DEBUG: NP_Initialize succeeded
** (ttocui_gtk:16360): DEBUG: NP_Initialize
** (ttocui_gtk:16360): DEBUG: NP_Initialize succeeded
** (ttocui_gtk:16360): DEBUG: NP_Initialize
** (ttocui_gtk:16360): DEBUG: NP_Initialize succeeded
(ttocui_gtk:16360): GLib-CRITICAL **: g_hash_table_foreach: assertion `hash_table != NULL' failed
(ttocui_gtk:16360): GLib-CRITICAL **: g_hash_table_insert_internal: assertion `hash_table != NULL' failed
(ttocui_gtk:16360): GLib-CRITICAL **: g_hash_table_lookup: assertion `hash_table != NULL' failed
*** NSPlugin Wrapper *** ERROR: no valid NPP -> PluginInstance mapping found
(ttocui_gtk:16360): GLib-CRITICAL **: g_hash_table_lookup: assertion `hash_table != NULL' failed
*** NSPlugin Wrapper *** ERROR: no valid NPP -> PluginInstance mapping found
(ttocui_gtk:16360): GLib-CRITICAL **: g_hash_table_lookup: assertion `hash_table != NULL' failed
(ttocui_gtk:16360): GLib-CRITICAL **: g_hash_table_insert_internal: assertion `hash_table != NULL' failed
(ttocui_gtk:16360): GLib-CRITICAL **: g_hash_table_insert_internal: assertion `hash_table != NULL' failed
(ttocui_gtk:16360): GLib-CRITICAL **: g_hash_table_find: assertion `hash_table != NULL' failed
(ttocui_gtk:16360): GLib-CRITICAL **: g_hash_table_insert_internal: assertion `hash_table != NULL' failed
(ttocui_gtk:16360): GLib-CRITICAL **: g_hash_table_lookup: assertion `hash_table != NULL' failed
*** NSPlugin Wrapper *** ERROR: no valid NPP -> PluginInstance mapping found
(ttocui_gtk:16360): GLib-CRITICAL **: g_hash_table_lookup: assertion `hash_table != NULL' failed
ttocui_gtk: /build/buildd/nspluginwrapper-1.2.2/src/npw-rpc.c:1225: do_recv_NPObject: Assertion `npobj != ((void *)0)' failed.
*** NSPlugin Viewer *** ERROR: NPN_GetProperty() wait for reply: Connection reset by peer
*** NSPlugin Viewer *** WARNING:(/build/buildd/nspluginwrapper-1.2.2/src/npw-viewer.c:898):invoke_NPN_GetValue: assertion failed: (rpc_method_invoke_possible(g_rpc_connection))
Aborted
*** NSPlugin Viewer *** WARNING: unhandled variable 18 (<unknown variable>) in NPN_GetValue()
*** NSPlugin Viewer *** WARNING:(/build/buildd/nspluginwrapper-1.2.2/src/npw-viewer.c:898):invoke_NPN_GetValue: assertion failed: (rpc_method_invoke_possible(g_rpc_connection))
.js文件包含在我的html页面的head标签中…
<link rel="stylesheet" type="text/css" href="/ext3.2.1/resources/css/ext-all.css">
<link rel="stylesheet" type="text/css" href="/ext3.2.1/resources/css/xtheme-access.css"/>
<script type="text/javascript" src="/ext3.2.1/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="/ext3.2.1/ext-all-debug.js"></script>
gtkmozembed也不能与新版本的Gecko一起工作,如果我没记错的话。您所寻找的是WebkitGTK,至少如果您没有特别绑定到Gecko。
作为@ptomato答案的附录。WebKitGTK是可行的方法。我不知道gtkmm/c++包装器,但我目前在一个gtkmm项目中非常成功地使用了它(幸运的是,gtkmm/c++允许你很容易地混合使用C gtk):
WebKitWebView* pWebKitView = WEBKIT_WEB_VIEW (webkit_web_view_new ());
gtk_container_add (GTK_CONTAINER (pSomeContainer->gobj()), GTK_WIDGET (pWebKitView));
我只是想回来让任何关心我们的人知道我们的解决方案是使用Gtkmozembed。唯一的问题是,Gtkmozembed只运行使用gtk+ 2,我使用gtk+ 3。这两者不能存在于同一个过程中,我不会迁移任何一个项目。因此,我在使用管道进行通信的子进程中运行gtkmozembed,并在我的项目中运行渲染小部件的GtkPlug。
这个解决方案有点做作,但它完成了工作,并且嵌入了浏览器。
相关文章:
- 如何捕获从 MFC Web 浏览器 c++ 发出的 GET/POST 请求
- 在能够从 Web 浏览器访问大型数组数据的同时存储它的最可行方法是什么?
- 如何使用http:uri方案启动默认的Web浏览器并使用Shellexecute访问主页
- 如何隐藏显示HTML5标记的Web浏览器控件(IE)的滚动条和窗口边框
- 当在Web浏览器上输入某些内容时,可以创建条件
- Web浏览器挂钩和自动化
- C++实现文件缓存(如 Web 浏览器)的库
- 在 Web 浏览器上显示保存的文件
- 重用 Web 浏览器控件
- 在web浏览器上流式传输c++文件
- 是否可以使用C++库运行本地 PHP 以在应用内 Web 浏览器中使用
- Web浏览器与本机C++的通信
- Web浏览器控件仿真问题(FEATURE_browser_emulation)
- 如何使用C++和WinAPI检查是否有任何web浏览器正在运行
- 如何将功能齐全的 Web 浏览器嵌入到我的 C++ 应用程序中
- MFC Web 浏览器控件:模拟 Ctrl+N 需要多少(正常)代码行
- 尝试在 Windows 10 上获取默认 Web 浏览器路径失败
- C++ Win32 通过电子邮件或 Web 浏览器发送消息
- MFC Web 浏览器.导航错误"A null reference pointer was passed to the stub."
- 列出Windows计算机上安装的所有web浏览器