aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2019-03-25 07:47:06 -0400
committerGitHub <noreply@github.com>2019-03-25 07:47:06 -0400
commit5ae562bfc3507f12f562dfcb0cecd5ad1ec0fd20 (patch)
tree93cd726d39efa4e30caf5bfca37fef5fb96e32c5 /components
parent40d599e39ffdd627b8912388dc24de77291f700f (diff)
parentdc41d2fb77e99862701d5b527a32b90163ffdb42 (diff)
downloadservo-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')
-rw-r--r--components/script/Cargo.toml1
-rw-r--r--components/script/dom/baseaudiocontext.rs9
-rw-r--r--components/script/dom/bindings/trace.rs3
-rw-r--r--components/script/dom/htmlmediaelement.rs27
-rw-r--r--components/script/dom/mediadevices.rs2
-rw-r--r--components/script/dom/rtcpeerconnection.rs2
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) {