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);
}
这是
我有以下 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);
}