diff options
author | Ms2ger <ms2ger@gmail.com> | 2014-08-14 16:30:05 +0200 |
---|---|---|
committer | Ms2ger <ms2ger@gmail.com> | 2014-08-14 16:30:05 +0200 |
commit | d2ffbec5eda14ca93efe5eaeda8ed43692b53c85 (patch) | |
tree | 44e0c3323a6feda59796f4825741369c44080808 /src/components/script/dom/worker.rs | |
parent | 251d818de29b97d8cf4a2398661a71c60cd89da8 (diff) | |
parent | eaea735f72f9219e0acbb338b06f1b61a408bcd9 (diff) | |
download | servo-d2ffbec5eda14ca93efe5eaeda8ed43692b53c85.tar.gz servo-d2ffbec5eda14ca93efe5eaeda8ed43692b53c85.zip |
Merge pull request #3080 from Ms2ger/clone
Structured clone the argument to postMessage; r=larsberg
Diffstat (limited to 'src/components/script/dom/worker.rs')
-rw-r--r-- | src/components/script/dom/worker.rs | 35 |
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> { |