aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMs2ger <ms2ger@gmail.com>2014-08-14 16:30:05 +0200
committerMs2ger <ms2ger@gmail.com>2014-08-14 16:30:05 +0200
commitd2ffbec5eda14ca93efe5eaeda8ed43692b53c85 (patch)
tree44e0c3323a6feda59796f4825741369c44080808
parent251d818de29b97d8cf4a2398661a71c60cd89da8 (diff)
parenteaea735f72f9219e0acbb338b06f1b61a408bcd9 (diff)
downloadservo-d2ffbec5eda14ca93efe5eaeda8ed43692b53c85.tar.gz
servo-d2ffbec5eda14ca93efe5eaeda8ed43692b53c85.zip
Merge pull request #3080 from Ms2ger/clone
Structured clone the argument to postMessage; r=larsberg
-rw-r--r--src/components/script/dom/dedicatedworkerglobalscope.rs32
-rw-r--r--src/components/script/dom/messageevent.rs10
-rw-r--r--src/components/script/dom/webidls/DedicatedWorkerGlobalScope.webidl3
-rw-r--r--src/components/script/dom/webidls/Worker.webidl3
-rw-r--r--src/components/script/dom/worker.rs35
-rw-r--r--src/components/script/script_task.rs8
m---------src/support/spidermonkey/rust-mozjs0
-rw-r--r--src/test/wpt/metadata/workers/WorkerGlobalScope_EventTarget.htm.ini5
-rw-r--r--src/test/wpt/metadata/workers/constructors/Worker/expected-self-properties.html.ini5
-rw-r--r--src/test/wpt/metadata/workers/constructors/Worker/same-origin.html.ini3
-rw-r--r--src/test/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/return-value.html.ini5
-rw-r--r--src/test/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null.html.ini5
-rw-r--r--src/test/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/setting-postMessage.html.ini5
-rw-r--r--src/test/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/structured-clone-message.html.ini41
-rw-r--r--src/test/wpt/metadata/workers/interfaces/WorkerGlobalScope/self.html.ini5
-rw-r--r--src/test/wpt/metadata/workers/interfaces/WorkerUtils/importScripts/005.html.ini5
-rw-r--r--src/test/wpt/metadata/workers/interfaces/WorkerUtils/importScripts/006.html.ini3
-rw-r--r--src/test/wpt/metadata/workers/semantics/encodings/003.html.ini5
-rw-r--r--src/test/wpt/metadata/workers/semantics/run-a-worker/001.html.ini5
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
-