Title: [209425] trunk
Revision
209425
Author
[email protected]
Date
2016-12-06 14:48:17 -0800 (Tue, 06 Dec 2016)

Log Message

YouTube sometimes pauses when switching tabs
https://bugs.webkit.org/show_bug.cgi?id=165468

Reviewed by Eric Carlson.

Source/WebCore:

Test: media/media-session-restrictions.html

The bitfield which represents the restrictions for "VideoAudio" media type was unititialized,
leading to what was effectively a random set of restrictions at runtime.

* platform/audio/PlatformMediaSessionManager.cpp:
(WebCore::PlatformMediaSessionManager::resetRestrictions):
* testing/Internals.cpp:
(WebCore::mediaTypeFromString):
(WebCore::Internals::setMediaSessionRestrictions):
(WebCore::Internals::mediaSessionRestrictions):
* testing/Internals.h:
* testing/Internals.idl:

LayoutTests:

* media/media-session-restrictions.html: Added.
* platform/ios-simulator/media/media-session-restrictions-expected.txt: Added.
* platform/mac/media/media-session-restrictions-expected.txt: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (209424 => 209425)


--- trunk/LayoutTests/ChangeLog	2016-12-06 22:43:16 UTC (rev 209424)
+++ trunk/LayoutTests/ChangeLog	2016-12-06 22:48:17 UTC (rev 209425)
@@ -1,3 +1,14 @@
+2016-12-06  Jer Noble  <[email protected]>
+
+        YouTube sometimes pauses when switching tabs
+        https://bugs.webkit.org/show_bug.cgi?id=165468
+
+        Reviewed by Eric Carlson.
+
+        * media/media-session-restrictions.html: Added.
+        * platform/ios-simulator/media/media-session-restrictions-expected.txt: Added.
+        * platform/mac/media/media-session-restrictions-expected.txt: Added.
+
 2016-12-06  Mark Lam  <[email protected]>
 
         Introduce the concept of Immutable Prototype Exotic Objects to comply with the spec.

Added: trunk/LayoutTests/media/media-session-restrictions.html (0 => 209425)


--- trunk/LayoutTests/media/media-session-restrictions.html	                        (rev 0)
+++ trunk/LayoutTests/media/media-session-restrictions.html	2016-12-06 22:48:17 UTC (rev 209425)
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+    <script src=""
+    <body>
+    <script>
+
+    if (!window.internals) {
+        failTest('This test requires window.internals and must be run in DumpRenderTree or WebKitTestRunner.');
+        throw '';
+    }
+
+    ['video','audio','videoaudio','webaudio'].forEach(type => {
+        consoleWrite(`mediaSessionRestrictions["${type}"] = "${ internals.mediaSessionRestrictions(type) }"`);
+    });
+
+    endTest();
+
+    </script>
+    </body>
+</html>
\ No newline at end of file

Added: trunk/LayoutTests/platform/ios-simulator/media/media-session-restrictions-expected.txt (0 => 209425)


--- trunk/LayoutTests/platform/ios-simulator/media/media-session-restrictions-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/platform/ios-simulator/media/media-session-restrictions-expected.txt	2016-12-06 22:48:17 UTC (rev 209425)
@@ -0,0 +1,6 @@
+mediaSessionRestrictions["video"] = "backgroundprocessplaybackrestricted,backgroundtabplaybackrestricted"
+mediaSessionRestrictions["audio"] = ""
+mediaSessionRestrictions["videoaudio"] = "concurrentplaybacknotpermitted,backgroundprocessplaybackrestricted"
+mediaSessionRestrictions["webaudio"] = ""
+END OF TEST
+

Added: trunk/LayoutTests/platform/mac/media/media-session-restrictions-expected.txt (0 => 209425)


--- trunk/LayoutTests/platform/mac/media/media-session-restrictions-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/platform/mac/media/media-session-restrictions-expected.txt	2016-12-06 22:48:17 UTC (rev 209425)
@@ -0,0 +1,6 @@
+mediaSessionRestrictions["video"] = ""
+mediaSessionRestrictions["audio"] = ""
+mediaSessionRestrictions["videoaudio"] = ""
+mediaSessionRestrictions["webaudio"] = ""
+END OF TEST
+

