Làm thế nào để Thêm một lớp gốc mới vào ngữ cảnh của WebWorker trong JavaScriptCore?


102

Tôi có một ứng dụng mở rộng JavaScript qua JavaScriptCore, trong trình duyệt webkit-gtk. Ngay bây giờ tôi có một số lớp mà tôi thêm vào ngữ cảnh chung như vậy:

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);
}

Bây giờ, tôi cũng muốn thêm các lớp đó vào ngữ cảnh của WebWorker, vì vậy tôi có thể gọi chúng từ các worker được khởi tạo trong JS.

Tôi đã thử lấy Workerđối tượng như vậy:

JSStringRef workerStr = JSStringCreateWithUTF8CString("Worker");
JSObjectRef worker = JSObjectGetProperty(context, globalObj, workerStr, NULL);
JSObjectSetProperty(context, worker, str, classObj, kJSPropertyAttributeNone, NULL);
JSStringRelease(workerStr);

Nhưng điều đó sẽ thêm nó vào WorkerConstructorđối tượng và khi a new Worker()được gọi, các lớp sẽ không khả dụng.


1
Không chắc chắn về yêu cầu của bạn chính xác. Nhưng tôi nghĩ chúng ta có thể bao gồm một tập lệnh thực hiện điều này trong tệp worker. như thế này. importScripts ("globalWorker.js")
rajesh

1
Bạn đang đặt lớp Worker vào bối cảnh chung, bạn nên thêm chúng vào ngữ cảnh của WebWorker chứ không phải ngữ cảnh chính vì hai ngữ cảnh khác nhau.
Karim H

4
Bạn đang cố thêm lớp mới được tạo vào Workerđịnh nghĩa lớp. Thông thường, bạn cần thêm lớp của mình vào đối tượng Toàn cục và vào mọi Đối tượng toàn cục trong JSVirtualMachine mới được tạo. Workersẽ tạo ra một cái mới JSVirtualMachinevới bối cảnh toàn cầu và đối tượng toàn cầu; một hoàn toàn tách environement
dectroo

Câu trả lời:


1

Không có cách nào để sửa đổi WorkerGlobalScopephạm vi / bối cảnh hoặc phạm vi có thể so sánh trước khi trình nhân viên web được khởi động trong hầu hết các triển khai trình duyệt phổ biến. Các phạm vi này chỉ có sẵn cho ngữ cảnh web worker ngay sau khi web worker cụ thể này được khởi chạy.

Cách duy nhất để sử dụng các phương thức chia sẻ là xác định chúng trong một tệp / tài nguyên được chia sẻ riêng biệt và bao gồm chúng bằng cách sử dụng importScripts()

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

Lưu ý: importScripts()self.importScripts()tương đương về mặt hiệu quả - cả hai đều đại diện cho importScripts()việc được gọi từ bên trong phạm vi bên trong của người lao động.


Nguồn


0

Sử dụng "importScripts ()" để chia sẻ tài nguyên với WorkerGlobalScope

importScripts('resource.js');
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.