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 для изменения веб-страницы?

Другие вопросы по тегам