aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/navigationpreloadmanager.rs
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2018-12-09 19:21:31 -0500
committerGitHub <noreply@github.com>2018-12-09 19:21:31 -0500
commitddfc799f4d0edd5a39b76c5582712d84a9f236a0 (patch)
treeab030d6e0e3d8f56b6122c8e0a3a98666a6baa3b /components/script/dom/navigationpreloadmanager.rs
parentf370fdfc9c20f224c5f0df5f7a9a0da892687591 (diff)
parent235fb5952dfed86e97347eeb9ac4e3f1aadcf544 (diff)
downloadservo-ddfc799f4d0edd5a39b76c5582712d84a9f236a0.tar.gz
servo-ddfc799f4d0edd5a39b76c5582712d84a9f236a0.zip
Auto merge of #22218 - CYBAI:sw-up-to-date, r=jdm
Implement NavigationPreloadManager for ServiceWorker --- - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [x] These changes fix part of #19302 . - [ ] There are tests for these changes OR - [ ] These changes do not require tests because _____ <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/22218) <!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom/navigationpreloadmanager.rs')
-rw-r--r--components/script/dom/navigationpreloadmanager.rs141
1 files changed, 141 insertions, 0 deletions
diff --git a/components/script/dom/navigationpreloadmanager.rs b/components/script/dom/navigationpreloadmanager.rs
new file mode 100644
index 00000000000..f955f6af9eb
--- /dev/null
+++ b/components/script/dom/navigationpreloadmanager.rs
@@ -0,0 +1,141 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+use crate::dom::bindings::codegen::Bindings::NavigationPreloadManagerBinding::NavigationPreloadState;
+use crate::dom::bindings::codegen::Bindings::NavigationPreloadManagerBinding::{
+ NavigationPreloadManagerMethods, Wrap,
+};
+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 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, Wrap)
+ }
+}
+
+impl NavigationPreloadManagerMethods for NavigationPreloadManager {
+ #[allow(unrooted_must_root)]
+ // https://w3c.github.io/ServiceWorker/#navigation-preload-manager-enable
+ fn Enable(&self) -> Rc<Promise> {
+ let promise = Promise::new(&*self.global());
+
+ // 2.
+ if self.serviceworker_registration.active().is_none() {
+ 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
+ }
+
+ #[allow(unrooted_must_root)]
+ // https://w3c.github.io/ServiceWorker/#navigation-preload-manager-disable
+ fn Disable(&self) -> Rc<Promise> {
+ let promise = Promise::new(&*self.global());
+
+ // 2.
+ if self.serviceworker_registration.active().is_none() {
+ 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
+ }
+
+ #[allow(unrooted_must_root)]
+ // https://w3c.github.io/ServiceWorker/#navigation-preload-manager-setheadervalue
+ fn SetHeaderValue(&self, value: ByteString) -> Rc<Promise> {
+ let promise = Promise::new(&*self.global());
+
+ // 2.
+ if self.serviceworker_registration.active().is_none() {
+ 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
+ }
+
+ #[allow(unrooted_must_root)]
+ // https://w3c.github.io/ServiceWorker/#navigation-preload-manager-getstate
+ fn GetState(&self) -> Rc<Promise> {
+ let promise = Promise::new(&*self.global());
+ // 2.
+ let mut state = NavigationPreloadState::empty();
+
+ // 3.
+ if let Some(_) = self.serviceworker_registration.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
+ }
+}