3

这是来自How to debug WebKit2GTK+ extensions的后续问题。虽然那里有更多代码可供参考,但我对其进行了一些更改。

我有以下 webkit 扩展:

#include <webkit2/webkit-web-extension.h>
#include <iostream>

static void web_page_created_callback(WebKitWebExtension* extension, WebKitWebPage* webPage, gpointer userData)
{
  std::cout << "Page " << webkit_web_page_get_id(webPage) << " created for " << webkit_web_page_get_uri(webPage) << "\n";
  g_print("Page %lu created for %s\n", webkit_web_page_get_id(webPage), webkit_web_page_get_uri(webPage));
}

extern "C" G_MODULE_EXPORT void webkit_web_extension_initialize(WebKitWebExtension* extension)
{
  g_signal_connect(extension, "page-created", G_CALLBACK(web_page_created_callback), NULL);
}

根据https://webkitgtk.org/reference/webkit2gtk/stable/WebKitWebExtension.htmlhttps://blogs.igalia.com/carlosgc/2013/09/10/webkit2gtk-web-process-extensions/,这应该打印每次创建页面时都会发出一条消息。我使用扩展的实现方式与 webkit 参考文档相同,它是“initialize-web-extension”的回调。

我不知道这是否有区别,但我的 WebKitWebView 对象被打包在一个 GTKWidget 框对象中。这是我得到的输出:

Page 1 created for Page 1 created for (null)

即使我打开一个新文件(我有一个打开文件的文件选择对话框,这就是为什么将 WebKitWebView 打包到 GTK_BOX 中),这永远不会再次打印出来。

这是 WebKit2GTK 文档对“页面创建”处理程序所说的:

void user_function (WebKitWebExtension *extension, WebKitWebPage *web_page, gpointer user_data)

在 Web 进程中创建新的 WebKitWebPage 时会发出此信号。参数

extension:发出信号的 WebKitWebExtension

web_page:创建的 WebKitWebPage

user_data:连接信号处理程序时的用户数据集。

标志:最后运行

如果这给出了创建的网页,那么为什么我不能用 uri 获取 uri webkit_web_page_get_uri()?为什么这只为加载的第一页提供输出(尽管混乱)?

编辑:我正在使用 webkit_web_view_load_uri() 加载页面

4

2 回答 2

2

我刚刚接触了 WebKitGtk 的表面,我的知识并不多。但据我了解,WebKitWebPage(名称具有误导性)仅反映 WebKitWebView 小部件的实例,而不是您当前正在查看的网站。

每当应用程序创建一个新的 WebKitWebView 小部件时,扩展都会通过“page-created”信号得到通知,并为这个新的小部件传递一个 WebKitWebPage 对象。

例如,对于选项卡式浏览,您为每个选项卡创建一个 WebKitWebView 小部件。然后在创建新选项卡时在扩展上发出“page-created”

如果您想知道网站(技术上:uri)何时更改,您可以执行以下操作:

#include <webkit2/webkit-web-extension.h>

static void
on_uri_changed (WebKitWebPage *web_page,
                GParamSpec *pspec,
                gpointer user_data)
{
  g_print ("changed uri: %s\n", webkit_web_page_get_uri (web_page));
}

static void
web_page_created_callback (WebKitWebExtension *extension,
                           WebKitWebPage      *web_page,
                           gpointer            user_data)
{
    g_signal_connect (web_page,
                      "notify::uri",
                      G_CALLBACK (on_uri_changed),
                      NULL);
    g_print ("created new web_view widget with id %d created\n",
             webkit_web_page_get_id (web_page));
}

G_MODULE_EXPORT void
webkit_web_extension_initialize (WebKitWebExtension *extension)
{
    g_signal_connect (extension, "page-created", 
                      G_CALLBACK (web_page_created_callback), 
                      NULL);
}
于 2019-09-29T16:32:36.220 回答
0

您是否使用 webkit_web_view_load_uri 来更改网页?

于 2019-09-29T13:23:29.920 回答