diff options
Diffstat (limited to 'components/script/dom/serviceworker.rs')
-rw-r--r-- | components/script/dom/serviceworker.rs | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/components/script/dom/serviceworker.rs b/components/script/dom/serviceworker.rs index 2b79be43dc8..9c37d73bd9e 100644 --- a/components/script/dom/serviceworker.rs +++ b/components/script/dom/serviceworker.rs @@ -2,20 +2,23 @@ * 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 dom::abstractworker::{SimpleWorkerErrorHandler, WorkerScriptMsg}; +use dom::abstractworker::SimpleWorkerErrorHandler; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::codegen::Bindings::ServiceWorkerBinding::{ServiceWorkerMethods, ServiceWorkerState, Wrap}; +use dom::bindings::error::{ErrorResult, Error}; use dom::bindings::global::GlobalRef; use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::bindings::refcounted::Trusted; -use dom::bindings::reflector::reflect_dom_object; +use dom::bindings::reflector::{Reflectable, reflect_dom_object}; use dom::bindings::str::USVString; +use dom::bindings::structuredclone::StructuredCloneData; use dom::eventtarget::EventTarget; +use js::jsapi::{HandleValue, JSContext}; use script_thread::Runnable; +use script_traits::{ScriptMsg, DOMMessage}; use std::cell::Cell; -use std::sync::mpsc::Sender; use url::Url; pub type TrustedServiceWorkerAddress = Trusted<ServiceWorker>; @@ -24,28 +27,31 @@ pub type TrustedServiceWorkerAddress = Trusted<ServiceWorker>; pub struct ServiceWorker { eventtarget: EventTarget, script_url: DOMRefCell<String>, + scope_url: Url, state: Cell<ServiceWorkerState>, - #[ignore_heap_size_of = "Defined in std"] - sender: Option<Sender<(TrustedServiceWorkerAddress, WorkerScriptMsg)>>, skip_waiting: Cell<bool> } impl ServiceWorker { fn new_inherited(script_url: &str, - skip_waiting: bool) -> ServiceWorker { + skip_waiting: bool, + scope_url: Url) -> ServiceWorker { ServiceWorker { eventtarget: EventTarget::new_inherited(), - sender: None, script_url: DOMRefCell::new(String::from(script_url)), state: Cell::new(ServiceWorkerState::Installing), + scope_url: scope_url, skip_waiting: Cell::new(skip_waiting) } } - pub fn new(global: GlobalRef, - script_url: &str, + pub fn install_serviceworker(global: GlobalRef, + script_url: Url, + scope_url: Url, skip_waiting: bool) -> Root<ServiceWorker> { - reflect_dom_object(box ServiceWorker::new_inherited(script_url, skip_waiting), global, Wrap) + reflect_dom_object(box ServiceWorker::new_inherited(script_url.as_str(), + skip_waiting, + scope_url), global, Wrap) } pub fn dispatch_simple_error(address: TrustedServiceWorkerAddress) { @@ -61,14 +67,6 @@ impl ServiceWorker { pub fn get_script_url(&self) -> Url { Url::parse(&self.script_url.borrow().clone()).unwrap() } - - pub fn install_serviceworker(global: GlobalRef, - script_url: Url, - skip_waiting: bool) -> Root<ServiceWorker> { - ServiceWorker::new(global, - script_url.as_str(), - skip_waiting) - } } impl ServiceWorkerMethods for ServiceWorker { @@ -82,6 +80,20 @@ impl ServiceWorkerMethods for ServiceWorker { USVString(self.script_url.borrow().clone()) } + // https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#service-worker-postmessage + fn PostMessage(&self, cx: *mut JSContext, message: HandleValue) -> ErrorResult { + // Step 1 + if let ServiceWorkerState::Redundant = self.state.get() { + return Err(Error::InvalidState); + } + // Step 7 + let data = try!(StructuredCloneData::write(cx, message)); + let msg_vec = DOMMessage(data.move_to_arraybuffer()); + let _ = self.global().r().constellation_chan().send(ScriptMsg::ForwardDOMMessage(msg_vec, + self.scope_url.clone())); + Ok(()) + } + // https://slightlyoff.github.io/ServiceWorker/spec/service_worker/#service-worker-container-onerror-attribute event_handler!(error, GetOnerror, SetOnerror); |