Jak dodać nową klasę natywną do kontekstu WebWorkera w JavaScriptCore?

102

Mam aplikację, która rozszerza JavaScript przez JavaScriptCore w przeglądarce webkit-gtk. W tej chwili mam kilka klas, które dodaję do globalnego kontekstu, w ten sposób:

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);
}

Teraz chciałbym również dodać te klasy do kontekstu WebWorkera, abym mógł je wywoływać z pracowników, których instancja została utworzona w JS.

Próbowałem uzyskać Workerobiekt w następujący sposób:

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

Ale to dodaje go do WorkerConstructorobiektu, a kiedy new Worker()wywoływana jest a , klasy nie są dostępne.

Pedro Vanzella
źródło
1
Nie jestem pewien co do Twoich wymagań. Ale myślę, że możemy dołączyć jeden skrypt, który robi to w pliku roboczym. lubię to. importScripts ("globalWorker.js")
rajesh
1
Umieszczasz klasę Worker w kontekście globalnym, powinieneś dodać je do kontekstu WebWorkera, a nie głównego kontekstu, ponieważ te dwa konteksty są różne.
Karim H
4
Próbujesz dodać nowo utworzoną klasę do Workerdefinicji klasy. Zwykle musisz dodać swoją klasę do obiektu Global i do każdego obiektu globalnego w nowo utworzonym JSVirtualMachine. Workerstworzy nowy JSVirtualMachinez jego globalnym kontekstem i globalnym obiektem; całkowicie oddzielone środowisko
dectroo

Odpowiedzi:

1

Nie ma możliwości zmodyfikowania WorkerGlobalScopelub porównywalnych zakresów / kontekstów przed uruchomieniem programu Web Worker w większości popularnych implementacji przeglądarek. Te zakresy stają się dostępne tylko dla kontekstu pracowników sieci Web, gdy tylko ten konkretny pracownik sieciowy zostanie uruchomiony.

Jedynym sposobem użycia współdzielonych metod jest zdefiniowanie ich w oddzielnym udostępnionym pliku / zasobie i dołączenie ich przy użyciu importScripts()

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

Uwaga: importScripts() i self.importScripts()są w rzeczywistości równoważne - oba reprezentują importScripts()wywołanie z wewnętrznego zakresu pracownika.


Źródła

janniks
źródło
0

Użyj metody „importScripts ()”, aby udostępnić zasoby WorkerGlobalScope

importScripts('resource.js');
Lucas Tadeu
źródło