Create a StructuredCloneData struct to encapsulate the result of a structured clone.

This commit is contained in:
Ms2ger 2015-01-10 15:39:47 +01:00
parent 1834359f16
commit 57aaa60fa5
5 changed files with 35 additions and 14 deletions

View file

@ -0,0 +1,12 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use libc::size_t;
#[allow(raw_pointer_deriving)]
#[deriving(Copy)]
pub struct StructuredCloneData {
pub data: *mut u64,
pub nbytes: size_t,
}

View file

@ -13,6 +13,7 @@ use dom::bindings::error::Error::DataClone;
use dom::bindings::global::GlobalRef;
use dom::bindings::js::{JSRef, Temporary, RootCollection};
use dom::bindings::refcounted::LiveDOMReferences;
use dom::bindings::structuredclone::StructuredCloneData;
use dom::bindings::utils::Reflectable;
use dom::eventtarget::{EventTarget, EventTargetHelpers, EventTargetTypeId};
use dom::messageevent::MessageEvent;
@ -200,12 +201,12 @@ impl<'a> PrivateDedicatedWorkerGlobalScopeHelpers for JSRef<'a, DedicatedWorkerG
#[allow(unsafe_blocks)]
fn handle_event(self, msg: ScriptMsg) {
match msg {
ScriptMsg::DOMMessage(data, nbytes) => {
ScriptMsg::DOMMessage(data) => {
let mut message = UndefinedValue();
let scope: JSRef<WorkerGlobalScope> = WorkerGlobalScopeCast::from_ref(self);
unsafe {
assert!(JS_ReadStructuredClone(
scope.get_cx(), data as *const u64, nbytes,
scope.get_cx(), data.data as *const u64, data.nbytes,
JS_STRUCTURED_CLONE_VERSION, &mut message,
ptr::null(), ptr::null_mut()) != 0);
}
@ -242,9 +243,14 @@ impl<'a> DedicatedWorkerGlobalScopeMethods for JSRef<'a, DedicatedWorkerGlobalSc
unsafe { JS_ClearPendingException(cx); }
return Err(DataClone);
}
let data = StructuredCloneData {
data: data,
nbytes: nbytes,
};
let worker = self.worker.borrow().as_ref().unwrap().clone();
self.parent_sender.send(ScriptMsg::RunnableMsg(box WorkerMessageHandler::new(worker, data, nbytes)));
self.parent_sender.send(ScriptMsg::RunnableMsg(
box WorkerMessageHandler::new(worker, data)));
Ok(())
}

View file

@ -11,6 +11,7 @@ use dom::bindings::error::Error::{Syntax, DataClone};
use dom::bindings::global::{GlobalRef, GlobalField};
use dom::bindings::js::{JSRef, Temporary};
use dom::bindings::refcounted::Trusted;
use dom::bindings::structuredclone::StructuredCloneData;
use dom::bindings::trace::JSTraceable;
use dom::bindings::utils::{Reflectable, reflect_dom_object};
use dom::dedicatedworkerglobalscope::DedicatedWorkerGlobalScope;
@ -26,7 +27,6 @@ use js::jsapi::{JS_ReadStructuredClone, JS_WriteStructuredClone, JS_ClearPending
use js::jsval::{JSVal, UndefinedValue};
use url::UrlParser;
use libc::size_t;
use std::cell::Cell;
use std::ptr;
@ -82,7 +82,7 @@ impl Worker {
#[allow(unsafe_blocks)]
pub fn handle_message(address: TrustedWorkerAddress,
data: *mut u64, nbytes: size_t) {
data: StructuredCloneData) {
let worker = address.to_temporary().root();
let global = worker.r().global.root();
@ -90,7 +90,7 @@ impl Worker {
let mut message = UndefinedValue();
unsafe {
assert!(JS_ReadStructuredClone(
global.r().get_cx(), data as *const u64, nbytes,
global.r().get_cx(), data.data as *const u64, data.nbytes,
JS_STRUCTURED_CLONE_VERSION, &mut message,
ptr::null(), ptr::null_mut()) != 0);
}
@ -113,9 +113,13 @@ impl<'a> WorkerMethods for JSRef<'a, Worker> {
unsafe { JS_ClearPendingException(cx); }
return Err(DataClone);
}
let data = StructuredCloneData {
data: data,
nbytes: nbytes,
};
let address = Trusted::new(cx, self, self.global.root().r().script_chan().clone());
self.sender.send((address, ScriptMsg::DOMMessage(data, nbytes)));
self.sender.send((address, ScriptMsg::DOMMessage(data)));
Ok(())
}
@ -124,22 +128,20 @@ impl<'a> WorkerMethods for JSRef<'a, Worker> {
pub struct WorkerMessageHandler {
addr: TrustedWorkerAddress,
data: *mut u64,
nbytes: size_t
data: StructuredCloneData,
}
impl WorkerMessageHandler {
pub fn new(addr: TrustedWorkerAddress, data: *mut u64, nbytes: size_t) -> WorkerMessageHandler {
pub fn new(addr: TrustedWorkerAddress, data: StructuredCloneData) -> WorkerMessageHandler {
WorkerMessageHandler {
addr: addr,
data: data,
nbytes: nbytes,
}
}
}
impl Runnable for WorkerMessageHandler {
fn handler(&self){
Worker::handle_message(self.addr.clone(), self.data, self.nbytes);
Worker::handle_message(self.addr.clone(), self.data);
}
}

View file

@ -64,6 +64,7 @@ pub mod dom {
pub mod conversions;
mod proxyhandler;
pub mod str;
pub mod structuredclone;
pub mod trace;
/// Generated JS-Rust bindings.

View file

@ -19,6 +19,7 @@ use dom::bindings::global::GlobalRef;
use dom::bindings::js::{JS, JSRef, Temporary, OptionalRootable};
use dom::bindings::js::{RootCollection, RootCollectionPtr};
use dom::bindings::refcounted::{LiveDOMReferences, Trusted};
use dom::bindings::structuredclone::StructuredCloneData;
use dom::bindings::trace::JSTraceable;
use dom::bindings::utils::{wrap_for_same_compartment, pre_wrap};
use dom::document::{Document, IsHTMLDocument, DocumentHelpers, DocumentSource};
@ -77,7 +78,6 @@ use js;
use url::Url;
use libc;
use libc::size_t;
use std::any::{Any, AnyRefExt};
use std::cell::Cell;
use std::comm::{channel, Sender, Receiver, Select};
@ -120,7 +120,7 @@ pub enum ScriptMsg {
ExitWindow(PipelineId),
/// Message sent through Worker.postMessage (only dispatched to
/// DedicatedWorkerGlobalScope).
DOMMessage(*mut u64, size_t),
DOMMessage(StructuredCloneData),
/// Generic message that encapsulates event handling.
RunnableMsg(Box<Runnable+Send>),
/// A DOM object's last pinned reference was removed (dispatched to all tasks).