Подтвердить что ты не робот

Как добавить новый собственный класс в контекст WebWorker в JavaScriptCore?

У меня есть приложение, которое расширяет JavaScript через JavaScriptCore, в браузере webkit-gtk. Сейчас у меня есть несколько классов, которые я добавляю к глобальному контексту:

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(), классы недоступны.

4b9b3361

Ответ 1

WorkerGlobalScope изменить WorkerGlobalScope или сопоставимые области действия/контексты, прежде чем веб-работник будет запущен в большинстве распространенных реализаций браузера. Эти области становятся доступными только для контекста веб-работников, как только этот конкретный веб-работник запускается.

Единственный способ использовать общие методы - определить их в отдельном общем файле/ресурсе и включить их с помощью importScripts()

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

Примечание: importScripts() и self.importScripts() фактически эквивалентны - оба представляют importScripts(), вызываемый изнутри рабочей области работника.


источники

Ответ 2

Используйте "importScripts()", чтобы поделиться ресурсами с WorkerGlobalScope

importScripts('resource.js');