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

102

У меня есть приложение, которое расширяет 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
Не уверен в ваших требованиях. Но я думаю, что мы можем включить один скрипт, который делает это в рабочий файл. как это. importScripts ("globalWorker.js")
rajesh
1
Вы помещаете класс Worker в глобальный контекст, вы должны добавить их в контекст WebWorker, а не в основной контекст, потому что эти два контекста различны.
Karim H
4
Вы пытаетесь добавить новый созданный класс в Workerопределение класса. Обычно вам нужно добавить свой класс к глобальному объекту и к каждому глобальному объекту в новом созданном JSVirtualMachine. Workerсоздаст новый JSVirtualMachineс его глобальным контекстом и глобальным объектом; полностью отделенная среда
dectroo

Ответы:

1

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

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

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

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


Источники

Янники
источник
0

Используйте importScripts () для совместного использования ресурсов с WorkerGlobalScope

importScripts('resource.js');
Лукас Тадеу
источник