Changeset 161899 in webkit


Ignore:
Timestamp:
Jan 13, 2014, 11:42:27 AM (12 years ago)
Author:
eric.carlson@apple.com
Message:

Allow MediaSessionManager to restrict media playback
https://bugs.webkit.org/show_bug.cgi?id=126780

Reviewed by Jer Noble.

Source/WebCore:

Test: media/video-concurrent-playback.html

  • WebCore.exp.in: Export functions needed by Internals.

Add HTMLMediaSession.

  • WebCore.xcodeproj/project.pbxproj:
  • CMakeLists.txt:
  • GNUmakefile.list.am:
  • WebCore.vcxproj/WebCore.vcxproj:
  • WebCore.vcxproj/WebCore.vcxproj.filters:
  • WebCore.xcodeproj/project.pbxproj:

Add a media session object to manage HTMLMediaElement restrictions.

  • html/HTMLMediaSession.cpp: Added.
  • html/HTMLMediaSession.h: Added.

Move media restriction management to a MediaSession.

  • html/HTMLMediaElement.cpp:

(WebCore::HTMLMediaElement::HTMLMediaElement): Use the media session to manage restrictions.
(WebCore::HTMLMediaElement::parseAttribute): Ditto.
(WebCore::HTMLMediaElement::insertedInto): Ditto.
(WebCore::HTMLMediaElement::parseAttribute): Ditto.
(WebCore::HTMLMediaElement::loadInternal): Ditto.
(WebCore::HTMLMediaElement::loadResource): Ditto.
(WebCore::HTMLMediaElement::setReadyState): Ditto.
(WebCore::HTMLMediaElement::autoplay): Ditto.
(WebCore::HTMLMediaElement::play): Ditto.
(WebCore::HTMLMediaElement::pause): Ditto
(WebCore::HTMLMediaElement::pauseInternal): Ditto
(WebCore::HTMLMediaElement::suspend): Ditto
(WebCore::HTMLMediaElement::resume): Ditto.
(WebCore::HTMLMediaElement::updatePlayState): Tell media session playback is about to start.
(WebCore::HTMLMediaElement::deliverNotification): Ditto.
(WebCore::HTMLMediaElement::webkitShowPlaybackTargetPicker): Ditto.
(WebCore::HTMLMediaElement::mediaPlayerIsFullscreenPermitted): Ditto.
(WebCore::HTMLMediaElement::removeBehaviorsRestrictionsAfterFirstUserGesture): Ditto.
(WebCore::HTMLMediaElement::pausePlayback): New, allows the media session to pause playback.

  • html/HTMLMediaElement.h:
  • html/HTMLVideoElement.cpp:

(WebCore::HTMLVideoElement::webkitEnterFullscreen): Use the media session to manage restrictions.

  • platform/audio/MediaSession.cpp:

(WebCore::MediaSession::beginInterruption): Add logging.
(WebCore::MediaSession::endInterruption): Ditto.
(WebCore::MediaSession::pauseSession): New, allows the session manager to pause playback.

  • platform/audio/MediaSession.h:

Add per-media type restrictions.

  • platform/audio/MediaSessionManager.cpp:

(WebCore::MediaSessionManager::MediaSessionManager): Initialize restrictions.
(WebCore::MediaSessionManager::addRestriction): New.
(WebCore::MediaSessionManager::removeRestriction): New.
(WebCore::MediaSessionManager::restrictions): New.
(WebCore::MediaSessionManager::sessionWillBeginPlayback): New. If only one session if the same

type is allowed to play, pause all others.

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

(WebCore::MediaSessionManager::sharedManager):
(WebCore::m_objcObserver):
(-[WebAVAudioSessionHelper initWithCallback:]):
(-[WebAVAudioSessionHelper dealloc]):
(-[WebAVAudioSessionHelper interruption:]):

  • platform/audio/mac/AudioDestinationMac.h: Add pausePlayback.

Allow tests to set media session restrictions.

  • testing/Internals.cpp:
  • testing/Internals.h:
  • testing/Internals.idl:

LayoutTests:

  • media/video-concurrent-playback-expected.txt: Added.
  • media/video-concurrent-playback.html: Added.
