Bagaimana cara menambahkan kelas asli baru ke konteks WebWorker di JavaScriptCore?

102

Saya memiliki aplikasi yang memperluas JavaScript melalui JavaScriptCore, di browser webkit-gtk. Saat ini saya memiliki beberapa kelas yang saya tambahkan ke konteks global seperti:

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

Sekarang, saya juga ingin menambahkan kelas-kelas itu ke konteks WebWorker, jadi saya bisa memanggilnya dari pekerja yang dibuat di JS.

Saya sudah mencoba mendapatkan Workerobjek seperti ini:

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

Tapi itu menambahkannya ke WorkerConstructorobjek, dan ketika a new Worker()dipanggil, kelas tidak tersedia.

Pedro Vanzella
sumber
1
Tidak yakin tentang kebutuhan Anda dengan tepat. Tapi saya pikir kita bisa memasukkan satu skrip yang melakukan ini di file pekerja. seperti ini. importScripts ("globalWorker.js")
rajesh
1
Anda meletakkan kelas Pekerja ke konteks global, Anda harus menambahkannya ke konteks WebWorker bukan konteks utama karena kedua konteks berbeda.
Karim H
4
Anda mencoba menambahkan kelas baru yang dibuat ke Workerdefinisi kelas. Biasanya Anda perlu menambahkan kelas Anda ke objek Global dan ke setiap Objek Global dalam JSVirtualMachine yang baru dibuat. Workerakan membuat baru JSVirtualMachinedengan konteks global dan objek globalnya; lingkungan yang benar-benar terpisah
dectroo

Jawaban:

1

Tidak ada cara untuk mengubah WorkerGlobalScopeatau cakupan / konteks yang sebanding sebelum pekerja web dimulai di sebagian besar penerapan browser umum. Cakupan ini menjadi tersedia hanya untuk konteks pekerja web segera setelah pekerja web spesifik ini diluncurkan.

Satu-satunya cara untuk menggunakan metode bersama adalah dengan mendefinisikannya dalam file / sumber daya bersama yang terpisah dan memasukkannya menggunakan importScripts()

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

Catatan: importScripts() dan self.importScripts()secara efektif setara - keduanya mewakili importScripts()panggilan dari dalam lingkup dalam pekerja.


Sumber

janniks
sumber
0

Gunakan "importScripts ()" untuk berbagi sumber daya dengan WorkerGlobalScope

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