⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 278746 in webkit


Ignore:
Timestamp:
Jun 10, 2021, 6:02:06 PM (5 years ago)
Author:
Chris Dumez
Message:

REGRESSION: (r278544) [ Mac-wk1 ] media/media-continues-playing-after-replace-source.html is a flaky failure
​https://bugs.webkit.org/show_bug.cgi?id=226899
<rdar://problem/79160701>

Reviewed by Ryosuke Niwa.

Have MediaPlayerPrivateAVFoundationObjC schedule tasks on the HTML event loop instead of simply using
callOnMainThread() to address flakiness issues, since the rest of the media code uses the HTML event
loop.

  • html/HTMLMediaElement.cpp:

(WebCore::HTMLMediaElement::mediaPlayerQueueTaskOnEventLoop):

  • html/HTMLMediaElement.h:
  • platform/graphics/MediaPlayer.cpp:

(WebCore::MediaPlayer::queueTaskOnEventLoop):

  • platform/graphics/MediaPlayer.h:

(WebCore::MediaPlayerClient::mediaPlayerQueueTaskOnEventLoop):

  • platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp:

(WebCore::MediaPlayerPrivateAVFoundation::queueTaskOnEventLoop):

  • platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h:
  • platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:

(-[WebCoreAVFMovieObserver metadataLoaded]):
(-[WebCoreAVFMovieObserver didEnd:]):
(-[WebCoreAVFMovieObserver observeValueForKeyPath:ofObject:change:context:]):
(-[WebCoreAVFMovieObserver legibleOutput:didOutputAttributedStrings:nativeSampleBuffers:forItemTime:]):
(-[WebCoreAVFMovieObserver outputSequenceWasFlushed:]):
(-[WebCoreAVFMovieObserver metadataOutput:didOutputTimedMetadataGroups:fromPlayerItemTrack:]):
(-[WebCoreAVFMovieObserver metadataCollector:didCollectDateRangeMetadataGroups:indexesOfNewGroups:indexesOfModifiedGroups:]):
(-[WebCoreAVFLoaderDelegate resourceLoader:shouldWaitForLoadingOfRequestedResource:]):
(-[WebCoreAVFLoaderDelegate resourceLoader:didCancelLoadingRequest:]):

