pedro vanzella
Tengo una aplicación que extiende JavaScript a través de JavaScriptCore, en un navegador webkit-gtk. En este momento tengo varias clases que agrego al contexto global así:
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);
}
Ahora, también me gustaría agregar esas clases al contexto de WebWorker, para poder llamarlas desde los trabajadores instanciados en JS.
He intentado conseguir el Worker
objeto así:
JSStringRef workerStr = JSStringCreateWithUTF8CString("Worker");
JSObjectRef worker = JSObjectGetProperty(context, globalObj, workerStr, NULL);
JSObjectSetProperty(context, worker, str, classObj, kJSPropertyAttributeNone, NULL);
JSStringRelease(workerStr);
Pero eso lo suma a la WorkerConstructor
objeto, y cuando un new Worker()
se llama, las clases no están disponibles.
No hay manera de modificar el WorkerGlobalScope
o ámbitos/contextos comparables antes de que se inicie un trabajador web en las implementaciones de navegador más comunes. Estos ámbitos solo están disponibles para el contexto de trabajadores web tan pronto como se inicie este trabajador web específico.
La única forma de usar métodos compartidos es definirlos en un archivo/recurso compartido separado e incluirlos usando importScripts()
self.importScripts('foo.js');
self.importScripts('foo.js', 'bar.js', ...);
importScripts('foo.js');
importScripts('foo.js', 'bar.js', ...);
Nota:
importScripts()
yself.importScripts()
son efectivamente equivalentes, ambos representanimportScripts()
siendo llamado desde dentro del alcance interno del trabajador.
Fuentes
lucas tadeu
Utilice “importScripts()” para compartir los recursos con WorkerGlobalScope
importScripts('resource.js');
No estoy seguro acerca de su requisito exactamente. Pero creo que podemos incluir un script que haga esto en el archivo de trabajo. como esto. importScripts(“trabajadorglobal.js”)
– rajesh
26 de junio de 2016 a las 6:46
Está colocando la clase Worker en el contexto global, debe agregarlos al contexto de WebWorker, no al contexto principal porque los dos contextos son diferentes.
– Karim H.
30 de noviembre de 2016 a las 17:19
Está intentando agregar la nueva clase creada a
Worker
definición de clase. Normalmente, debe agregar su clase al objeto global y a cada objeto global dentro de una JSVirtualMachine recién creada.Worker
creará un nuevoJSVirtualMachine
con su contexto global y objeto global; un entorno totalmente separado– dectroo
16 de marzo de 2017 a las 22:59