Title: [201109] trunk
- Revision
- 201109
- Author
- jer.no...@apple.com
- Date
- 2016-05-18 15:49:32 -0700 (Wed, 18 May 2016)
Log Message
webkitEnterFullscreen() does not require a user gesture when RequireUserGestureForAudioRateChange is set.
https://bugs.webkit.org/show_bug.cgi?id=157803
Reviewed by Eric Carlson.
Source/WebCore:
Test: media/video-play-audio-require-user-gesture.html
Refactor the setting of restrictions in the HTMLMediaElement constructor, and in so doing, only
relax the RequireUserGestureForFullscreen restriction if both videoPlaybackRequiresUserGesture()
and audioPlaybackRequiresUserGesture() settings are not set.
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::HTMLMediaElement):
LayoutTests:
* media/video-play-audio-require-user-gesture-expected.txt: Added.
* media/video-play-audio-require-user-gesture.html: Added.
Modified Paths
Added Paths
Diff
Modified: trunk/LayoutTests/ChangeLog (201108 => 201109)
--- trunk/LayoutTests/ChangeLog 2016-05-18 22:45:37 UTC (rev 201108)
+++ trunk/LayoutTests/ChangeLog 2016-05-18 22:49:32 UTC (rev 201109)
@@ -1,3 +1,13 @@
+2016-05-18 Jer Noble <jer.no...@apple.com>
+
+ webkitEnterFullscreen() does not require a user gesture when RequireUserGestureForAudioRateChange is set.
+ https://bugs.webkit.org/show_bug.cgi?id=157803
+
+ Reviewed by Eric Carlson.
+
+ * media/video-play-audio-require-user-gesture-expected.txt: Added.
+ * media/video-play-audio-require-user-gesture.html: Added.
+
2016-05-18 Ryosuke Niwa <rn...@webkit.org>
REGRESSION (r186569): media/restore-from-page-cache.html is very flaky
Added: trunk/LayoutTests/media/video-play-audio-require-user-gesture-expected.txt (0 => 201109)
--- trunk/LayoutTests/media/video-play-audio-require-user-gesture-expected.txt (rev 0)
+++ trunk/LayoutTests/media/video-play-audio-require-user-gesture-expected.txt 2016-05-18 22:49:32 UTC (rev 201109)
@@ -0,0 +1,18 @@
+Test that video play(), pause() and webkitEnterFullScreen() should not work unless a user clicked on the play button.
+
+
+EVENT(canplaythrough)
+
+* No user gesture initiated
+RUN(video.play())
+TEST(video.webkitEnterFullScreen()) THROWS(DOMException.INVALID_STATE_ERR) OK
+EXPECTED (video.paused == 'true') OK
+
+* User gesture initiated
+EVENT(playing)
+RUN(video.pause())
+EVENT(pause)
+EXPECTED (video.paused == 'true') OK
+RUN(video.webkitEnterFullScreen())
+END OF TEST
+
Added: trunk/LayoutTests/media/video-play-audio-require-user-gesture.html (0 => 201109)
--- trunk/LayoutTests/media/video-play-audio-require-user-gesture.html (rev 0)
+++ trunk/LayoutTests/media/video-play-audio-require-user-gesture.html 2016-05-18 22:49:32 UTC (rev 201109)
@@ -0,0 +1,83 @@
+<html>
+ <head>
+ <title>Test that video play, pause and enterfullscreen does not work unless a user gesture is involved in playing a video</title>
+ <script src=""
+ <script src=""
+ <script src=""
+ <script>
+ var userGestureInitiated = 0;
+ if (window.internals)
+ window.internals.settings.setAudioPlaybackRequiresUserGesture(true);
+
+ function click()
+ {
+ if (window.eventSender) {
+ var playCoords;
+ try {
+ playCoords = mediaControlsButtonCoordinates(video, "play-button");
+ } catch (exception) {
+ failTest(exception.description);
+ return;
+ }
+ var x = playCoords[0];
+ var y = playCoords[1];
+
+ userGestureInitiated = 1;
+ eventSender.mouseMoveTo(x, y);
+ eventSender.mouseDown();
+ eventSender.mouseUp();
+ }
+ }
+
+ function playing()
+ {
+ if (userGestureInitiated == 0) {
+ failTest("Should not play without user gesture.");
+ } else {
+ run("video.pause()");
+ }
+ }
+
+ function pause()
+ {
+ testExpected("video.paused", true);
+ // Now video.webkitEnterFullScreen() should no longer throw any exception.
+ // However, the video element may not always enter fullscreen. For example,
+ // chromium uses fullscreen API which still requires user gesture
+ try {
+ run("video.webkitEnterFullScreen()");
+ } catch(ex) {
+ failTest("video.webkitEnterFullScreen() still requires user gesture.");
+ }
+ endTest();
+ }
+
+ function canplaythrough()
+ {
+ consoleWrite("");
+ consoleWrite("* No user gesture initiated");
+ run("video.play()");
+ testDOMException("video.webkitEnterFullScreen()", "DOMException.INVALID_STATE_ERR");
+ testExpected("video.paused", true);
+ consoleWrite("");
+
+ consoleWrite("* User gesture initiated");
+ click();
+ }
+
+ function start()
+ {
+ findMediaElement();
+ waitForEvent('canplaythrough', canplaythrough);
+ waitForEvent('playing', playing);
+ waitForEvent('pause', pause);
+ video.src = "" "content/test");
+ }
+ </script>
+ </head>
+
+ <body _onload_="start()">
+ <p>Test that video play(), pause() and webkitEnterFullScreen() should not work unless a user clicked on the play button.</p>
+ <video controls></video>
+ </body>
+</html>
Modified: trunk/Source/WebCore/ChangeLog (201108 => 201109)
--- trunk/Source/WebCore/ChangeLog 2016-05-18 22:45:37 UTC (rev 201108)
+++ trunk/Source/WebCore/ChangeLog 2016-05-18 22:49:32 UTC (rev 201109)
@@ -1,5 +1,21 @@
2016-05-18 Jer Noble <jer.no...@apple.com>
+ webkitEnterFullscreen() does not require a user gesture when RequireUserGestureForAudioRateChange is set.
+ https://bugs.webkit.org/show_bug.cgi?id=157803
+
+ Reviewed by Eric Carlson.
+
+ Test: media/video-play-audio-require-user-gesture.html
+
+ Refactor the setting of restrictions in the HTMLMediaElement constructor, and in so doing, only
+ relax the RequireUserGestureForFullscreen restriction if both videoPlaybackRequiresUserGesture()
+ and audioPlaybackRequiresUserGesture() settings are not set.
+
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::HTMLMediaElement):
+
+2016-05-18 Jer Noble <jer.no...@apple.com>
+
Playback session sends audio and text track lists when media does not have audio or text tracks.
https://bugs.webkit.org/show_bug.cgi?id=157865
<rdar://problem/25992750>
Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (201108 => 201109)
--- trunk/Source/WebCore/html/HTMLMediaElement.cpp 2016-05-18 22:45:37 UTC (rev 201108)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp 2016-05-18 22:49:32 UTC (rev 201109)
@@ -442,30 +442,24 @@
#if PLATFORM(IOS)
m_sendProgressEvents = false;
#endif
- if (!settings || settings->videoPlaybackRequiresUserGesture()) {
- // Allow autoplay in a MediaDocument that is not in an iframe.
- if (document.ownerElement() || !document.isMediaDocument()) {
- m_mediaSession->addBehaviorRestriction(MediaElementSession::RequireUserGestureForVideoRateChange);
- m_mediaSession->addBehaviorRestriction(MediaElementSession::RequireUserGestureForLoad);
- }
-#if ENABLE(WIRELESS_PLAYBACK_TARGET)
- m_mediaSession->addBehaviorRestriction(MediaElementSession::RequireUserGestureToShowPlaybackTargetPicker);
-#endif
- }
-#if PLATFORM(IOS)
- else {
- // Relax RequireUserGestureForFullscreen when videoPlaybackRequiresUserGesture is not set:
- m_mediaSession->removeBehaviorRestriction(MediaElementSession::RequireUserGestureForFullscreen);
- }
-#endif
if (settings && settings->invisibleAutoplayNotPermitted())
m_mediaSession->addBehaviorRestriction(MediaElementSession::InvisibleAutoplayNotPermitted);
if (document.ownerElement() || !document.isMediaDocument()) {
+ if (settings && settings->videoPlaybackRequiresUserGesture()) {
+ m_mediaSession->addBehaviorRestriction(MediaElementSession::RequireUserGestureForVideoRateChange);
+ m_mediaSession->addBehaviorRestriction(MediaElementSession::RequireUserGestureForLoad);
+ }
+
if (settings && settings->audioPlaybackRequiresUserGesture())
m_mediaSession->addBehaviorRestriction(MediaElementSession::RequireUserGestureForAudioRateChange);
+#if ENABLE(WIRELESS_PLAYBACK_TARGET)
+ if (settings && (settings->videoPlaybackRequiresUserGesture() || settings->audioPlaybackRequiresUserGesture()))
+ m_mediaSession->addBehaviorRestriction(MediaElementSession::RequireUserGestureToShowPlaybackTargetPicker);
+#endif
+
if (!settings || !settings->mediaDataLoadsAutomatically())
m_mediaSession->addBehaviorRestriction(MediaElementSession::AutoPreloadingNotPermitted);
@@ -473,6 +467,13 @@
m_mediaSession->addBehaviorRestriction(MediaElementSession::OverrideUserGestureRequirementForMainContent);
}
+#if PLATFORM(IOS)
+ if (settings && !settings->videoPlaybackRequiresUserGesture() && !settings->audioPlaybackRequiresUserGesture()) {
+ // Relax RequireUserGestureForFullscreen when videoPlaybackRequiresUserGesture and audioPlaybackRequiresUserGesture is not set:
+ m_mediaSession->removeBehaviorRestriction(MediaElementSession::RequireUserGestureForFullscreen);
+ }
+#endif
+
#if ENABLE(VIDEO_TRACK)
if (document.page())
m_captionDisplayMode = document.page()->group().captionPreferences().captionDisplayMode();
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes