Changeset 182081 in webkit


Ignore:
Timestamp:
Mar 27, 2015 2:32:38 PM (9 years ago)
Author:
jer.noble@apple.com
Message:

[Mac] Safari fails to fire page "load" event with video[preload=none]
https://bugs.webkit.org/show_bug.cgi?id=143147

Reviewed by Simon Fraser.

Source/WebCore:

Test: media/video-page-load-preload-none.html

When told to load() when preload == None, set the networkState to Idle.
This causes HTMLMediaElement to set the shouldDelayLoadEvent flag to
false, and allows the page's 'load' event to fire.

Drive-by fix: add setNetworkState() and setReadyState() methods to
MediaPlayerPrivateAVFoundation, reducing a bunch of code duplication.

  • platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp:

(WebCore::MediaPlayerPrivateAVFoundation::load):
(WebCore::MediaPlayerPrivateAVFoundation::setNetworkState):
(WebCore::MediaPlayerPrivateAVFoundation::setReadyState):
(WebCore::MediaPlayerPrivateAVFoundation::updateStates):

  • platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h:

LayoutTests:

  • media/video-page-load-preload-none-expected.txt: Added.
  • media/video-page-load-preload-none.html: Added.
Location:
trunk
Files:
2 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r182075 r182081  
     12015-03-27  Jer Noble  <jer.noble@apple.com>
     2
     3        [Mac] Safari fails to fire page "load" event with video[preload=none]
     4        https://bugs.webkit.org/show_bug.cgi?id=143147
     5
     6        Reviewed by Simon Fraser.
     7
     8        * media/video-page-load-preload-none-expected.txt: Added.
     9        * media/video-page-load-preload-none.html: Added.
     10
    1112015-03-27  Brent Fulgham  <bfulgham@apple.com>
    212
  • trunk/Source/WebCore/ChangeLog

    r182077 r182081  
     12015-03-27  Jer Noble  <jer.noble@apple.com>
     2
     3        [Mac] Safari fails to fire page "load" event with video[preload=none]
     4        https://bugs.webkit.org/show_bug.cgi?id=143147
     5
     6        Reviewed by Simon Fraser.
     7
     8        Test: media/video-page-load-preload-none.html
     9
     10        When told to load() when preload == None, set the networkState to Idle.
     11        This causes HTMLMediaElement to set the shouldDelayLoadEvent flag to
     12        false, and allows the page's 'load' event to fire.
     13
     14        Drive-by fix: add setNetworkState() and setReadyState() methods to
     15        MediaPlayerPrivateAVFoundation, reducing a bunch of code duplication.
     16
     17        * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp:
     18        (WebCore::MediaPlayerPrivateAVFoundation::load):
     19        (WebCore::MediaPlayerPrivateAVFoundation::setNetworkState):
     20        (WebCore::MediaPlayerPrivateAVFoundation::setReadyState):
     21        (WebCore::MediaPlayerPrivateAVFoundation::updateStates):
     22        * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h:
     23
    1242015-03-27  Alexey Proskuryakov  <ap@apple.com>
    225
  • trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp

    r180839 r182081  
    168168    LOG(Media, "MediaPlayerPrivateAVFoundation::load(%p)", this);
    169169
    170     if (m_networkState != MediaPlayer::Loading) {
    171         m_networkState = MediaPlayer::Loading;
    172         m_player->networkStateChanged();
    173     }
    174     if (m_readyState != MediaPlayer::HaveNothing) {
    175         m_readyState = MediaPlayer::HaveNothing;
    176         m_player->readyStateChanged();
    177     }
     170    setNetworkState(m_preload == MediaPlayer::None ? MediaPlayer::Idle : MediaPlayer::Loading);
     171    setReadyState(MediaPlayer::HaveNothing);
    178172
    179173    m_assetURL = url;
     
    189183void MediaPlayerPrivateAVFoundation::load(const String&, MediaSourcePrivateClient*)
    190184{
    191     m_networkState = MediaPlayer::FormatError;
    192     m_player->networkStateChanged();
     185    setNetworkState(MediaPlayer::FormatError);
    193186}
    194187#endif
     
    357350}
    358351
     352void MediaPlayerPrivateAVFoundation::setNetworkState(MediaPlayer::NetworkState state)
     353{
     354    if (state == m_networkState)
     355        return;
     356
     357    m_networkState = state;
     358    m_player->networkStateChanged();
     359}
     360
     361void MediaPlayerPrivateAVFoundation::setReadyState(MediaPlayer::ReadyState state)
     362{
     363    if (state == m_readyState)
     364        return;
     365
     366    m_readyState = state;
     367    m_player->readyStateChanged();
     368}
     369
    359370void MediaPlayerPrivateAVFoundation::characteristicsChanged()
    360371{
     
    479490        return;
    480491
    481     MediaPlayer::NetworkState oldNetworkState = m_networkState;
    482     MediaPlayer::ReadyState oldReadyState = m_readyState;
     492    MediaPlayer::NetworkState newNetworkState = m_networkState;
     493    MediaPlayer::ReadyState newReadyState = m_readyState;
    483494
    484495    if (m_loadingMetadata)
    485         m_networkState = MediaPlayer::Loading;
     496        newNetworkState = MediaPlayer::Loading;
    486497    else {
    487498        // -loadValuesAsynchronouslyForKeys:completionHandler: has invoked its handler; test status of keys and determine state.
     
    493504            if (m_assetIsPlayable) {
    494505                if (assetStatus >= MediaPlayerAVAssetStatusLoaded)
    495                     m_readyState = MediaPlayer::HaveMetadata;
     506                    newReadyState = MediaPlayer::HaveMetadata;
    496507                if (itemStatus <= MediaPlayerAVPlayerItemStatusUnknown) {
    497508                    if (assetStatus == MediaPlayerAVAssetStatusFailed || m_preload > MediaPlayer::MetaData || isLiveStream()) {
    498509                        // The asset is playable but doesn't support inspection prior to playback (eg. streaming files),
    499510                        // or we are supposed to prepare for playback immediately, so create the player item now.
    500                         m_networkState = MediaPlayer::Loading;
     511                        newNetworkState = MediaPlayer::Loading;
    501512                        prepareToPlay();
    502513                    } else
    503                         m_networkState = MediaPlayer::Idle;
     514                        newNetworkState = MediaPlayer::Idle;
    504515                }
    505516            } else {
    506517                // FIX ME: fetch the error associated with the @"playable" key to distinguish between format
    507518                // and network errors.
    508                 m_networkState = MediaPlayer::FormatError;
     519                newNetworkState = MediaPlayer::FormatError;
    509520            }
    510521        }
     
    522533                // progress to LikelyToKeepUp. Set the readyState to  HAVE_ENOUGH_DATA, on the
    523534                // presumption that if the playback buffer is full, playback will probably not stall.
    524                 m_readyState = MediaPlayer::HaveEnoughData;
     535                newReadyState = MediaPlayer::HaveEnoughData;
    525536                break;
    526537
    527538            case MediaPlayerAVPlayerItemStatusReadyToPlay:
    528539                if (m_readyState != MediaPlayer::HaveEnoughData && maxTimeLoaded() > currentMediaTime())
    529                     m_readyState = MediaPlayer::HaveFutureData;
     540                    newReadyState = MediaPlayer::HaveFutureData;
    530541                break;
    531542
    532543            case MediaPlayerAVPlayerItemStatusPlaybackBufferEmpty:
    533                 m_readyState = MediaPlayer::HaveCurrentData;
     544                newReadyState = MediaPlayer::HaveCurrentData;
    534545                break;
    535546            }
    536547
    537548            if (itemStatus == MediaPlayerAVPlayerItemStatusPlaybackBufferFull)
    538                 m_networkState = MediaPlayer::Idle;
     549                newNetworkState = MediaPlayer::Idle;
    539550            else if (itemStatus == MediaPlayerAVPlayerItemStatusFailed)
    540                 m_networkState = MediaPlayer::DecodeError;
     551                newNetworkState = MediaPlayer::DecodeError;
    541552            else if (itemStatus != MediaPlayerAVPlayerItemStatusPlaybackBufferFull && itemStatus >= MediaPlayerAVPlayerItemStatusReadyToPlay)
    542                 m_networkState = (maxTimeLoaded() == durationMediaTime()) ? MediaPlayer::Loaded : MediaPlayer::Loading;
     553                newNetworkState = (maxTimeLoaded() == durationMediaTime()) ? MediaPlayer::Loaded : MediaPlayer::Loading;
    543554        }
    544555    }
     
    549560    if (!m_haveReportedFirstVideoFrame && m_cachedHasVideo && hasAvailableVideoFrame()) {
    550561        if (m_readyState < MediaPlayer::HaveCurrentData)
    551             m_readyState = MediaPlayer::HaveCurrentData;
     562            newReadyState = MediaPlayer::HaveCurrentData;
    552563        m_haveReportedFirstVideoFrame = true;
    553564        m_player->firstVideoFrameAvailable();
    554565    }
    555566
    556     if (m_networkState != oldNetworkState)
    557         m_player->networkStateChanged();
    558 
    559     if (m_readyState != oldReadyState)
    560         m_player->readyStateChanged();
     567#if !LOG_DISABLED
     568    if (m_networkState != newNetworkState || m_readyState != newReadyState) {
     569        LOG(Media, "MediaPlayerPrivateAVFoundation::updateStates(%p) - entered with networkState = %i, readyState = %i,  exiting with networkState = %i, readyState = %i",
     570            this, static_cast<int>(m_networkState), static_cast<int>(m_readyState), static_cast<int>(newNetworkState), static_cast<int>(newReadyState));
     571    }
     572#endif
     573
     574    setNetworkState(newNetworkState);
     575    setReadyState(newReadyState);
    561576
    562577    if (m_playWhenFramesAvailable && hasAvailableVideoFrame()) {
     
    564579        platformPlay();
    565580    }
    566 
    567 #if !LOG_DISABLED
    568     if (m_networkState != oldNetworkState || oldReadyState != m_readyState) {
    569         LOG(Media, "MediaPlayerPrivateAVFoundation::updateStates(%p) - entered with networkState = %i, readyState = %i,  exiting with networkState = %i, readyState = %i",
    570             this, static_cast<int>(oldNetworkState), static_cast<int>(oldReadyState), static_cast<int>(m_networkState), static_cast<int>(m_readyState));
    571     }
    572 #endif
    573581}
    574582
  • trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h

    r181153 r182081  
    271271    void setNaturalSize(FloatSize);
    272272    bool isLiveStream() const { return std::isinf(duration()); }
     273    void setNetworkState(MediaPlayer::NetworkState);
     274    void setReadyState(MediaPlayer::ReadyState);
    273275
    274276    enum MediaRenderingMode { MediaRenderingNone, MediaRenderingToContext, MediaRenderingToLayer };
Note: See TracChangeset for help on using the changeset viewer.