[iOS] do not exit AirPlay when the screen locks
https://bugs.webkit.org/show_bug.cgi?id=156502
<rdar://problem/24616592>
Reviewed by Dean Jackson
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::pendingActionTimerFired): Use m_isPlayingToWirelessTarget.
(WebCore::HTMLMediaElement::webkitCurrentPlaybackTargetIsWireless): Ditto.
(WebCore::HTMLMediaElement::wirelessRoutesAvailableDidChange): Set m_isPlayingToWirelessTarget.
(WebCore::HTMLMediaElement::mediaPlayerCurrentPlaybackTargetIsWirelessChanged): Use
m_isPlayingToWirelessTarget.
(WebCore::HTMLMediaElement::isPlayingToWirelessPlaybackTarget): Ditto.
(WebCore::HTMLMediaElement::configureMediaControls): Ditto.
(WebCore::HTMLMediaElement::shouldOverrideBackgroundPlaybackRestriction): Add logging.
(WebCore::HTMLMediaElement::purgeBufferedDataIfPossible): Don't tell the media engine to purge
data if it is playing to a wireless target because that will drop the connection.
* html/HTMLMediaElement.h:
* html/MediaElementSession.cpp:
(WebCore::MediaElementSession::playbackPermitted): Add logging.
(WebCore::MediaElementSession::canPlayToWirelessPlaybackTarget): Drive by fix: iOS doesn't
have an explicit playbackTarget, don't test for it.
(WebCore::MediaElementSession::isPlayingToWirelessPlaybackTarget): Ditto.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@200273 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 27228c0..1d2aae2 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,30 @@
+2016-04-29 Eric Carlson <eric.carlson@apple.com>
+
+ [iOS] do not exit AirPlay when the screen locks
+ https://bugs.webkit.org/show_bug.cgi?id=156502
+ <rdar://problem/24616592>
+
+ Reviewed by Dean Jackson
+
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::pendingActionTimerFired): Use m_isPlayingToWirelessTarget.
+ (WebCore::HTMLMediaElement::webkitCurrentPlaybackTargetIsWireless): Ditto.
+ (WebCore::HTMLMediaElement::wirelessRoutesAvailableDidChange): Set m_isPlayingToWirelessTarget.
+ (WebCore::HTMLMediaElement::mediaPlayerCurrentPlaybackTargetIsWirelessChanged): Use
+ m_isPlayingToWirelessTarget.
+ (WebCore::HTMLMediaElement::isPlayingToWirelessPlaybackTarget): Ditto.
+ (WebCore::HTMLMediaElement::configureMediaControls): Ditto.
+ (WebCore::HTMLMediaElement::shouldOverrideBackgroundPlaybackRestriction): Add logging.
+ (WebCore::HTMLMediaElement::purgeBufferedDataIfPossible): Don't tell the media engine to purge
+ data if it is playing to a wireless target because that will drop the connection.
+ * html/HTMLMediaElement.h:
+
+ * html/MediaElementSession.cpp:
+ (WebCore::MediaElementSession::playbackPermitted): Add logging.
+ (WebCore::MediaElementSession::canPlayToWirelessPlaybackTarget): Drive by fix: iOS doesn't
+ have an explicit playbackTarget, don't test for it.
+ (WebCore::MediaElementSession::isPlayingToWirelessPlaybackTarget): Ditto.
+
2016-04-29 Chris Dumez <cdumez@apple.com>
Node.nodeName should not be nullable
diff --git a/Source/WebCore/html/HTMLMediaElement.cpp b/Source/WebCore/html/HTMLMediaElement.cpp
index 2de5139..9ad2b9d 100644
--- a/Source/WebCore/html/HTMLMediaElement.cpp
+++ b/Source/WebCore/html/HTMLMediaElement.cpp
@@ -915,7 +915,7 @@
}
#if ENABLE(WIRELESS_PLAYBACK_TARGET)
- if (pendingActions & CheckPlaybackTargetCompatablity && m_player && m_player->isCurrentPlaybackTargetWireless() && !m_player->canPlayToWirelessPlaybackTarget()) {
+ if (pendingActions & CheckPlaybackTargetCompatablity && m_isPlayingToWirelessTarget && !m_player->canPlayToWirelessPlaybackTarget()) {
LOG(Media, "HTMLMediaElement::pendingActionTimerFired(%p) - calling setShouldPlayToPlaybackTarget(false)", this);
m_failedToPlayToWirelessTarget = true;
m_player->setShouldPlayToPlaybackTarget(false);
@@ -5175,7 +5175,7 @@
bool HTMLMediaElement::webkitCurrentPlaybackTargetIsWireless() const
{
- return m_player && m_player->isCurrentPlaybackTargetWireless();
+ return m_isPlayingToWirelessTarget;
}
void HTMLMediaElement::wirelessRoutesAvailableDidChange()
@@ -5185,11 +5185,13 @@
void HTMLMediaElement::mediaPlayerCurrentPlaybackTargetIsWirelessChanged(MediaPlayer*)
{
- LOG(Media, "HTMLMediaElement::mediaPlayerCurrentPlaybackTargetIsWirelessChanged(%p) - webkitCurrentPlaybackTargetIsWireless = %s", this, boolString(webkitCurrentPlaybackTargetIsWireless()));
+ m_isPlayingToWirelessTarget = m_player && m_player->isCurrentPlaybackTargetWireless();
+
+ LOG(Media, "HTMLMediaElement::mediaPlayerCurrentPlaybackTargetIsWirelessChanged(%p) - webkitCurrentPlaybackTargetIsWireless = %s", this, boolString(m_isPlayingToWirelessTarget));
ASSERT(m_player);
configureMediaControls();
scheduleEvent(eventNames().webkitcurrentplaybacktargetiswirelesschangedEvent);
- m_mediaSession->isPlayingToWirelessPlaybackTargetChanged(m_player->isCurrentPlaybackTargetWireless());
+ m_mediaSession->isPlayingToWirelessPlaybackTargetChanged(m_isPlayingToWirelessTarget);
updateMediaState(UpdateMediaState::Asynchronously);
}
@@ -5267,11 +5269,7 @@
bool HTMLMediaElement::isPlayingToWirelessPlaybackTarget() const
{
- bool isPlaying = m_player && m_player->isCurrentPlaybackTargetWireless();
-
- LOG(Media, "HTMLMediaElement::isPlayingToWirelessPlaybackTarget(%p) - returning %s", this, boolString(isPlaying));
-
- return isPlaying;
+ return m_isPlayingToWirelessTarget;
}
void HTMLMediaElement::setShouldPlayToPlaybackTarget(bool shouldPlay)
@@ -5728,7 +5726,7 @@
requireControls = true;
#if ENABLE(WIRELESS_PLAYBACK_TARGET)
- if (m_player && m_player->isCurrentPlaybackTargetWireless())
+ if (m_isPlayingToWirelessTarget)
requireControls = true;
#endif
@@ -6684,12 +6682,16 @@
bool HTMLMediaElement::shouldOverrideBackgroundPlaybackRestriction(PlatformMediaSession::InterruptionType type) const
{
- if (type != PlatformMediaSession::EnteringBackground)
+ if (type != PlatformMediaSession::EnteringBackground) {
+ LOG(Media, "HTMLMediaElement::shouldOverrideBackgroundPlaybackRestriction(%p) - returning false because type != PlatformMediaSession::EnteringBackground", this);
return false;
+ }
#if ENABLE(WIRELESS_PLAYBACK_TARGET)
- if (m_player && m_player->isCurrentPlaybackTargetWireless())
+ if (m_isPlayingToWirelessTarget) {
+ LOG(Media, "HTMLMediaElement::shouldOverrideBackgroundPlaybackRestriction(%p) - returning true because m_isPlayingToWirelessTarget is true", this);
return true;
+ }
#endif
if (m_videoFullscreenMode & VideoFullscreenModePictureInPicture)
return true;
@@ -6724,7 +6726,7 @@
bool hasActiveVideo = isVideo() && hasVideo();
bool hasAudio = this->hasAudio();
#if ENABLE(WIRELESS_PLAYBACK_TARGET)
- if (m_player && m_player->isCurrentPlaybackTargetWireless())
+ if (m_isPlayingToWirelessTarget)
state |= IsPlayingToExternalDevice;
if (m_hasPlaybackTargetAvailabilityListeners) {
@@ -6797,6 +6799,11 @@
if (!MemoryPressureHandler::singleton().isUnderMemoryPressure() && PlatformMediaSessionManager::sharedManager().sessionCanLoadMedia(*m_mediaSession))
return;
+ if (m_isPlayingToWirelessTarget) {
+ LOG(Media, "HTMLMediaElement::purgeBufferedDataIfPossible(%p) - early return because m_isPlayingToWirelessTarget is true", this);
+ return;
+ }
+
// This is called to relieve memory pressure. Turning off buffering causes the media playback
// daemon to release memory associated with queued-up video frames.
// We turn it back on right away, but new frames won't get loaded unless playback is resumed.
diff --git a/Source/WebCore/html/HTMLMediaElement.h b/Source/WebCore/html/HTMLMediaElement.h
index 85371d2..93ef47d 100644
--- a/Source/WebCore/html/HTMLMediaElement.h
+++ b/Source/WebCore/html/HTMLMediaElement.h
@@ -973,6 +973,7 @@
MediaProducer::MediaStateFlags m_mediaState { MediaProducer::IsNotPlaying };
bool m_hasPlaybackTargetAvailabilityListeners { false };
bool m_failedToPlayToWirelessTarget { false };
+ bool m_isPlayingToWirelessTarget { false };
#endif
};
diff --git a/Source/WebCore/html/MediaElementSession.cpp b/Source/WebCore/html/MediaElementSession.cpp
index 88bdc96..ad52996 100644
--- a/Source/WebCore/html/MediaElementSession.cpp
+++ b/Source/WebCore/html/MediaElementSession.cpp
@@ -358,16 +358,20 @@
bool MediaElementSession::canPlayToWirelessPlaybackTarget() const
{
+#if !PLATFORM(IOS)
if (!m_playbackTarget || !m_playbackTarget->hasActiveRoute())
return false;
+#endif
return client().canPlayToWirelessPlaybackTarget();
}
bool MediaElementSession::isPlayingToWirelessPlaybackTarget() const
{
+#if !PLATFORM(IOS)
if (!m_playbackTarget || !m_playbackTarget->hasActiveRoute())
return false;
+#endif
return client().isPlayingToWirelessPlaybackTarget();
}