diff options
author | Gregory Terzian <gterzian@users.noreply.github.com> | 2019-06-26 00:25:48 +0800 |
---|---|---|
committer | Gregory Terzian <gterzian@users.noreply.github.com> | 2019-10-19 14:28:18 +0800 |
commit | 2f8932a6a1e2666567435114383b3acd1899aca7 (patch) | |
tree | 8490d198d1c22015afeae84ad25f21ecca462415 /components/script/dom/serviceworker.rs | |
parent | c3b17c1201441c9a24c4b272108aea0196fbf1b9 (diff) | |
download | servo-2f8932a6a1e2666567435114383b3acd1899aca7.tar.gz servo-2f8932a6a1e2666567435114383b3acd1899aca7.zip |
continue messageport, transferable, postmessage options
Diffstat (limited to 'components/script/dom/serviceworker.rs')
-rw-r--r-- | components/script/dom/serviceworker.rs | 82 |
1 files changed, 59 insertions, 23 deletions
diff --git a/components/script/dom/serviceworker.rs b/components/script/dom/serviceworker.rs index 8d33337f1c5..ec64036d305 100644 --- a/components/script/dom/serviceworker.rs +++ b/components/script/dom/serviceworker.rs @@ -4,6 +4,7 @@ use crate::dom::abstractworker::SimpleWorkerErrorHandler; use crate::dom::bindings::cell::DomRefCell; +use crate::dom::bindings::codegen::Bindings::MessagePortBinding::PostMessageOptions; use crate::dom::bindings::codegen::Bindings::ServiceWorkerBinding::{ ServiceWorkerMethods, ServiceWorkerState, Wrap, }; @@ -13,15 +14,15 @@ use crate::dom::bindings::refcounted::Trusted; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::USVString; -use crate::dom::bindings::structuredclone::StructuredCloneData; +use crate::dom::bindings::structuredclone; +use crate::dom::bindings::trace::RootedTraceableBox; use crate::dom::eventtarget::EventTarget; use crate::dom::globalscope::GlobalScope; use crate::script_runtime::JSContext; use crate::task::TaskOnce; use dom_struct::dom_struct; -use js::jsapi::JSContext; -use js::jsval::UndefinedValue; -use js::rust::HandleValue; +use js::jsapi::{Heap, JSObject}; +use js::rust::{CustomAutoRooter, CustomAutoRooterGuard, HandleValue}; use script_traits::{DOMMessage, ScriptMsg}; use servo_url::ServoUrl; use std::cell::Cell; @@ -79,41 +80,76 @@ impl ServiceWorker { pub fn get_script_url(&self) -> ServoUrl { ServoUrl::parse(&self.script_url.borrow().clone()).unwrap() } -} - -impl ServiceWorkerMethods for ServiceWorker { - // https://w3c.github.io/ServiceWorker/#service-worker-state-attribute - fn State(&self) -> ServiceWorkerState { - self.state.get() - } - // https://w3c.github.io/ServiceWorker/#service-worker-url-attribute - fn ScriptURL(&self) -> USVString { - USVString(self.script_url.borrow().clone()) - } - - // https://w3c.github.io/ServiceWorker/#service-worker-postmessage - fn PostMessage(&self, cx: JSContext, message: HandleValue) -> ErrorResult { + /// https://w3c.github.io/ServiceWorker/#service-worker-postmessage + fn post_message_impl( + &self, + cx: JSContext, + message: HandleValue, + transfer: CustomAutoRooterGuard<Vec<*mut JSObject>>, + ) -> ErrorResult { // Step 1 if let ServiceWorkerState::Redundant = self.state.get() { return Err(Error::InvalidState); } // Step 7 - rooted!(in(*cx) let transfer = UndefinedValue()); - let data = StructuredCloneData::write(*cx, message, transfer.handle())?; + let data = structuredclone::write(cx, message, Some(transfer))?; + let incumbent = GlobalScope::incumbent().expect("no incumbent global?"); let msg_vec = DOMMessage { - origin: self.global().origin().immutable().ascii_serialization(), - data: data.move_to_arraybuffer(), + origin: incumbent.origin().immutable().clone(), + data, }; let _ = self .global() .script_to_constellation_chan() .send(ScriptMsg::ForwardDOMMessage( msg_vec, - self.scope_url.clone() + self.scope_url.clone(), )); Ok(()) } +} + +impl ServiceWorkerMethods for ServiceWorker { + // https://w3c.github.io/ServiceWorker/#service-worker-state-attribute + fn State(&self) -> ServiceWorkerState { + self.state.get() + } + + // https://w3c.github.io/ServiceWorker/#service-worker-url-attribute + fn ScriptURL(&self) -> USVString { + USVString(self.script_url.borrow().clone()) + } + + /// https://w3c.github.io/ServiceWorker/#service-worker-postmessage + fn PostMessage( + &self, + cx: JSContext, + message: HandleValue, + transfer: CustomAutoRooterGuard<Vec<*mut JSObject>>, + ) -> ErrorResult { + self.post_message_impl(cx, message, transfer) + } + + /// https://w3c.github.io/ServiceWorker/#service-worker-postmessage + fn PostMessage_( + &self, + cx: JSContext, + message: HandleValue, + options: RootedTraceableBox<PostMessageOptions>, + ) -> ErrorResult { + let mut rooted = CustomAutoRooter::new( + options + .transfer + .as_ref() + .unwrap_or(&Vec::with_capacity(0)) + .iter() + .map(|js: &RootedTraceableBox<Heap<*mut JSObject>>| js.get()) + .collect(), + ); + let guard = CustomAutoRooterGuard::new(*cx, &mut rooted); + self.post_message_impl(cx, message, guard) + } // https://w3c.github.io/ServiceWorker/#service-worker-container-onerror-attribute event_handler!(error, GetOnerror, SetOnerror); |