¿Cómo agregar una nueva clase nativa al contexto de WebWorker en JavaScriptCore?

102

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, me gustaría agregar también esas clases al contexto de WebWorker, para poder llamarlas desde los trabajadores instanciados en JS.

Intenté obtener el Workerobjeto así:

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

Pero eso lo agrega al WorkerConstructorobjeto, y cuando new Worker()se llama a, las clases no están disponibles.

Pedro Vanzella
fuente
1
No estoy seguro de su requisito exactamente. Pero creo que podemos incluir un script que haga esto en el archivo del trabajador. Me gusta esto. importScripts ("globalWorker.js")
rajesh
1
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
4
Estás intentando agregar la nueva clase creada a Workerla definición de clase. Normalmente, debe agregar su clase al objeto Global y a cada Objeto Global dentro de una nueva JSVirtualMachine creada. Workercreará un nuevo JSVirtualMachinecon su contexto global y objeto global; un entorno totalmente separado
dectroo

Respuestas:

1

No hay forma de modificar los WorkerGlobalScopeámbitos o contextos comparables antes de que se inicie un trabajador web en las implementaciones de navegador más comunes. Estos ámbitos están disponibles solo para el contexto de los trabajadores web tan pronto como se inicia 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() y self.importScripts()son efectivamente equivalentes: ambos representan importScripts()una llamada desde dentro del ámbito interno del trabajador.


Fuentes

Janniks
fuente
0

Utilice "importScripts ()" para compartir los recursos con WorkerGlobalScope

importScripts('resource.js');
Lucas Tadeu
fuente