Modified: trunk/Source/WebCore/ChangeLog (209424 => 209425)


--- trunk/Source/WebCore/ChangeLog	2016-12-06 22:43:16 UTC (rev 209424)
+++ trunk/Source/WebCore/ChangeLog	2016-12-06 22:48:17 UTC (rev 209425)
@@ -1,3 +1,24 @@
+2016-12-06  Jer Noble  <[email protected]>
+
+        YouTube sometimes pauses when switching tabs
+        https://bugs.webkit.org/show_bug.cgi?id=165468
+
+        Reviewed by Eric Carlson.
+
+        Test: media/media-session-restrictions.html
+
+        The bitfield which represents the restrictions for "VideoAudio" media type was unititialized,
+        leading to what was effectively a random set of restrictions at runtime.
+
+        * platform/audio/PlatformMediaSessionManager.cpp:
+        (WebCore::PlatformMediaSessionManager::resetRestrictions):
+        * testing/Internals.cpp:
+        (WebCore::mediaTypeFromString):
+        (WebCore::Internals::setMediaSessionRestrictions):
+        (WebCore::Internals::mediaSessionRestrictions):
+        * testing/Internals.h:
+        * testing/Internals.idl:
+
 2016-12-06  Mark Lam  <[email protected]>
 
         Introduce the concept of Immutable Prototype Exotic Objects to comply with the spec.

Modified: trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.cpp (209424 => 209425)


--- trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.cpp	2016-12-06 22:43:16 UTC (rev 209424)
+++ trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.cpp	2016-12-06 22:48:17 UTC (rev 209425)
@@ -69,6 +69,7 @@
 {
     m_restrictions[PlatformMediaSession::Video] = NoRestrictions;
     m_restrictions[PlatformMediaSession::Audio] = NoRestrictions;
+    m_restrictions[PlatformMediaSession::VideoAudio] = NoRestrictions;
     m_restrictions[PlatformMediaSession::WebAudio] = NoRestrictions;
 }
 

Modified: trunk/Source/WebCore/testing/Internals.cpp (209424 => 209425)


--- trunk/Source/WebCore/testing/Internals.cpp	2016-12-06 22:43:16 UTC (rev 209424)
+++ trunk/Source/WebCore/testing/Internals.cpp	2016-12-06 22:48:17 UTC (rev 209425)
@@ -138,6 +138,7 @@
 #include <runtime/JSCJSValue.h>
 #include <wtf/text/CString.h>
 #include <wtf/text/StringBuffer.h>
+#include <wtf/text/StringBuilder.h>
 
 #if ENABLE(INPUT_TYPE_COLOR)
 #include "ColorChooser.h"
@@ -2760,18 +2761,24 @@
     PlatformMediaSessionManager::sharedManager().applicationWillEnterBackground();
 }
 
+static PlatformMediaSession::MediaType mediaTypeFromString(const String& mediaTypeString)
+{
+    if (equalLettersIgnoringASCIICase(mediaTypeString, "video"))
+        return PlatformMediaSession::Video;
+    if (equalLettersIgnoringASCIICase(mediaTypeString, "audio"))
+        return PlatformMediaSession::Audio;
+    if (equalLettersIgnoringASCIICase(mediaTypeString, "videoaudio"))
+        return PlatformMediaSession::VideoAudio;
+    if (equalLettersIgnoringASCIICase(mediaTypeString, "webaudio"))
+        return PlatformMediaSession::WebAudio;
+
+    return PlatformMediaSession::None;
+}
+
 ExceptionOr<void> Internals::setMediaSessionRestrictions(const String& mediaTypeString, const String& restrictionsString)
 {
-    PlatformMediaSession::MediaType mediaType = PlatformMediaSession::None;
-    if (equalLettersIgnoringASCIICase(mediaTypeString, "video"))
-        mediaType = PlatformMediaSession::Video;
-    else if (equalLettersIgnoringASCIICase(mediaTypeString, "audio"))
-        mediaType = PlatformMediaSession::Audio;
-    else if (equalLettersIgnoringASCIICase(mediaTypeString, "videoaudio"))
-        mediaType = PlatformMediaSession::VideoAudio;
-    else if (equalLettersIgnoringASCIICase(mediaTypeString, "webaudio"))
-        mediaType = PlatformMediaSession::WebAudio;
-    else
+    PlatformMediaSession::MediaType mediaType = mediaTypeFromString(mediaTypeString);
+    if (mediaType == PlatformMediaSession::None)
         return Exception { INVALID_ACCESS_ERR };
 
     PlatformMediaSessionManager::SessionRestrictions restrictions = PlatformMediaSessionManager::sharedManager().restrictions(mediaType);
@@ -2795,6 +2802,37 @@
     return { };
 }
 
