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 -