diff --git a/src/components/script/dom/dedicatedworkerglobalscope.rs b/src/components/script/dom/dedicatedworkerglobalscope.rs index dc56b7ba354..15bf075df44 100644 --- a/src/components/script/dom/dedicatedworkerglobalscope.rs +++ b/src/components/script/dom/dedicatedworkerglobalscope.rs @@ -24,11 +24,10 @@ 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::JS_ReadStructuredClone; -use js::jsval::UndefinedValue; +use js::jsapi::{JSContext, JS_ReadStructuredClone, JS_WriteStructuredClone}; +use js::jsval::{JSVal, UndefinedValue}; use js::rust::Cx; use std::rc::Rc; @@ -136,8 +135,8 @@ impl DedicatedWorkerGlobalScope { 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) @@ -151,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 { diff --git a/src/components/script/dom/messageevent.rs b/src/components/script/dom/messageevent.rs index 526ed181084..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,17 +67,6 @@ impl MessageEvent { } impl MessageEvent { - pub fn dispatch(target: &JSRef, - scope: &GlobalRef, - message: DOMString) { - let messageevent = MessageEvent::new( - scope, "message".to_string(), false, false, - message.to_jsval(scope.get_cx()), - "".to_string(), "".to_string()).root(); - let event: &JSRef = EventCast::from_ref(&*messageevent); - target.dispatch_event_with_target(None, &*event).unwrap(); - } - pub fn dispatch_jsval(target: &JSRef, scope: &GlobalRef, message: JSVal) { 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 transfer); - void postMessage(DOMString message); + void postMessage(any message/*, optional sequence transfer*/); attribute EventHandler onmessage; }; diff --git a/src/components/script/dom/worker.rs b/src/components/script/dom/worker.rs index 0b52309b80e..3119b4c96f2 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::{JSContext, JS_AddObjectRoot, JS_RemoveObjectRoot, JS_WriteStructuredClone}; -use js::jsval::JSVal; +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; @@ -75,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 = 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 = EventTargetCast::from_ref(&*worker); + MessageEvent::dispatch_jsval(target, &global.root_ref(), message); } } diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs index 295d0476b31..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; @@ -89,7 +88,7 @@ pub enum ScriptMsg { /// DedicatedWorkerGlobalScope). 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), } @@ -447,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/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/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 -