diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2016-07-25 19:34:36 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-07-25 19:34:36 -0500 |
commit | 4e18c230d031388570780ea0382eb5f7c6567a96 (patch) | |
tree | d84d59ead127ed0cc458d0175d918fb2d9960d45 /components | |
parent | 2746c476d3114d987b153d93bed2d302ba2e52a5 (diff) | |
parent | d23ef776455ce7903150fd999ae2293842071f16 (diff) | |
download | servo-4e18c230d031388570780ea0382eb5f7c6567a96.tar.gz servo-4e18c230d031388570780ea0382eb5f7c6567a96.zip |
Auto merge of #12501 - mephisto41:worker-close-impl, r=KiChjang
Implement DedicatedWorkerGlobalScope.close
<!-- Please describe your changes on the following line: -->
Implement DedicatedWorkerGlobalScope.close().
---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: -->
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes fix #12466 (github issue number if applicable).
<!-- Either: -->
- [X] There are tests for these changes
<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
<!-- 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/12501)
<!-- Reviewable:end -->
Diffstat (limited to 'components')
-rw-r--r-- | components/script/dom/dedicatedworkerglobalscope.rs | 6 | ||||
-rw-r--r-- | components/script/dom/webidls/DedicatedWorkerGlobalScope.webidl | 2 | ||||
-rw-r--r-- | components/script/dom/worker.rs | 20 | ||||
-rw-r--r-- | components/script/dom/workerglobalscope.rs | 6 |
4 files changed, 29 insertions, 5 deletions
diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index b65fd72ab62..80c70c45911 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -370,6 +370,12 @@ impl DedicatedWorkerGlobalScopeMethods for DedicatedWorkerGlobalScope { Ok(()) } + // https://html.spec.whatwg.org/multipage/#dom-dedicatedworkerglobalscope-close + fn Close(&self) { + // Step 2 + self.upcast::<WorkerGlobalScope>().close(); + } + // https://html.spec.whatwg.org/multipage/#handler-dedicatedworkerglobalscope-onmessage event_handler!(message, GetOnmessage, SetOnmessage); } diff --git a/components/script/dom/webidls/DedicatedWorkerGlobalScope.webidl b/components/script/dom/webidls/DedicatedWorkerGlobalScope.webidl index cd0d393e22e..53996ee3965 100644 --- a/components/script/dom/webidls/DedicatedWorkerGlobalScope.webidl +++ b/components/script/dom/webidls/DedicatedWorkerGlobalScope.webidl @@ -8,4 +8,6 @@ [Throws] void postMessage(any message/*, optional sequence<Transferable> transfer*/); attribute EventHandler onmessage; + + void close(); }; diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs index c318672fb7a..c1ad7cf5a96 100644 --- a/components/script/dom/worker.rs +++ b/components/script/dom/worker.rs @@ -27,6 +27,7 @@ use js::jsapi::{HandleValue, JSContext, JSAutoCompartment}; use js::jsval::UndefinedValue; use script_thread::Runnable; use script_traits::WorkerScriptLoadOrigin; +use std::cell::Cell; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::mpsc::{Sender, channel}; use std::sync::{Arc, Mutex}; @@ -43,7 +44,8 @@ pub struct Worker { sender: Sender<(TrustedWorkerAddress, WorkerScriptMsg)>, closing: Arc<AtomicBool>, #[ignore_heap_size_of = "Defined in rust-mozjs"] - runtime: Arc<Mutex<Option<SharedRt>>> + runtime: Arc<Mutex<Option<SharedRt>>>, + terminated: Cell<bool>, } impl Worker { @@ -53,7 +55,8 @@ impl Worker { eventtarget: EventTarget::new_inherited(), sender: sender, closing: closing, - runtime: Arc::new(Mutex::new(None)) + runtime: Arc::new(Mutex::new(None)), + terminated: Cell::new(false), } } @@ -112,11 +115,15 @@ impl Worker { self.closing.load(Ordering::SeqCst) } + pub fn is_terminated(&self) -> bool { + self.terminated.get() + } + pub fn handle_message(address: TrustedWorkerAddress, data: StructuredCloneData) { let worker = address.root(); - if worker.is_closing() { + if worker.is_terminated() { return; } @@ -137,7 +144,7 @@ impl Worker { filename: DOMString, lineno: u32, colno: u32) { let worker = address.root(); - if worker.is_closing() { + if worker.is_terminated() { return; } @@ -169,7 +176,10 @@ impl WorkerMethods for Worker { return; } - // Step 4 + // Step 2 + self.terminated.set(true); + + // Step 3 if let Some(runtime) = *self.runtime.lock().unwrap() { runtime.request_interrupt(); } diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs index 154705fe145..16388d54d73 100644 --- a/components/script/dom/workerglobalscope.rs +++ b/components/script/dom/workerglobalscope.rs @@ -444,4 +444,10 @@ impl WorkerGlobalScope { pub fn set_devtools_wants_updates(&self, value: bool) { self.devtools_wants_updates.set(value); } + + pub fn close(&self) { + if let Some(ref closing) = self.closing { + closing.store(true, Ordering::SeqCst); + } + } } |