aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script/dom/worker.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/script/dom/worker.rs')
-rw-r--r--src/components/script/dom/worker.rs35
1 files changed, 28 insertions, 7 deletions
diff --git a/src/components/script/dom/worker.rs b/src/components/script/dom/worker.rs
index a01865c6075..3119b4c96f2 100644
--- a/src/components/script/dom/worker.rs
+++ b/src/components/script/dom/worker.rs
@@ -17,11 +17,15 @@ use script_task::{ScriptChan, DOMMessage};
use servo_util::str::DOMString;
-use js::jsapi::{JS_AddObjectRoot, JS_RemoveObjectRoot};
+use js::glue::JS_STRUCTURED_CLONE_VERSION;
+use js::jsapi::{JSContext, JS_AddObjectRoot, JS_RemoveObjectRoot};
+use js::jsapi::{JS_ReadStructuredClone, JS_WriteStructuredClone};
+use js::jsval::{JSVal, UndefinedValue};
use url::UrlParser;
-use libc::c_void;
+use libc::{c_void, size_t};
use std::cell::Cell;
+use std::ptr;
pub struct TrustedWorkerAddress(pub *const c_void);
@@ -73,12 +77,22 @@ impl Worker {
Ok(Temporary::from_rooted(&*worker))
}
- pub fn handle_message(address: TrustedWorkerAddress, message: DOMString) {
+ pub fn handle_message(address: TrustedWorkerAddress,
+ data: *mut u64, nbytes: size_t) {
let worker = unsafe { JS::from_trusted_worker_address(address).root() };
- let target: &JSRef<EventTarget> = EventTargetCast::from_ref(&*worker);
let global = worker.global.root();
- MessageEvent::dispatch(target, &global.root_ref(), message);
+
+ let mut message = UndefinedValue();
+ unsafe {
+ assert!(JS_ReadStructuredClone(
+ global.root_ref().get_cx(), data as *const u64, nbytes,
+ JS_STRUCTURED_CLONE_VERSION, &mut message,
+ ptr::null(), ptr::mut_null()) != 0);
+ }
+
+ let target: &JSRef<EventTarget> = EventTargetCast::from_ref(&*worker);
+ MessageEvent::dispatch_jsval(target, &global.root_ref(), message);
}
}
@@ -115,10 +129,17 @@ impl Worker {
}
impl<'a> WorkerMethods for JSRef<'a, Worker> {
- fn PostMessage(&self, message: DOMString) {
+ fn PostMessage(&self, cx: *mut JSContext, message: JSVal) {
+ let mut data = ptr::mut_null();
+ let mut nbytes = 0;
+ unsafe {
+ assert!(JS_WriteStructuredClone(cx, message, &mut data, &mut nbytes,
+ ptr::null(), ptr::mut_null()) != 0);
+ }
+
self.addref();
let ScriptChan(ref sender) = self.sender;
- sender.send(DOMMessage(message));
+ sender.send(DOMMessage(data, nbytes));
}
fn GetOnmessage(&self) -> Option<EventHandlerNonNull> {