【问题标题】:WebKit2GTK+ "window-object-cleared" not clearingWebKit2GTK+“窗口对象清除”未清除
【发布时间】:2019-10-04 04:05:50
【问题描述】:

这是对以下内容的跟进:How to debug WebKit2GTK+ extensions

这是我的扩展:

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

打印到控制台的唯一内容是“为 (null) 创建的第 1 页”。页面创建的回调是在什么都没有创建的时候被调用的,winow-object-cleared也是一样的吗?

我不知道为什么 window_object_cleared 对象现在显示出工作迹象。

这是我在信号上发现的:https://webkitgtk.org/reference/webkit2gtk/stable/WebKitScriptWorld.html#WebKitScriptWorld-window-object-cleared

【问题讨论】:

    标签: c++ gtk webkit javascriptcore webkit2-webextension


    【解决方案1】:

    window-object-cleared 回调是一种注入 javascript 的方法。我认为它仅在您向 WebKitWebView 添加至少“一些内容”时才会执行。您应该调用 load_uri 或类似的函数。

    【讨论】:

    • 我在我的主代码中使用 webkit_web_view_load_uri(),它是在扩展初始化之后。我需要在扩展程序中这样做吗?如果是,我该怎么做,因为我无权访问扩展中的 WebKitWebView 对象。
    【解决方案2】:
    #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,并使用“文档加载”信号而不是“窗口对象清除”

    【讨论】:

      猜你喜欢
      • 2019-03-19
      • 1970-01-01
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多