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 | |
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
19 files changed, 65 insertions, 118 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> { diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs index dd01017ff76..f7873ca3c24 100644 --- a/src/components/script/script_task.rs +++ b/src/components/script/script_task.rs @@ -45,7 +45,6 @@ use servo_msg::constellation_msg; use servo_net::image_cache_task::ImageCacheTask; use servo_net::resource_task::ResourceTask; use servo_util::geometry::to_frac_px; -use servo_util::str::DOMString; use servo_util::task::spawn_named_with_send_on_failure; use geom::point::Point2D; @@ -56,6 +55,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,9 +86,9 @@ 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), + WorkerPostMessage(TrustedWorkerAddress, *mut u64, size_t), /// Releases one reference to the Worker object (dispatched to all tasks). WorkerRelease(TrustedWorkerAddress), } @@ -446,7 +446,7 @@ impl ScriptTask { FromConstellation(ResizeMsg(..)) => fail!("should have handled ResizeMsg already"), FromScript(XHRProgressMsg(addr, progress)) => XMLHttpRequest::handle_xhr_progress(addr, progress), FromScript(DOMMessage(..)) => fail!("unexpected message"), - FromScript(WorkerPostMessage(addr, message)) => Worker::handle_message(addr, message), + FromScript(WorkerPostMessage(addr, data, nbytes)) => Worker::handle_message(addr, data, nbytes), FromScript(WorkerRelease(addr)) => Worker::handle_release(addr), } } 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/WorkerGlobalScope_EventTarget.htm.ini b/src/test/wpt/metadata/workers/WorkerGlobalScope_EventTarget.htm.ini deleted file mode 100644 index e9328d2455c..00000000000 --- a/src/test/wpt/metadata/workers/WorkerGlobalScope_EventTarget.htm.ini +++ /dev/null @@ -1,5 +0,0 @@ -[WorkerGlobalScope_EventTarget.htm] - type: testharness - [Test Description: WorkerGlobalScope implements EventTarget] - expected: FAIL - 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 - diff --git a/src/test/wpt/metadata/workers/constructors/Worker/same-origin.html.ini b/src/test/wpt/metadata/workers/constructors/Worker/same-origin.html.ini index 490b967ba0f..9e8073aa95a 100644 --- a/src/test/wpt/metadata/workers/constructors/Worker/same-origin.html.ini +++ b/src/test/wpt/metadata/workers/constructors/Worker/same-origin.html.ini @@ -3,9 +3,6 @@ [unsupported_scheme] expected: FAIL - [data_url] - expected: FAIL - [about_blank] expected: FAIL diff --git a/src/test/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/return-value.html.ini b/src/test/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/return-value.html.ini deleted file mode 100644 index 40d57175ac1..00000000000 --- a/src/test/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/return-value.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[return-value.html] - type: testharness - [return value of postMessage] - expected: FAIL - diff --git a/src/test/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null.html.ini b/src/test/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null.html.ini deleted file mode 100644 index 60637c48080..00000000000 --- a/src/test/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[second-argument-null.html] - type: testharness - [Using null in postMessage\'s second argument] - expected: FAIL - diff --git a/src/test/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/setting-postMessage.html.ini b/src/test/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/setting-postMessage.html.ini deleted file mode 100644 index 4469fe6e364..00000000000 --- a/src/test/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/setting-postMessage.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[setting-postMessage.html] - type: testharness - [setting postMessage] - expected: FAIL - diff --git a/src/test/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-message.html.ini b/src/test/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-message.html.ini deleted file mode 100644 index a6f9892b5bb..00000000000 --- a/src/test/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-message.html.ini +++ /dev/null @@ -1,41 +0,0 @@ -[structured-clone-message.html] - type: testharness - [undefined] - expected: FAIL - - [null] - expected: FAIL - - [false] - expected: FAIL - - [true] - expected: FAIL - - [1] - expected: FAIL - - [NaN] - expected: FAIL - - [Infinity] - expected: FAIL - - [date] - expected: FAIL - - [regexp] - expected: FAIL - - [self] - expected: FAIL - - [array] - expected: FAIL - - [object] - expected: FAIL - - [error] - expected: FAIL - diff --git a/src/test/wpt/metadata/workers/interfaces/WorkerGlobalScope/self.html.ini b/src/test/wpt/metadata/workers/interfaces/WorkerGlobalScope/self.html.ini deleted file mode 100644 index 76a7533b0e2..00000000000 --- a/src/test/wpt/metadata/workers/interfaces/WorkerGlobalScope/self.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[self.html] - type: testharness - [self] - expected: FAIL - diff --git a/src/test/wpt/metadata/workers/interfaces/WorkerUtils/importScripts/005.html.ini b/src/test/wpt/metadata/workers/interfaces/WorkerUtils/importScripts/005.html.ini deleted file mode 100644 index d82cf0fd797..00000000000 --- a/src/test/wpt/metadata/workers/interfaces/WorkerUtils/importScripts/005.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[005.html] - type: testharness - [importScripts separate scripts] - expected: FAIL - diff --git a/src/test/wpt/metadata/workers/interfaces/WorkerUtils/importScripts/006.html.ini b/src/test/wpt/metadata/workers/interfaces/WorkerUtils/importScripts/006.html.ini index 5ccf297c3b8..6c3c750a2e3 100644 --- a/src/test/wpt/metadata/workers/interfaces/WorkerUtils/importScripts/006.html.ini +++ b/src/test/wpt/metadata/workers/interfaces/WorkerUtils/importScripts/006.html.ini @@ -1,5 +1,6 @@ [006.html] type: testharness + expected: TIMEOUT [importScripts uncaught exception] - expected: FAIL + expected: TIMEOUT diff --git a/src/test/wpt/metadata/workers/semantics/encodings/003.html.ini b/src/test/wpt/metadata/workers/semantics/encodings/003.html.ini deleted file mode 100644 index a3cfb4e3fea..00000000000 --- a/src/test/wpt/metadata/workers/semantics/encodings/003.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[003.html] - type: testharness - [URL encoding, dedicated worker] - expected: FAIL - diff --git a/src/test/wpt/metadata/workers/semantics/run-a-worker/001.html.ini b/src/test/wpt/metadata/workers/semantics/run-a-worker/001.html.ini deleted file mode 100644 index 2e248bd002d..00000000000 --- a/src/test/wpt/metadata/workers/semantics/run-a-worker/001.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[001.html] - type: testharness - [worker global scope, dedicated worker] - expected: FAIL - |