WebKit2GTK+ расширение "page-created" работает только один раз
Это следующий вопрос из статьи Как отлаживать расширения WebKit2GTK+. Хотя там есть еще код для справки, я немного его изменил.
У меня есть следующее расширение 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 и 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 для обработчика "созданной страницы":
void user_function (расширение WebKitWebExtension *, WebKitWebPage *web_page, gpointer user_data)
Этот сигнал испускается, когда в веб-процессе создается новая WebKitWebPage. Параметры
extension: расширение WebKitWebExtension, на котором испускается сигнал.
web_page: созданный WebKitWebPage
user_data: пользовательские данные, установленные при подключении обработчика сигнала.
Флаги: Run Last
Если это дает созданную веб-страницу, то почему я не могу получить uri с помощью webkit_web_page_get_uri()
? Почему это дает вывод (хотя и с ошибками) только для первой загруженной страницы?
Изменить: я загружаю страницу с помощью webkit_web_view_load_uri()
2 ответа
Я только что коснулся поверхности WebKitGtk и не очень разбираюсь в этом. Но, насколько я понимаю, WebKitWebPage (название вводит в заблуждение) просто отражает экземпляры виджетов 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);
}
Вы используете webkit_web_view_load_uri для изменения веб-страницы?