Structured clone the argument to Worker.postMessage.

This commit is contained in:
Ms2ger 2014-08-12 20:27:12 +02:00
parent 251d818de2
commit 1dca6146a8
7 changed files with 40 additions and 14 deletions

View file

@ -26,9 +26,13 @@ use script_task::StackRootTLS;
use servo_net::resource_task::{ResourceTask, load_whole_resource}; use servo_net::resource_task::{ResourceTask, load_whole_resource};
use servo_util::str::DOMString; 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 js::rust::Cx;
use std::rc::Rc; use std::rc::Rc;
use std::ptr;
use std::task::TaskBuilder; use std::task::TaskBuilder;
use native::task::NativeTaskBuilder; use native::task::NativeTaskBuilder;
use url::Url; use url::Url;
@ -117,8 +121,16 @@ impl DedicatedWorkerGlobalScope {
EventTargetCast::from_ref(&*global); EventTargetCast::from_ref(&*global);
loop { loop {
match global.receiver.recv_opt() { match global.receiver.recv_opt() {
Ok(DOMMessage(message)) => { Ok(DOMMessage(data, nbytes)) => {
MessageEvent::dispatch(target, &Worker(*scope), message); 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(); global.delayed_release_worker();
}, },
Ok(XHRProgressMsg(addr, progress)) => { Ok(XHRProgressMsg(addr, progress)) => {

View file

@ -78,6 +78,16 @@ impl MessageEvent {
let event: &JSRef<Event> = EventCast::from_ref(&*messageevent); let event: &JSRef<Event> = EventCast::from_ref(&*messageevent);
target.dispatch_event_with_target(None, &*event).unwrap(); 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> { impl<'a> MessageEventMethods for JSRef<'a, MessageEvent> {

View file

@ -14,8 +14,7 @@ interface AbstractWorker {
interface Worker : EventTarget { interface Worker : EventTarget {
//void terminate(); //void terminate();
//void postMessage(any message/*, optional sequence<Transferable> transfer*/); void postMessage(any message/*, optional sequence<Transferable> transfer*/);
void postMessage(DOMString message);
attribute EventHandler onmessage; attribute EventHandler onmessage;
}; };
Worker implements AbstractWorker; Worker implements AbstractWorker;

View file

@ -17,11 +17,13 @@ use script_task::{ScriptChan, DOMMessage};
use servo_util::str::DOMString; 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 url::UrlParser;
use libc::c_void; use libc::c_void;
use std::cell::Cell; use std::cell::Cell;
use std::ptr;
pub struct TrustedWorkerAddress(pub *const c_void); pub struct TrustedWorkerAddress(pub *const c_void);
@ -115,10 +117,17 @@ impl Worker {
} }
impl<'a> WorkerMethods for JSRef<'a, 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(); self.addref();
let ScriptChan(ref sender) = self.sender; let ScriptChan(ref sender) = self.sender;
sender.send(DOMMessage(message)); sender.send(DOMMessage(data, nbytes));
} }
fn GetOnmessage(&self) -> Option<EventHandlerNonNull> { fn GetOnmessage(&self) -> Option<EventHandlerNonNull> {

View file

@ -56,6 +56,7 @@ use js::rust::with_compartment;
use js; use js;
use url::Url; use url::Url;
use libc::size_t;
use serialize::{Encoder, Encodable}; use serialize::{Encoder, Encodable};
use std::any::{Any, AnyRefExt}; use std::any::{Any, AnyRefExt};
use std::cell::RefCell; use std::cell::RefCell;
@ -86,7 +87,7 @@ pub enum ScriptMsg {
XHRProgressMsg(TrustedXHRAddress, XHRProgress), XHRProgressMsg(TrustedXHRAddress, XHRProgress),
/// Message sent through Worker.postMessage (only dispatched to /// Message sent through Worker.postMessage (only dispatched to
/// DedicatedWorkerGlobalScope). /// DedicatedWorkerGlobalScope).
DOMMessage(DOMString), DOMMessage(*mut u64, size_t),
/// Posts a message to the Worker object (dispatched to all tasks). /// Posts a message to the Worker object (dispatched to all tasks).
WorkerPostMessage(TrustedWorkerAddress, DOMString), WorkerPostMessage(TrustedWorkerAddress, DOMString),
/// Releases one reference to the Worker object (dispatched to all tasks). /// Releases one reference to the Worker object (dispatched to all tasks).

@ -1 +1 @@
Subproject commit 3104cf76fc0ceffec78bcbf430faabd524864d2c Subproject commit 33bcfb764e9ab2d8b065915764cd0223e43a3770

View file

@ -1,5 +0,0 @@
[expected-self-properties.html]
type: testharness
[expected interface objects/constructors]
expected: FAIL