Wie füge ich eine neue native Klasse zum WebWorker-Kontext in JavaScriptCore hinzu?

102

Ich habe eine Anwendung, die JavaScript über JavaScriptCore in einem Webkit-GTK-Browser erweitert. Im Moment habe ich mehrere Klassen, die ich dem globalen Kontext wie folgt hinzufüge:

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

Jetzt möchte ich diese Klassen auch zum WebWorker-Kontext hinzufügen, damit ich sie von in JS instanziierten Workern aufrufen kann.

Ich habe versucht, das WorkerObjekt so zu bekommen:

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

Aber das fügt es dem WorkerConstructorObjekt hinzu, und wenn a new Worker()aufgerufen wird, sind die Klassen nicht verfügbar.

Pedro Vanzella
quelle
1
Nicht sicher über Ihre Anforderung genau. Aber ich denke, wir können ein Skript, das dies tut, in die Worker-Datei aufnehmen. so was. importScripts ("globalWorker.js")
Rajesh
1
Wenn Sie die Worker-Klasse in den globalen Kontext einfügen, sollten Sie sie dem WebWorker-Kontext hinzufügen, nicht dem Hauptkontext, da die beiden Kontexte unterschiedlich sind.
Karim H
4
Sie versuchen, die neu erstellte Klasse zur WorkerKlassendefinition hinzuzufügen . Normalerweise müssen Sie Ihre Klasse dem globalen Objekt und jedem globalen Objekt in einer neu erstellten JSVirtualMachine hinzufügen. Workerwird ein neues JSVirtualMachinemit seinem globalen Kontext und seinem globalen Objekt erstellen ; eine völlig getrennte
Umgebung

Antworten:

1

Es gibt keine Möglichkeit, die WorkerGlobalScopeoder vergleichbare Bereiche / Kontexte zu ändern, bevor ein Web-Worker in den meisten gängigen Browser-Implementierungen gestartet wird. Diese Bereiche stehen nur dem Web-Worker-Kontext zur Verfügung, sobald dieser spezielle Web-Worker gestartet wird.

Die einzige Möglichkeit, gemeinsam genutzte Methoden zu verwenden, besteht darin, sie in einer separaten gemeinsam genutzten Datei / Ressource zu definieren und sie mithilfe von einzuschließen importScripts()

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

Hinweis: importScripts() und self.importScripts()sind praktisch gleichwertig - beide repräsentieren importScripts()das Aufrufen aus dem inneren Bereich des Arbeitnehmers.


Quellen

janniks
quelle
0

Verwenden Sie "importScripts ()", um die Ressourcen für WorkerGlobalScope freizugeben

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