Comment ajouter une nouvelle classe native au contexte de WebWorker dans JavaScriptCore?

102

J'ai une application qui étend JavaScript via JavaScriptCore, dans un navigateur webkit-gtk. En ce moment, j'ai plusieurs classes que j'ajoute au contexte global comme ceci:

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

Maintenant, j'aimerais également ajouter ces classes au contexte du WebWorker, afin que je puisse les appeler à partir de workers instanciés dans JS.

J'ai essayé d'obtenir l' Workerobjet comme ceci:

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

Mais cela l'ajoute à l' WorkerConstructorobjet, et quand a new Worker()est appelé, les classes ne sont pas disponibles.

Pedro Vanzella
la source
1
Pas sûr de votre exigence exactement. Mais je pense que nous pouvons inclure un script qui fait cela dans le fichier de travail. comme ça. importScripts ("globalWorker.js")
rajesh
1
Vous mettez la classe Worker dans le contexte global, vous devez les ajouter au contexte du WebWorker et non au contexte principal car les deux contextes sont différents.
Karim H
4
Vous essayez d'ajouter la nouvelle classe créée à Workerla définition de classe. Normalement, vous devez ajouter votre classe à l'objet Global et à chaque objet global dans une nouvelle JSVirtualMachine créée. Workercréera un nouveau JSVirtualMachineavec son contexte global et son objet global; un environnement totalement
séparé

Réponses:

1

Il n'existe aucun moyen de modifier les WorkerGlobalScopeétendues / contextes ou des contextes comparables avant de démarrer un travailleur Web dans la plupart des implémentations de navigateur courantes. Ces étendues ne sont disponibles que pour le contexte des travailleurs Web dès que ce travailleur Web spécifique est lancé.

La seule façon d'utiliser des méthodes partagées est de les définir dans un fichier / ressource partagé distinct et de les inclure à l'aide de importScripts()

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

Remarque: importScripts() et self.importScripts()sont effectivement équivalents - les deux représentent importScripts()un appel depuis l'intérieur de la portée interne du travailleur.


Sources

janniks
la source
0

Utilisez "importScripts ()" pour partager les ressources avec WorkerGlobalScope

importScripts('resource.js');
Lucas Tadeu
la source