Я изучаю webExtensions, и я написал пример веб-расширения для webkit, в котором я использовал javascriptcore DOM / C API. Я упомянул Связывание нативных объектов с 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 code
<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 ++ code
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());
}