Возврат нативных объектов с помощью Javascriptcore Glib API - PullRequest
0 голосов
/ 09 июня 2019

Я изучаю 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());
}

1 Ответ

1 голос
/ 22 июня 2019

Я нашел ответ в сообществе WPE Webkit: https://lists.webkit.org/pipermail/webkit-wpe/2019-June/000183.html

Нам нужно зарегистрировать класс, чтобы ЗАО могло создавать и обрабатывать завернутые GFiles.

Я написал пример кода только для справки. Который можно найти ниже

https://github.com/munezbn/sample_webkit_extension

...