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::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<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 {
Object,
Attribute(String),