私は、webkit-gtkブラウザーで、JavaScriptCoreを介してJavaScriptを拡張するアプリケーションを持っています。現在、いくつかのクラスをグローバルコンテキストに追加しています。
_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);
}
_
次に、これらのクラスもWebWorkerのコンテキストに追加して、JSでインスタンス化されたワーカーからそれらを呼び出すことができるようにします。
私はWorker
オブジェクトを次のように取得しようとしました:
_JSStringRef workerStr = JSStringCreateWithUTF8CString("Worker");
JSObjectRef worker = JSObjectGetProperty(context, globalObj, workerStr, NULL);
JSObjectSetProperty(context, worker, str, classObj, kJSPropertyAttributeNone, NULL);
JSStringRelease(workerStr);
_
しかし、それによってWorkerConstructor
オブジェクトに追加され、new Worker()
が呼び出されると、クラスは使用できなくなります。
ほとんどの一般的なブラウザー実装でWebワーカーが開始される前に、 WorkerGlobalScope
または同等のスコープ/コンテキストを変更する方法はありません。これらのスコープは、この特定のWebワーカーが起動されるとすぐに、Webワーカーのコンテキストでのみ使用可能になります。
共有メソッドを使用する唯一の方法は、個別の共有ファイル/リソースでそれらを定義し、 importScripts()
を使用してそれらを含めることです
_self.importScripts('foo.js');
self.importScripts('foo.js', 'bar.js', ...);
importScripts('foo.js');
importScripts('foo.js', 'bar.js', ...);
_
注:
importScripts()
とself.importScripts()
は実質的に同等です—どちらもimportScripts()
が呼び出されていることを表しますワーカーの内部スコープの内側から。
ソース
「importScripts()」を使用して、WorkerGlobalScopeとリソースを共有します
importScripts('resource.js');