JavaScriptCore'da WebWorker'ın bağlamına yeni bir yerel sınıf nasıl eklenir?


102

JavaScriptCore aracılığıyla bir webkit-gtk tarayıcısında JavaScript'i genişleten bir uygulamam var. Şu anda küresel bağlama eklediğim birkaç sınıfım var:

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

Şimdi, bu sınıfları WebWorker'ın bağlamına da eklemek istiyorum, böylece onları JS'de örneklenen işçilerden çağırabilirim.

WorkerNesneyi şu şekilde almayı denedim :

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

Ancak bu onu WorkerConstructornesneye ekler ve a new Worker()çağrıldığında sınıflar kullanılamaz.


1
Tam olarak ihtiyacınızdan emin değilim. Ama sanırım bunu çalışan dosyaya yapan bir komut dosyası ekleyebiliriz. bunun gibi. importScripts ("globalWorker.js")
rajesh

1
Worker sınıfını genel bağlama koyuyorsunuz, bunları ana bağlama değil WebWorker bağlamına eklemelisiniz çünkü iki bağlam farklıdır.
Karim H

4
Yeni oluşturulan sınıfı Workersınıf tanımına eklemeye çalışıyorsunuz . Normalde, sınıfınızı Global nesneye ve yeni oluşturulan JSVirtualMachine içindeki her Global Object'e eklemeniz gerekir. küresel bağlamı ve küresel nesnesiyle Workeryeni bir JSVirtualMachineşey yaratacak ; tamamen ayrı bir çevre
dectroo

Yanıtlar:


1

WorkerGlobalScopeÇoğu yaygın tarayıcı uygulamalarında bir web çalışanı başlatılmadan önce kapsamları / bağlamları değiştirmenin bir yolu yoktur . Bu kapsamlar, bu belirli web çalışanı başlatılır başlatılmaz yalnızca web çalışanları bağlamında kullanılabilir hale gelir.

Paylaşılan yöntemleri kullanmanın tek yolu, onları ayrı bir paylaşılan dosya / kaynakta tanımlamak ve bunları kullanarak dahil etmektir. importScripts()

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

Not: importScripts() ve self.importScripts()fiilen eşdeğerdir - her ikisi importScripts()de çalışanın iç kapsamı içinden çağrılmayı temsil eder .


Kaynaklar


0

Kaynakları WorkerGlobalScope ile paylaşmak için "importScripts ()" kullanın

importScripts('resource.js');
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.