Как добавить новый собственный класс в контекст 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()
, классы недоступны.
Ответы
Ответ 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');