1

我正在学习 webExtensions,我为 webkit 编写了一个示例 web 扩展,在其中我使用了 javascriptcore DOM/C API。我提到了 Binding native objects with JavascriptCore C Apihttps://github.com/vrruiz/WebKit-JavaScriptCore-Extensions而且我能够返回所有数据类型,包括本机对象。

在最近的 webkit 版本中,引入了新的 JavascriptCore Glib API,我正在尝试将我的测试代码迁移到新的 JSC glib API。我在 webkit 工具目录中引用了测试代码,并且能够将本机数字、字符串、布尔值返回给 javascript(使用 HTML 测试应用程序)但我无法返回任何本机对象。例如,当我尝试返回 Gfile 对象时,出现以下错误

TypeError:不支持的类型 GObject

我尝试将返回类型从 G_TYPE_OBJECT 更改为 JSC_TYPE_VALUE 但我不确定如何将 GFile 对象转换为 JSCvalue。如果我不转换,那么在应用程序中我得到 NULL 对象。

HTML 和 JavaScript 代码

<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
  <h1>Extending JavaScript with WebKit</h1>
  <div id="test-extension"></div>

  <script type="text/javascript">
    var display = function () {
        var div = document.getElementById("test-extension");
        var testExt = getTestExtObject('.');
        var extString = "Test Extension Object " +  testExt + "<br>";
        div.innerHTML = extString;
    }
    display();
    }
  </script>
</body>
</html>

C++ 代码

extern "C" void webkit_web_extension_initialize_with_user_data(WebKitWebExtension* extension, GVariant* userData)
{
    g_signal_connect(webkit_script_world_get_default(), "window-object-cleared", G_CALLBACK(windowObjectCleared), nullptr);
}

static GFile* getTestExtObject(const char* path)
{
    GFile* ret =  g_file_new_for_path(path);
    return ret;
}

static void windowObjectCleared(WebKitScriptWorld* world, WebKitWebPage* page, WebKitFrame* frame, gpointer)
{
    GRefPtr<JSCContext> jsContext = adoptGRef(webkit_frame_get_js_context_for_script_world(frame, world));
    g_assert_true(JSC_IS_CONTEXT(jsContext.get()));
    GRefPtr<JSCValue> function = adoptGRef(jsc_value_new_function(jsContext.get(), "getTestExtObject", G_CALLBACK(getTestExtObject), NULL, NULL, G_TYPE_OBJECT, 1, G_TYPE_STRING));
    jsc_context_set_value(jsContext.get(), "getTestExtObject", function.get());
}

4

1 回答 1

2

我在 WPE Webkit 社区中找到了答案:https ://lists.webkit.org/pipermail/webkit-wpe/2019-June/000183.html

我们需要注册该类,以便 JSC 可以创建和处理包装的 GFile。

我写了示例代码仅供参考。可以在下面找到

https://github.com/munezbn/sample_webkit_extension

于 2019-06-21T21:26:18.740 回答