【问题标题】:Returning Native Objects Using Javascriptcore Glib API使用 Javascriptcore Glib API 返回本机对象
【发布时间】:2019-06-09 17:22:49
【问题描述】:

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

【问题讨论】:

    标签: c webkit glib javascriptcore webkitgtk


    【解决方案1】:

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

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

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

    https://github.com/munezbn/sample_webkit_extension

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-02
      • 2012-04-04
      • 2018-02-13
      • 2020-12-19
      • 1970-01-01
      • 2013-10-02
      • 2018-07-01
      • 2017-08-11
      相关资源
      最近更新 更多