diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 7e1314f400a..50c0f8d4f4d 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -20,6 +20,7 @@ use crate::dom::bindings::codegen::Bindings::HTMLIFrameElementBinding::HTMLIFram use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use crate::dom::bindings::codegen::Bindings::NodeFilterBinding::NodeFilter; use crate::dom::bindings::codegen::Bindings::PerformanceBinding::PerformanceMethods; +use crate::dom::bindings::codegen::Bindings::ShadowRootBinding::ShadowRootMethods; use crate::dom::bindings::codegen::Bindings::TouchBinding::TouchMethods; use crate::dom::bindings::codegen::Bindings::WindowBinding::{ FrameRequestCallback, ScrollBehavior, WindowMethods, @@ -2474,6 +2475,14 @@ impl Document { } pub fn unregister_media_controls(&self, id: &str) { + if let Some(media_controls) = self.media_controls.borrow().get(id) { + media_controls.Host().detach_shadow(); + media_controls + .upcast::() + .dirty(NodeDamage::OtherNodeDamage); + } else { + debug_assert!(false, "Trying to unregister unknown media controls"); + } self.media_controls.borrow_mut().remove(id); } } diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index b09aaf0dce7..8e9c5ef4ad9 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -501,6 +501,15 @@ impl Element { Ok(shadow_root) } + + pub fn detach_shadow(&self) { + if let Some(ref shadow_root) = self.shadow_root() { + self.node.owner_doc().unregister_shadow_root(shadow_root); + self.ensure_rare_data().shadow_root = None; + } else { + debug_assert!(false, "Trying to detach a non-attached shadow root"); + } + } } #[allow(unsafe_code)] diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index 3d9c5ce516b..f20db8eb83e 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -1788,8 +1788,10 @@ impl HTMLMediaElement { } } - fn hide_controls(&self) { - println!("hide_controls"); + fn remove_controls(&self) { + if let Some(ref id) = *self.media_controls_id.borrow() { + document_from_node(self).unregister_media_controls(id); + } } } @@ -1833,9 +1835,7 @@ impl Drop for HTMLMediaElement { .unwrap() .shutdown_player(&client_context_id, player.clone()); } - if let Some(ref id) = *self.media_controls_id.borrow() { - document_from_node(self).unregister_media_controls(id); - } + self.remove_controls(); } } @@ -2278,7 +2278,7 @@ impl VirtualMethods for HTMLMediaElement { if mutation.new_value(attr).is_some() { self.render_controls(); } else { - self.hide_controls(); + self.remove_controls(); } }, _ => (),