aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMs2ger <ms2ger@gmail.com>2015-01-10 16:30:27 +0100
committerMs2ger <ms2ger@gmail.com>2015-01-10 16:33:26 +0100
commit14ff55443fc872f0806a6267655689d48002a3b3 (patch)
tree59adff84613e3f1bc801f202ede840f6cf22798f
parent5978b21abf0939491527fa55503c4c01363f8bbf (diff)
downloadservo-14ff55443fc872f0806a6267655689d48002a3b3.tar.gz
servo-14ff55443fc872f0806a6267655689d48002a3b3.zip
Implement StructuredCloneData::read.
-rw-r--r--components/script/dom/bindings/structuredclone.rs16
-rw-r--r--components/script/dom/dedicatedworkerglobalscope.rs16
-rw-r--r--components/script/dom/worker.rs17
3 files changed, 21 insertions, 28 deletions
diff --git a/components/script/dom/bindings/structuredclone.rs b/components/script/dom/bindings/structuredclone.rs
index 018ac30e340..843b7bea30c 100644
--- a/components/script/dom/bindings/structuredclone.rs
+++ b/components/script/dom/bindings/structuredclone.rs
@@ -4,10 +4,13 @@
use dom::bindings::error::Fallible;
use dom::bindings::error::Error::DataClone;
+use dom::bindings::global::GlobalRef;
+use js::glue::JS_STRUCTURED_CLONE_VERSION;
use js::jsapi::JSContext;
use js::jsapi::{JS_WriteStructuredClone, JS_ClearPendingException};
-use js::jsval::JSVal;
+use js::jsapi::JS_ReadStructuredClone;
+use js::jsval::{JSVal, UndefinedValue};
use libc::size_t;
use std::ptr;
@@ -37,4 +40,15 @@ impl StructuredCloneData {
nbytes: nbytes,
})
}
+
+ pub fn read(self, global: GlobalRef) -> JSVal {
+ let mut message = UndefinedValue();
+ unsafe {
+ assert!(JS_ReadStructuredClone(
+ global.get_cx(), self.data as *const u64, self.nbytes,
+ JS_STRUCTURED_CLONE_VERSION, &mut message,
+ ptr::null(), ptr::null_mut()) != 0);
+ }
+ message
+ }
}
diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs
index 23ef0089274..1403344dad2 100644
--- a/components/script/dom/dedicatedworkerglobalscope.rs
+++ b/components/script/dom/dedicatedworkerglobalscope.rs
@@ -27,13 +27,11 @@ use servo_util::task::spawn_named;
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};
-use js::jsval::{JSVal, UndefinedValue};
+use js::jsapi::JSContext;
+use js::jsval::JSVal;
use js::rust::Cx;
use std::rc::Rc;
-use std::ptr;
use url::Url;
/// A ScriptChan that can be cloned freely and will silently send a TrustedWorkerAddress with
@@ -197,20 +195,12 @@ trait PrivateDedicatedWorkerGlobalScopeHelpers {
}
impl<'a> PrivateDedicatedWorkerGlobalScopeHelpers for JSRef<'a, DedicatedWorkerGlobalScope> {
- #[allow(unsafe_blocks)]
fn handle_event(self, msg: ScriptMsg) {
match msg {
ScriptMsg::DOMMessage(data) => {
- let mut message = UndefinedValue();
let scope: JSRef<WorkerGlobalScope> = WorkerGlobalScopeCast::from_ref(self);
- unsafe {
- assert!(JS_ReadStructuredClone(
- scope.get_cx(), data.data as *const u64, data.nbytes,
- JS_STRUCTURED_CLONE_VERSION, &mut message,
- ptr::null(), ptr::null_mut()) != 0);
- }
-
let target: JSRef<EventTarget> = EventTargetCast::from_ref(self);
+ let message = data.read(GlobalRef::Worker(scope));
MessageEvent::dispatch_jsval(target, GlobalRef::Worker(scope), message);
},
ScriptMsg::RunnableMsg(runnable) => {
diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs
index 60675fa4b8a..3822e4e538c 100644
--- a/components/script/dom/worker.rs
+++ b/components/script/dom/worker.rs
@@ -21,14 +21,11 @@ use script_task::{ScriptChan, ScriptMsg, Runnable};
use servo_util::str::DOMString;
-use js::glue::JS_STRUCTURED_CLONE_VERSION;
use js::jsapi::JSContext;
-use js::jsapi::JS_ReadStructuredClone;
-use js::jsval::{JSVal, UndefinedValue};
+use js::jsval::JSVal;
use url::UrlParser;
use std::cell::Cell;
-use std::ptr;
pub type TrustedWorkerAddress = Trusted<Worker>;
@@ -80,22 +77,14 @@ impl Worker {
Ok(Temporary::from_rooted(worker.r()))
}
- #[allow(unsafe_blocks)]
pub fn handle_message(address: TrustedWorkerAddress,
data: StructuredCloneData) {
let worker = address.to_temporary().root();
let global = worker.r().global.root();
-
- let mut message = UndefinedValue();
- unsafe {
- assert!(JS_ReadStructuredClone(
- global.r().get_cx(), data.data as *const u64, data.nbytes,
- JS_STRUCTURED_CLONE_VERSION, &mut message,
- ptr::null(), ptr::null_mut()) != 0);
- }
-
let target: JSRef<EventTarget> = EventTargetCast::from_ref(worker.r());
+
+ let message = data.read(global.r());
MessageEvent::dispatch_jsval(target, global.r(), message);
}
}