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


102

JavaScriptCoreを介してJavaScriptを拡張するアプリケーションをwebkit-gtkブラウザーで使用しています。現在、いくつかのクラスをグローバルコンテキストに追加しています。

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オブジェクトに追加し、a new Worker()が呼び出されると、クラスは使用できなくなります。


1
正確にあなたの要件についてわからない。しかし、これを行う1つのスクリプトをワーカーファイルに含めることができると思います。このような。importScripts( "globalWorker.js")
rajesh

1
Workerクラスをグローバルコンテキストに配置している場合、2つのコンテキストが異なるため、メインコンテキストではなくWebWorkerのコンテキストに追加する必要があります。
Karim H

4
新しく作成したクラスをWorkerクラス定義に追加しようとしています。通常、クラスをグローバルオブジェクトと、新しく作成されたJSVirtualMachine内のすべてのグローバルオブジェクトに追加する必要があります。グローバルコンテキストとグローバルオブジェクトでWorker新しいJSVirtualMachineを作成します。完全に分離された環境
dectroo

回答:


1

WorkerGlobalScopeほとんどの一般的なブラウザー実装でWebワーカーが開始される前に、または同等のスコープ/コンテキストを変更する方法はありません。これらのスコープは、この特定の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()ワーカーの内部スコープ内から呼び出されることを表します。


出典


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.