diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs
index e419dde0fea..928c0ed6e93 100644
--- a/components/script/dom/htmlmediaelement.rs
+++ b/components/script/dom/htmlmediaelement.rs
@@ -20,7 +20,7 @@ use dom::event::{Event, EventBubbles, EventCancelable};
use dom::htmlelement::HTMLElement;
use dom::htmlsourceelement::HTMLSourceElement;
use dom::mediaerror::MediaError;
-use dom::node::{window_from_node, document_from_node};
+use dom::node::{window_from_node, document_from_node, Node, UnbindContext};
use dom::virtualmethods::VirtualMethods;
use ipc_channel::ipc;
use ipc_channel::router::ROUTER;
@@ -602,6 +602,15 @@ impl VirtualMethods for HTMLMediaElement {
_ => (),
};
}
+
+ // https://html.spec.whatwg.org/multipage/#playing-the-media-resource:media-element-75
+ fn unbind_from_tree(&self, context: &UnbindContext) {
+ self.super_type().unwrap().unbind_from_tree(context);
+
+ if context.tree_in_doc {
+ ScriptThread::await_stable_state(PauseIfNotInDocumentTask::new(self));
+ }
+ }
}
struct FireSimpleEventTask {
@@ -663,6 +672,27 @@ impl Runnable for DedicatedMediaSourceFailureTask {
}
}
+struct PauseIfNotInDocumentTask {
+ elem: Trusted,
+}
+
+impl PauseIfNotInDocumentTask {
+ fn new(elem: &HTMLMediaElement) -> PauseIfNotInDocumentTask {
+ PauseIfNotInDocumentTask {
+ elem: Trusted::new(elem),
+ }
+ }
+}
+
+impl Runnable for PauseIfNotInDocumentTask {
+ fn handler(self: Box) {
+ let elem = self.elem.root();
+ if !elem.upcast::().is_in_doc() {
+ elem.internal_pause_steps();
+ }
+ }
+}
+
enum ResourceSelectionMode {
Object,
Attribute(String),
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/media-elements/ready-states/autoplay.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/ready-states/autoplay.html.ini
deleted file mode 100644
index a7fe6814e76..00000000000
--- a/tests/wpt/metadata/html/semantics/embedded-content/media-elements/ready-states/autoplay.html.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-[autoplay.html]
- type: testharness
- [audio.autoplay and internal pause steps]
- expected: FAIL
-
- [video.autoplay and internal pause steps]
- expected: FAIL
-