Structured clone the argument to DedicatedWorkerGlobalScope.postMessage.

This commit is contained in:
Ms2ger 2014-08-12 20:58:57 +02:00
parent 1dca6146a8
commit eaea735f72
16 changed files with 36 additions and 115 deletions

View file

@ -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<EventHandlerNonNull> {

View file

@ -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<EventTarget>,
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<Event> = EventCast::from_ref(&*messageevent);
target.dispatch_event_with_target(None, &*event).unwrap();
}
pub fn dispatch_jsval(target: &JSRef<EventTarget>,
scope: &GlobalRef,
message: JSVal) {

View file

@ -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;
};

View file

@ -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<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);
}
}

View file

@ -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),
}
}

View file

@ -1,5 +0,0 @@
[WorkerGlobalScope_EventTarget.htm]
type: testharness
[Test Description: WorkerGlobalScope implements EventTarget]
expected: FAIL

View file

@ -3,9 +3,6 @@
[unsupported_scheme]
expected: FAIL
[data_url]
expected: FAIL
[about_blank]
expected: FAIL

View file

@ -1,5 +0,0 @@
[return-value.html]
type: testharness
[return value of postMessage]
expected: FAIL

View file

@ -1,5 +0,0 @@
[second-argument-null.html]
type: testharness
[Using null in postMessage\'s second argument]
expected: FAIL

View file

@ -1,5 +0,0 @@
[setting-postMessage.html]
type: testharness
[setting postMessage]
expected: FAIL

View file

@ -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

View file

@ -1,5 +0,0 @@
[self.html]
type: testharness
[self]
expected: FAIL

View file

@ -1,5 +0,0 @@
[005.html]
type: testharness
[importScripts separate scripts]
expected: FAIL

View file

@ -1,5 +1,6 @@
[006.html]
type: testharness
expected: TIMEOUT
[importScripts uncaught exception]
expected: FAIL
expected: TIMEOUT

View file

@ -1,5 +0,0 @@
[003.html]
type: testharness
[URL encoding, dedicated worker]
expected: FAIL

View file

@ -1,5 +0,0 @@
[001.html]
type: testharness
[worker global scope, dedicated worker]
expected: FAIL