web-dev-qa-db-ja.com

JavaScriptCoreでWebWorkerのコンテキストに新しいネイティブクラスを追加する方法

私は、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()が呼び出されると、クラスは使用できなくなります。

102
Pedro Vanzella

ほとんどの一般的なブラウザー実装で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()が呼び出されていることを表しますワーカーの内部スコープの内側から。


ソース

1
janniks

「importScripts()」を使用して、WorkerGlobalScopeとリソースを共有します

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