Title: [201729] trunk/Source/WebCore
Revision
201729
Author
jer.no...@apple.com
Date
2016-06-06 14:47:05 -0700 (Mon, 06 Jun 2016)

Log Message

Media elements should only be allowed to control controls manager during a user gesture.
https://bugs.webkit.org/show_bug.cgi?id=158432

Reviewed by Eric Carlson.

Add a new MediaElementSession behavior restriction for the controls manager
which is cleared on the first user gesture. Since canControlControlsManager()
may be called before the first layout, call updatePlaybackControlsManager()
since the main content check requires the laid-out size of the media element.

(WebCore::HTMLMediaElement::HTMLMediaElement):
(WebCore::HTMLMediaElement::layoutSizeChanged):
(WebCore::HTMLMediaElement::removeBehaviorsRestrictionsAfterFirstUserGesture):
* html/HTMLMediaElement.h:
* html/MediaElementSession.cpp:
(WebCore::MediaElementSession::canControlControlsManager):
* html/MediaElementSession.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (201728 => 201729)


--- trunk/Source/WebCore/ChangeLog	2016-06-06 21:40:58 UTC (rev 201728)
+++ trunk/Source/WebCore/ChangeLog	2016-06-06 21:47:05 UTC (rev 201729)
@@ -1,3 +1,23 @@
+2016-06-06  Jer Noble  <jer.no...@apple.com>
+
+        Media elements should only be allowed to control controls manager during a user gesture.
+        https://bugs.webkit.org/show_bug.cgi?id=158432
+
+        Reviewed by Eric Carlson.
+
+        Add a new MediaElementSession behavior restriction for the controls manager
+        which is cleared on the first user gesture. Since canControlControlsManager()
+        may be called before the first layout, call updatePlaybackControlsManager()
+        since the main content check requires the laid-out size of the media element.
+
+        (WebCore::HTMLMediaElement::HTMLMediaElement):
+        (WebCore::HTMLMediaElement::layoutSizeChanged):
+        (WebCore::HTMLMediaElement::removeBehaviorsRestrictionsAfterFirstUserGesture):
+        * html/HTMLMediaElement.h:
+        * html/MediaElementSession.cpp:
+        (WebCore::MediaElementSession::canControlControlsManager):
+        * html/MediaElementSession.h:
+
 2016-06-06  Adam Bergkvist  <adam.bergkv...@ericsson.com>
 
         WebRTC: Update MediaEndpointPeerConnection::createOffer() to use the transceiver set

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (201728 => 201729)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2016-06-06 21:40:58 UTC (rev 201728)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2016-06-06 21:47:05 UTC (rev 201729)
@@ -409,6 +409,7 @@
     , m_parsingInProgress(createdByParser)
     , m_elementIsHidden(document.hidden())
     , m_creatingControls(false)
+    , m_receivedLayoutSizeChanged(false)
 #if ENABLE(MEDIA_CONTROLS_SCRIPT)
     , m_mediaControlsDependOnPageScaleFactor(false)
     , m_haveSetUpCaptionContainer(false)
@@ -443,6 +444,7 @@
 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
     m_mediaSession->addBehaviorRestriction(MediaElementSession::RequireUserGestureToAutoplayToExternalDevice);
 #endif
+    m_mediaSession->addBehaviorRestriction(MediaElementSession::RequireUserGestureToControlControlsManager);
 
     Settings* settings = document.settings();
 #if PLATFORM(IOS)
@@ -4001,6 +4003,11 @@
     };
     m_resizeTaskQueue.enqueueTask(WTFMove(task));
 #endif
+
+    if (!m_receivedLayoutSizeChanged) {
+        m_receivedLayoutSizeChanged = true;
+        updatePlaybackControlsManager();
+    }
 }
 
 void HTMLMediaElement::visibilityDidChange()
@@ -6404,7 +6411,8 @@
         | MediaElementSession::RequireUserGestureForVideoRateChange
         | MediaElementSession::RequireUserGestureForAudioRateChange
         | MediaElementSession::RequireUserGestureForFullscreen
