Changeset 162145 in webkit


Ignore:
Timestamp:
Jan 16, 2014, 1:26:53 PM (11 years ago)
Author:
eric.carlson@apple.com
Message:

Allow MediaSessionManager to restrict inline <video> playback
https://bugs.webkit.org/show_bug.cgi?id=127113

Reviewed by Jer Noble.

Source/WebCore:

Test: media/video-fullscreeen-only-playback.html

  • html/HTMLMediaElement.cpp:

(WebCore::HTMLMediaElement::updatePlayState): Drive-by change to not tell the media session that

playback is starting if the media player is already playing. Enter fullscreen if the media
session says it is required.

  • html/HTMLMediaSession.cpp:

(WebCore::HTMLMediaSession::clientWillBeginPlayback): Make it const.
(WebCore::HTMLMediaSession::requiresFullscreenForVideoPlayback): New, see if the specified

media element must be played in fullscreen based on the media session settings, document
settings, and attributes.

  • html/HTMLMediaSession.h:
  • platform/audio/MediaSession.h: pauseSession shouldn't be virtual.
  • platform/audio/MediaSessionManager.cpp:

(WebCore::MediaSessionManager::sessionWillBeginPlayback): Return immediately if ConcurrentPlaybackNotPermitted

is not set.

(WebCore::MediaSessionManager::sessionRestrictsInlineVideoPlayback): New.

  • platform/audio/MediaSessionManager.h:
  • platform/audio/ios/MediaSessionManagerIOS.mm:

(WebCore::MediaSessionManageriOS::MediaSessionManageriOS): Set InlineVideoPlaybackRestricted if

running on an iPhone or iPod class device.

  • testing/Internals.cpp:

(WebCore::Internals::setMediaSessionRestrictions): Support InlineVideoPlaybackRestricted.

LayoutTests:

  • media/video-fullscreeen-only-playback-expected.txt: Added.
  • media/video-fullscreeen-only-playback.html: Added.
