Como adicionar uma nova classe nativa ao contexto do WebWorker em JavaScriptCore?

102

Eu tenho um aplicativo que estende o JavaScript via JavaScriptCore, em um navegador webkit-gtk. No momento, tenho várias classes que adiciono ao contexto global, como:

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

Agora, eu gostaria também de adicionar essas classes ao contexto do WebWorker, para que eu possa chamá-las de workers instanciados em JS.

Eu tentei pegar o Workerobjeto assim:

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

Mas isso o adiciona ao WorkerConstructorobjeto e, quando a new Worker()é chamado, as classes não estão disponíveis.

Pedro Vanzella
fonte
1
Não tenho certeza sobre sua exigência exatamente. Mas acho que podemos incluir um script que faça isso no arquivo de trabalho. como isso. importScripts ("globalWorker.js")
rajesh
1
Você está colocando a classe Worker no contexto global e deve adicioná-la ao contexto do WebWorker, não ao contexto principal, porque os dois contextos são diferentes.
Karim H
4
Você está tentando adicionar a nova classe criada à Workerdefinição de classe. Normalmente você precisa adicionar sua classe ao objeto global e a cada objeto global dentro de um novo JSVirtualMachine criado. Workercriará um novo JSVirtualMachinecom seu contexto global e objeto global; um ambiente totalmente separado
dectroo

Respostas:

1

Não há como modificar os WorkerGlobalScopeescopos / contextos comparáveis ​​antes que um web worker seja iniciado nas implementações de navegador mais comuns. Esses escopos tornam-se disponíveis apenas para o contexto dos web workers assim que esse web worker específico é iniciado.

A única maneira de usar métodos compartilhados é defini-los em um arquivo / recurso compartilhado separado e incluí-los usando importScripts()

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

Observação: importScripts() e self.importScripts()são efetivamente equivalentes - ambos representam importScripts()a chamada de dentro do escopo interno do trabalhador.


Fontes

janniks
fonte
0

Use "importScripts ()" para compartilhar os recursos com o WorkerGlobalScope

importScripts('resource.js');
Lucas tadeu
fonte