aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMs2ger <ms2ger@gmail.com>2014-08-12 20:27:12 +0200
committerMs2ger <ms2ger@gmail.com>2014-08-14 16:28:57 +0200
commit1dca6146a87a09e6ab0f792debb763af67be41f2 (patch)
tree91b5646be5b671d716a6d073c48a3c116aea6257
parent251d818de29b97d8cf4a2398661a71c60cd89da8 (diff)
downloadservo-1dca6146a87a09e6ab0f792debb763af67be41f2.tar.gz
servo-1dca6146a87a09e6ab0f792debb763af67be41f2.zip
Structured clone the argument to Worker.postMessage.
-rw-r--r--src/components/script/dom/dedicatedworkerglobalscope.rs16
-rw-r--r--src/components/script/dom/messageevent.rs10
-rw-r--r--src/components/script/dom/webidls/Worker.webidl3
-rw-r--r--src/components/script/dom/worker.rs15
-rw-r--r--src/components/script/script_task.rs3
m---------src/support/spidermonkey/rust-mozjs0
-rw-r--r--src/test/wpt/metadata/workers/constructors/Worker/expected-self-properties.html.ini5
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
-