Changeset 201729 in webkit


Ignore:
Timestamp:
Jun 6, 2016 2:47:05 PM (8 years ago)
Author:
jer.noble@apple.com
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:
Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r201728 r201729  
     12016-06-06  Jer Noble  <jer.noble@apple.com>
     2
     3        Media elements should only be allowed to control controls manager during a user gesture.
     4        https://bugs.webkit.org/show_bug.cgi?id=158432
     5
     6        Reviewed by Eric Carlson.
     7
     8        Add a new MediaElementSession behavior restriction for the controls manager
     9        which is cleared on the first user gesture. Since canControlControlsManager()
     10        may be called before the first layout, call updatePlaybackControlsManager()
     11        since the main content check requires the laid-out size of the media element.
     12
     13        (WebCore::HTMLMediaElement::HTMLMediaElement):
     14        (WebCore::HTMLMediaElement::layoutSizeChanged):
     15        (WebCore::HTMLMediaElement::removeBehaviorsRestrictionsAfterFirstUserGesture):
     16        * html/HTMLMediaElement.h:
     17        * html/MediaElementSession.cpp:
     18        (WebCore::MediaElementSession::canControlControlsManager):
     19        * html/MediaElementSession.h:
     20
    1212016-06-06  Adam Bergkvist  <adam.bergkvist@ericsson.com>
    222
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r201588 r201729  
    410410    , m_elementIsHidden(document.hidden())
    411411    , m_creatingControls(false)
     412    , m_receivedLayoutSizeChanged(false)
    412413#if ENABLE(MEDIA_CONTROLS_SCRIPT)
    413414    , m_mediaControlsDependOnPageScaleFactor(false)
     
    444445    m_mediaSession->addBehaviorRestriction(MediaElementSession::RequireUserGestureToAutoplayToExternalDevice);
    445446#endif
     447    m_mediaSession->addBehaviorRestriction(MediaElementSession::RequireUserGestureToControlControlsManager);
    446448
    447449    Settings* settings = document.settings();
     
    40024004    m_resizeTaskQueue.enqueueTask(WTFMove(task));
    40034005#endif
     4006
     4007    if (!m_receivedLayoutSizeChanged) {
     4008        m_receivedLayoutSizeChanged = true;
     4009        updatePlaybackControlsManager();
     4010    }
    40044011}
    40054012
     
    64056412        | MediaElementSession::RequireUserGestureForAudioRateChange
    64066413        | MediaElementSession::RequireUserGestureForFullscreen
    6407         | MediaElementSession::InvisibleAutoplayNotPermitted;
     6414        | MediaElementSession::InvisibleAutoplayNotPermitted
     6415        | MediaElementSession::RequireUserGestureToControlControlsManager;
    64086416    m_mediaSession->removeBehaviorRestriction(restrictionsToRemove);
    64096417}
  • trunk/Source/WebCore/html/HTMLMediaElement.h

    r201588 r201729  
    927927    bool m_elementIsHidden : 1;
    928928    bool m_creatingControls : 1;
     929    bool m_receivedLayoutSizeChanged : 1;
    929930
    930931#if ENABLE(MEDIA_CONTROLS_SCRIPT)
  • trunk/Source/WebCore/html/MediaElementSession.cpp

    r201588 r201729  
    215215bool MediaElementSession::canControlControlsManager(const HTMLMediaElement& element) const
    216216{
    217     if (!element.hasAudio())
    218         return false;
    219 
    220     if (element.muted())
    221         return false;
    222 
    223     if (element.ended())
    224         return false;
    225 
    226     if (element.document().activeDOMObjectsAreSuspended())
    227         return false;
    228 
    229     if (!playbackPermitted(element))
    230         return false;
    231 
    232     if (!element.renderer())
    233         return false;
    234 
    235     if (isElementLargeEnoughForMainContent(element))
    236         return true;
    237 
    238     if (ScriptController::processingUserGestureForMedia())
    239         return true;
    240 
    241     return false;
     217    if (!element.hasAudio()) {
     218        LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: No audio");
     219        return false;
     220    }
     221
     222    if (element.muted()) {
     223        LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: Muted");
     224        return false;
     225    }
     226
     227    if (element.ended()) {
     228        LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: Ended");
     229        return false;
     230    }
     231
     232    if (element.document().activeDOMObjectsAreSuspended()) {
     233        LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: activeDOMObjectsAreSuspended()");
     234        return false;
     235    }
     236
     237    if (!playbackPermitted(element)) {
     238        LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: Playback not permitted");
     239        return false;
     240    }
     241
     242    if (element.isVideo()) {
     243        if (!element.renderer()) {
     244            LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: No renderer");
     245            return false;
     246        }
     247
     248        if (!element.hasVideo()) {
     249            LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: No video");
     250            return false;
     251        }
     252
     253        if (isElementLargeEnoughForMainContent(element)) {
     254            LOG(Media, "MediaElementSession::canControlControlsManager - returning TRUE: Is main content");
     255            return true;
     256        }
     257    }
     258
     259    if (m_restrictions & RequireUserGestureToControlControlsManager && !ScriptController::processingUserGestureForMedia()) {
     260        LOG(Media, "MediaElementSession::canControlControlsManager - returning FALSE: No user gesture");
     261        return false;
     262    }
     263
     264    LOG(Media, "MediaElementSession::canControlControlsManager - returning TRUE: All criteria met");
     265    return true;
    242266}
    243267
  • trunk/Source/WebCore/html/MediaElementSession.h

    r199286 r201729  
    9595        AutoPreloadingNotPermitted = 1 << 10,
    9696        InvisibleAutoplayNotPermitted = 1 << 11,
    97         OverrideUserGestureRequirementForMainContent = 1 << 12
     97        OverrideUserGestureRequirementForMainContent = 1 << 12,
     98        RequireUserGestureToControlControlsManager = 1 << 13,
    9899    };
    99100    typedef unsigned BehaviorRestrictions;
Note: See TracChangeset for help on using the changeset viewer.