WebKit2GTK+ оконный объект очищен, не очищается

Это продолжение: Как отлаживать расширения WebKit2GTK+

Вот мое расширение:

#include <webkit2/webkit-web-extension.h>
#include <iostream>

static void window_object_cleared_callback(WebKitScriptWorld* world, WebKitWebPage* webPage, WebKitFrame* frame, gpointer userData)
{
  std::cout << "Callback reached\n";

  JSCContext *jsCtx = webkit_frame_get_js_context_for_script_world(frame, world);
  JSCValue* title = jsc_context_evaluate(jsCtx, "document.title;", -1);

  std::cout << "Title: " << jsc_value_to_string(title) << "\n";
}

static void web_page_created_callback(WebKitWebExtension* extension, WebKitWebPage* webPage, gpointer UserData)
{
  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);
  g_signal_connect(webkit_script_world_get_default(), "window-object-cleared", G_CALLBACK(window_object_cleared_callback), NULL);
}

Единственное, что выводится на консоль, это «Страница 1 создана для (нуль)». Этот обратный вызов для созданной страницы вызывается, когда ничего не было создано, это то же самое для очистки объекта winow?

Я понятия не имею, почему объект window_object_cleared теперь показывает признаки работы.

Вот что я нашел в сигнале: https://webkitgtk.org/reference/webkit2gtk/stable/WebKitScriptWorld.html#WebKitScriptWorld-window-object-cleared


person A student    schedule 04.10.2019    source источник


Ответы (2)


Обратный вызов с очисткой оконного объекта предназначен для внедрения javascript. Я думаю, что это выполняется только тогда, когда вы добавляете хотя бы «какой-то контент» в WebKitWebView. Вы должны вызвать load_uri или подобные функции.

person lb90    schedule 04.10.2019
comment
Я использую webkit_web_view_load_uri() в своем основном коде после инициализации расширений. Нужно ли это делать в расширении? Если да, то как мне это сделать, поскольку у меня нет доступа к объекту WebKitWebView в расширении. - person A student; 06.10.2019

#include <webkit2/webkit-web-extension.h>
#include <iostream>

static void js_handler(WebKitWebPage* webPage)
{
  JSCContext *jsCtx = webkit_frame_get_js_context(webkit_web_page_get_main_frame(webPage));
  JSCValue* title = jsc_context_evaluate(jsCtx, "document.title;", -1);

  std::cout << "Title: " << jsc_value_to_string(title) << "\n";
}

static void document_loaded_callback(WebKitWebPage* webPage, gpointer userData)
{
  g_print("Page %lu created for %s\n", webkit_web_page_get_id(webPage), webkit_web_page_get_uri(webPage));
  js_handler(webPage);
}

static void web_page_created_callback(WebKitWebExtension* extension, WebKitWebPage* webPage, gpointer userData)
{
  g_signal_connect(webPage, "document-loaded", G_CALLBACK(document_loaded_callback), NULL);
}

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);
}

Я предполагаю, что решение заключалось в использовании фрейма webkit для получения JSCContext и использовании сигнала для «загруженного документа» вместо «очистки окна-объекта».

person A student    schedule 10.10.2019