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

Ped*_*lla 101 javascript customization webkit web-worker javascriptcore

我有一个应用程序,它通过JavaScriptCore在webkit-gtk浏览器中扩展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);
}
Run Code Online (Sandbox Code Playgroud)

现在,我还想将这些类添加到WebWorker的上下文中,因此我可以从JS中实例化的worker中调用它们.

我试过Worker这样的对象:

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

但是这会将它添加到WorkerConstructor对象中,并且当new Worker()调用a时,这些类不可用.

jan*_*iks 1

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

\n\n

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

\n\n
self.importScripts(\'foo.js\');\nself.importScripts(\'foo.js\', \'bar.js\', ...);\nimportScripts(\'foo.js\');\nimportScripts(\'foo.js\', \'bar.js\', ...);\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

注意: importScripts()self.importScripts()是有效等价的 \xe2\x80\x94 都表示importScripts()从工作人员的内部范围内调用。

\n
\n\n
\n\n

来源

\n\n\n