Changeset 255116 in webkit
- Timestamp:
- Jan 25, 2020 4:27:39 AM (4 years ago)
- Location:
- trunk
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r255113 r255116 1 2020-01-25 youenn fablet <youenn@apple.com> 2 3 HTMLMediaElement should not remove the media session at DOM suspension time 4 https://bugs.webkit.org/show_bug.cgi?id=206661 5 <rdar://problem/58800787> 6 7 Reviewed by Eric Carlson. 8 9 https://trac.webkit.org/changeset/233560 made it so that, on HTMLMediaElement suspension, 10 its media session is stopped. 11 This was done to ensure updateNowPlayingInfo is not called synchronously but asynchronously. 12 The issue is that, once the media session is stopped, it is removed from the media session vector. 13 On updating the ready state after suspension, and playing, we try to look into the media session vector and do not find the session. 14 This triggers the ASSERT. 15 16 Partially revert the behavior by calling the same code as clientWillPausePlayback 17 but make sure updateNowPlayingInfo is calling asynchronously when suspending the media element. 18 Introduce clientWillBeDOMSuspended for that purpose. 19 20 Update mediaPlayerReadyStateChanged to enqueue a task to do the update if the media element is suspended. 21 22 Covered by test no longer crashing in debug. 23 24 * html/HTMLMediaElement.cpp: 25 (WebCore::HTMLMediaElement::mediaPlayerReadyStateChanged): 26 (WebCore::HTMLMediaElement::stopWithoutDestroyingMediaPlayer): 27 * platform/audio/PlatformMediaSession.cpp: 28 (WebCore::PlatformMediaSession::processClientWillPausePlayback): 29 (WebCore::PlatformMediaSession::clientWillPausePlayback): 30 (WebCore::PlatformMediaSession::clientWillBeDOMSuspended): 31 * platform/audio/PlatformMediaSession.h: 32 * platform/audio/PlatformMediaSessionManager.cpp: 33 (WebCore::PlatformMediaSessionManager::sessionWillEndPlayback): 34 * platform/audio/PlatformMediaSessionManager.h: 35 * platform/audio/cocoa/MediaSessionManagerCocoa.h: 36 * platform/audio/cocoa/MediaSessionManagerCocoa.mm: 37 (MediaSessionManagerCocoa::sessionWillEndPlayback): 38 * platform/audio/ios/MediaSessionManagerIOS.h: 39 * platform/audio/ios/MediaSessionManagerIOS.mm: 40 (WebCore::MediaSessionManageriOS::sessionWillEndPlayback): 41 1 42 2020-01-24 Jack Lee <shihchieh_lee@apple.com> 2 43 -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r254964 r255116 2327 2327 void HTMLMediaElement::mediaPlayerReadyStateChanged() 2328 2328 { 2329 if (isSuspended()) { 2330 queueTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this] { 2331 mediaPlayerReadyStateChanged(); 2332 }); 2333 return; 2334 } 2335 2329 2336 beginProcessingMediaPlayerCallback(); 2330 2337 … … 5627 5634 setPlaying(false); 5628 5635 pauseAndUpdatePlayStateImmediately(); 5629 m_mediaSession-> stopSession();5636 m_mediaSession->clientWillBeDOMSuspended(); 5630 5637 5631 5638 setAutoplayEventPlaybackState(AutoplayEventPlaybackState::None); -
trunk/Source/WebCore/platform/audio/PlatformMediaSession.cpp
r252470 r255116 225 225 } 226 226 227 bool PlatformMediaSession:: clientWillPausePlayback()227 bool PlatformMediaSession::processClientWillPausePlayback(DelayCallingUpdateNowPlaying shouldDelayCallingUpdateNowPlaying) 228 228 { 229 229 if (m_notifyingClient) … … 238 238 239 239 setState(Paused); 240 PlatformMediaSessionManager::sharedManager().sessionWillEndPlayback(*this );240 PlatformMediaSessionManager::sharedManager().sessionWillEndPlayback(*this, shouldDelayCallingUpdateNowPlaying); 241 241 return true; 242 } 243 244 bool PlatformMediaSession::clientWillPausePlayback() 245 { 246 return processClientWillPausePlayback(DelayCallingUpdateNowPlaying::No); 247 } 248 249 void PlatformMediaSession::clientWillBeDOMSuspended() 250 { 251 processClientWillPausePlayback(DelayCallingUpdateNowPlaying::Yes); 242 252 } 243 253 -
trunk/Source/WebCore/platform/audio/PlatformMediaSession.h
r251737 r255116 42 42 class MediaPlaybackTarget; 43 43 class PlatformMediaSessionClient; 44 enum class DelayCallingUpdateNowPlaying { No, Yes }; 44 45 45 46 class PlatformMediaSession … … 113 114 virtual bool clientWillBeginPlayback(); 114 115 virtual bool clientWillPausePlayback(); 116 117 void clientWillBeDOMSuspended(); 115 118 116 119 void pauseSession(); … … 200 203 201 204 private: 205 bool processClientWillPausePlayback(DelayCallingUpdateNowPlaying); 206 202 207 PlatformMediaSessionClient& m_client; 203 208 State m_state; -
trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.cpp
r252470 r255116 236 236 } 237 237 238 void PlatformMediaSessionManager::sessionWillEndPlayback(PlatformMediaSession& session )238 void PlatformMediaSessionManager::sessionWillEndPlayback(PlatformMediaSession& session, DelayCallingUpdateNowPlaying) 239 239 { 240 240 ALWAYS_LOG(LOGIDENTIFIER, session.logIdentifier()); -
trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.h
r252470 r255116 114 114 115 115 virtual bool sessionWillBeginPlayback(PlatformMediaSession&); 116 virtual void sessionWillEndPlayback(PlatformMediaSession&); 116 117 virtual void sessionWillEndPlayback(PlatformMediaSession&, DelayCallingUpdateNowPlaying); 117 118 virtual void sessionStateChanged(PlatformMediaSession&); 118 119 virtual void sessionDidEndRemoteScrubbing(const PlatformMediaSession&) { }; -
trunk/Source/WebCore/platform/audio/cocoa/MediaSessionManagerCocoa.h
r252470 r255116 54 54 55 55 bool sessionWillBeginPlayback(PlatformMediaSession&) override; 56 void sessionWillEndPlayback(PlatformMediaSession& ) override;56 void sessionWillEndPlayback(PlatformMediaSession&, DelayCallingUpdateNowPlaying) override; 57 57 void sessionDidEndRemoteScrubbing(const PlatformMediaSession&) override; 58 58 void clientCharacteristicsChanged(PlatformMediaSession&) override; -
trunk/Source/WebCore/platform/audio/cocoa/MediaSessionManagerCocoa.mm
r252470 r255116 162 162 } 163 163 164 void MediaSessionManagerCocoa::sessionWillEndPlayback(PlatformMediaSession& session) 165 { 166 PlatformMediaSessionManager::sessionWillEndPlayback(session); 167 updateNowPlayingInfo(); 164 void MediaSessionManagerCocoa::sessionWillEndPlayback(PlatformMediaSession& session, DelayCallingUpdateNowPlaying delayCallingUpdateNowPlaying) 165 { 166 PlatformMediaSessionManager::sessionWillEndPlayback(session, delayCallingUpdateNowPlaying); 167 if (delayCallingUpdateNowPlaying == DelayCallingUpdateNowPlaying::No) { 168 updateNowPlayingInfo(); 169 return; 170 } 171 scheduleUpdateNowPlayingInfo(); 168 172 } 169 173 -
trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.h
r254878 r255116 64 64 void configureWireLessTargetMonitoring() override; 65 65 void providePresentingApplicationPIDIfNecessary() final; 66 void sessionWillEndPlayback(PlatformMediaSession& ) final;66 void sessionWillEndPlayback(PlatformMediaSession&, DelayCallingUpdateNowPlaying) final; 67 67 68 68 #if !RELEASE_LOG_DISABLED -
trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm
r254878 r255116 195 195 } 196 196 197 void MediaSessionManageriOS::sessionWillEndPlayback(PlatformMediaSession& session )198 { 199 MediaSessionManagerCocoa::sessionWillEndPlayback(session );197 void MediaSessionManageriOS::sessionWillEndPlayback(PlatformMediaSession& session, DelayCallingUpdateNowPlaying delayCallingUpdateNowPlaying) 198 { 199 MediaSessionManagerCocoa::sessionWillEndPlayback(session, delayCallingUpdateNowPlaying); 200 200 201 201 #if USE(AUDIO_SESSION) -
trunk/Tools/ChangeLog
r255082 r255116 1 2020-01-25 Youenn Fablet <youenn@apple.com> 2 3 HTMLMediaElement should not remove the media session at DOM suspension time 4 https://bugs.webkit.org/show_bug.cgi?id=206661 5 <rdar://problem/58800787> 6 7 Reviewed by Eric Carlson. 8 9 * TestWebKitAPI/Tests/WebKitLegacy/ios/ScrollingDoesNotPauseMedia.mm: 10 (TestWebKitAPI::TEST): 11 Suspend/resume Active DOM Objects from time to time as would do scrolling. 12 This allows pending tasks to be executed asynchronously when not scrolling. 13 1 14 2020-01-23 Matt Lewis <jlewis3@apple.com> 2 15 -
trunk/Tools/TestWebKitAPI/Tests/WebKitLegacy/ios/ScrollingDoesNotPauseMedia.mm
r252152 r255116 93 93 94 94 callOnMainThreadAndWait([&] () mutable { 95 [mainFrame setTimeoutsPaused:YES]; 96 95 97 DOMHTMLMediaElement* video = (DOMHTMLMediaElement*)[mainFrame.DOMDocument querySelector:@"video"]; 96 98 ASSERT_TRUE([video isKindOfClass:[DOMHTMLMediaElement class]]); 97 99 98 100 [video addEventListener:@"playing" listener:testController.get() useCapture:NO]; 99 100 [mainFrame setTimeoutsPaused:YES];101 101 didReceivePlaying = false; 102 102 [video play]; 103 104 [mainFrame setTimeoutsPaused:NO]; 103 105 }); 104 106 … … 106 108 107 109 callOnMainThreadAndWait([&] () mutable { 110 [mainFrame setTimeoutsPaused:YES]; 111 108 112 DOMHTMLMediaElement* video = (DOMHTMLMediaElement*)[mainFrame.DOMDocument querySelector:@"video"]; 109 113 ASSERT_TRUE([video isKindOfClass:[DOMHTMLMediaElement class]]); 110 114 111 115 [video addEventListener:@"pause" listener:testController.get() useCapture:NO]; 116 didReceivePause = false; 117 [video pause]; 112 118 113 119 [mainFrame setTimeoutsPaused:NO]; 114 didReceivePause = false;115 [video pause];116 120 }); 117 121
Note: See TracChangeset
for help on using the changeset viewer.