aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/serviceworkercontainer.rs
diff options
context:
space:
mode:
authorPatrick Trottier <patrick.arrow206@outlook.com>2016-09-28 21:36:11 +0000
committerPatrick Trottier <patrick.arrow206@outlook.com>2016-10-31 15:20:28 +0000
commite6b879048fa7224885605cd695ca5b853799f55a (patch)
treeffebe8f14776a8e89d620c7a343c53b272b916c5 /components/script/dom/serviceworkercontainer.rs
parente888b7653479022bf5aecc518a73f1cf627e318a (diff)
downloadservo-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.rs41
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
}
}