WebKit2GTK + расширение "страница создана", работающее только один раз - PullRequest
0 голосов
/ 28 сентября 2019

Это дополнительный вопрос от Как отладить WebKit2GTK + расширения .Хотя там есть больше кода для справки, я немного его изменил.

У меня есть следующее расширение веб-набора:

#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 в веб-процессе.Параметры

расширение: WebKitWebExtension, на котором излучается сигнал

web_page: WebKitWebPage создал

user_data: набор пользовательских данных, когда был подключен обработчик сигнала.

Flags: Run Last

Если это дает созданную веб-страницу, то почему я не могу получить URI с webkit_web_page_get_uri()?Почему это дает только вывод (хотя и испорченный) только для первой загруженной страницы?

Редактировать: я загружаю страницу с помощью webkit_web_view_load_uri ()

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

Я только что коснулся поверхности WebKitGtk, и я не очень хорошо осведомлен.Но, насколько я понимаю, WebKitWebPage (название вводит в заблуждение) просто отражает экземпляры виджетов WebKitWebView, а не веб-сайт, который вы просматриваете в настоящее время.

Каждый раз, когда приложение создает новый виджет WebKitWebView, расширения уведомляются ««созданный на странице» сигнал, и объект WebKitWebPage передается для этого нового виджета.

Например, для просмотра с вкладками вы создаете виджет WebKitWebView для каждой вкладки.Затем «созданный страницей» выдается на расширение при создании новой вкладки

Если вы хотите знать, когда изменился веб-сайт (технически: 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);
}
0 голосов
/ 29 сентября 2019

Вы используете webkit_web_view_load_uri для изменения веб-страницы?

...