Як додати новий рідний клас до контексту WebWorker в JavaScriptCore?


102

У мене є додаток, який розширює JavaScript через JavaScriptCore, у веб-переглядачі 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об'єкта, і коли new Worker()викликається a , класи недоступні.


1
Не точно впевнений у своїй вимозі. Але я думаю, ми можемо включити один сценарій, який робить це у файлі працівника. подобається це. importScripts ("globalWorker.js")
rajesh

1
Ви ставите клас Worker у глобальний контекст, ви повинні додати їх до контексту WebWorker, а не до основного, оскільки два контексти різні.
Карим Н

4
Ви намагаєтеся додати новий створений клас до Workerвизначення класу. Зазвичай вам потрібно додати свій клас до об'єкта Global і до кожного глобального об'єкта в новому створеному JSVirtualMachine. Workerстворить новий JSVirtualMachineіз його глобальним контекстом та глобальним об’єктом; цілком відокремлене
оточення

Відповіді:


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()що викликаються зсередини внутрішньої сфери роботи.


Джерела


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.