Changeset 163390 in webkit
- Timestamp:
- Feb 4, 2014, 11:09:34 AM (11 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 2 deleted
- 23 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r163382 r163390 1 2014-02-04 Eric Carlson <eric.carlson@apple.com> 2 3 Refine MediaSession interruptions 4 https://bugs.webkit.org/show_bug.cgi?id=128125 5 6 Reviewed by Jer Noble. 7 8 * media/video-background-playback-expected.txt: Added. 9 * media/video-background-playback.html: Added. 10 * media/video-interruption-active-when-element-created-expected.txt: Removed. 11 * media/video-interruption-active-when-element-created.html: Removed. 12 * media/video-interruption-with-resume-allowing-play.html: 13 * media/video-interruption-with-resume-not-allowing-play.html: 14 1 15 2014-02-04 Radu Stavila <stavila@adobe.com> 2 16 -
trunk/LayoutTests/media/video-interruption-with-resume-allowing-play-expected.txt
r163377 r163390 3 3 4 4 EVENT(canplaythrough) 5 RUN(video.play()) 5 6 7 EVENT(playing) 8 EXPECTED (video.paused == 'false') OK 6 9 RUN(internals.beginMediaSessionInterruption()) 7 RUN(video.play()) 10 8 11 100ms timer fired... 9 12 EXPECTED (video.paused == 'true') OK 10 13 RUN(internals.endMediaSessionInterruption('MayResumePlaying')) 14 11 15 EVENT(playing) 16 EXPECTED (video.paused == 'false') OK 12 17 13 18 END OF TEST -
trunk/LayoutTests/media/video-interruption-with-resume-allowing-play.html
r163377 r163390 8 8 function checkState() 9 9 { 10 consoleWrite("100ms timer fired..."); 11 testExpected("video.paused", true); 12 state = "resuming"; 13 run("internals.endMediaSessionInterruption('MayResumePlaying')"); 14 } 15 16 function playing() 17 { 18 if (state != "resuming") 19 { 10 switch (state) { 11 case "playing": 12 testExpected("video.paused", false); 13 state = "interrupted"; 14 run("internals.beginMediaSessionInterruption()");; 15 setTimeout(checkState, 100); 20 16 consoleWrite(""); 21 failTest("<b>Playback started during interruption.</b>"); 22 return; 17 break; 18 case "interrupted": 19 consoleWrite("100ms timer fired..."); 20 testExpected("video.paused", true); 21 state = "resuming"; 22 run("internals.endMediaSessionInterruption('MayResumePlaying')"); 23 consoleWrite(""); 24 break; 25 case "resuming": 26 testExpected("video.paused", false); 27 consoleWrite(""); 28 endTest(); 29 break; 23 30 } 24 25 consoleWrite("");26 endTest();27 31 } 28 32 29 33 function canplaythrough() 30 34 { 35 state = "playing"; 36 run("video.play()"); 31 37 consoleWrite(""); 32 33 run("internals.beginMediaSessionInterruption()");;34 state = "interrupted";35 run("video.play()");36 setTimeout(checkState, 100);37 38 } 38 39 … … 46 47 findMediaElement(); 47 48 waitForEvent('canplaythrough', canplaythrough); 48 waitForEvent('playing', playing);49 waitForEvent('playing', checkState); 49 50 video.src = findMediaFile("video", "content/test"); 50 51 } -
trunk/LayoutTests/media/video-interruption-with-resume-not-allowing-play-expected.txt
r163377 r163390 1 1 2 Test that play () during interruption does nothing, ending interruption does not allow playback to resume.2 Test that playback is paused by an interruption, and that ending the interruption does automatically resume playback. 3 3 4 4 EVENT(canplaythrough) 5 RUN(video.play()) 5 6 7 EVENT(playing) 6 8 RUN(internals.beginMediaSessionInterruption()) 7 RUN(video.play()) 9 8 10 100ms timer fired... 9 11 EXPECTED (video.paused == 'true') OK 10 12 RUN(internals.endMediaSessionInterruption('')) 13 11 14 100ms timer fired... 12 15 EXPECTED (video.paused == 'true') OK -
trunk/LayoutTests/media/video-interruption-with-resume-not-allowing-play.html
r163377 r163390 8 8 function playing() 9 9 { 10 if (state == "resuming") 11 failTest("<b>Playback started after interruption.</b>"); 12 else 13 failTest("<b>Playback started during interruption.</b>"); 10 run("internals.beginMediaSessionInterruption()");; 11 setTimeout(checkState, 100); 14 12 } 15 13 16 14 function checkState() 17 15 { 18 consoleWrite(" 100ms timer fired...");16 consoleWrite("<br>100ms timer fired..."); 19 17 testExpected("video.paused", true); 20 18 switch (state) { … … 33 31 function canplaythrough() 34 32 { 35 consoleWrite("");36 37 run("internals.beginMediaSessionInterruption()");;38 33 state = "interrupted"; 39 34 run("video.play()"); 40 setTimeout(checkState, 100);35 consoleWrite(""); 41 36 } 42 37 … … 58 53 <body onload="start()"> 59 54 <video controls ></video> 60 <p>Test that play () during interruption does nothing, ending interruption does not allow playback to resume.</p>55 <p>Test that playback is paused by an interruption, and that ending the interruption does automatically resume playback.</p> 61 56 </body> 62 57 </html> -
trunk/Source/WebCore/ChangeLog
r163389 r163390 1 2014-02-04 Eric Carlson <eric.carlson@apple.com> 2 3 Refine MediaSession interruptions 4 https://bugs.webkit.org/show_bug.cgi?id=128125 5 6 Reviewed by Jer Noble. 7 8 Test: media/video-background-playback.html 9 10 * WebCore.exp.in: Export applicationWillEnterForeground and applicationWillEnterBackground for 11 Internals. 12 13 * html/HTMLMediaElement.cpp: 14 (WebCore::HTMLMediaElement::play): Ask the media session if playback is allowed instead of check 15 to see if it is interrupted directly. 16 (WebCore::HTMLMediaElement::pause): Ask the media session if pausing is allowed instead of check 17 to see if it is interrupted directly. 18 (WebCore::HTMLMediaElement::mediaType): Return media type based on media characteristics once 19 the information is available. 20 (WebCore::HTMLMediaElement::resumePlayback): New. 21 * html/HTMLMediaElement.h: 22 23 * html/HTMLMediaSession.cpp: 24 (WebCore::restrictionName): New, use for logging only. 25 (WebCore::HTMLMediaSession::addBehaviorRestriction): Log restriction changes. 26 (WebCore::HTMLMediaSession::removeBehaviorRestriction): Ditto. 27 * html/HTMLMediaSession.h: 28 29 * platform/audio/MediaSession.cpp: 30 (WebCore::stateName): New, used for logging. 31 (WebCore::MediaSession::MediaSession): Don't cache client media type because it can change. 32 (WebCore::MediaSession::setState): Log state changes. 33 (WebCore::MediaSession::beginInterruption): Remember the current state in case we want to use it 34 to restore state when the interruption ends. 35 (WebCore::MediaSession::endInterruption): Resume playback if appropriate. 36 (WebCore::MediaSession::clientWillBeginPlayback): Track the client's playback state. 37 (WebCore::MediaSession::clientWillPausePlayback): Ditto. 38 (WebCore::MediaSession::mediaType): Ask client for state. 39 * platform/audio/MediaSession.h: 40 41 * platform/audio/MediaSessionManager.cpp: 42 (WebCore::MediaSessionManager::MediaSessionManager): m_interruptions -> m_interrupted. 43 (WebCore::MediaSessionManager::beginInterruption): Don't assume interruptions are always balanced. 44 (WebCore::MediaSessionManager::endInterruption): Ditto. 45 (WebCore::MediaSessionManager::addSession): 46 (WebCore::MediaSessionManager::applicationWillEnterBackground): Interrupt client if it is not 47 allowed to play in the background. 48 (WebCore::MediaSessionManager::applicationWillEnterForeground): End client interruption if it 49 was stopped by an interruption. 50 * platform/audio/MediaSessionManager.h: 51 52 * platform/audio/ios/MediaSessionManagerIOS.h: 53 * platform/audio/ios/MediaSessionManagerIOS.mm: 54 (WebCore::MediaSessionManageriOS::~MediaSessionManageriOS): Clear the helper callback. 55 (WebCore::MediaSessionManageriOS::resetRestrictions): Mark video as not allowed to play 56 while the application is in the background. Register for application suspend/resume 57 notifications. 58 (-[WebMediaSessionHelper clearCallback]): Set _callback to nil. 59 (-[WebMediaSessionHelper applicationWillEnterForeground:]): New, notify client of application 60 state change. 61 (-[WebMediaSessionHelper applicationWillResignActive:]): Ditto. 62 63 * platform/audio/mac/AudioDestinationMac.h: Add resumePlayback. 64 65 * testing/Internals.cpp: 66 (WebCore::Internals::applicationWillEnterForeground): New, simulate application context switch. 67 (WebCore::Internals::applicationWillEnterBackground): Ditto. 68 (WebCore::Internals::setMediaSessionRestrictions): Add "BackgroundPlaybackNotPermitted" restriction. 69 * testing/Internals.h: 70 * testing/Internals.idl: 71 1 72 2014-02-04 Andreas Kling <akling@apple.com> 2 73 -
trunk/Source/WebCore/WebCore.exp.in
r163377 r163390 761 761 __ZN7WebCore19MediaSessionManager17beginInterruptionEv 762 762 __ZN7WebCore19MediaSessionManager17removeRestrictionENS_12MediaSession9MediaTypeEj 763 __ZNK7WebCore19MediaSessionManager30applicationWillEnterBackgroundEv 764 __ZNK7WebCore19MediaSessionManager30applicationWillEnterForegroundEv 763 765 __ZN7WebCore19ResourceRequestBase11setHTTPBodyEN3WTF10PassRefPtrINS_8FormDataEEE 764 766 __ZN7WebCore19ResourceRequestBase13setHTTPMethodERKN3WTF6StringE -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r163377 r163390 2649 2649 removeBehaviorsRestrictionsAfterFirstUserGesture(); 2650 2650 2651 if ( m_mediaSession->state() == MediaSession::Interrupted) {2652 m_resumePlaybackAfterInterruption = true;2651 if (!m_mediaSession->clientWillBeginPlayback()) { 2652 LOG(Media, " returning because of interruption"); 2653 2653 return; 2654 2654 } … … 2696 2696 return; 2697 2697 2698 if ( m_mediaSession->state() == MediaSession::Interrupted) {2699 m_resumePlaybackAfterInterruption = false;2700 return; 2701 } 2702 2698 if (!m_mediaSession->clientWillPausePlayback()) { 2699 LOG(Media, " returning because of interruption"); 2700 return; 2701 } 2702 2703 2703 pauseInternal(); 2704 2704 } … … 4269 4269 4270 4270 if (playerPaused) { 4271 m_mediaSession->clientWillBeginPlayback();4272 4273 4271 if (m_mediaSession->requiresFullscreenForVideoPlayback(*this)) 4274 4272 enterFullscreen(); … … 4290 4288 m_playing = true; 4291 4289 4292 } else { // Should not be playing right now4290 } else { 4293 4291 if (!playerPaused) 4294 4292 m_player->pause(); … … 5763 5761 MediaSession::MediaType HTMLMediaElement::mediaType() const 5764 5762 { 5763 if (m_player && m_readyState >= HAVE_METADATA) 5764 return hasVideo() ? MediaSession::Video : MediaSession::Audio; 5765 5765 5766 if (hasTagName(HTMLNames::videoTag)) 5766 5767 return MediaSession::Video; … … 5769 5770 } 5770 5771 5771 void HTMLMediaElement::beginInterruption()5772 {5773 LOG(Media, "HTMLMediaElement::beginInterruption");5774 5775 m_resumePlaybackAfterInterruption = !paused();5776 if (m_resumePlaybackAfterInterruption)5777 pause();5778 }5779 5780 void HTMLMediaElement::endInterruption(MediaSession::EndInterruptionFlags flags)5781 {5782 bool shouldResumePlayback = m_resumePlaybackAfterInterruption;5783 m_resumePlaybackAfterInterruption = false;5784 5785 if (!flags & MediaSession::MayResumePlaying)5786 return;5787 5788 if (shouldResumePlayback)5789 play();5790 }5791 5792 5772 void HTMLMediaElement::pausePlayback() 5793 5773 { 5774 LOG(Media, "HTMLMediaElement::pausePlayback - paused = %s", boolString(paused())); 5794 5775 if (!paused()) 5795 5776 pause(); 5796 5777 } 5797 5778 5798 } 5799 5800 #endif 5779 void HTMLMediaElement::resumePlayback() 5780 { 5781 LOG(Media, "HTMLMediaElement::resumePlayback - paused = %s", boolString(paused())); 5782 if (paused()) 5783 play(); 5784 } 5785 5786 } 5787 5788 #endif -
trunk/Source/WebCore/html/HTMLMediaElement.h
r163377 r163390 670 670 671 671 virtual MediaSession::MediaType mediaType() const override; 672 673 virtual void beginInterruption() override;674 virtual void endInterruption(MediaSession::EndInterruptionFlags) override;675 672 virtual void pausePlayback() override; 673 virtual void resumePlayback() override; 676 674 677 675 Timer<HTMLMediaElement> m_loadTimer; … … 781 779 #endif 782 780 783 bool m_resumePlaybackAfterInterruption : 1;784 785 781 #if ENABLE(VIDEO_TRACK) 786 782 bool m_tracksAreReady : 1; -
trunk/Source/WebCore/html/HTMLMediaSession.cpp
r163377 r163390 43 43 namespace WebCore { 44 44 45 #if !LOG_DISABLED 46 static const char* restrictionName(HTMLMediaSession::BehaviorRestrictions restriction) 47 { 48 #define CASE(_restriction) case HTMLMediaSession::_restriction: return #_restriction; break; 49 switch (restriction) { 50 CASE(NoRestrictions); 51 CASE(RequireUserGestureForLoad); 52 CASE(RequireUserGestureForRateChange); 53 CASE(RequireUserGestureForFullscreen); 54 CASE(RequirePageConsentToLoadMedia); 55 CASE(RequirePageConsentToResumeMedia); 56 #if ENABLE(IOS_AIRPLAY) 57 CASE(RequireUserGestureToShowPlaybackTargetPicker); 58 #endif 59 } 60 61 ASSERT_NOT_REACHED(); 62 return ""; 63 } 64 #endif 65 45 66 static void initializeAudioSession() 46 67 { … … 72 93 void HTMLMediaSession::addBehaviorRestriction(BehaviorRestrictions restriction) 73 94 { 95 LOG(Media, "HTMLMediaSession::addBehaviorRestriction - adding %s", restrictionName(restriction)); 74 96 m_restrictions |= restriction; 75 97 } … … 77 99 void HTMLMediaSession::removeBehaviorRestriction(BehaviorRestrictions restriction) 78 100 { 101 LOG(Media, "HTMLMediaSession::removeBehaviorRestriction - removing %s", restrictionName(restriction)); 79 102 m_restrictions &= ~restriction; 80 103 } … … 160 183 } 161 184 162 void HTMLMediaSession::clientWillBeginPlayback() const163 {164 MediaSessionManager::sharedManager().sessionWillBeginPlayback(*this);165 }166 167 185 bool HTMLMediaSession::requiresFullscreenForVideoPlayback(const HTMLMediaElement& element) const 168 186 { -
trunk/Source/WebCore/html/HTMLMediaSession.h
r163377 r163390 43 43 virtual ~HTMLMediaSession() { } 44 44 45 void clientWillBeginPlayback() const;46 47 45 bool playbackPermitted(const HTMLMediaElement&) const; 48 46 bool dataLoadingPermitted(const HTMLMediaElement&) const; -
trunk/Source/WebCore/platform/audio/MediaSession.cpp
r163377 r163390 33 33 namespace WebCore { 34 34 35 static const char* stateName(MediaSession::State state) 36 { 37 #define CASE(_state) case MediaSession::_state: return #_state; break; 38 switch (state) { 39 CASE(Idle); 40 CASE(Playing); 41 CASE(Paused); 42 CASE(Interrupted); 43 } 44 45 ASSERT_NOT_REACHED(); 46 return ""; 47 } 48 35 49 std::unique_ptr<MediaSession> MediaSession::create(MediaSessionClient& client) 36 50 { … … 40 54 MediaSession::MediaSession(MediaSessionClient& client) 41 55 : m_client(client) 42 , m_state(Running) 56 , m_state(Idle) 57 , m_stateToRestore(Idle) 58 , m_notifyingClient(false) 43 59 { 44 m_type = m_client.mediaType(); 45 ASSERT(m_type >= None && m_type <= WebAudio); 60 ASSERT(m_client.mediaType() >= None && m_client.mediaType() <= WebAudio); 46 61 MediaSessionManager::sharedManager().addSession(*this); 47 62 } … … 52 67 } 53 68 69 void MediaSession::setState(State state) 70 { 71 LOG(Media, "MediaSession::setState - %s", stateName(state)); 72 m_state = state; 73 } 74 54 75 void MediaSession::beginInterruption() 55 76 { 56 77 LOG(Media, "MediaSession::beginInterruption"); 57 m_state = Interrupted; 58 m_client.beginInterruption(); 78 79 m_stateToRestore = state(); 80 m_notifyingClient = true; 81 client().pausePlayback(); 82 setState(Interrupted); 83 m_notifyingClient = false; 59 84 } 60 85 61 86 void MediaSession::endInterruption(EndInterruptionFlags flags) 62 87 { 63 LOG(Media, "MediaSession::endInterruption"); 64 m_state = Running; 65 m_client.endInterruption(flags); 88 LOG(Media, "MediaSession::endInterruption - flags = %i, stateToRestore = %s", (int)flags, stateName(m_stateToRestore)); 89 90 State stateToRestore = m_stateToRestore; 91 m_stateToRestore = Idle; 92 setState(Paused); 93 94 if (flags & MayResumePlaying && stateToRestore == Playing) { 95 LOG(Media, "MediaSession::endInterruption - resuming playback"); 96 client().resumePlayback(); 97 } 98 } 99 100 bool MediaSession::clientWillBeginPlayback() 101 { 102 setState(Playing); 103 MediaSessionManager::sharedManager().sessionWillBeginPlayback(*this); 104 return true; 105 } 106 107 bool MediaSession::clientWillPausePlayback() 108 { 109 if (state() == Interrupted) { 110 if (!m_notifyingClient) 111 m_stateToRestore = Paused; 112 return false; 113 } 114 115 setState(Paused); 116 return true; 66 117 } 67 118 … … 72 123 } 73 124 125 MediaSession::MediaType MediaSession::mediaType() const 126 { 127 return m_client.mediaType(); 74 128 } 129 130 } -
trunk/Source/WebCore/platform/audio/MediaSession.h
r163377 r163390 46 46 WebAudio, 47 47 }; 48 49 MediaType mediaType() const { return m_type; } 48 MediaType mediaType() const; 50 49 51 50 enum State { 52 Running, 51 Idle, 52 Playing, 53 Paused, 53 54 Interrupted, 54 55 }; 55 56 State state() const { return m_state; } 56 void setState(State state) { m_state = state; }57 void setState(State); 57 58 58 59 enum EndInterruptionFlags { … … 63 64 void endInterruption(EndInterruptionFlags); 64 65 66 void applicationWillEnterForeground() const; 67 void applicationWillEnterBackground() const; 68 69 bool clientWillBeginPlayback(); 70 bool clientWillPausePlayback(); 71 65 72 void pauseSession(); 66 73 … … 70 77 private: 71 78 MediaSessionClient& m_client; 72 MediaType m_type;73 79 State m_state; 80 State m_stateToRestore; 81 bool m_notifyingClient; 74 82 }; 75 83 … … 80 88 81 89 virtual MediaSession::MediaType mediaType() const = 0; 82 83 virtual void beginInterruption() { } 84 virtual void endInterruption(MediaSession::EndInterruptionFlags) { } 85 90 virtual void resumePlayback() = 0; 86 91 virtual void pausePlayback() = 0; 87 92 -
trunk/Source/WebCore/platform/audio/MediaSessionManager.cpp
r163377 r163390 27 27 #include "MediaSessionManager.h" 28 28 29 #include "Logging.h" 29 30 #include "MediaSession.h" 30 31 … … 40 41 41 42 MediaSessionManager::MediaSessionManager() 42 : m_interrupt ions(0)43 : m_interrupted(false) 43 44 { 44 45 resetRestrictions(); … … 79 80 void MediaSessionManager::beginInterruption() 80 81 { 81 if (++m_interruptions > 1) 82 return; 82 LOG(Media, "MediaSessionManager::beginInterruption"); 83 83 84 m_interrupted = true; 84 85 for (auto* session : m_sessions) 85 86 session->beginInterruption(); … … 88 89 void MediaSessionManager::endInterruption(MediaSession::EndInterruptionFlags flags) 89 90 { 90 ASSERT(m_interruptions > 0); 91 if (--m_interruptions) 92 return; 93 91 LOG(Media, "MediaSessionManager::endInterruption"); 92 93 m_interrupted = false; 94 94 for (auto* session : m_sessions) 95 95 session->endInterruption(flags); … … 99 99 { 100 100 m_sessions.append(&session); 101 session.setState(m_interruptions ? MediaSession::Interrupted : MediaSession::Running); 101 if (m_interrupted) 102 session.setState(MediaSession::Interrupted); 102 103 updateSessionState(); 103 104 } … … 158 159 } 159 160 161 void MediaSessionManager::applicationWillEnterBackground() const 162 { 163 LOG(Media, "MediaSessionManager::applicationWillEnterBackground"); 164 for (auto* session : m_sessions) { 165 if (m_restrictions[session->mediaType()] & BackgroundPlaybackNotPermitted) 166 session->beginInterruption(); 167 } 168 } 169 170 void MediaSessionManager::applicationWillEnterForeground() const 171 { 172 LOG(Media, "MediaSessionManager::applicationWillEnterForeground"); 173 for (auto* session : m_sessions) { 174 if (m_restrictions[session->mediaType()] & BackgroundPlaybackNotPermitted) 175 session->endInterruption(MediaSession::MayResumePlaying); 176 } 177 } 178 160 179 #if !PLATFORM(MAC) 161 180 void MediaSessionManager::updateSessionState() -
trunk/Source/WebCore/platform/audio/MediaSessionManager.h
r163377 r163390 48 48 void endInterruption(MediaSession::EndInterruptionFlags); 49 49 50 void applicationWillEnterForeground() const; 51 void applicationWillEnterBackground() const; 52 50 53 enum SessionRestrictionFlags { 51 54 NoRestrictions = 0, … … 54 57 MetadataPreloadingNotPermitted = 1 << 2, 55 58 AutoPreloadingNotPermitted = 1 << 3, 59 BackgroundPlaybackNotPermitted = 1 << 4, 56 60 }; 57 61 typedef unsigned SessionRestrictions; … … 63 67 64 68 void sessionWillBeginPlayback(const MediaSession&) const; 69 65 70 bool sessionRestrictsInlineVideoPlayback(const MediaSession&) const; 66 71 … … 78 83 79 84 Vector<MediaSession*> m_sessions; 80 int m_interruptions;85 bool m_interrupted; 81 86 }; 82 87 -
trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.h
r163377 r163390 38 38 class MediaSessionManageriOS : public MediaSessionManager { 39 39 public: 40 virtual ~MediaSessionManageriOS() { }40 virtual ~MediaSessionManageriOS(); 41 41 42 42 private: -
trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm
r163377 r163390 32 32 #import "MediaSession.h" 33 33 #import "SoftLinking.h" 34 #import "WebCoreSystemInterface.h" 34 35 #import "WebCoreThreadRun.h" 35 #import "WebCoreSystemInterface.h"36 36 #import <AVFoundation/AVAudioSession.h> 37 #import <UIKit/UIApplication.h> 37 38 #import <objc/runtime.h> 38 39 #import <wtf/RetainPtr.h> 39 40 40 41 SOFT_LINK_FRAMEWORK(AVFoundation) 42 SOFT_LINK_FRAMEWORK(UIKit) 41 43 42 44 SOFT_LINK_CLASS(AVFoundation, AVAudioSession) … … 45 47 SOFT_LINK_POINTER(AVFoundation, AVAudioSessionInterruptionTypeKey, NSString *) 46 48 SOFT_LINK_POINTER(AVFoundation, AVAudioSessionInterruptionOptionKey, NSString *) 49 SOFT_LINK_POINTER(UIKit, UIApplicationWillResignActiveNotification, NSString *) 50 SOFT_LINK_POINTER(UIKit, UIApplicationWillEnterForegroundNotification, NSString *) 47 51 48 52 #define AVAudioSession getAVAudioSessionClass() … … 50 54 #define AVAudioSessionInterruptionTypeKey getAVAudioSessionInterruptionTypeKey() 51 55 #define AVAudioSessionInterruptionOptionKey getAVAudioSessionInterruptionOptionKey() 56 #define UIApplicationWillResignActiveNotification getUIApplicationWillResignActiveNotification() 57 #define UIApplicationWillEnterForegroundNotification getUIApplicationWillEnterForegroundNotification() 52 58 53 59 using namespace WebCore; … … 58 64 59 65 - (id)initWithCallback:(MediaSessionManageriOS*)callback; 66 - (void)clearCallback; 60 67 - (void)interruption:(NSNotification*)notification; 68 - (void)applicationWillEnterForeground:(NSNotification*)notification; 69 - (void)applicationWillResignActive:(NSNotification*)notification; 61 70 @end 62 63 71 64 72 namespace WebCore { … … 77 85 } 78 86 87 MediaSessionManageriOS::~MediaSessionManageriOS() 88 { 89 [m_objcObserver clearCallback]; 90 } 91 79 92 void MediaSessionManageriOS::resetRestrictions() 80 93 { … … 86 99 87 100 addRestriction(MediaSession::Video, ConcurrentPlaybackNotPermitted); 101 addRestriction(MediaSession::Video, BackgroundPlaybackNotPermitted); 102 88 103 removeRestriction(MediaSession::Audio, MetadataPreloadingNotPermitted); 89 104 removeRestriction(MediaSession::Video, MetadataPreloadingNotPermitted); … … 105 120 NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; 106 121 [center addObserver:self selector:@selector(interruption:) name:AVAudioSessionInterruptionNotification object:[AVAudioSession sharedInstance]]; 107 122 123 // FIXME: These need to be piped through from the UI process in WK2 mode. 124 [center addObserver:self selector:@selector(applicationWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil]; 125 [center addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil]; 126 108 127 return self; 109 128 } … … 113 132 [[NSNotificationCenter defaultCenter] removeObserver:self]; 114 133 [super dealloc]; 134 } 135 136 - (void)clearCallback 137 { 138 _callback = nil; 115 139 } 116 140 … … 138 162 } 139 163 164 - (void)applicationWillEnterForeground:(NSNotification *)notification 165 { 166 UNUSED_PARAM(notification); 167 168 if (!_callback) 169 return; 170 171 WebThreadRun(^{ 172 if (!_callback) 173 return; 174 175 _callback->applicationWillEnterForeground(); 176 }); 177 } 178 179 - (void)applicationWillResignActive:(NSNotification *)notification 180 { 181 UNUSED_PARAM(notification); 182 183 if (!_callback) 184 return; 185 186 WebThreadRun(^{ 187 if (!_callback) 188 return; 189 190 _callback->applicationWillEnterBackground(); 191 }); 192 } 193 140 194 @end 141 195 -
trunk/Source/WebCore/platform/audio/mac/AudioDestinationMac.h
r163377 r163390 48 48 virtual void stop() override; 49 49 virtual bool isPlaying() override { return m_isPlaying; } 50 50 51 virtual void pausePlayback() override { stop(); } 52 virtual void resumePlayback() override { start(); } 51 53 52 54 virtual float sampleRate() const override { return m_sampleRate; } -
trunk/Source/WebCore/testing/Internals.cpp
r163377 r163390 2189 2189 } 2190 2190 2191 void Internals::applicationWillEnterForeground() const 2192 { 2193 MediaSessionManager::sharedManager().applicationWillEnterForeground(); 2194 } 2195 2196 void Internals::applicationWillEnterBackground() const 2197 { 2198 MediaSessionManager::sharedManager().applicationWillEnterBackground(); 2199 } 2200 2191 2201 void Internals::setMediaSessionRestrictions(const String& mediaTypeString, const String& restrictionsString, ExceptionCode& ec) 2192 2202 { … … 2216 2226 if (equalIgnoringCase(restrictionsString, "AutoPreloadingNotPermitted")) 2217 2227 restrictions += MediaSessionManager::AutoPreloadingNotPermitted; 2228 if (equalIgnoringCase(restrictionsString, "BackgroundPlaybackNotPermitted")) 2229 restrictions += MediaSessionManager::BackgroundPlaybackNotPermitted; 2218 2230 2219 2231 MediaSessionManager::sharedManager().addRestriction(mediaType, restrictions); -
trunk/Source/WebCore/testing/Internals.h
r163377 r163390 327 327 void beginMediaSessionInterruption(); 328 328 void endMediaSessionInterruption(const String&); 329 void applicationWillEnterForeground() const; 330 void applicationWillEnterBackground() const; 329 331 void setMediaSessionRestrictions(const String& mediaType, const String& restrictions, ExceptionCode& ec); 330 332 -
trunk/Source/WebCore/testing/Internals.idl
r163377 r163390 275 275 void beginMediaSessionInterruption(); 276 276 void endMediaSessionInterruption(DOMString flags); 277 void applicationWillEnterForeground(); 278 void applicationWillEnterBackground(); 277 279 [RaisesException] void setMediaSessionRestrictions(DOMString mediaType, DOMString restrictions); 278 280 }; -
trunk/Source/WebKit/ChangeLog
r163377 r163390 1 2014-02-04 Eric Carlson <eric.carlson@apple.com> 2 3 Refine MediaSession interruptions 4 https://bugs.webkit.org/show_bug.cgi?id=128125 5 6 Reviewed by Jer Noble. 7 8 * WebKit.vcxproj/WebKitExportGenerator/WebKitExports.def.in: Export applicationWillEnterForeground 9 and applicationWillEnterBackground for Internals. 10 1 11 2014-02-04 Commit Queue <commit-queue@webkit.org> 2 12 -
trunk/Source/WebKit/WebKit.vcxproj/WebKitExportGenerator/WebKitExports.def.in
r163377 r163390 251 251 symbolWithPointer(?removeRestriction@MediaSessionManager@WebCore@@QAEXW4MediaType@MediaSession@2@I@Z, ?removeRestriction@MediaSessionManager@WebCore@@QEAAXW4MediaType@MediaSession@2@I@Z) 252 252 symbolWithPointer(?restrictions@MediaSessionManager@WebCore@@QAEIW4MediaType@MediaSession@2@@Z, ?restrictions@MediaSessionManager@WebCore@@QEAAIW4MediaType@MediaSession@2@@Z) 253 symbolWithPointer(?applicationWillEnterForeground@MediaSessionManager@WebCore@@QBEXXZ, ?applicationWillEnterForeground@MediaSessionManager@WebCore@@QBEXXZ) 254 symbolWithPointer(?applicationWillEnterBackground@MediaSessionManager@WebCore@@QBEXXZ, ?applicationWillEnterBackground@MediaSessionManager@WebCore@@QBEXXZ) 253 255 ?localUserSpecificStorageDirectory@WebCore@@YA?AVString@WTF@@XZ 254 256 symbolWithPointer(?namedItem@StaticNodeList@WebCore@@UBEPAVNode@2@ABVAtomicString@WTF@@@Z, ?namedItem@StaticNodeList@WebCore@@UEBAPEAVNode@2@AEBVAtomicString@WTF@@@Z)
Note:
See TracChangeset
for help on using the changeset viewer.