aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/serviceworker.rs
diff options
context:
space:
mode:
authorGregory Terzian <gterzian@users.noreply.github.com>2019-06-26 00:25:48 +0800
committerGregory Terzian <gterzian@users.noreply.github.com>2019-10-19 14:28:18 +0800
commit2f8932a6a1e2666567435114383b3acd1899aca7 (patch)
tree8490d198d1c22015afeae84ad25f21ecca462415 /components/script/dom/serviceworker.rs
parentc3b17c1201441c9a24c4b272108aea0196fbf1b9 (diff)
downloadservo-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.rs82
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);