使用Javascriptcore Glib API返回本机对象

时间:2019-06-09 17:22:49

标签: c webkit glib javascriptcore webkitgtk

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

1 个答案:

答案 0 :(得分:1)

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

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

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

https://github.com/munezbn/sample_webkit_extension