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);