Location:
trunk
Files:
2 added
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r162135 r162145  
     12014-01-16  Eric Carlson  <eric.carlson@apple.com>
     2
     3        Allow MediaSessionManager to restrict inline <video> playback
     4        https://bugs.webkit.org/show_bug.cgi?id=127113
     5
     6        Reviewed by Jer Noble.
     7
     8        * media/video-fullscreeen-only-playback-expected.txt: Added.
     9        * media/video-fullscreeen-only-playback.html: Added.
     10
    1112014-01-07  Myles C. Maxfield  <mmaxfield@apple.com>
    212
  • trunk/Source/WebCore/ChangeLog

    r162141 r162145  
     12014-01-16  Eric Carlson  <eric.carlson@apple.com>
     2
     3        Allow MediaSessionManager to restrict inline <video> playback
     4        https://bugs.webkit.org/show_bug.cgi?id=127113
     5
     6        Reviewed by Jer Noble.
     7
     8        Test: media/video-fullscreeen-only-playback.html
     9
     10        * html/HTMLMediaElement.cpp:
     11        (WebCore::HTMLMediaElement::updatePlayState): Drive-by change to not tell the media session that
     12            playback is starting if the media player is already playing. Enter fullscreen if the media
     13            session says it is required.
     14
     15        * html/HTMLMediaSession.cpp:
     16        (WebCore::HTMLMediaSession::clientWillBeginPlayback): Make it const.
     17        (WebCore::HTMLMediaSession::requiresFullscreenForVideoPlayback): New, see if the specified
     18            media element must be played in fullscreen based on the media session settings, document
     19            settings, and attributes.
     20        * html/HTMLMediaSession.h:
     21
     22        * platform/audio/MediaSession.h: pauseSession shouldn't be virtual.
     23
     24        * platform/audio/MediaSessionManager.cpp:
     25        (WebCore::MediaSessionManager::sessionWillBeginPlayback): Return immediately if ConcurrentPlaybackNotPermitted
     26            is not set.
     27        (WebCore::MediaSessionManager::sessionRestrictsInlineVideoPlayback): New.
     28        * platform/audio/MediaSessionManager.h:
     29
     30        * platform/audio/ios/MediaSessionManagerIOS.mm:
     31        (WebCore::MediaSessionManageriOS::MediaSessionManageriOS): Set InlineVideoPlaybackRestricted if
     32            running on an iPhone or iPod class device.
     33
     34        * testing/Internals.cpp:
     35        (WebCore::Internals::setMediaSessionRestrictions): Support InlineVideoPlaybackRestricted.
     36
    1372014-01-16  Roger Fong  <roger_fong@apple.com>
    238
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r161973 r162145  
    42564256        invalidateCachedTime();
    42574257
    4258         m_mediaSession->clientWillBeginPlayback();
    4259 
    42604258        if (playerPaused) {
    4261             if (!m_isFullscreen && isVideo() && document().page() && document().page()->chrome().requiresFullscreenForVideoPlayback())
     4259            m_mediaSession->clientWillBeginPlayback();
     4260
     4261            if (m_mediaSession->requiresFullscreenForVideoPlayback(*this))
    42624262                enterFullscreen();
    42634263
  • trunk/Source/WebCore/html/HTMLMediaSession.cpp

    r162140 r162145  
    3535#include "Page.h"
    3636#include "ScriptController.h"
     37
     38#if PLATFORM(IOS)
     39#include "RuntimeApplicationChecksIOS.h"
     40#endif
    3741
    3842namespace WebCore {
     
    123127#endif
    124128
    125 void HTMLMediaSession::clientWillBeginPlayback()
     129void HTMLMediaSession::clientWillBeginPlayback() const
    126130{
    127131    MediaSessionManager::sharedManager().sessionWillBeginPlayback(*this);
    128132}
    129133
    130 void HTMLMediaSession::pauseSession()
     134bool HTMLMediaSession::requiresFullscreenForVideoPlayback(const HTMLMediaElement& element) const
    131135{
    132     client().pausePlayback();
     136    if (!MediaSessionManager::sharedManager().sessionRestrictsInlineVideoPlayback(*this))
     137        return false;
     138
     139    Settings* settings = element.document().settings();
     140    if (!settings || !settings->mediaPlaybackAllowsInline())
     141        return true;
     142
     143    if (element.fastHasAttribute(HTMLNames::webkit_playsinlineAttr))
     144        return false;
     145
     146#if PLATFORM(IOS)
     147    if (applicationIsDumpRenderTree())
     148        return false;
     149#endif
     150
     151    return true;
    133152}
    134  
     153
    135154}
    136155
  • trunk/Source/WebCore/html/HTMLMediaSession.h

    r162140 r162145  
    4242    virtual ~HTMLMediaSession() { }
    4343
    44     void clientWillBeginPlayback();
    45 
    46     virtual void pauseSession() override;
     44    void clientWillBeginPlayback() const;
    4745
    4846    bool playbackPermitted(const HTMLMediaElement&) const;
     
    5452    bool showingPlaybackTargetPickerPermitted(const HTMLMediaElement&) const;
    5553#endif
     54    bool requiresFullscreenForVideoPlayback(const HTMLMediaElement&) const;
    5655
    5756    // Restrictions to modify default behaviors.
  • trunk/Source/WebCore/platform/audio/MediaSession.h

    r162108 r162145  
    6363    void endInterruption(EndInterruptionFlags);
    6464
    65     virtual void pauseSession();
     65    void pauseSession();
    6666
    6767protected:
  • trunk/Source/WebCore/platform/audio/MediaSessionManager.cpp

    r162108 r162145  
    127127}
    128128
    129 void MediaSessionManager::sessionWillBeginPlayback(MediaSession& session)
     129void MediaSessionManager::sessionWillBeginPlayback(const MediaSession& session) const
    130130{
    131131    MediaSession::MediaType sessionType = session.mediaType();
    132132    SessionRestrictions restrictions = m_restrictions[sessionType];
    133     if (restrictions == NoRestrictions)
     133    if (!restrictions & ConcurrentPlaybackNotPermitted)
    134134        return;
    135135
     
    144144}
    145145
     146bool MediaSessionManager::sessionRestrictsInlineVideoPlayback(const MediaSession& session) const
     147{
     148    MediaSession::MediaType sessionType = session.mediaType();
     149    if (sessionType != MediaSession::Video)
     150        return false;
     151
     152    return m_restrictions[sessionType] & InlineVideoPlaybackRestricted;
     153}
     154
    146155#if !PLATFORM(MAC)
    147156void MediaSessionManager::updateSessionState()
  • trunk/Source/WebCore/platform/audio/MediaSessionManager.h

    r162108 r162145  
    5050        NoRestrictions = 0,
    5151        ConcurrentPlaybackNotPermitted = 1 << 0,
     52        InlineVideoPlaybackRestricted = 1 << 0,
    5253    };
    5354    typedef unsigned SessionRestrictions;
     
    5758    SessionRestrictions restrictions(MediaSession::MediaType);
    5859
    59     void sessionWillBeginPlayback(MediaSession&);
     60    void sessionWillBeginPlayback(const MediaSession&) const;
     61    bool sessionRestrictsInlineVideoPlayback(const MediaSession&) const;
    6062
    6163protected:
  • trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm

    r161899 r162145  
    3333#import "SoftLinking.h"
    3434#import "WebCoreThreadRun.h"
     35#import "WebCoreSystemInterface.h"
    3536#import <AVFoundation/AVAudioSession.h>
    3637#import <objc/runtime.h>
     
    7374    , m_objcObserver(adoptNS([[WebMediaSessionHelper alloc] initWithCallback:this]))
    7475{
     76    DEFINE_STATIC_LOCAL(wkDeviceClass, deviceClass, iosDeviceClass());
     77
     78    if (deviceClass == wkDeviceClassiPhone || deviceClass == wkDeviceClassiPod)
     79        addRestriction(MediaSession::Video, InlineVideoPlaybackRestricted);
     80
    7581    addRestriction(MediaSession::Video, ConcurrentPlaybackNotPermitted);
    7682}
  • trunk/Source/WebCore/testing/Internals.cpp

    r162139 r162145  
    23132313    if (equalIgnoringCase(restrictionsString, "ConcurrentPlaybackNotPermitted"))
    23142314        restrictions = MediaSessionManager::ConcurrentPlaybackNotPermitted;
     2315    if (equalIgnoringCase(restrictionsString, "InlineVideoPlaybackRestricted"))
     2316        restrictions += MediaSessionManager::InlineVideoPlaybackRestricted;
    23152317   
    23162318    MediaSessionManager::sharedManager().addRestriction(mediaType, restrictions);
Note: See TracChangeset for help on using the changeset viewer.