Come aggiungere una nuova classe nativa al contesto di WebWorker in JavaScriptCore?


102

Ho un'applicazione che estende JavaScript tramite JavaScriptCore, in un browser webkit-gtk. In questo momento ho diverse classi che aggiungo al contesto globale in questo modo:

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

Ora, vorrei aggiungere anche quelle classi al contesto del WebWorker, così posso chiamarle dai lavoratori istanziati in JS.

Ho provato a ottenere l' Workeroggetto in questo modo:

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

Ma questo lo aggiunge WorkerConstructorall'oggetto e quando new Worker()viene chiamato a, le classi non sono disponibili.


1
Non sono sicuro delle tue esigenze esattamente. Ma penso che possiamo includere uno script che lo faccia nel file worker. come questo. importScripts ("globalWorker.js")
rajesh

1
Stai mettendo la classe Worker nel contesto globale, dovresti aggiungerla al contesto del WebWorker non al contesto principale perché i due contesti sono diversi.
Karim H

4
Stai cercando di aggiungere la nuova classe creata alla Workerdefinizione della classe. Normalmente devi aggiungere la tua classe all'oggetto Global e ad ogni Oggetto Global all'interno di una nuova JSVirtualMachine creata. Workercreerà un nuovo JSVirtualMachinecon il suo contesto globale e l'oggetto globale; un ambiente totalmente separato
dectroo

Risposte:


1

Non è possibile modificare gli WorkerGlobalScopeambiti / contesti o gli ambiti comparabili prima che un web worker venga avviato nelle implementazioni del browser più comuni. Questi ambiti diventano disponibili solo per il contesto dei web worker non appena viene avviato questo web worker specifico.

L'unico modo per utilizzare metodi condivisi è definirli in un file / risorsa condiviso separato e includerli utilizzando importScripts()

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

Nota: importScripts() e self.importScripts()sono effettivamente equivalenti: entrambi rappresentano l' importScripts()essere chiamati dall'interno dell'ambito del lavoratore.


fonti


0

Usa "importScripts ()" per condividere le risorse con WorkerGlobalScope

importScripts('resource.js');
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.