Location:
trunk
Files:
6 added
18 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r161898 r161899  
     12014-01-13  Eric Carlson  <eric.carlson@apple.com>
     2
     3        Allow MediaSessionManager to restrict media playback
     4        https://bugs.webkit.org/show_bug.cgi?id=126780
     5
     6        Reviewed by Jer Noble.
     7
     8        * media/video-concurrent-playback-expected.txt: Added.
     9        * media/video-concurrent-playback.html: Added.
     10
    1112014-01-13  Zalan Bujtas  <zalan@apple.com>
    212
  • trunk/Source/WebCore/CMakeLists.txt

    r161817 r161899  
    14161416    html/HTMLMarqueeElement.cpp
    14171417    html/HTMLMediaElement.cpp
     1418    html/HTMLMediaSession.cpp
    14181419    html/HTMLMediaSource.cpp
    14191420    html/HTMLMenuElement.cpp
  • trunk/Source/WebCore/ChangeLog

    r161896 r161899  
     12014-01-13  Eric Carlson  <eric.carlson@apple.com>
     2
     3        Allow MediaSessionManager to restrict media playback
     4        https://bugs.webkit.org/show_bug.cgi?id=126780
     5
     6        Reviewed by Jer Noble.
     7
     8        Test: media/video-concurrent-playback.html
     9
     10        * WebCore.exp.in: Export functions needed by Internals.
     11
     12        Add HTMLMediaSession.
     13        * WebCore.xcodeproj/project.pbxproj:
     14        * CMakeLists.txt:
     15        * GNUmakefile.list.am:
     16        * WebCore.vcxproj/WebCore.vcxproj:
     17        * WebCore.vcxproj/WebCore.vcxproj.filters:
     18        * WebCore.xcodeproj/project.pbxproj:
     19
     20        Add a media session object to manage HTMLMediaElement restrictions.
     21        * html/HTMLMediaSession.cpp: Added.
     22        * html/HTMLMediaSession.h: Added.
     23
     24        Move media restriction management to a MediaSession.
     25        * html/HTMLMediaElement.cpp:
     26        (WebCore::HTMLMediaElement::HTMLMediaElement): Use the media session to manage restrictions.
     27        (WebCore::HTMLMediaElement::parseAttribute): Ditto.
     28        (WebCore::HTMLMediaElement::insertedInto): Ditto.
     29        (WebCore::HTMLMediaElement::parseAttribute): Ditto.
     30        (WebCore::HTMLMediaElement::loadInternal): Ditto.
     31        (WebCore::HTMLMediaElement::loadResource): Ditto.
     32        (WebCore::HTMLMediaElement::setReadyState): Ditto.
     33        (WebCore::HTMLMediaElement::autoplay): Ditto.
     34        (WebCore::HTMLMediaElement::play): Ditto.
     35        (WebCore::HTMLMediaElement::pause): Ditto
     36        (WebCore::HTMLMediaElement::pauseInternal): Ditto
     37        (WebCore::HTMLMediaElement::suspend): Ditto
     38        (WebCore::HTMLMediaElement::resume): Ditto.
     39        (WebCore::HTMLMediaElement::updatePlayState): Tell media session playback is about to start.
     40        (WebCore::HTMLMediaElement::deliverNotification): Ditto.
     41        (WebCore::HTMLMediaElement::webkitShowPlaybackTargetPicker): Ditto.
     42        (WebCore::HTMLMediaElement::mediaPlayerIsFullscreenPermitted): Ditto.
     43        (WebCore::HTMLMediaElement::removeBehaviorsRestrictionsAfterFirstUserGesture): Ditto.
     44        (WebCore::HTMLMediaElement::pausePlayback): New, allows the media session to pause playback.
     45        * html/HTMLMediaElement.h:
     46
     47        * html/HTMLVideoElement.cpp:
     48        (WebCore::HTMLVideoElement::webkitEnterFullscreen): Use the media session to manage restrictions.
     49
     50        * platform/audio/MediaSession.cpp:
     51        (WebCore::MediaSession::beginInterruption): Add logging.
     52        (WebCore::MediaSession::endInterruption): Ditto.
     53        (WebCore::MediaSession::pauseSession): New, allows the session manager to pause playback.
     54        * platform/audio/MediaSession.h:
     55
     56        Add per-media type restrictions.
     57        * platform/audio/MediaSessionManager.cpp:
     58        (WebCore::MediaSessionManager::MediaSessionManager): Initialize restrictions.
     59        (WebCore::MediaSessionManager::addRestriction): New.
     60        (WebCore::MediaSessionManager::removeRestriction): New.
     61        (WebCore::MediaSessionManager::restrictions): New.
     62        (WebCore::MediaSessionManager::sessionWillBeginPlayback): New. If only one session if the same
     63            type is allowed to play, pause all others.
     64        * platform/audio/MediaSessionManager.h:
     65
     66        * platform/audio/ios/MediaSessionManagerIOS.h: Added.
     67        * platform/audio/ios/MediaSessionManagerIOS.mm: Added.
     68        (WebCore::MediaSessionManager::sharedManager):
     69        (WebCore::m_objcObserver):
     70        (-[WebAVAudioSessionHelper initWithCallback:]):
     71        (-[WebAVAudioSessionHelper dealloc]):
     72        (-[WebAVAudioSessionHelper interruption:]):
     73
     74        * platform/audio/mac/AudioDestinationMac.h: Add pausePlayback.
     75
     76        Allow tests to set media session restrictions.
     77        * testing/Internals.cpp:
     78        * testing/Internals.h:
     79        * testing/Internals.idl:
     80
    1812014-01-13  Alexey Proskuryakov  <ap@apple.com>
    282
  • trunk/Source/WebCore/GNUmakefile.list.am

    r161890 r161899  
    34583458        Source/WebCore/html/HTMLMediaElement.cpp \
    34593459        Source/WebCore/html/HTMLMediaElement.h \
     3460        Source/WebCore/html/HTMLMediaSession.cpp \
     3461        Source/WebCore/html/HTMLMediaSession.h \
    34603462        Source/WebCore/html/HTMLMenuElement.cpp \
    34613463        Source/WebCore/html/HTMLMenuElement.h \
  • trunk/Source/WebCore/WebCore.exp.in

    r161823 r161899  
    754754__ZN7WebCore19LayerFlushSchedulerD1Ev
    755755__ZN7WebCore19LayerFlushSchedulerD2Ev
     756__ZN7WebCore19MediaSessionManager12restrictionsENS_12MediaSession9MediaTypeE
    756757__ZN7WebCore19MediaSessionManager13sharedManagerEv
     758__ZN7WebCore19MediaSessionManager14addRestrictionENS_12MediaSession9MediaTypeEj
    757759__ZN7WebCore19MediaSessionManager15endInterruptionENS_12MediaSession20EndInterruptionFlagsE
    758760__ZN7WebCore19MediaSessionManager17beginInterruptionEv
     761__ZN7WebCore19MediaSessionManager17removeRestrictionENS_12MediaSession9MediaTypeEj
    759762__ZN7WebCore19ResourceRequestBase11setHTTPBodyEN3WTF10PassRefPtrINS_8FormDataEEE
    760763__ZN7WebCore19ResourceRequestBase13setHTTPMethodERKN3WTF6StringE
  • trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj

    r161819 r161899  
    1458414584    <ClCompile Include="..\html\DOMTokenList.cpp" />
    1458514585    <ClCompile Include="..\html\DOMURL.cpp" />
     14586    <ClCompile Include="..\html\HTMLMediaSession.cpp" />
    1458614587    <ClCompile Include="..\html\EmailInputType.cpp" />
    1458714588    <ClCompile Include="..\fileapi\File.cpp" />
     
    2044020441    <ClInclude Include="..\html\DOMTokenList.h" />
    2044120442    <ClInclude Include="..\html\DOMURL.h" />
     20443    <ClInclude Include="..\html\ElementMediaSession.h" />
    2044220444    <ClInclude Include="..\html\EmailInputType.h" />
    2044320445    <ClInclude Include="..\fileapi\File.h" />
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r161892 r161899  
    186186                076306E117E16089005A7C4E /* JSSourceInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 076306DF17E16089005A7C4E /* JSSourceInfo.h */; settings = {ATTRIBUTES = (Private, ); }; };
    187187                076306E317E22A43005A7C4E /* MediaStreamTrackSourcesRequestClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 076306E217E22A43005A7C4E /* MediaStreamTrackSourcesRequestClient.h */; };
     188                07638A991884487200E15A1B /* MediaSessionManagerIOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 07638A971884487200E15A1B /* MediaSessionManagerIOS.h */; };
     189                07638A9A1884487200E15A1B /* MediaSessionManagerIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 07638A981884487200E15A1B /* MediaSessionManagerIOS.mm */; };
    188190                076970861463AD8700F502CF /* TextTrackList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 076970841463AD8700F502CF /* TextTrackList.cpp */; };
    189191                076970871463AD8700F502CF /* TextTrackList.h in Headers */ = {isa = PBXBuildFile; fileRef = 076970851463AD8700F502CF /* TextTrackList.h */; };
     
    340342                07ED35A316D6DCE2002248F3 /* InbandTextTrackPrivateAVFIOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 07357C7616D2DF0D00ED99E7 /* InbandTextTrackPrivateAVFIOS.h */; };
    341343                07F944161864D046005D31CB /* MediaSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = CDAE8C081746B95700532D78 /* MediaSessionManager.h */; settings = {ATTRIBUTES = (Private, ); }; };
     344                07FE99DC18807A7D00256648 /* HTMLMediaSession.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07FE99DA18807A7D00256648 /* HTMLMediaSession.cpp */; };
     345                07FE99DD18807A7D00256648 /* HTMLMediaSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 07FE99DB18807A7D00256648 /* HTMLMediaSession.h */; settings = {ATTRIBUTES = (Private, ); }; };
    342346                07FFDE68181AED420072D409 /* MediaStreamTrackPrivate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07FFDE66181AED420072D409 /* MediaStreamTrackPrivate.cpp */; };
    343347                07FFDE69181AED420072D409 /* MediaStreamTrackPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 07FFDE67181AED420072D409 /* MediaStreamTrackPrivate.h */; };
     
    70357039                076306DF17E16089005A7C4E /* JSSourceInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSSourceInfo.h; sourceTree = "<group>"; };
    70367040                076306E217E22A43005A7C4E /* MediaStreamTrackSourcesRequestClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaStreamTrackSourcesRequestClient.h; sourceTree = "<group>"; };
     7041                07638A971884487200E15A1B /* MediaSessionManagerIOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MediaSessionManagerIOS.h; path = ios/MediaSessionManagerIOS.h; sourceTree = "<group>"; };
     7042                07638A981884487200E15A1B /* MediaSessionManagerIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MediaSessionManagerIOS.mm; path = ios/MediaSessionManagerIOS.mm; sourceTree = "<group>"; };
    70377043                076970841463AD8700F502CF /* TextTrackList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextTrackList.cpp; sourceTree = "<group>"; };
    70387044                076970851463AD8700F502CF /* TextTrackList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextTrackList.h; sourceTree = "<group>"; };
     
    71247130                07E116B01489C9A100EC5ACE /* JSTextTrackCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSTextTrackCustom.cpp; sourceTree = "<group>"; };
    71257131                07E117061489EBEB00EC5ACE /* JSTextTrackCueCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSTextTrackCueCustom.cpp; sourceTree = "<group>"; };
     7132                07FE99DA18807A7D00256648 /* HTMLMediaSession.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTMLMediaSession.cpp; sourceTree = "<group>"; };
     7133                07FE99DB18807A7D00256648 /* HTMLMediaSession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLMediaSession.h; sourceTree = "<group>"; };
    71267134                07FFDE66181AED420072D409 /* MediaStreamTrackPrivate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaStreamTrackPrivate.cpp; sourceTree = "<group>"; };
    71277135                07FFDE67181AED420072D409 /* MediaStreamTrackPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaStreamTrackPrivate.h; sourceTree = "<group>"; };
     
    1717317181                        isa = PBXGroup;
    1717417182                        children = (
     17183                                07FE99DA18807A7D00256648 /* HTMLMediaSession.cpp */,
     17184                                07FE99DB18807A7D00256648 /* HTMLMediaSession.h */,
    1717517185                                49484FAE102CF01E00187DD3 /* canvas */,
    1717617186                                1A88A90117553CD7000C74F9 /* forms */,
     
    2099921009                        isa = PBXGroup;
    2100021010                        children = (
     21011                                07638A971884487200E15A1B /* MediaSessionManagerIOS.h */,
     21012                                07638A981884487200E15A1B /* MediaSessionManagerIOS.mm */,
    2100121013                                CD0EEE0B14743E35003EAFA2 /* AudioDestinationIOS.cpp */,
    2100221014                                CD0EEE0A14743E34003EAFA2 /* AudioDestinationIOS.h */,
     
    2434124353                                1A494E350A12358B00FDAFC1 /* JSHTMLDocument.h in Headers */,
    2434224354                                1A494BFB0A122F4400FDAFC1 /* JSHTMLElement.h in Headers */,
     24355                                07638A991884487200E15A1B /* MediaSessionManagerIOS.h in Headers */,
    2434324356                                938E65F109F09840008A48EC /* JSHTMLElementWrapperFactory.h in Headers */,
    2434424357                                BC6D44ED0C07F2ED0072D2C9 /* JSHTMLEmbedElement.h in Headers */,
     
    2535625369                                931CBD0F161A44E900E4C874 /* ScrollingStateScrollingNode.h in Headers */,
    2535725370                                0FB8890F167D30160010CDA5 /* ScrollingStateStickyNode.h in Headers */,
     25371                                07FE99DD18807A7D00256648 /* HTMLMediaSession.h in Headers */,
    2535825372                                931CBD11161A44E900E4C874 /* ScrollingStateTree.h in Headers */,
    2535925373                                1AF62F2614DAFEA10041556C /* ScrollingThread.h in Headers */,
     
    2848628500                                93309E00099E64920056E581 /* RemoveCSSPropertyCommand.cpp in Sources */,
    2848728501                                D06C0D900CFD11460065F43F /* RemoveFormatCommand.cpp in Sources */,
     28502                                07638A9A1884487200E15A1B /* MediaSessionManagerIOS.mm in Sources */,
    2848828503                                93309E04099E64920056E581 /* RemoveNodeCommand.cpp in Sources */,
    2848928504                                93309E06099E64920056E581 /* RemoveNodePreservingChildrenCommand.cpp in Sources */,
     
    2923829253                                FE6938B61045D67E008EABB6 /* EventHandlerIOS.mm in Sources */,
    2923929254                                31C0FF210E4CEB6E007D6FE5 /* WebKitAnimationEvent.cpp in Sources */,
     29255                                07FE99DC18807A7D00256648 /* HTMLMediaSession.cpp in Sources */,
    2924029256                                976D6C7B122B8A3D001FD1F7 /* WebKitBlobBuilder.cpp in Sources */,
    2924129257                                150B923915F08DC400E10986 /* WebKitCSSArrayFunctionValue.cpp in Sources */,
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r161768 r161899  
    283283    , m_proxyWidget(0)
    284284#endif
    285     , m_restrictions(RequireUserGestureForFullscreenRestriction | RequirePageConsentToLoadMediaRestriction)
    286285    , m_preload(MediaPlayer::Auto)
    287286    , m_displayMode(Unknown)
     
    338337    , m_audioSourceNode(0)
    339338#endif
    340     , m_mediaSession(MediaSession::create(*this))
     339    , m_mediaSession(HTMLMediaSession::create(*this))
    341340    , m_reportedExtraMemoryCost(0)
    342341#if ENABLE(MEDIA_STREAM)
     
    346345    LOG(Media, "HTMLMediaElement::HTMLMediaElement");
    347346    setHasCustomStyleResolveCallbacks();
     347
     348    m_mediaSession->addBehaviorRestriction(HTMLMediaSession::RequireUserGestureForFullscreen);
     349    m_mediaSession->addBehaviorRestriction(HTMLMediaSession::RequirePageConsentToLoadMedia);
    348350
    349351    // FIXME: We should clean up and look to better merge the iOS and non-iOS code below.
     
    358360
    359361    if (settings && settings->mediaPlaybackRequiresUserGesture()) {
    360         addBehaviorRestriction(RequireUserGestureForRateChangeRestriction);
    361         addBehaviorRestriction(RequireUserGestureForLoadRestriction);
     362        m_mediaSession->addBehaviorRestriction(HTMLMediaSession::RequireUserGestureForRateChange);
     363        m_mediaSession->addBehaviorRestriction(HTMLMediaSession::RequireUserGestureForLoad);
    362364    }
    363365#else
    364366    m_sendProgressEvents = false;
    365367    if (!settings || settings->mediaPlaybackRequiresUserGesture()) {
    366         addBehaviorRestriction(RequireUserGestureForRateChangeRestriction);
     368        m_mediaSession->addBehaviorRestriction(HTMLMediaSession::RequireUserGestureForRateChange);
    367369#if ENABLE(IOS_AIRPLAY)
    368         addBehaviorRestriction(RequireUserGestureToShowPlaybackTargetPickerRestriction);
     370        m_mediaSession->addBehaviorRestriction(HTMLMediaSession::RequireUserGestureToShowPlaybackTargetPicker);
    369371#endif
    370372    }
     
    520522        // Note, unless the restriction on requiring user action has been removed,
    521523        // do not begin downloading data on iOS.
    522         if (!userGestureRequiredForLoad() && !value.isNull()) {
     524        if (!value.isNull() && m_mediaSession->dataLoadingPermitted(*this)) {
    523525#else
    524526        // Trigger a reload, as long as the 'src' attribute is present.
     
    687689
    688690#if PLATFORM(IOS)
    689         if (!userGestureRequiredForLoad() && m_networkState == NETWORK_EMPTY && !fastGetAttribute(srcAttr).isEmpty())
     691        if (m_networkState == NETWORK_EMPTY && !fastGetAttribute(srcAttr).isEmpty() && m_mediaSession->dataLoadingPermitted(*this))
    690692#else
    691693        if (m_networkState == NETWORK_EMPTY && !fastGetAttribute(srcAttr).isEmpty())
     
    894896    LOG(Media, "HTMLMediaElement::load()");
    895897   
    896     if (userGestureRequiredForLoad() && !ScriptController::processingUserGesture())
     898    if (!m_mediaSession->dataLoadingPermitted(*this))
    897899        return;
    898900    if (ScriptController::processingUserGesture())
     
    10061008
    10071009    // If we can't start a load right away, start it later.
    1008     Page* page = document().page();
    1009     if (pageConsentRequiredForLoad() && page && !page->canStartMedia()) {
     1010    if (!m_mediaSession->pageAllowsDataLoading(*this)) {
    10101011        setShouldDelayLoadEvent(false);
    10111012        if (m_isWaitingUntilMediaCanStart)
     
    10201021    // Once the page has allowed an element to load media, it is free to load at will. This allows a
    10211022    // playlist that starts in a foreground tab to continue automatically if the tab is subsequently
    1022     // put in the the background.
    1023     removeBehaviorRestriction(RequirePageConsentToLoadMediaRestriction);
     1023    // put into the background.
     1024    m_mediaSession->removeBehaviorRestriction(HTMLMediaSession::RequirePageConsentToLoadMedia);
    10241025
    10251026#if ENABLE(VIDEO_TRACK)
     
    11971198#if ENABLE(MEDIA_STREAM)
    11981199    if (MediaStreamRegistry::registry().lookup(url.string()))
    1199         removeBehaviorRestriction(RequireUserGestureForRateChangeRestriction);
     1200        m_mediaSession->removeBehaviorRestriction(HTMLMediaSession::RequireUserGestureForRateChange);
    12001201#endif
    12011202
     
    20482049            scheduleEvent(eventNames().playingEvent);
    20492050
    2050         if (m_autoplaying && m_paused && autoplay() && !document().isSandboxed(SandboxAutomaticFeatures) && !userGestureRequiredForRateChange()) {
     2051        if (m_autoplaying && m_paused && autoplay() && !document().isSandboxed(SandboxAutomaticFeatures) && m_mediaSession->playbackPermitted(*this)) {
    20512052            m_paused = false;
    20522053            invalidateCachedTime();
     
    26002601    // because they have OK'ed us loading data. This allows playback to continue if
    26012602    // the URL is changed while the movie is playing.
    2602     if (userGestureRequiredForRateChange() || userGestureRequiredForLoad())
     2603    if (!m_mediaSession->playbackPermitted(*this) || !m_mediaSession->dataLoadingPermitted(*this))
    26032604        return false;
    26042605#endif
     
    26352636    LOG(Media, "HTMLMediaElement::play()");
    26362637
    2637     if (userGestureRequiredForRateChange() && !ScriptController::processingUserGesture())
     2638    if (!m_mediaSession->playbackPermitted(*this))
    26382639        return;
    26392640    if (ScriptController::processingUserGesture())
     
    26842685    LOG(Media, "HTMLMediaElement::pause()");
    26852686
    2686     if (userGestureRequiredForRateChange() && !ScriptController::processingUserGesture())
     2687    if (!m_mediaSession->playbackPermitted(*this))
    26872688        return;
    26882689
     
    27052706        // Unless the restriction on media requiring user action has been lifted
    27062707        // don't trigger loading if a script calls pause().
    2707         if (userGestureRequiredForRateChange())
     2708        if (!m_mediaSession->playbackPermitted(*this))
    27082709            return;
    27092710#endif
     
    42594260        invalidateCachedTime();
    42604261
     4262        m_mediaSession->clientWillBeginPlayback();
     4263
    42614264        if (playerPaused) {
    42624265            if (!m_isFullscreen && isVideo() && document().page() && document().page()->chrome().requiresFullscreenForVideoPlayback())
     
    44524455        case DocumentWillBecomeInactive:
    44534456            stop();
    4454             addBehaviorRestriction(RequirePageConsentToResumeMediaRestriction);
     4457            m_mediaSession->addBehaviorRestriction(HTMLMediaSession::RequirePageConsentToResumeMedia);
    44554458            break;
    44564459        case DocumentWillBePaused:
     
    44694472    m_inActiveDocument = true;
    44704473
    4471     Page* page = document().page();
    4472     if (pageConsentRequiredForResume() && page && !page->canStartMedia())
     4474    if (!m_mediaSession->pageAllowsPlaybackAfterResuming(*this))
    44734475        document().addMediaCanStartListener(this);
    44744476    else
    44754477        setPausedInternal(false);
    44764478
    4477     removeBehaviorRestriction(RequirePageConsentToResumeMediaRestriction);
     4479    m_mediaSession->removeBehaviorRestriction(HTMLMediaSession::RequirePageConsentToResumeMedia);
    44784480
    44794481    if (m_error && m_error->code() == MediaError::MEDIA_ERR_ABORTED) {
     
    47464748        return;
    47474749
    4748     if (userGestureRequiredToShowPlaybackTargetPicker() && !ScriptController::processingUserGesture())
     4750    if (!m_mediaSession->showingPlaybackTargetPickerPermitted(*this))
    47494751        return;
    47504752
     
    55145516bool HTMLMediaElement::mediaPlayerIsFullscreenPermitted() const
    55155517{
    5516     return !userGestureRequiredForFullscreen() || ScriptController::processingUserGesture();
     5518    return m_mediaSession->fullscreenPermitted(*this);
    55175519}
    55185520
     
    55985600void HTMLMediaElement::removeBehaviorsRestrictionsAfterFirstUserGesture()
    55995601{
    5600     removeBehaviorRestriction(RequireUserGestureForLoadRestriction);
    5601     removeBehaviorRestriction(RequireUserGestureForRateChangeRestriction);
    5602     removeBehaviorRestriction(RequireUserGestureForFullscreenRestriction);
     5602    m_mediaSession->removeBehaviorRestriction(HTMLMediaSession::RequireUserGestureForLoad);
     5603    m_mediaSession->removeBehaviorRestriction(HTMLMediaSession::RequireUserGestureForRateChange);
     5604    m_mediaSession->removeBehaviorRestriction(HTMLMediaSession::RequireUserGestureForFullscreen);
    56035605#if ENABLE(IOS_AIRPLAY)
    5604     removeBehaviorRestriction(RequireUserGestureToShowPlaybackTargetPickerRestriction);
     5606    m_mediaSession->removeBehaviorRestriction(HTMLMediaSession::RequireUserGestureToShowPlaybackTargetPicker);
    56055607#endif
    56065608}
     
    57555757}
    57565758
    5757 }
    5758 
    5759 #endif
     5759void HTMLMediaElement::pausePlayback()
     5760{
     5761    if (!paused())
     5762        pause();
     5763}
     5764
     5765}
     5766
     5767#endif
  • trunk/Source/WebCore/html/HTMLMediaElement.h

    r161768 r161899  
    3131#include "ActiveDOMObject.h"
    3232#include "GenericEventQueue.h"
     33#include "HTMLMediaSession.h"
    3334#include "MediaCanStartListener.h"
    3435#include "MediaControllerInterface.h"
    3536#include "MediaPlayer.h"
    36 #include "MediaSession.h"
    3737
    3838#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
     
    443443    virtual bool isMediaElement() const OVERRIDE { return true; }
    444444
    445     // Restrictions to change default behaviors.
    446     enum BehaviorRestrictionFlags {
    447         NoRestrictions = 0,
    448         RequireUserGestureForLoadRestriction = 1 << 0,
    449         RequireUserGestureForRateChangeRestriction = 1 << 1,
    450         RequireUserGestureForFullscreenRestriction = 1 << 2,
    451         RequirePageConsentToLoadMediaRestriction = 1 << 3,
    452         RequirePageConsentToResumeMediaRestriction = 1 << 4,
    453 #if ENABLE(IOS_AIRPLAY)
    454         RequireUserGestureToShowPlaybackTargetPickerRestriction = 1 << 5,
    455 #endif
    456     };
    457     typedef unsigned BehaviorRestrictions;
    458    
    459     bool userGestureRequiredForLoad() const { return m_restrictions & RequireUserGestureForLoadRestriction; }
    460     bool userGestureRequiredForRateChange() const { return m_restrictions & RequireUserGestureForRateChangeRestriction; }
    461     bool userGestureRequiredForFullscreen() const { return m_restrictions & RequireUserGestureForFullscreenRestriction; }
    462     bool pageConsentRequiredForLoad() const { return m_restrictions & RequirePageConsentToLoadMediaRestriction; }
    463     bool pageConsentRequiredForResume() const { return m_restrictions & RequirePageConsentToResumeMediaRestriction; }
    464 #if ENABLE(IOS_AIRPLAY)
    465     bool userGestureRequiredToShowPlaybackTargetPicker() const { return m_restrictions & RequireUserGestureToShowPlaybackTargetPickerRestriction; }
    466 #endif
    467    
    468     void addBehaviorRestriction(BehaviorRestrictions restriction) { m_restrictions |= restriction; }
    469     void removeBehaviorRestriction(BehaviorRestrictions restriction) { m_restrictions &= ~restriction; }
    470 
    471445#if ENABLE(VIDEO_TRACK)
    472446    bool ignoreTrackDisplayUpdateRequests() const { return m_ignoreTrackDisplayUpdate > 0 || !m_textTracks || !m_cueTree.size(); }
     
    477451    virtual RenderPtr<RenderElement> createElementRenderer(PassRef<RenderStyle>) OVERRIDE;
    478452
    479     MediaSession& mediaSession() const { return *m_mediaSession; }
     453    HTMLMediaSession& mediaSession() const { return *m_mediaSession; }
    480454
    481455private:
     
    698672    virtual void beginInterruption() OVERRIDE;
    699673    virtual void endInterruption(MediaSession::EndInterruptionFlags) OVERRIDE;
     674    virtual void pausePlayback() OVERRIDE;
    700675
    701676    Timer<HTMLMediaElement> m_loadTimer;
     
    739714#endif
    740715
    741     BehaviorRestrictions m_restrictions;
    742    
    743716    MediaPlayer::Preload m_preload;
    744717
     
    853826#endif
    854827
    855     std::unique_ptr<MediaSession> m_mediaSession;
     828    std::unique_ptr<HTMLMediaSession> m_mediaSession;
    856829    std::unique_ptr<PageActivityAssertionToken> m_activityToken;
    857830    size_t m_reportedExtraMemoryCost;
  • trunk/Source/WebCore/html/HTMLVideoElement.cpp

    r161181 r161899  
    290290    // Generate an exception if this isn't called in response to a user gesture, or if the
    291291    // element does not support fullscreen.
    292     if ((userGestureRequiredForFullscreen() && !ScriptController::processingUserGesture()) || !supportsFullscreen()) {
     292    if (!mediaSession().fullscreenPermitted(*this) || !supportsFullscreen()) {
    293293        ec = INVALID_STATE_ERR;
    294294        return;
  • trunk/Source/WebCore/platform/audio/MediaSession.cpp

    r161481 r161899  
    3030#include "Logging.h"
    3131#include "MediaSessionManager.h"
    32 #include "Page.h"
    33 #include "ScriptController.h"
    3432
    3533namespace WebCore {
     
    5654void MediaSession::beginInterruption()
    5755{
     56    LOG(Media, "MediaSession::beginInterruption");
    5857    m_state = Interrupted;
    5958    m_client.beginInterruption();
     
    6261void MediaSession::endInterruption(EndInterruptionFlags flags)
    6362{
     63    LOG(Media, "MediaSession::endInterruption");
    6464    m_state = Running;
    6565    m_client.endInterruption(flags);
    6666}
    6767
     68void MediaSession::pauseSession()
     69{
     70    LOG(Media, "MediaSession::pauseSession");
     71    m_client.pausePlayback();
    6872}
     73
     74}
  • trunk/Source/WebCore/platform/audio/MediaSession.h

    r161481 r161899  
    3232
    3333class MediaSessionClient;
    34 class HTMLMediaElement;
    3534
    3635class MediaSession {
     
    3938
    4039    MediaSession(MediaSessionClient&);
    41     ~MediaSession();
     40    virtual ~MediaSession();
    4241
    4342    enum MediaType {
     
    6463    void endInterruption(EndInterruptionFlags);
    6564
     65    virtual void pauseSession();
     66
     67protected:
     68    MediaSessionClient& client() const { return m_client; }
     69
    6670private:
    6771    MediaSessionClient& m_client;
     
    7983    virtual void beginInterruption() { }
    8084    virtual void endInterruption(MediaSession::EndInterruptionFlags) { }
    81    
     85
     86    virtual void pausePlayback() = 0;
     87
    8288protected:
    8389    virtual ~MediaSessionClient() { }
  • trunk/Source/WebCore/platform/audio/MediaSessionManager.cpp

    r161481 r161899  
    3131namespace WebCore {
    3232
     33#if !PLATFORM(IOS)
    3334MediaSessionManager& MediaSessionManager::sharedManager()
    3435{
     
    3637    return manager;
    3738}
     39#endif
    3840
    3941MediaSessionManager::MediaSessionManager()
    4042    : m_interruptions(0)
    4143{
     44    m_restrictions[MediaSession::Video] = NoRestrictions;
     45    m_restrictions[MediaSession::Audio] = NoRestrictions;
     46    m_restrictions[MediaSession::WebAudio] = NoRestrictions;
    4247}
    4348
     
    104109}
    105110
     111void MediaSessionManager::addRestriction(MediaSession::MediaType type, SessionRestrictions restriction)
     112{
     113    ASSERT(type > MediaSession::None && type <= MediaSession::WebAudio);
     114    m_restrictions[type] = m_restrictions[type] | restriction;
     115}
     116
     117void MediaSessionManager::removeRestriction(MediaSession::MediaType type, SessionRestrictions restriction)
     118{
     119    ASSERT(type > MediaSession::None && type <= MediaSession::WebAudio);
     120    m_restrictions[type] = m_restrictions[type] & ~restriction;
     121}
     122
     123MediaSessionManager::SessionRestrictions MediaSessionManager::restrictions(MediaSession::MediaType sessionType)
     124{
     125    return m_restrictions[sessionType];
     126}
     127
     128void MediaSessionManager::sessionWillBeginPlayback(MediaSession& session)
     129{
     130    MediaSession::MediaType sessionType = session.mediaType();
     131    SessionRestrictions restrictions = m_restrictions[sessionType];
     132    if (restrictions == NoRestrictions)
     133        return;
     134
     135    for (auto* oneSession : m_sessions) {
     136        if (oneSession == &session)
     137            continue;
     138        if (oneSession->mediaType() != sessionType)
     139            continue;
     140        if (restrictions & ConcurrentPlaybackNotPermitted)
     141            oneSession->pauseSession();
     142    }
     143}
     144
    106145#if !PLATFORM(MAC)
    107146void MediaSessionManager::updateSessionState()
  • trunk/Source/WebCore/platform/audio/MediaSessionManager.h

    r161481 r161899  
    2929#include "MediaSession.h"
    3030#include "Settings.h"
     31#include <map>
    3132#include <wtf/Vector.h>
    3233
     
    4647    void endInterruption(MediaSession::EndInterruptionFlags);
    4748
     49    enum SessionRestrictionFlags {
     50        NoRestrictions = 0,
     51        ConcurrentPlaybackNotPermitted = 1 << 0,
     52    };
     53    typedef unsigned SessionRestrictions;
     54   
     55    void addRestriction(MediaSession::MediaType, SessionRestrictions);
     56    void removeRestriction(MediaSession::MediaType, SessionRestrictions);
     57    SessionRestrictions restrictions(MediaSession::MediaType);
     58
     59    void sessionWillBeginPlayback(MediaSession&);
     60
    4861protected:
    4962    friend class MediaSession;
     63    explicit MediaSessionManager();
     64
    5065    void addSession(MediaSession&);
    5166    void removeSession(MediaSession&);
    5267
    5368private:
    54     MediaSessionManager();
     69    void updateSessionState();
    5570
    56     void updateSessionState();
     71    std::map<MediaSession::MediaType, SessionRestrictions> m_restrictions;
    5772
    5873    Vector<MediaSession*> m_sessions;
  • trunk/Source/WebCore/platform/audio/mac/AudioDestinationMac.h

    r161481 r161899  
    4949    virtual void stop() OVERRIDE;
    5050    virtual bool isPlaying() OVERRIDE { return m_isPlaying; }
     51    virtual void pausePlayback() OVERRIDE { stop(); }
    5152
    5253    virtual float sampleRate() const OVERRIDE { return m_sampleRate; }
  • trunk/Source/WebCore/testing/Internals.cpp

    r161662 r161899  
    22922292}
    22932293
    2294 }
     2294void Internals::setMediaSessionRestrictions(const String& mediaTypeString, const String& restrictionsString, ExceptionCode& ec)
     2295{
     2296    MediaSession::MediaType mediaType = MediaSession::None;
     2297    if (equalIgnoringCase(mediaTypeString, "Video"))
     2298        mediaType = MediaSession::Video;
     2299    else if (equalIgnoringCase(mediaTypeString, "Audio"))
     2300        mediaType = MediaSession::Audio;
     2301    else if (equalIgnoringCase(mediaTypeString, "WebAudio"))
     2302        mediaType = MediaSession::WebAudio;
     2303    else {
     2304        ec = INVALID_ACCESS_ERR;
     2305        return;
     2306    }
     2307
     2308    MediaSessionManager::SessionRestrictions restrictions = MediaSessionManager::sharedManager().restrictions(mediaType);
     2309    MediaSessionManager::sharedManager().removeRestriction(mediaType, restrictions);
     2310
     2311    restrictions = MediaSessionManager::NoRestrictions;
     2312   
     2313    if (equalIgnoringCase(restrictionsString, "ConcurrentPlaybackNotPermitted"))
     2314        restrictions = MediaSessionManager::ConcurrentPlaybackNotPermitted;
     2315   
     2316    MediaSessionManager::sharedManager().addRestriction(mediaType, restrictions);
     2317}
     2318
     2319}
  • trunk/Source/WebCore/testing/Internals.h

    r161481 r161899  
    335335    void beginMediaSessionInterruption();
    336336    void endMediaSessionInterruption(const String&);
     337    void setMediaSessionRestrictions(const String& mediaType, const String& restrictions, ExceptionCode& ec);
    337338
    338339private:
  • trunk/Source/WebCore/testing/Internals.idl

    r161481 r161899  
    282282    void beginMediaSessionInterruption();
    283283    void endMediaSessionInterruption(DOMString flags);
     284    [RaisesException] void setMediaSessionRestrictions(DOMString mediaType, DOMString restrictions);
    284285};
Note: See TracChangeset for help on using the changeset viewer.