我正在学习 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());
}