diff options
author | Ms2ger <ms2ger@gmail.com> | 2015-01-10 16:23:35 +0100 |
---|---|---|
committer | Ms2ger <ms2ger@gmail.com> | 2015-01-10 16:33:26 +0100 |
commit | 5978b21abf0939491527fa55503c4c01363f8bbf (patch) | |
tree | 2454e7f5bfc10f33aa03fb2061422ca70f9373d9 | |
parent | 57aaa60fa5c3c0da1458271d21a1cab1c6a778c4 (diff) | |
download | servo-5978b21abf0939491527fa55503c4c01363f8bbf.tar.gz servo-5978b21abf0939491527fa55503c4c01363f8bbf.zip |
Implement StructuredCloneData::write.
-rw-r--r-- | components/script/dom/bindings/structuredclone.rs | 28 | ||||
-rw-r--r-- | components/script/dom/dedicatedworkerglobalscope.rs | 20 | ||||
-rw-r--r-- | components/script/dom/worker.rs | 21 |
3 files changed, 33 insertions, 36 deletions
diff --git a/components/script/dom/bindings/structuredclone.rs b/components/script/dom/bindings/structuredclone.rs index aad4a50a149..018ac30e340 100644 --- a/components/script/dom/bindings/structuredclone.rs +++ b/components/script/dom/bindings/structuredclone.rs @@ -2,7 +2,15 @@ * 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 dom::bindings::error::Fallible; +use dom::bindings::error::Error::DataClone; + +use js::jsapi::JSContext; +use js::jsapi::{JS_WriteStructuredClone, JS_ClearPendingException}; +use js::jsval::JSVal; + use libc::size_t; +use std::ptr; #[allow(raw_pointer_deriving)] #[deriving(Copy)] @@ -10,3 +18,23 @@ pub struct StructuredCloneData { pub data: *mut u64, pub nbytes: size_t, } + +impl StructuredCloneData { + pub fn write(cx: *mut JSContext, message: JSVal) + -> Fallible<StructuredCloneData> { + let mut data = ptr::null_mut(); + let mut nbytes = 0; + let result = unsafe { + JS_WriteStructuredClone(cx, message, &mut data, &mut nbytes, + ptr::null(), ptr::null_mut()) + }; + if result == 0 { + unsafe { JS_ClearPendingException(cx); } + return Err(DataClone); + } + Ok(StructuredCloneData { + data: data, + nbytes: nbytes, + }) + } +} diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index 8cc5e5c6dda..23ef0089274 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -9,7 +9,6 @@ use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::codegen::InheritTypes::DedicatedWorkerGlobalScopeDerived; use dom::bindings::codegen::InheritTypes::{EventTargetCast, WorkerGlobalScopeCast}; use dom::bindings::error::ErrorResult; -use dom::bindings::error::Error::DataClone; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JSRef, Temporary, RootCollection}; use dom::bindings::refcounted::LiveDOMReferences; @@ -29,7 +28,7 @@ use servo_util::task_state; use servo_util::task_state::{SCRIPT, IN_WORKER}; use js::glue::JS_STRUCTURED_CLONE_VERSION; -use js::jsapi::{JSContext, JS_ReadStructuredClone, JS_WriteStructuredClone, JS_ClearPendingException}; +use js::jsapi::{JSContext, JS_ReadStructuredClone}; use js::jsval::{JSVal, UndefinedValue}; use js::rust::Cx; @@ -231,23 +230,8 @@ impl<'a> PrivateDedicatedWorkerGlobalScopeHelpers for JSRef<'a, DedicatedWorkerG } impl<'a> DedicatedWorkerGlobalScopeMethods for JSRef<'a, DedicatedWorkerGlobalScope> { - #[allow(unsafe_blocks)] fn PostMessage(self, cx: *mut JSContext, message: JSVal) -> ErrorResult { - let mut data = ptr::null_mut(); - let mut nbytes = 0; - let result = unsafe { - JS_WriteStructuredClone(cx, message, &mut data, &mut nbytes, - ptr::null(), ptr::null_mut()) - }; - if result == 0 { - unsafe { JS_ClearPendingException(cx); } - return Err(DataClone); - } - let data = StructuredCloneData { - data: data, - nbytes: nbytes, - }; - + let data = try!(StructuredCloneData::write(cx, message)); let worker = self.worker.borrow().as_ref().unwrap().clone(); self.parent_sender.send(ScriptMsg::RunnableMsg( box WorkerMessageHandler::new(worker, data))); diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs index 98392cb6a11..60675fa4b8a 100644 --- a/components/script/dom/worker.rs +++ b/components/script/dom/worker.rs @@ -7,7 +7,7 @@ use dom::bindings::codegen::Bindings::WorkerBinding::WorkerMethods; use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::codegen::InheritTypes::EventTargetCast; use dom::bindings::error::{Fallible, ErrorResult}; -use dom::bindings::error::Error::{Syntax, DataClone}; +use dom::bindings::error::Error::Syntax; use dom::bindings::global::{GlobalRef, GlobalField}; use dom::bindings::js::{JSRef, Temporary}; use dom::bindings::refcounted::Trusted; @@ -23,7 +23,7 @@ use servo_util::str::DOMString; use js::glue::JS_STRUCTURED_CLONE_VERSION; use js::jsapi::JSContext; -use js::jsapi::{JS_ReadStructuredClone, JS_WriteStructuredClone, JS_ClearPendingException}; +use js::jsapi::JS_ReadStructuredClone; use js::jsval::{JSVal, UndefinedValue}; use url::UrlParser; @@ -101,23 +101,8 @@ impl Worker { } impl<'a> WorkerMethods for JSRef<'a, Worker> { - #[allow(unsafe_blocks)] fn PostMessage(self, cx: *mut JSContext, message: JSVal) -> ErrorResult { - let mut data = ptr::null_mut(); - let mut nbytes = 0; - let result = unsafe { - JS_WriteStructuredClone(cx, message, &mut data, &mut nbytes, - ptr::null(), ptr::null_mut()) - }; - if result == 0 { - unsafe { JS_ClearPendingException(cx); } - return Err(DataClone); - } - let data = StructuredCloneData { - data: data, - nbytes: nbytes, - }; - + let data = try!(StructuredCloneData::write(cx, message)); let address = Trusted::new(cx, self, self.global.root().r().script_chan().clone()); self.sender.send((address, ScriptMsg::DOMMessage(data))); Ok(()) |