diff options
author | Ms2ger <ms2ger@gmail.com> | 2014-08-12 20:27:12 +0200 |
---|---|---|
committer | Ms2ger <ms2ger@gmail.com> | 2014-08-14 16:28:57 +0200 |
commit | 1dca6146a87a09e6ab0f792debb763af67be41f2 (patch) | |
tree | 91b5646be5b671d716a6d073c48a3c116aea6257 | |
parent | 251d818de29b97d8cf4a2398661a71c60cd89da8 (diff) | |
download | servo-1dca6146a87a09e6ab0f792debb763af67be41f2.tar.gz servo-1dca6146a87a09e6ab0f792debb763af67be41f2.zip |
Structured clone the argument to Worker.postMessage.
-rw-r--r-- | src/components/script/dom/dedicatedworkerglobalscope.rs | 16 | ||||
-rw-r--r-- | src/components/script/dom/messageevent.rs | 10 | ||||
-rw-r--r-- | src/components/script/dom/webidls/Worker.webidl | 3 | ||||
-rw-r--r-- | src/components/script/dom/worker.rs | 15 | ||||
-rw-r--r-- | src/components/script/script_task.rs | 3 | ||||
m--------- | src/support/spidermonkey/rust-mozjs | 0 | ||||
-rw-r--r-- | src/test/wpt/metadata/workers/constructors/Worker/expected-self-properties.html.ini | 5 |
7 files changed, 39 insertions, 13 deletions
diff --git a/src/components/script/dom/dedicatedworkerglobalscope.rs b/src/components/script/dom/dedicatedworkerglobalscope.rs index 8d6fd2640d6..dc56b7ba354 100644 --- a/src/components/script/dom/dedicatedworkerglobalscope.rs +++ b/src/components/script/dom/dedicatedworkerglobalscope.rs @@ -26,9 +26,13 @@ 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::JS_ReadStructuredClone; +use js::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,8 +121,16 @@ 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)) => { diff --git a/src/components/script/dom/messageevent.rs b/src/components/script/dom/messageevent.rs index a72e38cd650..526ed181084 100644 --- a/src/components/script/dom/messageevent.rs +++ b/src/components/script/dom/messageevent.rs @@ -78,6 +78,16 @@ impl MessageEvent { let event: &JSRef<Event> = EventCast::from_ref(&*messageevent); target.dispatch_event_with_target(None, &*event).unwrap(); } + + pub fn dispatch_jsval(target: &JSRef<EventTarget>, + scope: &GlobalRef, + message: JSVal) { + let messageevent = MessageEvent::new( + 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(); + } } impl<'a> MessageEventMethods for JSRef<'a, MessageEvent> { 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..0b52309b80e 100644 --- a/src/components/script/dom/worker.rs +++ b/src/components/script/dom/worker.rs @@ -17,11 +17,13 @@ use script_task::{ScriptChan, DOMMessage}; use servo_util::str::DOMString; -use js::jsapi::{JS_AddObjectRoot, JS_RemoveObjectRoot}; +use js::jsapi::{JSContext, JS_AddObjectRoot, JS_RemoveObjectRoot, JS_WriteStructuredClone}; +use js::jsval::JSVal; use url::UrlParser; use libc::c_void; use std::cell::Cell; +use std::ptr; pub struct TrustedWorkerAddress(pub *const c_void); @@ -115,10 +117,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> { diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs index dd01017ff76..295d0476b31 100644 --- a/src/components/script/script_task.rs +++ b/src/components/script/script_task.rs @@ -56,6 +56,7 @@ use js::rust::with_compartment; use js; use url::Url; +use libc::size_t; use serialize::{Encoder, Encodable}; use std::any::{Any, AnyRefExt}; use std::cell::RefCell; @@ -86,7 +87,7 @@ pub enum ScriptMsg { XHRProgressMsg(TrustedXHRAddress, XHRProgress), /// Message sent through Worker.postMessage (only dispatched to /// DedicatedWorkerGlobalScope). - DOMMessage(DOMString), + DOMMessage(*mut u64, size_t), /// Posts a message to the Worker object (dispatched to all tasks). WorkerPostMessage(TrustedWorkerAddress, DOMString), /// Releases one reference to the Worker object (dispatched to all tasks). diff --git a/src/support/spidermonkey/rust-mozjs b/src/support/spidermonkey/rust-mozjs -Subproject 3104cf76fc0ceffec78bcbf430faabd524864d2 +Subproject 33bcfb764e9ab2d8b065915764cd0223e43a377 diff --git a/src/test/wpt/metadata/workers/constructors/Worker/expected-self-properties.html.ini b/src/test/wpt/metadata/workers/constructors/Worker/expected-self-properties.html.ini deleted file mode 100644 index c28d52adbb5..00000000000 --- a/src/test/wpt/metadata/workers/constructors/Worker/expected-self-properties.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[expected-self-properties.html] - type: testharness - [expected interface objects/constructors] - expected: FAIL - |