如何在JavaScriptCore中向WebWorker的上下文添加新的本机类?


102

我有一个在webkit-gtk浏览器中通过JavaScriptCore扩展JavaScript的应用程序。现在,我有几个类可以添加到全局上下文中,如下所示:

void create_js(gpointer context, char* className, JSClassDefinition clasDefinition) {
    JSClassRef classDef = JSClassCreate(&clasDefinition);
    JSObjectRef classObj = JSObjectMake(context, classDef, context);
    JSObjectRef globalObj = JSContextGetGlobalObject(context);
    JSStringRef str = JSStringCreateWithUTF8CString(className);
    JSObjectSetProperty(context, globalObj, str, classObj, kJSPropertyAttributeNone, NULL);
    JSStringRelease(str);
}

现在,我还要将这些类添加到WebWorker的上下文中,以便可以从JS中实例化的工作程序中调用它们。

我试着Worker像这样获取对象:

JSStringRef workerStr = JSStringCreateWithUTF8CString("Worker");
JSObjectRef worker = JSObjectGetProperty(context, globalObj, workerStr, NULL);
JSObjectSetProperty(context, worker, str, classObj, kJSPropertyAttributeNone, NULL);
JSStringRelease(workerStr);

但这会将其添加到WorkerConstructor对象中,并且在new Worker()调用a时,这些类不可用。


1
不完全确定您的要求。但是我认为我们可以在工作文件中包含一个执行此操作的脚本。像这样。importScripts( “globalWorker.js”)
拉杰什

1
您要将Worker类放在全局上下文中,应该将它们添加到WebWorker的上下文中而不是主要上下文中,因为这两个上下文是不同的。
卡里姆H

4
您正在尝试将新创建的类添加到Worker类定义中。通常,您需要将类添加到全局对象以及新创建的JSVirtualMachine中的每个全局对象。WorkerJSVirtualMachine使用其全局上下文和全局对象创建一个新对象;完全分离的环境
十月

Answers:


1

WorkerGlobalScope在大多数常见的浏览器实现中,在启动Web Worker之前,无法修改或类似的作用域/上下文。这些作用域仅在启动此特定Web Worker时才对Web Worker上下文可用。

使用共享方法的唯一方法是在单独的共享文件/资源​​中定义它们,并使用 importScripts()

self.importScripts('foo.js');
self.importScripts('foo.js', 'bar.js', ...);
importScripts('foo.js');
importScripts('foo.js', 'bar.js', ...);

注意: importScripts()self.importScripts()是有效等效的-两者都代表importScripts()从工作人员的内部范围内调用。


资料来源


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.