Pause media elements when they're removed from the document.

This commit is contained in:
Josh Matthews 2015-11-07 11:36:58 -05:00
parent e3db11fd8b
commit d718da1c6a
2 changed files with 31 additions and 9 deletions

View file

@ -20,7 +20,7 @@ use dom::event::{Event, EventBubbles, EventCancelable};
use dom::htmlelement::HTMLElement; use dom::htmlelement::HTMLElement;
use dom::htmlsourceelement::HTMLSourceElement; use dom::htmlsourceelement::HTMLSourceElement;
use dom::mediaerror::MediaError; 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 dom::virtualmethods::VirtualMethods;
use ipc_channel::ipc; use ipc_channel::ipc;
use ipc_channel::router::ROUTER; 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 { struct FireSimpleEventTask {
@ -663,6 +672,27 @@ impl Runnable for DedicatedMediaSourceFailureTask {
} }
} }
struct PauseIfNotInDocumentTask {
elem: Trusted<HTMLMediaElement>,
}
impl PauseIfNotInDocumentTask {
fn new(elem: &HTMLMediaElement) -> PauseIfNotInDocumentTask {
PauseIfNotInDocumentTask {
elem: Trusted::new(elem),
}
}
}
impl Runnable for PauseIfNotInDocumentTask {
fn handler(self: Box<PauseIfNotInDocumentTask>) {
let elem = self.elem.root();
if !elem.upcast::<Node>().is_in_doc() {
elem.internal_pause_steps();
}
}
}
enum ResourceSelectionMode { enum ResourceSelectionMode {
Object, Object,
Attribute(String), Attribute(String),

View file

@ -1,8 +0,0 @@
[autoplay.html]
type: testharness
[audio.autoplay and internal pause steps]
expected: FAIL
[video.autoplay and internal pause steps]
expected: FAIL