JavaScriptCore에서 WebWorker의 컨텍스트에 새 네이티브 클래스를 추가하는 방법은 무엇입니까?


102

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객체에 추가하고 a new Worker()가 호출되면 클래스를 사용할 수 없습니다.


1
귀하의 요구 사항에 대해 정확히 확신하지 못합니다. 하지만 작업자 파일에이 작업을 수행하는 하나의 스크립트를 포함 할 수 있다고 생각합니다. 이렇게. importScripts ( "globalWorker.js")
RAJESH

1
Worker 클래스를 전역 컨텍스트에 배치하고 있으므로 두 컨텍스트가 다르기 때문에 주 컨텍스트가 아닌 WebWorker의 컨텍스트에 추가해야합니다.
Karim H

4
새로 생성 된 클래스를 Worker클래스 정의 에 추가하려고합니다 . 일반적으로 클래스를 전역 객체와 새로 생성 된 JSVirtualMachine 내의 모든 전역 객체에 추가해야합니다. 글로벌 컨텍스트 및 글로벌 오브젝트 Worker로 새 JSVirtualMachine를 생성 합니다. 완전히 구분 environement
dectroo

답변:


1

수정할 방법이 없습니다. WorkerGlobalScope웹 워커가 대부분의 일반적인 브라우저 구현에서 시작되기 전에는 또는 유사한 범위 / 컨텍스트 . 이러한 범위는이 특정 웹 작업자가 시작되는 즉시 웹 작업자 컨텍스트에서만 사용할 수 있습니다.

공유 방법을 사용하는 유일한 방법은 별도의 공유 파일 / 리소스에 정의하고 다음을 사용하여 포함하는 것입니다. importScripts()

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

노트 : importScripts()self.importScripts()는 사실상 동등합니다. 둘 다 importScripts()작업자의 내부 범위 내에서 호출됨을 나타냅니다 .


출처


0

"importScripts ()"를 사용하여 WorkerGlobalScope와 리소스를 공유합니다.

importScripts('resource.js');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.