WebKit2GTK+ "page-created" 扩展只能工作一次

WebKit2GTK+ "page-created" extension only working once

这是 的后续问题。虽然那里有更多的代码可供参考,但我已经做了一些修改。

我有以下 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.html and https://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 文档对 "page-created" 处理程序的描述:

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

This signal is emitted when a new WebKitWebPage is created in the Web Process. Parameters

extension: the WebKitWebExtension on which the signal is emitted

web_page: the WebKitWebPage created

user_data: user data set when the signal handler was connected.

Flags: Run Last

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

编辑:我正在使用 webkit_web_view_load_uri()

加载页面

您是否正在使用 webkit_web_view_load_uri 更改网页?

我对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);
}