Location:
trunk/Source/WebCore
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r278738 r278746  
     12021-06-10  Chris Dumez  <cdumez@apple.com>
     2
     3        REGRESSION: (r278544) [ Mac-wk1 ] media/media-continues-playing-after-replace-source.html is a flaky failure
     4        https://bugs.webkit.org/show_bug.cgi?id=226899
     5        <rdar://problem/79160701>
     6
     7        Reviewed by Ryosuke Niwa.
     8
     9        Have MediaPlayerPrivateAVFoundationObjC schedule tasks on the HTML event loop instead of simply using
     10        callOnMainThread() to address flakiness issues, since the rest of the media code uses the HTML event
     11        loop.
     12
     13        * html/HTMLMediaElement.cpp:
     14        (WebCore::HTMLMediaElement::mediaPlayerQueueTaskOnEventLoop):
     15        * html/HTMLMediaElement.h:
     16        * platform/graphics/MediaPlayer.cpp:
     17        (WebCore::MediaPlayer::queueTaskOnEventLoop):
     18        * platform/graphics/MediaPlayer.h:
     19        (WebCore::MediaPlayerClient::mediaPlayerQueueTaskOnEventLoop):
     20        * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp:
     21        (WebCore::MediaPlayerPrivateAVFoundation::queueTaskOnEventLoop):
     22        * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h:
     23        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
     24        (-[WebCoreAVFMovieObserver metadataLoaded]):
     25        (-[WebCoreAVFMovieObserver didEnd:]):
     26        (-[WebCoreAVFMovieObserver observeValueForKeyPath:ofObject:change:context:]):
     27        (-[WebCoreAVFMovieObserver legibleOutput:didOutputAttributedStrings:nativeSampleBuffers:forItemTime:]):
     28        (-[WebCoreAVFMovieObserver outputSequenceWasFlushed:]):
     29        (-[WebCoreAVFMovieObserver metadataOutput:didOutputTimedMetadataGroups:fromPlayerItemTrack:]):
     30        (-[WebCoreAVFMovieObserver metadataCollector:didCollectDateRangeMetadataGroups:indexesOfNewGroups:indexesOfModifiedGroups:]):
     31        (-[WebCoreAVFLoaderDelegate resourceLoader:shouldWaitForLoadingOfRequestedResource:]):
     32        (-[WebCoreAVFLoaderDelegate resourceLoader:didCancelLoadingRequest:]):
     33
    1342021-06-10  Alex Christensen  <achristensen@webkit.org>
    235
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r278646 r278746  
    81398139}
    81408140
     8141void HTMLMediaElement::mediaPlayerQueueTaskOnEventLoop(Function<void()>&& task)
     8142{
     8143    document().eventLoop().queueTask(TaskSource::MediaElement, WTFMove(task));
     8144}
     8145
    81418146template<typename T> void HTMLMediaElement::scheduleEventOn(T& target, Ref<Event>&& event)
    81428147{
  • trunk/Source/WebCore/html/HTMLMediaElement.h

    r278645 r278746  
    668668    void mediaPlayerDidInitializeMediaEngine() final;
    669669    void mediaPlayerReloadAndResumePlaybackIfNeeded() final;
     670    void mediaPlayerQueueTaskOnEventLoop(Function<void()>&&) final;
    670671
    671672    void scheduleMediaEngineWasUpdated();
  • trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp

    r278646 r278746  
    606606}
    607607
     608void MediaPlayer::queueTaskOnEventLoop(Function<void()>&& task)
     609{
     610    ASSERT(isMainThread());
     611    client().mediaPlayerQueueTaskOnEventLoop(WTFMove(task));
     612}
     613
    608614bool MediaPlayer::hasAvailableVideoFrame() const
    609615{
  • trunk/Source/WebCore/platform/graphics/MediaPlayer.h

    r278646 r278746  
    285285    virtual String audioOutputDeviceIdOverride() const { return { }; }
    286286
     287    virtual void mediaPlayerQueueTaskOnEventLoop(Function<void()>&& task) { callOnMainThread(WTFMove(task)); }
     288
    287289#if !RELEASE_LOG_DISABLED
    288290    virtual const void* mediaPlayerLogIdentifier() { return nullptr; }
    … …  
    387389    bool shouldContinueAfterKeyNeeded() const { return m_shouldContinueAfterKeyNeeded; }
    388390#endif
     391
     392    void queueTaskOnEventLoop(Function<void()>&&);
    389393
    390394    bool paused() const;
  • trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp

    r277805 r278746  
    10531053}
    10541054
     1055void MediaPlayerPrivateAVFoundation::queueTaskOnEventLoop(Function<void()>&& task)
     1056{
     1057    ASSERT(isMainThread());
     1058    if (m_player)
     1059        m_player->queueTaskOnEventLoop(WTFMove(task));
     1060}
     1061
    10551062#if !RELEASE_LOG_DISABLED
    10561063WTFLogChannel& MediaPlayerPrivateAVFoundation::logChannel() const
  • trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h

    r277958 r278746  
    6565    void playbackTargetIsWirelessChanged();
    6666#endif
     67
     68    void queueTaskOnEventLoop(Function<void()>&&);
    6769   
    6870    class Notification {
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm

    r278580 r278746  
    35793579{
    35803580    ensureOnMainThread([self, strongSelf = retainPtr(self)] {
    3581         callOnMainThread([player = m_player] {
     3581        if (!m_player)
     3582            return;
     3583
     3584        m_player->queueTaskOnEventLoop([player = m_player] {
    35823585            if (player)
    35833586                player->metadataLoaded();
    … …  
    35903593    UNUSED_PARAM(unusedNotification);
    35913594    ensureOnMainThread([self, strongSelf = retainPtr(self)] {
    3592         callOnMainThread([player = m_player] {
     3595        if (!m_player)
     3596            return;
     3597
     3598        m_player->queueTaskOnEventLoop([player = m_player] {
    35933599            if (player)
    35943600                player->didEnd();
    … …  
    36003606{
    36013607    ensureOnMainThread([self, strongSelf = retainPtr(self), keyPath = retainPtr(keyPath), change = retainPtr(change), object = retainPtr(object), context]() mutable {
    3602         callOnMainThread([player = m_player, keyPath = WTFMove(keyPath), change = WTFMove(change), object = WTFMove(object), context] {
     3608        if (!m_player)
     3609            return;
     3610
     3611        m_player->queueTaskOnEventLoop([player = m_player, keyPath = WTFMove(keyPath), change = WTFMove(change), object = WTFMove(object), context] {
    36033612            if (!player)
    36043613                return;
    … …  
    36993708
    37003709    ensureOnMainThread([self, strongSelf = retainPtr(self), strings = retainPtr(strings), nativeSamples = retainPtr(nativeSamples), itemTime]() mutable {
    3701         callOnMainThread([player = m_player, strings = WTFMove(strings), nativeSamples = WTFMove(nativeSamples), itemTime] {
     3710        if (!m_player)
     3711            return;
     3712
     3713        m_player->queueTaskOnEventLoop([player = m_player, strings = WTFMove(strings), nativeSamples = WTFMove(nativeSamples), itemTime] {
    37023714            if (!player)
    37033715                return;
    … …  
    37163728
    37173729    ensureOnMainThread([self, strongSelf = retainPtr(self)] {
    3718         callOnMainThread([player = m_player] {
     3730        if (!m_player)
     3731            return;
     3732
     3733        m_player->queueTaskOnEventLoop([player = m_player] {
    37193734            if (player)
    37203735                player->flushCues();
    … …  
    37323747        return;
    37333748
    3734     callOnMainThread([player = m_player, metadataGroups = retainPtr(metadataGroups), currentTime = m_player->currentMediaTime()] {
     3749    m_player->queueTaskOnEventLoop([player = m_player, metadataGroups = retainPtr(metadataGroups), currentTime = m_player->currentMediaTime()] {
    37353750        if (!player)
    37363751            return;
    … …  
    37533768        return;
    37543769
    3755     callOnMainThread([player = m_player, metadataGroups = retainPtr(metadataGroups), currentTime = m_player->currentMediaTime()] {
     3770    m_player->queueTaskOnEventLoop([player = m_player, metadataGroups = retainPtr(metadataGroups), currentTime = m_player->currentMediaTime()] {
    37563771        if (!player)
    37573772            return;
    … …  
    37803795
    37813796    ensureOnMainThread([self, strongSelf = retainPtr(self), loadingRequest = retainPtr(loadingRequest)]() mutable {
    3782         callOnMainThread([player = m_player, loadingRequest = WTFMove(loadingRequest)] {
     3797        if (!m_player)
     3798            return;
     3799
     3800        m_player->queueTaskOnEventLoop([player = m_player, loadingRequest = WTFMove(loadingRequest)] {
    37833801            if (!player) {
    37843802                [loadingRequest finishLoadingWithError:nil];
    … …  
    38063824    UNUSED_PARAM(resourceLoader);
    38073825    ensureOnMainThread([self, strongSelf = retainPtr(self), loadingRequest = retainPtr(loadingRequest)]() mutable {
    3808         callOnMainThread([player = m_player, loadingRequest = WTFMove(loadingRequest)] {
     3826        if (!m_player)
     3827            return;
     3828
     3829        m_player->queueTaskOnEventLoop([player = m_player, loadingRequest = WTFMove(loadingRequest)] {
    38093830
    38103831            ScriptDisallowedScope::InMainThread scriptDisallowedScope;
Note: See TracChangeset for help on using the changeset viewer.