Diff
Modified: branches/safari-601-branch/Source/WebCore/ChangeLog (195737 => 195738)
--- branches/safari-601-branch/Source/WebCore/ChangeLog 2016-01-28 16:18:32 UTC (rev 195737)
+++ branches/safari-601-branch/Source/WebCore/ChangeLog 2016-01-28 16:26:25 UTC (rev 195738)
@@ -1,3 +1,23 @@
+2016-01-26 Eric Carlson <[email protected]>
+
+ Cherry-pick r195592 and parts of r194672 to fix rdar://24154288
+ <rdar://problem/24154288> FaradayDotFour: Do not see AirPlay icon in Vimeo
+
+ Unreviewed.
+
+ * Modules/mediasession/WebMediaSessionManager.cpp:
+ (WebCore::mediaProducerStateString): Log a new flag.
+ (WebCore::WebMediaSessionManager::clientStateDidChange): Schedule a client
+ reconfiguration if the 'requires monitoring', 'has listener', or 'has audio or
+ video' flags have changed.
+ (WebCore::WebMediaSessionManager::configurePlaybackTargetMonitoring): Start monitoring if
+ at least one client has a listener and at least one has audio/video.
+
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::mediaState): Set new flags.
+
+ * page/MediaProducer.h: Add new flags.
+
2016-01-27 Matthew Hanson <[email protected]>
Merge r195609. rdar://problem/24337868
Modified: branches/safari-601-branch/Source/WebCore/Modules/mediasession/WebMediaSessionManager.cpp (195737 => 195738)
--- branches/safari-601-branch/Source/WebCore/Modules/mediasession/WebMediaSessionManager.cpp 2016-01-28 16:18:32 UTC (rev 195737)
+++ branches/safari-601-branch/Source/WebCore/Modules/mediasession/WebMediaSessionManager.cpp 2016-01-28 16:26:25 UTC (rev 195738)
@@ -74,6 +74,8 @@
string.append("IsPlayingVideo + ");
if (flags & MediaProducer::IsPlayingToExternalDevice)
string.append("IsPlayingToExternalDevice + ");
+ if (flags & MediaProducer::HasPlaybackTargetAvailabilityListener)
+ string.append("HasPlaybackTargetAvailabilityListener + ");
if (flags & MediaProducer::RequiresPlaybackTargetMonitoring)
string.append("RequiresPlaybackTargetMonitoring + ");
if (flags & MediaProducer::ExternalDeviceAutoPlayCandidate)
@@ -174,7 +176,9 @@
LOG(Media, "WebMediaSessionManager::clientStateDidChange(%p + %llu) - new flags = %s, old flags = %s", &client, contextId, mediaProducerStateString(newFlags).utf8().data(), mediaProducerStateString(oldFlags).utf8().data());
changedClientState->flags = newFlags;
- if (!flagsAreSet(oldFlags, MediaProducer::RequiresPlaybackTargetMonitoring) && flagsAreSet(newFlags, MediaProducer::RequiresPlaybackTargetMonitoring))
+
+ MediaProducer::MediaStateFlags updateConfigurationFlags = MediaProducer::RequiresPlaybackTargetMonitoring | MediaProducer::HasPlaybackTargetAvailabilityListener | MediaProducer::HasAudioOrVideo;
+ if ((oldFlags & updateConfigurationFlags) != (newFlags & updateConfigurationFlags))
scheduleDelayedTask(TargetMonitoringConfigurationTask);
MediaProducer::MediaStateFlags playingToTargetFlags = MediaProducer::IsPlayingToExternalDevice | MediaProducer::IsPlayingVideo;
@@ -196,7 +200,7 @@
return;
}
- // Do not take begin playing to the device unless playback has just started.
+ // Do not begin playing to the device unless playback has just started.
if (!flagsAreSet(newFlags, MediaProducer::IsPlayingVideo) || flagsAreSet(oldFlags, MediaProducer::IsPlayingVideo))
return;
@@ -304,16 +308,22 @@
void WebMediaSessionManager::configurePlaybackTargetMonitoring()
{
bool monitoringRequired = false;
+ bool hasAvailabilityListener = false;
+ bool haveClientWithMedia = false;
for (auto& state : m_clientState) {
if (state->flags & MediaProducer::RequiresPlaybackTargetMonitoring) {
monitoringRequired = true;
break;
}
+ if (state->flags & MediaProducer::HasPlaybackTargetAvailabilityListener)
+ hasAvailabilityListener = true;
+ if (state->flags & MediaProducer::HasAudioOrVideo)
+ haveClientWithMedia = true;
}
- LOG(Media, "WebMediaSessionManager::configurePlaybackTargetMonitoring - monitoringRequired = %i", (int)monitoringRequired);
+ LOG(Media, "WebMediaSessionManager::configurePlaybackTargetMonitoring - monitoringRequired = %i", static_cast<int>(monitoringRequired || (hasAvailabilityListener && haveClientWithMedia)));
- if (monitoringRequired)
+ if (monitoringRequired || (hasAvailabilityListener && haveClientWithMedia))
targetPicker().startingMonitoringPlaybackTargets();
else
targetPicker().stopMonitoringPlaybackTargets();
Modified: branches/safari-601-branch/Source/WebCore/html/HTMLMediaElement.cpp (195737 => 195738)
--- branches/safari-601-branch/Source/WebCore/html/HTMLMediaElement.cpp 2016-01-28 16:18:32 UTC (rev 195737)
+++ branches/safari-601-branch/Source/WebCore/html/HTMLMediaElement.cpp 2016-01-28 16:26:25 UTC (rev 195738)
@@ -6434,7 +6434,6 @@
MediaProducer::MediaStateFlags HTMLMediaElement::mediaState() const
{
-
MediaStateFlags state = IsNotPlaying;
bool hasActiveVideo = isVideo() && hasVideo();
@@ -6443,13 +6442,19 @@
if (m_player && m_player->isCurrentPlaybackTargetWireless())
state |= IsPlayingToExternalDevice;
- if (m_player && m_hasPlaybackTargetAvailabilityListeners && !m_mediaSession->wirelessVideoPlaybackDisabled(*this))
- state |= RequiresPlaybackTargetMonitoring;
+ if (m_hasPlaybackTargetAvailabilityListeners) {
+ state |= HasPlaybackTargetAvailabilityListener;
+ if (!m_mediaSession->wirelessVideoPlaybackDisabled(*this))
+ state |= RequiresPlaybackTargetMonitoring;
+ }
bool requireUserGesture = m_mediaSession->hasBehaviorRestriction(MediaElementSession::RequireUserGestureToAutoplayToExternalDevice);
if (m_readyState >= HAVE_METADATA && !requireUserGesture && !m_failedToPlayToWirelessTarget)
state |= ExternalDeviceAutoPlayCandidate;
+ if (hasActiveVideo || hasAudio)
+ state |= HasAudioOrVideo;
+
if (hasActiveVideo && endedPlayback())
state |= DidPlayToEnd;
#endif
Modified: branches/safari-601-branch/Source/WebCore/page/MediaProducer.h (195737 => 195738)
--- branches/safari-601-branch/Source/WebCore/page/MediaProducer.h 2016-01-28 16:18:32 UTC (rev 195737)
+++ branches/safari-601-branch/Source/WebCore/page/MediaProducer.h 2016-01-28 16:26:25 UTC (rev 195738)
@@ -38,6 +38,8 @@
RequiresPlaybackTargetMonitoring = 1 << 3,
ExternalDeviceAutoPlayCandidate = 1 << 4,
DidPlayToEnd = 1 << 5,
+ HasPlaybackTargetAvailabilityListener = 1 << 9,
+ HasAudioOrVideo = 1 << 10,
};
typedef unsigned MediaStateFlags;