Title: [175777] trunk/Source/WebCore
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
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to