Changeset 161899 in webkit
- Timestamp:
- Jan 13, 2014, 11:42:27 AM (12 years ago)
- Location:
- trunk
- Files:
-
- 6 added
- 18 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/media/video-concurrent-playback-expected.txt (added)
-
LayoutTests/media/video-concurrent-playback.html (added)
-
Source/WebCore/CMakeLists.txt (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/GNUmakefile.list.am (modified) (1 diff)
-
Source/WebCore/WebCore.exp.in (modified) (1 diff)
-
Source/WebCore/WebCore.vcxproj/WebCore.vcxproj (modified) (2 diffs)
-
Source/WebCore/WebCore.xcodeproj/project.pbxproj (modified) (10 diffs)
-
Source/WebCore/html/HTMLMediaElement.cpp (modified) (22 diffs)
-
Source/WebCore/html/HTMLMediaElement.h (modified) (6 diffs)
-
Source/WebCore/html/HTMLMediaSession.cpp (added)
-
Source/WebCore/html/HTMLMediaSession.h (added)
-
Source/WebCore/html/HTMLVideoElement.cpp (modified) (1 diff)
-
Source/WebCore/platform/audio/MediaSession.cpp (modified) (3 diffs)
-
Source/WebCore/platform/audio/MediaSession.h (modified) (4 diffs)
-
Source/WebCore/platform/audio/MediaSessionManager.cpp (modified) (3 diffs)
-
Source/WebCore/platform/audio/MediaSessionManager.h (modified) (2 diffs)
-
Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.h (added)
-
Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm (added)
-
Source/WebCore/platform/audio/mac/AudioDestinationMac.h (modified) (1 diff)
-
Source/WebCore/testing/Internals.cpp (modified) (1 diff)
-
Source/WebCore/testing/Internals.h (modified) (1 diff)
-
Source/WebCore/testing/Internals.idl (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r161898 r161899 1 2014-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 1 11 2014-01-13 Zalan Bujtas <zalan@apple.com> 2 12 -
trunk/Source/WebCore/CMakeLists.txt
r161817 r161899 1416 1416 html/HTMLMarqueeElement.cpp 1417 1417 html/HTMLMediaElement.cpp 1418 html/HTMLMediaSession.cpp 1418 1419 html/HTMLMediaSource.cpp 1419 1420 html/HTMLMenuElement.cpp -
trunk/Source/WebCore/ChangeLog
r161896 r161899 1 2014-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 1 81 2014-01-13 Alexey Proskuryakov <ap@apple.com> 2 82 -
trunk/Source/WebCore/GNUmakefile.list.am
r161890 r161899 3458 3458 Source/WebCore/html/HTMLMediaElement.cpp \ 3459 3459 Source/WebCore/html/HTMLMediaElement.h \ 3460 Source/WebCore/html/HTMLMediaSession.cpp \ 3461 Source/WebCore/html/HTMLMediaSession.h \ 3460 3462 Source/WebCore/html/HTMLMenuElement.cpp \ 3461 3463 Source/WebCore/html/HTMLMenuElement.h \ -
trunk/Source/WebCore/WebCore.exp.in
r161823 r161899 754 754 __ZN7WebCore19LayerFlushSchedulerD1Ev 755 755 __ZN7WebCore19LayerFlushSchedulerD2Ev 756 __ZN7WebCore19MediaSessionManager12restrictionsENS_12MediaSession9MediaTypeE 756 757 __ZN7WebCore19MediaSessionManager13sharedManagerEv 758 __ZN7WebCore19MediaSessionManager14addRestrictionENS_12MediaSession9MediaTypeEj 757 759 __ZN7WebCore19MediaSessionManager15endInterruptionENS_12MediaSession20EndInterruptionFlagsE 758 760 __ZN7WebCore19MediaSessionManager17beginInterruptionEv 761 __ZN7WebCore19MediaSessionManager17removeRestrictionENS_12MediaSession9MediaTypeEj 759 762 __ZN7WebCore19ResourceRequestBase11setHTTPBodyEN3WTF10PassRefPtrINS_8FormDataEEE 760 763 __ZN7WebCore19ResourceRequestBase13setHTTPMethodERKN3WTF6StringE -
trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj
r161819 r161899 14584 14584 <ClCompile Include="..\html\DOMTokenList.cpp" /> 14585 14585 <ClCompile Include="..\html\DOMURL.cpp" /> 14586 <ClCompile Include="..\html\HTMLMediaSession.cpp" /> 14586 14587 <ClCompile Include="..\html\EmailInputType.cpp" /> 14587 14588 <ClCompile Include="..\fileapi\File.cpp" /> … … 20440 20441 <ClInclude Include="..\html\DOMTokenList.h" /> 20441 20442 <ClInclude Include="..\html\DOMURL.h" /> 20443 <ClInclude Include="..\html\ElementMediaSession.h" /> 20442 20444 <ClInclude Include="..\html\EmailInputType.h" /> 20443 20445 <ClInclude Include="..\fileapi\File.h" /> -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r161892 r161899 186 186 076306E117E16089005A7C4E /* JSSourceInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 076306DF17E16089005A7C4E /* JSSourceInfo.h */; settings = {ATTRIBUTES = (Private, ); }; }; 187 187 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 */; }; 188 190 076970861463AD8700F502CF /* TextTrackList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 076970841463AD8700F502CF /* TextTrackList.cpp */; }; 189 191 076970871463AD8700F502CF /* TextTrackList.h in Headers */ = {isa = PBXBuildFile; fileRef = 076970851463AD8700F502CF /* TextTrackList.h */; }; … … 340 342 07ED35A316D6DCE2002248F3 /* InbandTextTrackPrivateAVFIOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 07357C7616D2DF0D00ED99E7 /* InbandTextTrackPrivateAVFIOS.h */; }; 341 343 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, ); }; }; 342 346 07FFDE68181AED420072D409 /* MediaStreamTrackPrivate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07FFDE66181AED420072D409 /* MediaStreamTrackPrivate.cpp */; }; 343 347 07FFDE69181AED420072D409 /* MediaStreamTrackPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 07FFDE67181AED420072D409 /* MediaStreamTrackPrivate.h */; }; … … 7035 7039 076306DF17E16089005A7C4E /* JSSourceInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSSourceInfo.h; sourceTree = "<group>"; }; 7036 7040 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>"; }; 7037 7043 076970841463AD8700F502CF /* TextTrackList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextTrackList.cpp; sourceTree = "<group>"; }; 7038 7044 076970851463AD8700F502CF /* TextTrackList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextTrackList.h; sourceTree = "<group>"; }; … … 7124 7130 07E116B01489C9A100EC5ACE /* JSTextTrackCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSTextTrackCustom.cpp; sourceTree = "<group>"; }; 7125 7131 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>"; }; 7126 7134 07FFDE66181AED420072D409 /* MediaStreamTrackPrivate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaStreamTrackPrivate.cpp; sourceTree = "<group>"; }; 7127 7135 07FFDE67181AED420072D409 /* MediaStreamTrackPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaStreamTrackPrivate.h; sourceTree = "<group>"; }; … … 17173 17181 isa = PBXGroup; 17174 17182 children = ( 17183 07FE99DA18807A7D00256648 /* HTMLMediaSession.cpp */, 17184 07FE99DB18807A7D00256648 /* HTMLMediaSession.h */, 17175 17185 49484FAE102CF01E00187DD3 /* canvas */, 17176 17186 1A88A90117553CD7000C74F9 /* forms */, … … 20999 21009 isa = PBXGroup; 21000 21010 children = ( 21011 07638A971884487200E15A1B /* MediaSessionManagerIOS.h */, 21012 07638A981884487200E15A1B /* MediaSessionManagerIOS.mm */, 21001 21013 CD0EEE0B14743E35003EAFA2 /* AudioDestinationIOS.cpp */, 21002 21014 CD0EEE0A14743E34003EAFA2 /* AudioDestinationIOS.h */, … … 24341 24353 1A494E350A12358B00FDAFC1 /* JSHTMLDocument.h in Headers */, 24342 24354 1A494BFB0A122F4400FDAFC1 /* JSHTMLElement.h in Headers */, 24355 07638A991884487200E15A1B /* MediaSessionManagerIOS.h in Headers */, 24343 24356 938E65F109F09840008A48EC /* JSHTMLElementWrapperFactory.h in Headers */, 24344 24357 BC6D44ED0C07F2ED0072D2C9 /* JSHTMLEmbedElement.h in Headers */, … … 25356 25369 931CBD0F161A44E900E4C874 /* ScrollingStateScrollingNode.h in Headers */, 25357 25370 0FB8890F167D30160010CDA5 /* ScrollingStateStickyNode.h in Headers */, 25371 07FE99DD18807A7D00256648 /* HTMLMediaSession.h in Headers */, 25358 25372 931CBD11161A44E900E4C874 /* ScrollingStateTree.h in Headers */, 25359 25373 1AF62F2614DAFEA10041556C /* ScrollingThread.h in Headers */, … … 28486 28500 93309E00099E64920056E581 /* RemoveCSSPropertyCommand.cpp in Sources */, 28487 28501 D06C0D900CFD11460065F43F /* RemoveFormatCommand.cpp in Sources */, 28502 07638A9A1884487200E15A1B /* MediaSessionManagerIOS.mm in Sources */, 28488 28503 93309E04099E64920056E581 /* RemoveNodeCommand.cpp in Sources */, 28489 28504 93309E06099E64920056E581 /* RemoveNodePreservingChildrenCommand.cpp in Sources */, … … 29238 29253 FE6938B61045D67E008EABB6 /* EventHandlerIOS.mm in Sources */, 29239 29254 31C0FF210E4CEB6E007D6FE5 /* WebKitAnimationEvent.cpp in Sources */, 29255 07FE99DC18807A7D00256648 /* HTMLMediaSession.cpp in Sources */, 29240 29256 976D6C7B122B8A3D001FD1F7 /* WebKitBlobBuilder.cpp in Sources */, 29241 29257 150B923915F08DC400E10986 /* WebKitCSSArrayFunctionValue.cpp in Sources */, -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r161768 r161899 283 283 , m_proxyWidget(0) 284 284 #endif 285 , m_restrictions(RequireUserGestureForFullscreenRestriction | RequirePageConsentToLoadMediaRestriction)286 285 , m_preload(MediaPlayer::Auto) 287 286 , m_displayMode(Unknown) … … 338 337 , m_audioSourceNode(0) 339 338 #endif 340 , m_mediaSession( MediaSession::create(*this))339 , m_mediaSession(HTMLMediaSession::create(*this)) 341 340 , m_reportedExtraMemoryCost(0) 342 341 #if ENABLE(MEDIA_STREAM) … … 346 345 LOG(Media, "HTMLMediaElement::HTMLMediaElement"); 347 346 setHasCustomStyleResolveCallbacks(); 347 348 m_mediaSession->addBehaviorRestriction(HTMLMediaSession::RequireUserGestureForFullscreen); 349 m_mediaSession->addBehaviorRestriction(HTMLMediaSession::RequirePageConsentToLoadMedia); 348 350 349 351 // FIXME: We should clean up and look to better merge the iOS and non-iOS code below. … … 358 360 359 361 if (settings && settings->mediaPlaybackRequiresUserGesture()) { 360 addBehaviorRestriction(RequireUserGestureForRateChangeRestriction);361 addBehaviorRestriction(RequireUserGestureForLoadRestriction);362 m_mediaSession->addBehaviorRestriction(HTMLMediaSession::RequireUserGestureForRateChange); 363 m_mediaSession->addBehaviorRestriction(HTMLMediaSession::RequireUserGestureForLoad); 362 364 } 363 365 #else 364 366 m_sendProgressEvents = false; 365 367 if (!settings || settings->mediaPlaybackRequiresUserGesture()) { 366 addBehaviorRestriction(RequireUserGestureForRateChangeRestriction);368 m_mediaSession->addBehaviorRestriction(HTMLMediaSession::RequireUserGestureForRateChange); 367 369 #if ENABLE(IOS_AIRPLAY) 368 addBehaviorRestriction(RequireUserGestureToShowPlaybackTargetPickerRestriction);370 m_mediaSession->addBehaviorRestriction(HTMLMediaSession::RequireUserGestureToShowPlaybackTargetPicker); 369 371 #endif 370 372 } … … 520 522 // Note, unless the restriction on requiring user action has been removed, 521 523 // do not begin downloading data on iOS. 522 if (! userGestureRequiredForLoad() && !value.isNull()) {524 if (!value.isNull() && m_mediaSession->dataLoadingPermitted(*this)) { 523 525 #else 524 526 // Trigger a reload, as long as the 'src' attribute is present. … … 687 689 688 690 #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)) 690 692 #else 691 693 if (m_networkState == NETWORK_EMPTY && !fastGetAttribute(srcAttr).isEmpty()) … … 894 896 LOG(Media, "HTMLMediaElement::load()"); 895 897 896 if ( userGestureRequiredForLoad() && !ScriptController::processingUserGesture())898 if (!m_mediaSession->dataLoadingPermitted(*this)) 897 899 return; 898 900 if (ScriptController::processingUserGesture()) … … 1006 1008 1007 1009 // 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)) { 1010 1011 setShouldDelayLoadEvent(false); 1011 1012 if (m_isWaitingUntilMediaCanStart) … … 1020 1021 // Once the page has allowed an element to load media, it is free to load at will. This allows a 1021 1022 // playlist that starts in a foreground tab to continue automatically if the tab is subsequently 1022 // put in thethe background.1023 removeBehaviorRestriction(RequirePageConsentToLoadMediaRestriction);1023 // put into the background. 1024 m_mediaSession->removeBehaviorRestriction(HTMLMediaSession::RequirePageConsentToLoadMedia); 1024 1025 1025 1026 #if ENABLE(VIDEO_TRACK) … … 1197 1198 #if ENABLE(MEDIA_STREAM) 1198 1199 if (MediaStreamRegistry::registry().lookup(url.string())) 1199 removeBehaviorRestriction(RequireUserGestureForRateChangeRestriction);1200 m_mediaSession->removeBehaviorRestriction(HTMLMediaSession::RequireUserGestureForRateChange); 1200 1201 #endif 1201 1202 … … 2048 2049 scheduleEvent(eventNames().playingEvent); 2049 2050 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)) { 2051 2052 m_paused = false; 2052 2053 invalidateCachedTime(); … … 2600 2601 // because they have OK'ed us loading data. This allows playback to continue if 2601 2602 // the URL is changed while the movie is playing. 2602 if ( userGestureRequiredForRateChange() || userGestureRequiredForLoad())2603 if (!m_mediaSession->playbackPermitted(*this) || !m_mediaSession->dataLoadingPermitted(*this)) 2603 2604 return false; 2604 2605 #endif … … 2635 2636 LOG(Media, "HTMLMediaElement::play()"); 2636 2637 2637 if ( userGestureRequiredForRateChange() && !ScriptController::processingUserGesture())2638 if (!m_mediaSession->playbackPermitted(*this)) 2638 2639 return; 2639 2640 if (ScriptController::processingUserGesture()) … … 2684 2685 LOG(Media, "HTMLMediaElement::pause()"); 2685 2686 2686 if ( userGestureRequiredForRateChange() && !ScriptController::processingUserGesture())2687 if (!m_mediaSession->playbackPermitted(*this)) 2687 2688 return; 2688 2689 … … 2705 2706 // Unless the restriction on media requiring user action has been lifted 2706 2707 // don't trigger loading if a script calls pause(). 2707 if ( userGestureRequiredForRateChange())2708 if (!m_mediaSession->playbackPermitted(*this)) 2708 2709 return; 2709 2710 #endif … … 4259 4260 invalidateCachedTime(); 4260 4261 4262 m_mediaSession->clientWillBeginPlayback(); 4263 4261 4264 if (playerPaused) { 4262 4265 if (!m_isFullscreen && isVideo() && document().page() && document().page()->chrome().requiresFullscreenForVideoPlayback()) … … 4452 4455 case DocumentWillBecomeInactive: 4453 4456 stop(); 4454 addBehaviorRestriction(RequirePageConsentToResumeMediaRestriction);4457 m_mediaSession->addBehaviorRestriction(HTMLMediaSession::RequirePageConsentToResumeMedia); 4455 4458 break; 4456 4459 case DocumentWillBePaused: … … 4469 4472 m_inActiveDocument = true; 4470 4473 4471 Page* page = document().page(); 4472 if (pageConsentRequiredForResume() && page && !page->canStartMedia()) 4474 if (!m_mediaSession->pageAllowsPlaybackAfterResuming(*this)) 4473 4475 document().addMediaCanStartListener(this); 4474 4476 else 4475 4477 setPausedInternal(false); 4476 4478 4477 removeBehaviorRestriction(RequirePageConsentToResumeMediaRestriction);4479 m_mediaSession->removeBehaviorRestriction(HTMLMediaSession::RequirePageConsentToResumeMedia); 4478 4480 4479 4481 if (m_error && m_error->code() == MediaError::MEDIA_ERR_ABORTED) { … … 4746 4748 return; 4747 4749 4748 if ( userGestureRequiredToShowPlaybackTargetPicker() && !ScriptController::processingUserGesture())4750 if (!m_mediaSession->showingPlaybackTargetPickerPermitted(*this)) 4749 4751 return; 4750 4752 … … 5514 5516 bool HTMLMediaElement::mediaPlayerIsFullscreenPermitted() const 5515 5517 { 5516 return !userGestureRequiredForFullscreen() || ScriptController::processingUserGesture();5518 return m_mediaSession->fullscreenPermitted(*this); 5517 5519 } 5518 5520 … … 5598 5600 void HTMLMediaElement::removeBehaviorsRestrictionsAfterFirstUserGesture() 5599 5601 { 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); 5603 5605 #if ENABLE(IOS_AIRPLAY) 5604 removeBehaviorRestriction(RequireUserGestureToShowPlaybackTargetPickerRestriction);5606 m_mediaSession->removeBehaviorRestriction(HTMLMediaSession::RequireUserGestureToShowPlaybackTargetPicker); 5605 5607 #endif 5606 5608 } … … 5755 5757 } 5756 5758 5757 } 5758 5759 #endif 5759 void HTMLMediaElement::pausePlayback() 5760 { 5761 if (!paused()) 5762 pause(); 5763 } 5764 5765 } 5766 5767 #endif -
trunk/Source/WebCore/html/HTMLMediaElement.h
r161768 r161899 31 31 #include "ActiveDOMObject.h" 32 32 #include "GenericEventQueue.h" 33 #include "HTMLMediaSession.h" 33 34 #include "MediaCanStartListener.h" 34 35 #include "MediaControllerInterface.h" 35 36 #include "MediaPlayer.h" 36 #include "MediaSession.h"37 37 38 38 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO) … … 443 443 virtual bool isMediaElement() const OVERRIDE { return true; } 444 444 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 #endif456 };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 #endif467 468 void addBehaviorRestriction(BehaviorRestrictions restriction) { m_restrictions |= restriction; }469 void removeBehaviorRestriction(BehaviorRestrictions restriction) { m_restrictions &= ~restriction; }470 471 445 #if ENABLE(VIDEO_TRACK) 472 446 bool ignoreTrackDisplayUpdateRequests() const { return m_ignoreTrackDisplayUpdate > 0 || !m_textTracks || !m_cueTree.size(); } … … 477 451 virtual RenderPtr<RenderElement> createElementRenderer(PassRef<RenderStyle>) OVERRIDE; 478 452 479 MediaSession& mediaSession() const { return *m_mediaSession; }453 HTMLMediaSession& mediaSession() const { return *m_mediaSession; } 480 454 481 455 private: … … 698 672 virtual void beginInterruption() OVERRIDE; 699 673 virtual void endInterruption(MediaSession::EndInterruptionFlags) OVERRIDE; 674 virtual void pausePlayback() OVERRIDE; 700 675 701 676 Timer<HTMLMediaElement> m_loadTimer; … … 739 714 #endif 740 715 741 BehaviorRestrictions m_restrictions;742 743 716 MediaPlayer::Preload m_preload; 744 717 … … 853 826 #endif 854 827 855 std::unique_ptr< MediaSession> m_mediaSession;828 std::unique_ptr<HTMLMediaSession> m_mediaSession; 856 829 std::unique_ptr<PageActivityAssertionToken> m_activityToken; 857 830 size_t m_reportedExtraMemoryCost; -
trunk/Source/WebCore/html/HTMLVideoElement.cpp
r161181 r161899 290 290 // Generate an exception if this isn't called in response to a user gesture, or if the 291 291 // element does not support fullscreen. 292 if ( (userGestureRequiredForFullscreen() && !ScriptController::processingUserGesture()) || !supportsFullscreen()) {292 if (!mediaSession().fullscreenPermitted(*this) || !supportsFullscreen()) { 293 293 ec = INVALID_STATE_ERR; 294 294 return; -
trunk/Source/WebCore/platform/audio/MediaSession.cpp
r161481 r161899 30 30 #include "Logging.h" 31 31 #include "MediaSessionManager.h" 32 #include "Page.h"33 #include "ScriptController.h"34 32 35 33 namespace WebCore { … … 56 54 void MediaSession::beginInterruption() 57 55 { 56 LOG(Media, "MediaSession::beginInterruption"); 58 57 m_state = Interrupted; 59 58 m_client.beginInterruption(); … … 62 61 void MediaSession::endInterruption(EndInterruptionFlags flags) 63 62 { 63 LOG(Media, "MediaSession::endInterruption"); 64 64 m_state = Running; 65 65 m_client.endInterruption(flags); 66 66 } 67 67 68 void MediaSession::pauseSession() 69 { 70 LOG(Media, "MediaSession::pauseSession"); 71 m_client.pausePlayback(); 68 72 } 73 74 } -
trunk/Source/WebCore/platform/audio/MediaSession.h
r161481 r161899 32 32 33 33 class MediaSessionClient; 34 class HTMLMediaElement;35 34 36 35 class MediaSession { … … 39 38 40 39 MediaSession(MediaSessionClient&); 41 ~MediaSession();40 virtual ~MediaSession(); 42 41 43 42 enum MediaType { … … 64 63 void endInterruption(EndInterruptionFlags); 65 64 65 virtual void pauseSession(); 66 67 protected: 68 MediaSessionClient& client() const { return m_client; } 69 66 70 private: 67 71 MediaSessionClient& m_client; … … 79 83 virtual void beginInterruption() { } 80 84 virtual void endInterruption(MediaSession::EndInterruptionFlags) { } 81 85 86 virtual void pausePlayback() = 0; 87 82 88 protected: 83 89 virtual ~MediaSessionClient() { } -
trunk/Source/WebCore/platform/audio/MediaSessionManager.cpp
r161481 r161899 31 31 namespace WebCore { 32 32 33 #if !PLATFORM(IOS) 33 34 MediaSessionManager& MediaSessionManager::sharedManager() 34 35 { … … 36 37 return manager; 37 38 } 39 #endif 38 40 39 41 MediaSessionManager::MediaSessionManager() 40 42 : m_interruptions(0) 41 43 { 44 m_restrictions[MediaSession::Video] = NoRestrictions; 45 m_restrictions[MediaSession::Audio] = NoRestrictions; 46 m_restrictions[MediaSession::WebAudio] = NoRestrictions; 42 47 } 43 48 … … 104 109 } 105 110 111 void 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 117 void 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 123 MediaSessionManager::SessionRestrictions MediaSessionManager::restrictions(MediaSession::MediaType sessionType) 124 { 125 return m_restrictions[sessionType]; 126 } 127 128 void 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 106 145 #if !PLATFORM(MAC) 107 146 void MediaSessionManager::updateSessionState() -
trunk/Source/WebCore/platform/audio/MediaSessionManager.h
r161481 r161899 29 29 #include "MediaSession.h" 30 30 #include "Settings.h" 31 #include <map> 31 32 #include <wtf/Vector.h> 32 33 … … 46 47 void endInterruption(MediaSession::EndInterruptionFlags); 47 48 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 48 61 protected: 49 62 friend class MediaSession; 63 explicit MediaSessionManager(); 64 50 65 void addSession(MediaSession&); 51 66 void removeSession(MediaSession&); 52 67 53 68 private: 54 MediaSessionManager();69 void updateSessionState(); 55 70 56 void updateSessionState();71 std::map<MediaSession::MediaType, SessionRestrictions> m_restrictions; 57 72 58 73 Vector<MediaSession*> m_sessions; -
trunk/Source/WebCore/platform/audio/mac/AudioDestinationMac.h
r161481 r161899 49 49 virtual void stop() OVERRIDE; 50 50 virtual bool isPlaying() OVERRIDE { return m_isPlaying; } 51 virtual void pausePlayback() OVERRIDE { stop(); } 51 52 52 53 virtual float sampleRate() const OVERRIDE { return m_sampleRate; } -
trunk/Source/WebCore/testing/Internals.cpp
r161662 r161899 2292 2292 } 2293 2293 2294 } 2294 void 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 335 335 void beginMediaSessionInterruption(); 336 336 void endMediaSessionInterruption(const String&); 337 void setMediaSessionRestrictions(const String& mediaType, const String& restrictions, ExceptionCode& ec); 337 338 338 339 private: -
trunk/Source/WebCore/testing/Internals.idl
r161481 r161899 282 282 void beginMediaSessionInterruption(); 283 283 void endMediaSessionInterruption(DOMString flags); 284 [RaisesException] void setMediaSessionRestrictions(DOMString mediaType, DOMString restrictions); 284 285 };
Note:
See TracChangeset
for help on using the changeset viewer.