diff options
author | Patrick Trottier <patrick.arrow206@outlook.com> | 2016-09-28 21:36:11 +0000 |
---|---|---|
committer | Patrick Trottier <patrick.arrow206@outlook.com> | 2016-10-31 15:20:28 +0000 |
commit | e6b879048fa7224885605cd695ca5b853799f55a (patch) | |
tree | ffebe8f14776a8e89d620c7a343c53b272b916c5 /components/script/dom/serviceworkercontainer.rs | |
parent | e888b7653479022bf5aecc518a73f1cf627e318a (diff) | |
download | servo-e6b879048fa7224885605cd695ca5b853799f55a.tar.gz servo-e6b879048fa7224885605cd695ca5b853799f55a.zip |
Add Promises to Service Worker Container
The purpose of the code changes is to enable the use of promises in the Service Worker container. I also modified the Service Worker test in order to support the promises.
Diffstat (limited to 'components/script/dom/serviceworkercontainer.rs')
-rw-r--r-- | components/script/dom/serviceworkercontainer.rs | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/components/script/dom/serviceworkercontainer.rs b/components/script/dom/serviceworkercontainer.rs index 0947b9c0a1f..a28440e5c42 100644 --- a/components/script/dom/serviceworkercontainer.rs +++ b/components/script/dom/serviceworkercontainer.rs @@ -4,18 +4,20 @@ use dom::bindings::codegen::Bindings::ServiceWorkerContainerBinding::{ServiceWorkerContainerMethods, Wrap}; use dom::bindings::codegen::Bindings::ServiceWorkerContainerBinding::RegistrationOptions; -use dom::bindings::error::{Error, Fallible}; +use dom::bindings::error::Error; use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, MutNullableHeap, Root}; use dom::bindings::reflector::{Reflectable, reflect_dom_object}; use dom::bindings::str::USVString; use dom::eventtarget::EventTarget; use dom::globalscope::GlobalScope; +use dom::promise::Promise; use dom::serviceworker::ServiceWorker; use dom::serviceworkerregistration::ServiceWorkerRegistration; use script_thread::ScriptThread; use std::ascii::AsciiExt; use std::default::Default; +use std::rc::Rc; #[dom_struct] pub struct ServiceWorkerContainer { @@ -53,26 +55,36 @@ impl ServiceWorkerContainerMethods for ServiceWorkerContainer { return self.controller.get() } + #[allow(unrooted_must_root)] // https://w3c.github.io/ServiceWorker/#service-worker-container-register-method fn Register(&self, script_url: USVString, - options: &RegistrationOptions) -> Fallible<Root<ServiceWorkerRegistration>> { + options: &RegistrationOptions) -> Rc<Promise> { + let promise = Promise::new(&*self.global()); + let ctx = self.global().get_cx(); let USVString(ref script_url) = script_url; let api_base_url = self.global().api_base_url(); // Step 3-4 let script_url = match api_base_url.join(script_url) { Ok(url) => url, - Err(_) => return Err(Error::Type("Invalid script URL".to_owned())) + Err(_) => { + promise.reject_error(ctx, Error::Type("Invalid script URL".to_owned())); + return promise; + } }; // Step 5 match script_url.scheme() { "https" | "http" => {}, - _ => return Err(Error::Type("Only secure origins are allowed".to_owned())) + _ => { + promise.reject_error(ctx, Error::Type("Only secure origins are allowed".to_owned())); + return promise; + } } // Step 6 if script_url.path().to_ascii_lowercase().contains("%2f") || script_url.path().to_ascii_lowercase().contains("%5c") { - return Err(Error::Type("Script URL contains forbidden characters".to_owned())); + promise.reject_error(ctx, Error::Type("Script URL contains forbidden characters".to_owned())); + return promise; } // Step 8-9 let scope = match options.scope { @@ -80,7 +92,10 @@ impl ServiceWorkerContainerMethods for ServiceWorkerContainer { let &USVString(ref inner_scope) = scope; match api_base_url.join(inner_scope) { Ok(url) => url, - Err(_) => return Err(Error::Type("Invalid scope URL".to_owned())) + Err(_) => { + promise.reject_error(ctx, Error::Type("Invalid scope URL".to_owned())); + return promise; + } } }, None => script_url.join("./").unwrap() @@ -88,12 +103,16 @@ impl ServiceWorkerContainerMethods for ServiceWorkerContainer { // Step 11 match scope.scheme() { "https" | "http" => {}, - _ => return Err(Error::Type("Only secure origins are allowed".to_owned())) + _ => { + promise.reject_error(ctx, Error::Type("Only secure origins are allowed".to_owned())); + return promise; + } } // Step 12 if scope.path().to_ascii_lowercase().contains("%2f") || scope.path().to_ascii_lowercase().contains("%5c") { - return Err(Error::Type("Scope URL contains forbidden characters".to_owned())); + promise.reject_error(ctx, Error::Type("Scope URL contains forbidden characters".to_owned())); + return promise; } let global = self.global(); @@ -101,7 +120,9 @@ impl ServiceWorkerContainerMethods for ServiceWorkerContainer { script_url, scope.clone(), self); - ScriptThread::set_registration(scope, &*worker_registration, global.pipeline_id()); - Ok(worker_registration) + ScriptThread::set_registration(scope, &*worker_registration, self.global().pipeline_id()); + + promise.resolve_native(ctx, &*worker_registration); + promise } } |