gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:43:40 28 4
gpt4 key购买 nike

这是来自 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)

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() 加载页面

最佳答案

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

任何时候应用程序创建一个新的 WebKitWebView 小部件,扩展都会收到“页面创建”信号的通知,并为这个新小部件传递一个 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);
}

关于c++ - WebKit2GTK+ "page-created"扩展只能工作一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58147678/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com