aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/script/dom/dedicatedworkerglobalscope.rs6
-rw-r--r--components/script/dom/webidls/DedicatedWorkerGlobalScope.webidl2
-rw-r--r--components/script/dom/worker.rs20
-rw-r--r--components/script/dom/workerglobalscope.rs6
-rw-r--r--tests/wpt/metadata/workers/WorkerGlobalScope_close.htm.ini5
-rw-r--r--tests/wpt/metadata/workers/interfaces.worker.js.ini3
-rw-r--r--tests/wpt/metadata/workers/interfaces/WorkerGlobalScope/close/sending-messages.html.ini6
7 files changed, 29 insertions, 19 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);
+ }
+ }
}
diff --git a/tests/wpt/metadata/workers/WorkerGlobalScope_close.htm.ini b/tests/wpt/metadata/workers/WorkerGlobalScope_close.htm.ini
deleted file mode 100644
index 95efa590227..00000000000
--- a/tests/wpt/metadata/workers/WorkerGlobalScope_close.htm.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[WorkerGlobalScope_close.htm]
- type: testharness
- [ WorkerGlobalScope close(): clear events queue ]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/workers/interfaces.worker.js.ini b/tests/wpt/metadata/workers/interfaces.worker.js.ini
index cb9d2850693..3928e5f88e0 100644
--- a/tests/wpt/metadata/workers/interfaces.worker.js.ini
+++ b/tests/wpt/metadata/workers/interfaces.worker.js.ini
@@ -21,9 +21,6 @@
[DedicatedWorkerGlobalScope interface: attribute onmessage]
expected: FAIL
- [WorkerGlobalScope interface: self must inherit property "close" with the proper type (2)]
- expected: FAIL
-
[WorkerGlobalScope interface: self must inherit property "onerror" with the proper type (3)]
expected: FAIL
diff --git a/tests/wpt/metadata/workers/interfaces/WorkerGlobalScope/close/sending-messages.html.ini b/tests/wpt/metadata/workers/interfaces/WorkerGlobalScope/close/sending-messages.html.ini
deleted file mode 100644
index 379fec0c3ec..00000000000
--- a/tests/wpt/metadata/workers/interfaces/WorkerGlobalScope/close/sending-messages.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[sending-messages.html]
- type: testharness
- expected: TIMEOUT
- [close() and sending messages]
- expected: TIMEOUT
-