- Revision
- 175777
- Author
- [email protected]
- Date
- 2014-11-08 09:17:32 -0800 (Sat, 08 Nov 2014)
Log Message
[iOS] video is sometimes allowed to play from the background
https://bugs.webkit.org/show_bug.cgi?id=138522
Reviewed by Jer Noble.
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::displayType): New.
* html/HTMLMediaElement.h:
* platform/audio/MediaSession.cpp:
(WebCore::MediaSession::isHidden): New, client passthrough.
(WebCore::MediaSession::displayType): Ditto.
* platform/audio/MediaSession.h:
(WebCore::MediaSessionClient::displayType):
* platform/audio/MediaSessionManager.cpp:
(WebCore::MediaSessionManager::sessionCanLoadMedia): New, default implementation returns
true if client is visible or playing.
* platform/audio/MediaSessionManager.h:
* platform/audio/ios/MediaSessionManagerIOS.h:
* platform/audio/ios/MediaSessionManagerIOS.mm:
(WebCore::MediaSessionManageriOS::sessionCanLoadMedia): iOS override, also allows buffering
when displaying optimized fullscreen.
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (175776 => 175777)
--- trunk/Source/WebCore/ChangeLog 2014-11-08 10:53:26 UTC (rev 175776)
+++ trunk/Source/WebCore/ChangeLog 2014-11-08 17:17:32 UTC (rev 175777)
@@ -1,3 +1,30 @@
+2014-11-07 Eric Carlson <[email protected]>
+
+ [iOS] video is sometimes allowed to play from the background
+ https://bugs.webkit.org/show_bug.cgi?id=138522
+
+ Reviewed by Jer Noble.
+
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::displayType): New.
+ * html/HTMLMediaElement.h:
+
+ * platform/audio/MediaSession.cpp:
+ (WebCore::MediaSession::isHidden): New, client passthrough.
+ (WebCore::MediaSession::displayType): Ditto.
+ * platform/audio/MediaSession.h:
+ (WebCore::MediaSessionClient::displayType):
+
+ * platform/audio/MediaSessionManager.cpp:
+ (WebCore::MediaSessionManager::sessionCanLoadMedia): New, default implementation returns
+ true if client is visible or playing.
+ * platform/audio/MediaSessionManager.h:
+
+ * platform/audio/ios/MediaSessionManagerIOS.h:
+ * platform/audio/ios/MediaSessionManagerIOS.mm:
+ (WebCore::MediaSessionManageriOS::sessionCanLoadMedia): iOS override, also allows buffering
+ when displaying optimized fullscreen.
+
2014-11-07 Benjamin Poulain <[email protected]>
Fix the build after r175772
Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (175776 => 175777)
--- trunk/Source/WebCore/html/HTMLMediaElement.cpp 2014-11-08 10:53:26 UTC (rev 175776)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp 2014-11-08 17:17:32 UTC (rev 175777)
@@ -5974,6 +5974,23 @@
return MediaSession::Audio;
}
+MediaSession::DisplayType HTMLMediaElement::displayType() const
+{
+ switch (m_videoFullscreenMode) {
+ case VideoFullscreenModeStandard:
+ return MediaSession::Fullscreen;
+ case VideoFullscreenModeOptimized:
+ return MediaSession::Optimized;
+ case VideoFullscreenModeNone:
+ return MediaSession::Normal;
+ default:
+ ASSERT_NOT_REACHED();
+ break;
+ }
+
+ return MediaSession::Normal;
+}
+
#if ENABLE(MEDIA_SOURCE)
size_t HTMLMediaElement::maximumSourceBufferSize(const SourceBuffer& buffer) const
{
Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (175776 => 175777)
--- trunk/Source/WebCore/html/HTMLMediaElement.h 2014-11-08 10:53:26 UTC (rev 175776)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h 2014-11-08 17:17:32 UTC (rev 175777)
@@ -704,6 +704,7 @@
// MediaSessionClient Overrides
virtual MediaSession::MediaType mediaType() const override;
virtual MediaSession::MediaType presentationType() const override;
+ virtual MediaSession::DisplayType displayType() const override;
virtual void pausePlayback() override;
virtual void resumePlayback() override;
virtual String mediaSessionTitle() const override;
Modified: trunk/Source/WebCore/platform/audio/MediaSession.cpp (175776 => 175777)
--- trunk/Source/WebCore/platform/audio/MediaSession.cpp 2014-11-08 10:53:26 UTC (rev 175776)
+++ trunk/Source/WebCore/platform/audio/MediaSession.cpp 2014-11-08 17:17:32 UTC (rev 175777)
@@ -194,6 +194,16 @@
m_client.setShouldBufferData(shouldBuffer);
}
+bool MediaSession::isHidden() const
+{
+ return m_client.elementIsHidden();
+}
+
+MediaSession::DisplayType MediaSession::displayType() const
+{
+ return m_client.displayType();
+}
+
void MediaSession::wirelessRoutesAvailableDidChange() const
{
m_client.wirelessRoutesAvailableDidChange();
Modified: trunk/Source/WebCore/platform/audio/MediaSession.h (175776 => 175777)
--- trunk/Source/WebCore/platform/audio/MediaSession.h 2014-11-08 10:53:26 UTC (rev 175776)
+++ trunk/Source/WebCore/platform/audio/MediaSession.h 2014-11-08 17:17:32 UTC (rev 175777)
@@ -102,6 +102,15 @@
virtual bool requiresPlaybackTargetRouteMonitoring() const { return false; }
void wirelessRoutesAvailableDidChange() const;
+ enum DisplayType {
+ Normal,
+ Fullscreen,
+ Optimized,
+ };
+ DisplayType displayType() const;
+
+ bool isHidden() const;
+
protected:
MediaSessionClient& client() const { return m_client; }
@@ -123,6 +132,7 @@
virtual MediaSession::MediaType mediaType() const = 0;
virtual MediaSession::MediaType presentationType() const = 0;
+ virtual MediaSession::DisplayType displayType() const { return MediaSession::Normal; }
virtual void resumePlayback() = 0;
virtual void pausePlayback() = 0;
Modified: trunk/Source/WebCore/platform/audio/MediaSessionManager.cpp (175776 => 175777)
--- trunk/Source/WebCore/platform/audio/MediaSessionManager.cpp 2014-11-08 10:53:26 UTC (rev 175776)
+++ trunk/Source/WebCore/platform/audio/MediaSessionManager.cpp 2014-11-08 17:17:32 UTC (rev 175777)
@@ -260,6 +260,11 @@
return m_restrictions[sessionType] & InlineVideoPlaybackRestricted;
}
+bool MediaSessionManager::sessionCanLoadMedia(const MediaSession& session) const
+{
+ return session.state() == MediaSession::Playing || !session.isHidden();
+}
+
void MediaSessionManager::applicationWillEnterBackground() const
{
LOG(Media, "MediaSessionManager::applicationWillEnterBackground");
Modified: trunk/Source/WebCore/platform/audio/MediaSessionManager.h (175776 => 175777)
--- trunk/Source/WebCore/platform/audio/MediaSessionManager.h 2014-11-08 10:53:26 UTC (rev 175776)
+++ trunk/Source/WebCore/platform/audio/MediaSessionManager.h 2014-11-08 17:17:32 UTC (rev 175777)
@@ -76,6 +76,8 @@
bool sessionRestrictsInlineVideoPlayback(const MediaSession&) const;
+ virtual bool sessionCanLoadMedia(const MediaSession&) const;
+
virtual void configureWireLessTargetMonitoring() { }
#if ENABLE(IOS_AIRPLAY)
Modified: trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.h (175776 => 175777)
--- trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.h 2014-11-08 10:53:26 UTC (rev 175776)
+++ trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.h 2014-11-08 17:17:32 UTC (rev 175777)
@@ -60,6 +60,8 @@
virtual void configureWireLessTargetMonitoring() override;
#endif
+ virtual bool sessionCanLoadMedia(const MediaSession&) const override;
+
MediaSessionManageriOS();
RetainPtr<WebMediaSessionHelper> m_objcObserver;
};
Modified: trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm (175776 => 175777)
--- trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm 2014-11-08 10:53:26 UTC (rev 175776)
+++ trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm 2014-11-08 17:17:32 UTC (rev 175777)
@@ -213,6 +213,11 @@
[nowPlaying setNowPlayingInfo:info.get()];
}
+bool MediaSessionManageriOS::sessionCanLoadMedia(const MediaSession& session) const
+{
+ return session.state() == MediaSession::Playing || !session.isHidden() || session.displayType() == MediaSession::Optimized;
+}
+
} // namespace WebCore
@implementation WebMediaSessionHelper