+ExceptionOr<String> Internals::mediaSessionRestrictions(const String& mediaTypeString) const
+{
+    PlatformMediaSession::MediaType mediaType = mediaTypeFromString(mediaTypeString);
+    if (mediaType == PlatformMediaSession::None)
+        return Exception { INVALID_ACCESS_ERR };
+
+    PlatformMediaSessionManager::SessionRestrictions restrictions = PlatformMediaSessionManager::sharedManager().restrictions(mediaType);
+    if (restrictions == PlatformMediaSessionManager::NoRestrictions)
+        return String();
+
+    StringBuilder builder;
+    if (restrictions & PlatformMediaSessionManager::ConcurrentPlaybackNotPermitted)
+        builder.append("concurrentplaybacknotpermitted");
+    if (restrictions & PlatformMediaSessionManager::BackgroundProcessPlaybackRestricted) {
+        if (!builder.isEmpty())
+            builder.append(',');
+        builder.append("backgroundprocessplaybackrestricted");
+    }
+    if (restrictions & PlatformMediaSessionManager::BackgroundTabPlaybackRestricted) {
+        if (!builder.isEmpty())
+            builder.append(',');
+        builder.append("backgroundtabplaybackrestricted");
+    }
+    if (restrictions & PlatformMediaSessionManager::InterruptedPlaybackNotPermitted) {
+        if (!builder.isEmpty())
+            builder.append(',');
+        builder.append("interruptedplaybacknotpermitted");
+    }
+    return builder.toString();
+}
+
 void Internals::setMediaElementRestrictions(HTMLMediaElement& element, const String& restrictionsString)
 {
     MediaElementSession::BehaviorRestrictions restrictions = element.mediaSession().behaviorRestrictions();

Modified: trunk/Source/WebCore/testing/Internals.h (209424 => 209425)


--- trunk/Source/WebCore/testing/Internals.h	2016-12-06 22:43:16 UTC (rev 209424)
+++ trunk/Source/WebCore/testing/Internals.h	2016-12-06 22:48:17 UTC (rev 209425)
@@ -421,6 +421,7 @@
     void applicationDidEnterForeground() const;
     void applicationWillEnterBackground() const;
     ExceptionOr<void> setMediaSessionRestrictions(const String& mediaType, const String& restrictions);
+    ExceptionOr<String> mediaSessionRestrictions(const String& mediaType) const;
     void setMediaElementRestrictions(HTMLMediaElement&, const String& restrictions);
     ExceptionOr<void> postRemoteControlCommand(const String&, float argument);
     bool elementIsBlockingDisplaySleep(HTMLMediaElement&) const;

Modified: trunk/Source/WebCore/testing/Internals.idl (209424 => 209425)


--- trunk/Source/WebCore/testing/Internals.idl	2016-12-06 22:43:16 UTC (rev 209424)
+++ trunk/Source/WebCore/testing/Internals.idl	2016-12-06 22:48:17 UTC (rev 209425)
@@ -413,6 +413,7 @@
     [Conditional=VIDEO] void applicationDidEnterForeground();
     [Conditional=VIDEO] void applicationWillEnterBackground();
     [Conditional=VIDEO, MayThrowException] void setMediaSessionRestrictions(DOMString mediaType, DOMString restrictions);
+    [Conditional=VIDEO, MayThrowException] DOMString mediaSessionRestrictions(DOMString mediaType);
     [Conditional=VIDEO] void setMediaElementRestrictions(HTMLMediaElement element, DOMString restrictions);
     [Conditional=WEB_AUDIO] void setAudioContextRestrictions(AudioContext context, DOMString restrictions);
     [Conditional=VIDEO, MayThrowException] void postRemoteControlCommand(DOMString command, optional unrestricted float argument = 0);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to