【问题标题】:Embed a web browser in a cross platform Gtk application在跨平台 Gtk 应用程序中嵌入 Web 浏览器
【发布时间】:2011-11-04 22:25:39
【问题描述】:

我需要在 Gtk Widget 中嵌入一个非常简单的浏览器(可以解析 HTML 和 JS Ext),希望在 gtkmm 中。我查看了 gtkmozembed,但 c++ 包装器已经过时了,所以我尝试只用 C 编写它,但我已经致力于 Gtk+ 3.0,而 gtkmozembed 不适用于 Gtk+ 3.0。有没有办法扩展 Gtk::Widget 并将壁虎解析器放入其中?真的找不到任何壁虎文档,我一直被重定向到 gtkmozembed。

任何想法/建议将不胜感激。

编辑: @Mark 在我尝试使用 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>

【问题讨论】:

    标签: c++ gtk gtkmm gtk3


    【解决方案1】:

    如果我没记错的话,gtkmozembed 也不适用于新版本的 Gecko。您正在寻找的是WebkitGTK,至少如果您没有专门与 Gecko 绑定的话。

    【讨论】:

    • Mozilla/Firefox 自 4.0 起不再可嵌入
    • 在这一点上我绝对不依赖于任何概念/实现。感谢您的意见!
    • @ptomato 你知道为什么WebkitGTK 不喜欢POST 数据(SO Question) 吗?我仍在寻找 gtkmozembed 的替代品。
    【解决方案2】:

    作为@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));
    

    你走吧……

    【讨论】:

    • 我不知道这些c++绑定有多成熟,但是this来自Webkit wiki。
    • 谢谢!我会检查一下。
    • 但是使用 WebKitGTK 跨平台并非易事。当您尝试在 Windows 上编译它时,您会看到。
    • 谢谢@Mark!我肯定会试一试,但@Lothar 提出了一个很好的观点。我需要这个在 Windows 中编译,这就是为什么我要使用 Gecko,或者一些轻量级和便携的东西。我不需要安全性或真正丰富的网络功能,我只需要解析 HTML 和 Javascript(Ext JS 框架)。
    • @ptomato,那个项目看起来有点老了。前几天我在研究这个时,我什至无法构建它。
    【解决方案3】:

    只是想我会回来让关心的人知道我们的解决方案是使用 Gtkmozembed。唯一的问题是 Gtkmozembed 只使用 gtk+ 2 运行,而我使用的是 gtk+ 3。两者不能存在于同一个进程中,我不会迁移任何一个项目。因此,我在使用管道与之通信的子进程中运行 gtkmozembed,并在我的项目中呈现小部件的 GtkPlug。

    这个解决方案有点做作,但它完成了工作,并且嵌入了浏览器。

    【讨论】:

      猜你喜欢
      • 2011-02-12
      • 2010-09-24
      • 2011-11-27
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 2012-05-17
      • 2011-10-26
      相关资源
      最近更新 更多