mirror of
https://github.com/servo/servo.git
synced 2025-08-05 21:50:18 +01:00
Structured clone the argument to Worker.postMessage.
This commit is contained in:
parent
251d818de2
commit
1dca6146a8
7 changed files with 40 additions and 14 deletions
|
@ -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)) => {
|
||||
|
|
|
@ -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> {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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> {
|
||||
|
|
|
@ -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).
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 3104cf76fc0ceffec78bcbf430faabd524864d2c
|
||||
Subproject commit 33bcfb764e9ab2d8b065915764cd0223e43a3770
|
|
@ -1,5 +0,0 @@
|
|||
[expected-self-properties.html]
|
||||
type: testharness
|
||||
[expected interface objects/constructors]
|
||||
expected: FAIL
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue