diff options
Diffstat (limited to 'src/components/script/dom')
-rw-r--r-- | src/components/script/dom/dedicatedworkerglobalscope.rs | 32 | ||||
-rw-r--r-- | src/components/script/dom/messageevent.rs | 10 | ||||
-rw-r--r-- | src/components/script/dom/webidls/DedicatedWorkerGlobalScope.webidl | 3 | ||||
-rw-r--r-- | src/components/script/dom/webidls/Worker.webidl | 3 | ||||
-rw-r--r-- | src/components/script/dom/worker.rs | 35 |
5 files changed, 59 insertions, 24 deletions
diff --git a/src/components/script/dom/dedicatedworkerglobalscope.rs b/src/components/script/dom/dedicatedworkerglobalscope.rs index 8d6fd2640d6..15bf075df44 100644 --- a/src/components/script/dom/dedicatedworkerglobalscope.rs +++ b/src/components/script/dom/dedicatedworkerglobalscope.rs @@ -24,11 +24,14 @@ use script_task::WorkerPostMessage; use script_task::StackRootTLS; use servo_net::resource_task::{ResourceTask, load_whole_resource}; -use servo_util::str::DOMString; +use js::glue::JS_STRUCTURED_CLONE_VERSION; +use js::jsapi::{JSContext, JS_ReadStructuredClone, JS_WriteStructuredClone}; +use js::jsval::{JSVal, UndefinedValue}; use js::rust::Cx; use std::rc::Rc; +use std::ptr; use std::task::TaskBuilder; use native::task::NativeTaskBuilder; use url::Url; @@ -117,15 +120,23 @@ impl DedicatedWorkerGlobalScope { EventTargetCast::from_ref(&*global); loop { match global.receiver.recv_opt() { - Ok(DOMMessage(message)) => { - MessageEvent::dispatch(target, &Worker(*scope), message); + Ok(DOMMessage(data, nbytes)) => { + let mut message = UndefinedValue(); + unsafe { + assert!(JS_ReadStructuredClone( + js_context.ptr, data as *const u64, nbytes, + JS_STRUCTURED_CLONE_VERSION, &mut message, + ptr::null(), ptr::mut_null()) != 0); + } + + MessageEvent::dispatch_jsval(target, &Worker(*scope), message); global.delayed_release_worker(); }, Ok(XHRProgressMsg(addr, progress)) => { XMLHttpRequest::handle_xhr_progress(addr, progress) }, - Ok(WorkerPostMessage(addr, message)) => { - Worker::handle_message(addr, message); + Ok(WorkerPostMessage(addr, data, nbytes)) => { + Worker::handle_message(addr, data, nbytes); }, Ok(WorkerRelease(addr)) => { Worker::handle_release(addr) @@ -139,9 +150,16 @@ impl DedicatedWorkerGlobalScope { } impl<'a> DedicatedWorkerGlobalScopeMethods for JSRef<'a, DedicatedWorkerGlobalScope> { - 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); + } + let ScriptChan(ref sender) = self.parent_sender; - sender.send(WorkerPostMessage(*self.worker, message)); + sender.send(WorkerPostMessage(*self.worker, data, nbytes)); } fn GetOnmessage(&self) -> Option<EventHandlerNonNull> { diff --git a/src/components/script/dom/messageevent.rs b/src/components/script/dom/messageevent.rs index a72e38cd650..13c8cf52dfd 100644 --- a/src/components/script/dom/messageevent.rs +++ b/src/components/script/dom/messageevent.rs @@ -6,7 +6,6 @@ use dom::bindings::codegen::Bindings::EventBinding::EventMethods; use dom::bindings::codegen::Bindings::MessageEventBinding; use dom::bindings::codegen::Bindings::MessageEventBinding::MessageEventMethods; use dom::bindings::codegen::InheritTypes::{EventCast, MessageEventDerived}; -use dom::bindings::conversions::ToJSValConvertible; use dom::bindings::error::Fallible; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JSRef, Temporary}; @@ -68,12 +67,11 @@ impl MessageEvent { } impl MessageEvent { - pub fn dispatch(target: &JSRef<EventTarget>, - scope: &GlobalRef, - message: DOMString) { + pub fn dispatch_jsval(target: &JSRef<EventTarget>, + scope: &GlobalRef, + message: JSVal) { let messageevent = MessageEvent::new( - scope, "message".to_string(), false, false, - message.to_jsval(scope.get_cx()), + scope, "message".to_string(), false, false, message, "".to_string(), "".to_string()).root(); let event: &JSRef<Event> = EventCast::from_ref(&*messageevent); target.dispatch_event_with_target(None, &*event).unwrap(); diff --git a/src/components/script/dom/webidls/DedicatedWorkerGlobalScope.webidl b/src/components/script/dom/webidls/DedicatedWorkerGlobalScope.webidl index c44a5788e9d..dbf2891f72a 100644 --- a/src/components/script/dom/webidls/DedicatedWorkerGlobalScope.webidl +++ b/src/components/script/dom/webidls/DedicatedWorkerGlobalScope.webidl @@ -5,7 +5,6 @@ // http://www.whatwg.org/html/#dedicatedworkerglobalscope [Global/*=Worker,DedicatedWorker*/] /*sealed*/ interface DedicatedWorkerGlobalScope : WorkerGlobalScope { - //void postMessage(any message, optional sequence<Transferable> transfer); - void postMessage(DOMString message); + void postMessage(any message/*, optional sequence<Transferable> transfer*/); attribute EventHandler onmessage; }; diff --git a/src/components/script/dom/webidls/Worker.webidl b/src/components/script/dom/webidls/Worker.webidl index fd85a2f6c8f..2228c203781 100644 --- a/src/components/script/dom/webidls/Worker.webidl +++ b/src/components/script/dom/webidls/Worker.webidl @@ -14,8 +14,7 @@ interface AbstractWorker { interface Worker : EventTarget { //void terminate(); - //void postMessage(any message/*, optional sequence<Transferable> transfer*/); - void postMessage(DOMString message); + void postMessage(any message/*, optional sequence<Transferable> transfer*/); attribute EventHandler onmessage; }; Worker implements AbstractWorker; 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> { |