-        | MediaElementSession::InvisibleAutoplayNotPermitted;
+        | MediaElementSession::InvisibleAutoplayNotPermitted
+        | MediaElementSession::RequireUserGestureToControlControlsManager;
     m_mediaSession->removeBehaviorRestriction(restrictionsToRemove);
 }
 

Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (201728 => 201729)


--- trunk/Source/WebCore/html/HTMLMediaElement.h	2016-06-06 21:40:58 UTC (rev 201728)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h	2016-06-06 21:47:05 UTC (rev 201729)
@@ -926,6 +926,7 @@
     bool m_parsingInProgress : 1;
     bool m_elementIsHidden : 1;
     bool m_creatingControls : 1;
+    bool m_receivedLayoutSizeChanged : 1;
 
 #if ENABLE(MEDIA_CONTROLS_SCRIPT)
     bool m_mediaControlsDependOnPageScaleFactor : 1;

Modified: trunk/Source/WebCore/html/MediaElementSession.cpp (201728 => 201729)


--- trunk/Source/WebCore/html/MediaElementSession.cpp	2016-06-06 21:40:58 UTC (rev 201728)
+++ trunk/Source/WebCore/html/MediaElementSession.cpp	2016-06-06 21:47:05 UTC (rev 201729)
@@ -214,31 +214,55 @@
 
 bool MediaElementSession::canControlControlsManager(const HTMLMediaElement& element) const
 {
-    if (!element.hasAudio())
+    if (!element.hasAudio()) {
+        LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: No audio");
         return false;
+    }
 
-    if (element.muted())
+    if (element.muted()) {
+        LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: Muted");
         return false;
+    }
 
-    if (element.ended())
+    if (element.ended()) {
+        LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: Ended");
         return false;
+    }
 
-    if (element.document().activeDOMObjectsAreSuspended())
+    if (element.document().activeDOMObjectsAreSuspended()) {
+        LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: activeDOMObjectsAreSuspended()");
         return false;
+    }
 
-    if (!playbackPermitted(element))
+    if (!playbackPermitted(element)) {
+        LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: Playback not permitted");
         return false;
+    }
 
-    if (!element.renderer())
-        return false;
+    if (element.isVideo()) {
+        if (!element.renderer()) {
+            LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: No renderer");
+            return false;
+        }
 
-    if (isElementLargeEnoughForMainContent(element))
-        return true;
+        if (!element.hasVideo()) {
+            LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: No video");
+            return false;
+        }
 
-    if (ScriptController::processingUserGestureForMedia())
-        return true;
+        if (isElementLargeEnoughForMainContent(element)) {
+            LOG(Media, "MediaElementSession::canControlControlsManager - returning TRUE: Is main content");
+            return true;
+        }
+    }
 
-    return false;
+    if (m_restrictions & RequireUserGestureToControlControlsManager && !ScriptController::processingUserGestureForMedia()) {
+        LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: No user gesture");
+        return false;
+    }
+
+    LOG(Media, "MediaElementSession::canControlControlsManager - returning TRUE: All criteria met");
+    return true;
 }
 
 #if ENABLE(WIRELESS_PLAYBACK_TARGET)

Modified: trunk/Source/WebCore/html/MediaElementSession.h (201728 => 201729)


--- trunk/Source/WebCore/html/MediaElementSession.h	2016-06-06 21:40:58 UTC (rev 201728)
+++ trunk/Source/WebCore/html/MediaElementSession.h	2016-06-06 21:47:05 UTC (rev 201729)
@@ -94,7 +94,8 @@
         MetadataPreloadingNotPermitted = 1 << 9,
         AutoPreloadingNotPermitted = 1 << 10,
         InvisibleAutoplayNotPermitted = 1 << 11,
-        OverrideUserGestureRequirementForMainContent = 1 << 12
+        OverrideUserGestureRequirementForMainContent = 1 << 12,
+        RequireUserGestureToControlControlsManager = 1 << 13,
     };
     typedef unsigned BehaviorRestrictions;
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to