我正在学习webExtensions,并且编写了一个用于webkit的示例Web扩展,其中使用了javascriptcore DOM / C API。我引用了Binding native objects with JavascriptCore C Api和https://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());
}
答案 0 :(得分:1)
我在WPE Webkit社区中找到了答案:https://lists.webkit.org/pipermail/webkit-wpe/2019-June/000183.html
我们需要注册该类,以便JSC可以创建和处理 包装的GFiles。
我编写了示例代码仅供参考。可以在下面找到