diff options
-rw-r--r-- | components/script/dom/bindings/structuredclone.rs | 12 | ||||
-rw-r--r-- | components/script/dom/dedicatedworkerglobalscope.rs | 12 | ||||
-rw-r--r-- | components/script/dom/worker.rs | 20 | ||||
-rw-r--r-- | components/script/lib.rs | 1 | ||||
-rw-r--r-- | components/script/script_task.rs | 4 |
5 files changed, 35 insertions, 14 deletions
diff --git a/components/script/dom/bindings/structuredclone.rs b/components/script/dom/bindings/structuredclone.rs new file mode 100644 index 00000000000..aad4a50a149 --- /dev/null +++ b/components/script/dom/bindings/structuredclone.rs @@ -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, +} diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index 6f8242086f0..8cc5e5c6dda 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -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(()) } diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs index d3681900db3..98392cb6a11 100644 --- a/components/script/dom/worker.rs +++ b/components/script/dom/worker.rs @@ -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); } } diff --git a/components/script/lib.rs b/components/script/lib.rs index bd4b19745a4..50661a60ca1 100644 --- a/components/script/lib.rs +++ b/components/script/lib.rs @@ -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. diff --git a/components/script/script_task.rs b/components/script/script_task.rs index 1c4af120334..4783d8539f4 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -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). |