Changeset 271531 in webkit
- Timestamp:
- Jan 15, 2021 12:53:32 PM (18 months ago)
- Location:
- trunk
- Files:
-
- 2 added
- 3 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/media/media-play-promise-reject-play-notallowed-audio-expected.txt (added)
-
LayoutTests/media/media-play-promise-reject-play-notallowed-audio.html (added)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/html/HTMLMediaElement.cpp (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r271524 r271531 1 2021-01-15 Jer Noble <jer.noble@apple.com> 2 3 Playback fails at marketwatch.com 4 https://bugs.webkit.org/show_bug.cgi?id=220646 5 <rdar://72950166> 6 7 Reviewed by Xabier Rodriguez-Calvar. 8 9 * media/media-play-promise-reject-play-notallowed-audio-expected.txt: Added. 10 * media/media-play-promise-reject-play-notallowed-audio.html: Added. 11 1 12 2021-01-15 Antoine Quint <graouts@webkit.org> 2 13 -
trunk/Source/WebCore/ChangeLog
r271530 r271531 1 2021-01-15 Jer Noble <jer.noble@apple.com> 2 3 Playback fails at marketwatch.com 4 https://bugs.webkit.org/show_bug.cgi?id=220646 5 <rdar://72950166> 6 7 Reviewed by Xabier Rodriguez-Calvar. 8 9 Test: media/media-play-promise-reject-play-notallowed-audio.html 10 11 When audio playback is blocked by settings, the HTMLMediaElement must load its source 12 media's metadata in order to determine whether the media should be allowed to play without a 13 user gesture. If a play promise is pending, the expectation is that those promises will 14 reject with a NotAllowedError to indicate that a user gesture is needed. However, by calling 15 pauseInternal() to block (possibly) existing playback, this causes those promises to be 16 rejected with an AbortError, as if the pause() method had been called. Call 17 scheduleRejectPendingPlayPromises() with NotAllowedError to ensure the correct error is used 18 to reject. 19 20 Drive-by fix: no reason to dispatch and call rejectPendingPlayPromises() or 21 resolvePendingPlayPromises() if there are no promises to reject or resolve, and not calling 22 these methods makes the logs less noisy. 23 24 * html/HTMLMediaElement.cpp: 25 (WebCore::HTMLMediaElement::scheduleResolvePendingPlayPromises): 26 (WebCore::HTMLMediaElement::scheduleRejectPendingPlayPromises): 27 (WebCore::HTMLMediaElement::setVolume): 28 (WebCore::HTMLMediaElement::mediaPlayerDidAddAudioTrack): 29 (WebCore::HTMLMediaElement::mediaPlayerCharacteristicChanged): 30 (WebCore::HTMLMediaElement::updateShouldPlay): 31 1 32 2021-01-15 Jer Noble <jer.noble@apple.com> 2 33 -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r271245 r271531 909 909 void HTMLMediaElement::scheduleResolvePendingPlayPromises() 910 910 { 911 if (m_pendingPlayPromises.isEmpty()) 912 return; 913 911 914 m_promiseTaskQueue.enqueueTask([this, pendingPlayPromises = WTFMove(m_pendingPlayPromises)] () mutable { 912 915 resolvePendingPlayPromises(WTFMove(pendingPlayPromises)); … … 916 919 void HTMLMediaElement::scheduleRejectPendingPlayPromises(Ref<DOMException>&& error) 917 920 { 921 if (m_pendingPlayPromises.isEmpty()) 922 return; 923 918 924 m_promiseTaskQueue.enqueueTask([this, error = WTFMove(error), pendingPlayPromises = WTFMove(m_pendingPlayPromises)] () mutable { 919 925 rejectPendingPlayPromises(WTFMove(pendingPlayPromises), WTFMove(error)); … … 3610 3616 3611 3617 if (isPlaying() && !m_mediaSession->playbackPermitted()) { 3618 scheduleRejectPendingPlayPromises(DOMException::create(NotAllowedError)); 3612 3619 pauseInternal(); 3613 3620 setAutoplayEventPlaybackState(AutoplayEventPlaybackState::PreventedAutoplay); … … 3877 3884 { 3878 3885 if (isPlaying() && !m_mediaSession->playbackPermitted()) { 3886 scheduleRejectPendingPlayPromises(DOMException::create(NotAllowedError)); 3879 3887 pauseInternal(); 3880 3888 setAutoplayEventPlaybackState(AutoplayEventPlaybackState::PreventedAutoplay); … … 5051 5059 5052 5060 if (!paused() && !m_mediaSession->playbackPermitted()) { 5061 scheduleRejectPendingPlayPromises(DOMException::create(NotAllowedError)); 5053 5062 pauseInternal(); 5054 5063 setAutoplayEventPlaybackState(AutoplayEventPlaybackState::PreventedAutoplay); … … 7803 7812 { 7804 7813 if (!paused() && !m_mediaSession->playbackPermitted()) { 7814 scheduleRejectPendingPlayPromises(DOMException::create(NotAllowedError)); 7805 7815 pauseInternal(); 7806 7816 setAutoplayEventPlaybackState(AutoplayEventPlaybackState::PreventedAutoplay);
Note: See TracChangeset
for help on using the changeset viewer.