diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2018-12-09 19:21:31 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-09 19:21:31 -0500 |
commit | ddfc799f4d0edd5a39b76c5582712d84a9f236a0 (patch) | |
tree | ab030d6e0e3d8f56b6122c8e0a3a98666a6baa3b | |
parent | f370fdfc9c20f224c5f0df5f7a9a0da892687591 (diff) | |
parent | 235fb5952dfed86e97347eeb9ac4e3f1aadcf544 (diff) | |
download | servo-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 -->
-rw-r--r-- | components/script/dom/mod.rs | 1 | ||||
-rw-r--r-- | components/script/dom/navigationpreloadmanager.rs | 141 | ||||
-rw-r--r-- | components/script/dom/serviceworkerregistration.rs | 42 | ||||
-rw-r--r-- | components/script/dom/webidls/NavigationPreloadManager.webidl | 17 | ||||
-rw-r--r-- | components/script/dom/webidls/ServiceWorkerRegistration.webidl | 2 |
5 files changed, 199 insertions, 4 deletions
diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs index b9a9bc60663..7c1aa2593ee 100644 --- a/components/script/dom/mod.rs +++ b/components/script/dom/mod.rs @@ -398,6 +398,7 @@ pub mod mouseevent; pub mod mutationobserver; pub mod mutationrecord; pub mod namednodemap; +pub mod navigationpreloadmanager; pub mod navigator; pub mod navigatorinfo; pub mod node; 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 + } +} diff --git a/components/script/dom/serviceworkerregistration.rs b/components/script/dom/serviceworkerregistration.rs index cb0e7996b35..a2165a82115 100644 --- a/components/script/dom/serviceworkerregistration.rs +++ b/components/script/dom/serviceworkerregistration.rs @@ -2,16 +2,18 @@ * 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::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::ServiceWorkerBinding::ServiceWorkerState; use crate::dom::bindings::codegen::Bindings::ServiceWorkerRegistrationBinding::ServiceWorkerUpdateViaCache; use crate::dom::bindings::codegen::Bindings::ServiceWorkerRegistrationBinding::{ ServiceWorkerRegistrationMethods, Wrap, }; -use crate::dom::bindings::reflector::reflect_dom_object; -use crate::dom::bindings::root::{Dom, DomRoot}; -use crate::dom::bindings::str::USVString; +use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom}; +use crate::dom::bindings::str::{ByteString, USVString}; use crate::dom::eventtarget::EventTarget; use crate::dom::globalscope::GlobalScope; +use crate::dom::navigationpreloadmanager::NavigationPreloadManager; use crate::dom::serviceworker::ServiceWorker; use crate::dom::workerglobalscope::prepare_workerscope_init; use dom_struct::dom_struct; @@ -25,7 +27,10 @@ pub struct ServiceWorkerRegistration { active: Option<Dom<ServiceWorker>>, installing: Option<Dom<ServiceWorker>>, waiting: Option<Dom<ServiceWorker>>, + navigation_preload: MutNullableDom<NavigationPreloadManager>, scope: ServoUrl, + navigation_preload_enabled: Cell<bool>, + navigation_preload_header_value: DomRefCell<Option<ByteString>>, update_via_cache: ServiceWorkerUpdateViaCache, uninstalling: Cell<bool>, } @@ -37,7 +42,10 @@ impl ServiceWorkerRegistration { active: Some(Dom::from_ref(active_sw)), installing: None, waiting: None, + navigation_preload: MutNullableDom::new(None), scope: scope, + navigation_preload_enabled: Cell::new(false), + navigation_preload_header_value: DomRefCell::new(None), update_via_cache: ServiceWorkerUpdateViaCache::Imports, uninstalling: Cell::new(false), } @@ -52,6 +60,7 @@ impl ServiceWorkerRegistration { let active_worker = ServiceWorker::install_serviceworker(global, script_url.clone(), scope.clone(), true); active_worker.set_transition_state(ServiceWorkerState::Installed); + reflect_dom_object( Box::new(ServiceWorkerRegistration::new_inherited( &*active_worker, @@ -62,10 +71,31 @@ impl ServiceWorkerRegistration { ) } + pub fn active(&self) -> Option<&ServiceWorker> { + self.active.as_ref().map(|sw| &**sw) + } + pub fn get_installed(&self) -> &ServiceWorker { self.active.as_ref().unwrap() } + pub fn get_navigation_preload_header_value(&self) -> Option<ByteString> { + self.navigation_preload_header_value.borrow().clone() + } + + pub fn set_navigation_preload_header_value(&self, value: ByteString) { + let mut header_value = self.navigation_preload_header_value.borrow_mut(); + *header_value = Some(value); + } + + pub fn get_navigation_preload_enabled(&self) -> bool { + self.navigation_preload_enabled.get() + } + + pub fn set_navigation_preload_enabled(&self, flag: bool) { + self.navigation_preload_enabled.set(flag) + } + pub fn get_uninstalling(&self) -> bool { self.uninstalling.get() } @@ -147,4 +177,10 @@ impl ServiceWorkerRegistrationMethods for ServiceWorkerRegistration { fn UpdateViaCache(&self) -> ServiceWorkerUpdateViaCache { self.update_via_cache } + + // https://w3c.github.io/ServiceWorker/#service-worker-registration-navigationpreload + fn NavigationPreload(&self) -> DomRoot<NavigationPreloadManager> { + self.navigation_preload + .or_init(|| NavigationPreloadManager::new(&self.global(), &self)) + } } diff --git a/components/script/dom/webidls/NavigationPreloadManager.webidl b/components/script/dom/webidls/NavigationPreloadManager.webidl new file mode 100644 index 00000000000..23988251fb1 --- /dev/null +++ b/components/script/dom/webidls/NavigationPreloadManager.webidl @@ -0,0 +1,17 @@ +/* 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/. */ + +// https://w3c.github.io/ServiceWorker/#navigation-preload-manager +[Pref="dom.serviceworker.enabled", SecureContext, Exposed=(Window,Worker)] +interface NavigationPreloadManager { + Promise<void> enable(); + Promise<void> disable(); + Promise<void> setHeaderValue(ByteString value); + Promise<NavigationPreloadState> getState(); +}; + +dictionary NavigationPreloadState { + boolean enabled = false; + ByteString headerValue; +}; diff --git a/components/script/dom/webidls/ServiceWorkerRegistration.webidl b/components/script/dom/webidls/ServiceWorkerRegistration.webidl index 014f52ad27c..f7a10659513 100644 --- a/components/script/dom/webidls/ServiceWorkerRegistration.webidl +++ b/components/script/dom/webidls/ServiceWorkerRegistration.webidl @@ -8,7 +8,7 @@ interface ServiceWorkerRegistration : EventTarget { readonly attribute ServiceWorker? installing; readonly attribute ServiceWorker? waiting; readonly attribute ServiceWorker? active; - // [SameObject] readonly attribute NavigationPreloadManager navigationPreload; + [SameObject] readonly attribute NavigationPreloadManager navigationPreload; readonly attribute USVString scope; readonly attribute ServiceWorkerUpdateViaCache updateViaCache; |