aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/navigationpreloadmanager.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/navigationpreloadmanager.rs')
-rw-r--r--components/script/dom/navigationpreloadmanager.rs136
1 files changed, 136 insertions, 0 deletions
diff --git a/components/script/dom/navigationpreloadmanager.rs b/components/script/dom/navigationpreloadmanager.rs
new file mode 100644
index 00000000000..d45fa9ac5f8
--- /dev/null
+++ b/components/script/dom/navigationpreloadmanager.rs
@@ -0,0 +1,136 @@
+/* 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 https://mozilla.org/MPL/2.0/. */
+
+use crate::dom::bindings::codegen::Bindings::NavigationPreloadManagerBinding::NavigationPreloadManagerMethods;
+use crate::dom::bindings::codegen::Bindings::NavigationPreloadManagerBinding::NavigationPreloadState;
+use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector};
+use crate::dom::bindings::root::{Dom, DomRoot};
+use crate::dom::bindings::str::ByteString;
+use crate::dom::domexception::{DOMErrorName, DOMException};
+use crate::dom::globalscope::GlobalScope;
+use crate::dom::promise::Promise;
+use crate::dom::serviceworkerregistration::ServiceWorkerRegistration;
+use crate::realms::InRealm;
+use dom_struct::dom_struct;
+use js::jsval::UndefinedValue;
+use std::rc::Rc;
+
+#[dom_struct]
+pub struct NavigationPreloadManager {
+ reflector_: Reflector,
+ serviceworker_registration: Dom<ServiceWorkerRegistration>,
+}
+
+impl NavigationPreloadManager {
+ fn new_inherited(registration: &ServiceWorkerRegistration) -> NavigationPreloadManager {
+ NavigationPreloadManager {
+ reflector_: Reflector::new(),
+ serviceworker_registration: Dom::from_ref(registration),
+ }
+ }
+
+ #[allow(unrooted_must_root)]
+ pub fn new(
+ global: &GlobalScope,
+ registration: &ServiceWorkerRegistration,
+ ) -> DomRoot<NavigationPreloadManager> {
+ let manager = NavigationPreloadManager::new_inherited(&*registration);
+ reflect_dom_object(Box::new(manager), global)
+ }
+}
+
+impl NavigationPreloadManagerMethods for NavigationPreloadManager {
+ // https://w3c.github.io/ServiceWorker/#navigation-preload-manager-enable
+ fn Enable(&self, comp: InRealm) -> Rc<Promise> {
+ let promise = Promise::new_in_current_realm(&*self.global(), comp);
+
+ // 2.
+ if self.serviceworker_registration.is_active() {
+ promise.reject_native(&DOMException::new(
+ &self.global(),
+ DOMErrorName::InvalidStateError,
+ ));
+ } else {
+ // 3.
+ self.serviceworker_registration
+ .set_navigation_preload_enabled(true);
+
+ // 4.
+ promise.resolve_native(&UndefinedValue());
+ }
+
+ promise
+ }
+
+ // https://w3c.github.io/ServiceWorker/#navigation-preload-manager-disable
+ fn Disable(&self, comp: InRealm) -> Rc<Promise> {
+ let promise = Promise::new_in_current_realm(&*self.global(), comp);
+
+ // 2.
+ if self.serviceworker_registration.is_active() {
+ promise.reject_native(&DOMException::new(
+ &self.global(),
+ DOMErrorName::InvalidStateError,
+ ));
+ } else {
+ // 3.
+ self.serviceworker_registration
+ .set_navigation_preload_enabled(false);
+
+ // 4.
+ promise.resolve_native(&UndefinedValue());
+ }
+
+ promise
+ }
+
+ // https://w3c.github.io/ServiceWorker/#navigation-preload-manager-setheadervalue
+ fn SetHeaderValue(&self, value: ByteString, comp: InRealm) -> Rc<Promise> {
+ let promise = Promise::new_in_current_realm(&*self.global(), comp);
+
+ // 2.
+ if self.serviceworker_registration.is_active() {
+ promise.reject_native(&DOMException::new(
+ &self.global(),
+ DOMErrorName::InvalidStateError,
+ ));
+ } else {
+ // 3.
+ self.serviceworker_registration
+ .set_navigation_preload_header_value(value);
+
+ // 4.
+ promise.resolve_native(&UndefinedValue());
+ }
+
+ promise
+ }
+
+ // https://w3c.github.io/ServiceWorker/#navigation-preload-manager-getstate
+ fn GetState(&self, comp: InRealm) -> Rc<Promise> {
+ let promise = Promise::new_in_current_realm(&*self.global(), comp);
+ // 2.
+ let mut state = NavigationPreloadState::empty();
+
+ // 3.
+ if self.serviceworker_registration.is_active() {
+ if self
+ .serviceworker_registration
+ .get_navigation_preload_enabled()
+ {
+ state.enabled = true;
+ }
+ }
+
+ // 4.
+ state.headerValue = self
+ .serviceworker_registration
+ .get_navigation_preload_header_value();
+
+ // 5.
+ promise.resolve_native(&state);
+
+ promise
+ }
+}