diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2019-03-25 07:47:06 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-03-25 07:47:06 -0400 |
commit | 5ae562bfc3507f12f562dfcb0cecd5ad1ec0fd20 (patch) | |
tree | 93cd726d39efa4e30caf5bfca37fef5fb96e32c5 /components/script | |
parent | 40d599e39ffdd627b8912388dc24de77291f700f (diff) | |
parent | dc41d2fb77e99862701d5b527a32b90163ffdb42 (diff) | |
download | servo-5ae562bfc3507f12f562dfcb0cecd5ad1ec0fd20.tar.gz servo-5ae562bfc3507f12f562dfcb0cecd5ad1ec0fd20.zip |
Auto merge of #22944 - ferjm:player.shutdown, r=ceyusa
Shutdown player when HTMLMediaElement is dropped
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes fix #22931
- [X] There are tests for these changes
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/22944)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/Cargo.toml | 1 | ||||
-rw-r--r-- | components/script/dom/baseaudiocontext.rs | 9 | ||||
-rw-r--r-- | components/script/dom/bindings/trace.rs | 3 | ||||
-rw-r--r-- | components/script/dom/htmlmediaelement.rs | 27 | ||||
-rw-r--r-- | components/script/dom/mediadevices.rs | 2 | ||||
-rw-r--r-- | components/script/dom/rtcpeerconnection.rs | 2 |
6 files changed, 31 insertions, 13 deletions
diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml index 421d16fca3c..6bb94a63abf 100644 --- a/components/script/Cargo.toml +++ b/components/script/Cargo.toml @@ -96,6 +96,7 @@ servo_atoms = {path = "../atoms"} servo_config = {path = "../config"} servo_geometry = {path = "../geometry" } servo-media = {git = "https://github.com/servo/media"} +servo-media-auto = {git = "https://github.com/servo/media"} servo_rand = {path = "../rand"} servo_url = {path = "../url"} smallvec = { version = "0.6", features = ["std", "union"] } diff --git a/components/script/dom/baseaudiocontext.rs b/components/script/dom/baseaudiocontext.rs index 9429a03c1aa..96f21eeddfc 100644 --- a/components/script/dom/baseaudiocontext.rs +++ b/components/script/dom/baseaudiocontext.rs @@ -50,7 +50,8 @@ use servo_media::audio::context::{AudioContext, AudioContextOptions, ProcessingS use servo_media::audio::context::{OfflineAudioContextOptions, RealTimeAudioContextOptions}; use servo_media::audio::decoder::AudioDecoderCallbacks; use servo_media::audio::graph::NodeId; -use servo_media::{Backend, ServoMedia}; +use servo_media::ServoMedia; +use servo_media_auto::Backend; use std::cell::Cell; use std::collections::{HashMap, VecDeque}; use std::mem; @@ -75,7 +76,7 @@ struct DecodeResolver { pub struct BaseAudioContext { eventtarget: EventTarget, #[ignore_malloc_size_of = "servo_media"] - audio_context_impl: AudioContext<Backend>, + audio_context_impl: AudioContext, /// https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-destination destination: MutNullableDom<AudioDestinationNode>, listener: MutNullableDom<AudioListener>, @@ -108,6 +109,8 @@ impl BaseAudioContext { }, }; + ServoMedia::init::<Backend>(); + let context = BaseAudioContext { eventtarget: EventTarget::new_inherited(), audio_context_impl: ServoMedia::get() @@ -131,7 +134,7 @@ impl BaseAudioContext { false } - pub fn audio_context_impl(&self) -> &AudioContext<Backend> { + pub fn audio_context_impl(&self) -> &AudioContext { &self.audio_context_impl } diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index 8216d8c6a71..181bae0a3f9 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -103,7 +103,6 @@ use servo_media::audio::param::ParamType; use servo_media::player::Player; use servo_media::streams::MediaStream as BackendMediaStream; use servo_media::webrtc::WebRtcController; -use servo_media::Backend; use servo_url::{ImmutableOrigin, MutableOrigin, ServoUrl}; use smallvec::SmallVec; use std::cell::{Cell, RefCell, UnsafeCell}; @@ -481,7 +480,7 @@ unsafe_no_jsmanaged_fields!(InteractiveWindow); unsafe_no_jsmanaged_fields!(CanvasId); unsafe_no_jsmanaged_fields!(SourceSet); unsafe_no_jsmanaged_fields!(AudioBuffer); -unsafe_no_jsmanaged_fields!(AudioContext<Backend>); +unsafe_no_jsmanaged_fields!(AudioContext); unsafe_no_jsmanaged_fields!(NodeId); unsafe_no_jsmanaged_fields!(AnalysisEngine, DistanceModel, PanningModel, ParamType); unsafe_no_jsmanaged_fields!(dyn Player); diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index 079bbd9d4bd..de84ae42b4f 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -68,6 +68,7 @@ use servo_config::pref; use servo_media::player::frame::{Frame, FrameRenderer}; use servo_media::player::{PlaybackState, Player, PlayerError, PlayerEvent, StreamType}; use servo_media::ServoMedia; +use servo_media_auto::Backend; use servo_url::ServoUrl; use std::cell::Cell; use std::collections::VecDeque; @@ -249,6 +250,7 @@ pub enum ReadyState { impl HTMLMediaElement { pub fn new_inherited(tag_name: LocalName, prefix: Option<Prefix>, document: &Document) -> Self { + ServoMedia::init::<Backend>(); Self { htmlelement: HTMLElement::new_inherited(tag_name, prefix, document), network_state: Cell::new(NetworkState::Empty), @@ -1147,15 +1149,16 @@ impl HTMLMediaElement { action_receiver.to_opaque(), Box::new(move |message| { let event: PlayerEvent = message.to().unwrap(); + trace!("Player event {:?}", event); let this = trusted_node.clone(); - task_source - .queue_with_canceller( - task!(handle_player_event: move || { - this.root().handle_player_event(&event); - }), - &canceller, - ) - .unwrap(); + if let Err(err) = task_source.queue_with_canceller( + task!(handle_player_event: move || { + this.root().handle_player_event(&event); + }), + &canceller, + ) { + warn!("Could not queue player event handler task {:?}", err); + } }), ); @@ -1489,6 +1492,14 @@ impl HTMLMediaElement { } } +impl Drop for HTMLMediaElement { + fn drop(&mut self) { + if let Err(err) = self.player.shutdown() { + warn!("Error shutting down player {:?}", err); + } + } +} + impl HTMLMediaElementMethods for HTMLMediaElement { // https://html.spec.whatwg.org/multipage/#dom-media-networkstate fn NetworkState(&self) -> u16 { diff --git a/components/script/dom/mediadevices.rs b/components/script/dom/mediadevices.rs index b89762c3779..808ce22c2af 100644 --- a/components/script/dom/mediadevices.rs +++ b/components/script/dom/mediadevices.rs @@ -17,6 +17,7 @@ use crate::dom::promise::Promise; use dom_struct::dom_struct; use servo_media::streams::capture::{Constrain, ConstrainRange, MediaTrackConstraintSet}; use servo_media::ServoMedia; +use servo_media_auto::Backend; use std::rc::Rc; #[dom_struct] @@ -26,6 +27,7 @@ pub struct MediaDevices { impl MediaDevices { pub fn new_inherited() -> MediaDevices { + ServoMedia::init::<Backend>(); MediaDevices { eventtarget: EventTarget::new_inherited(), } diff --git a/components/script/dom/rtcpeerconnection.rs b/components/script/dom/rtcpeerconnection.rs index eb94914e588..0a1c41cf3f9 100644 --- a/components/script/dom/rtcpeerconnection.rs +++ b/components/script/dom/rtcpeerconnection.rs @@ -39,6 +39,7 @@ use servo_media::webrtc::{ BundlePolicy, IceCandidate, SdpType, SessionDescription, WebRtcController, WebRtcSignaller, }; use servo_media::ServoMedia; +use servo_media_auto::Backend; use std::cell::Cell; use std::rc::Rc; @@ -117,6 +118,7 @@ impl RTCPeerConnection { RTCPeerConnectionBinding::Wrap, ); let signaller = this.make_signaller(); + ServoMedia::init::<Backend>(); *this.controller.borrow_mut() = Some(ServoMedia::get().unwrap().create_webrtc(signaller)); if let Some(ref servers) = config.iceServers { if let Some(ref server) = servers.get(0) { |