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

Reply via email to