Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(119)

Side by Side Diff: Source/core/html/HTMLMediaElement.cpp

Issue 327553002: Transition networkState back to NETWORK_IDLE on fetch if preload=none (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Reset deferred-FSM in prepareForLoad. Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/html/HTMLMediaElement.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved. 2 * Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 , m_networkState(NETWORK_EMPTY) 242 , m_networkState(NETWORK_EMPTY)
243 , m_readyState(HAVE_NOTHING) 243 , m_readyState(HAVE_NOTHING)
244 , m_readyStateMaximum(HAVE_NOTHING) 244 , m_readyStateMaximum(HAVE_NOTHING)
245 , m_volume(1.0f) 245 , m_volume(1.0f)
246 , m_lastSeekTime(0) 246 , m_lastSeekTime(0)
247 , m_previousProgressTime(numeric_limits<double>::max()) 247 , m_previousProgressTime(numeric_limits<double>::max())
248 , m_duration(numeric_limits<double>::quiet_NaN()) 248 , m_duration(numeric_limits<double>::quiet_NaN())
249 , m_lastTimeUpdateEventWallTime(0) 249 , m_lastTimeUpdateEventWallTime(0)
250 , m_lastTimeUpdateEventMovieTime(numeric_limits<double>::max()) 250 , m_lastTimeUpdateEventMovieTime(numeric_limits<double>::max())
251 , m_loadState(WaitingForSource) 251 , m_loadState(WaitingForSource)
252 , m_deferredLoadState(NotDeferred)
253 , m_deferredLoadTimer(this, &HTMLMediaElement::deferredLoadTimerFired)
252 , m_webLayer(0) 254 , m_webLayer(0)
253 , m_preload(MediaPlayer::Auto) 255 , m_preload(MediaPlayer::Auto)
254 , m_displayMode(Unknown) 256 , m_displayMode(Unknown)
255 , m_cachedTime(MediaPlayer::invalidTime()) 257 , m_cachedTime(MediaPlayer::invalidTime())
256 , m_cachedTimeWallClockUpdateTime(0) 258 , m_cachedTimeWallClockUpdateTime(0)
257 , m_minimumWallClockTimeToCacheMediaTime(0) 259 , m_minimumWallClockTimeToCacheMediaTime(0)
258 , m_fragmentStartTime(MediaPlayer::invalidTime()) 260 , m_fragmentStartTime(MediaPlayer::invalidTime())
259 , m_fragmentEndTime(MediaPlayer::invalidTime()) 261 , m_fragmentEndTime(MediaPlayer::invalidTime())
260 , m_pendingActionFlags(0) 262 , m_pendingActionFlags(0)
261 , m_userGestureRequiredForPlay(false) 263 , m_userGestureRequiredForPlay(false)
262 , m_playing(false) 264 , m_playing(false)
263 , m_shouldDelayLoadEvent(false) 265 , m_shouldDelayLoadEvent(false)
264 , m_haveFiredLoadedData(false) 266 , m_haveFiredLoadedData(false)
265 , m_active(true) 267 , m_active(true)
266 , m_autoplaying(true) 268 , m_autoplaying(true)
267 , m_muted(false) 269 , m_muted(false)
268 , m_paused(true) 270 , m_paused(true)
269 , m_seeking(false) 271 , m_seeking(false)
270 , m_sentStalledEvent(false) 272 , m_sentStalledEvent(false)
271 , m_sentEndEvent(false) 273 , m_sentEndEvent(false)
272 , m_pausedInternal(false) 274 , m_pausedInternal(false)
273 , m_closedCaptionsVisible(false) 275 , m_closedCaptionsVisible(false)
274 , m_completelyLoaded(false) 276 , m_completelyLoaded(false)
275 , m_havePreparedToPlay(false) 277 , m_havePreparedToPlay(false)
276 , m_delayingLoadForPreloadNone(false)
277 , m_tracksAreReady(true) 278 , m_tracksAreReady(true)
278 , m_haveVisibleTextTrack(false) 279 , m_haveVisibleTextTrack(false)
279 , m_processingPreferenceChange(false) 280 , m_processingPreferenceChange(false)
280 #if ENABLE(OILPAN) 281 #if ENABLE(OILPAN)
281 , m_isFinalizing(false) 282 , m_isFinalizing(false)
282 #endif 283 #endif
283 , m_lastTextTrackUpdateTime(-1) 284 , m_lastTextTrackUpdateTime(-1)
284 , m_textTracks(nullptr) 285 , m_textTracks(nullptr)
285 , m_ignoreTrackDisplayUpdate(0) 286 , m_ignoreTrackDisplayUpdate(0)
286 #if ENABLE(WEB_AUDIO) 287 #if ENABLE(WEB_AUDIO)
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after
629 prepareToPlay(); 630 prepareToPlay();
630 } 631 }
631 632
632 void HTMLMediaElement::prepareForLoad() 633 void HTMLMediaElement::prepareForLoad()
633 { 634 {
634 WTF_LOG(Media, "HTMLMediaElement::prepareForLoad"); 635 WTF_LOG(Media, "HTMLMediaElement::prepareForLoad");
635 636
636 // Perform the cleanup required for the resource load algorithm to run. 637 // Perform the cleanup required for the resource load algorithm to run.
637 stopPeriodicTimers(); 638 stopPeriodicTimers();
638 m_loadTimer.stop(); 639 m_loadTimer.stop();
640 cancelDeferredLoad();
639 // FIXME: Figure out appropriate place to reset LoadTextTrackResource if nec essary and set m_pendingActionFlags to 0 here. 641 // FIXME: Figure out appropriate place to reset LoadTextTrackResource if nec essary and set m_pendingActionFlags to 0 here.
640 m_pendingActionFlags &= ~LoadMediaResource; 642 m_pendingActionFlags &= ~LoadMediaResource;
641 m_sentEndEvent = false; 643 m_sentEndEvent = false;
642 m_sentStalledEvent = false; 644 m_sentStalledEvent = false;
643 m_haveFiredLoadedData = false; 645 m_haveFiredLoadedData = false;
644 m_completelyLoaded = false; 646 m_completelyLoaded = false;
645 m_havePreparedToPlay = false; 647 m_havePreparedToPlay = false;
646 m_displayMode = Unknown; 648 m_displayMode = Unknown;
647 649
648 // 1 - Abort any already-running instance of the resource selection algorith m for this element. 650 // 1 - Abort any already-running instance of the resource selection algorith m for this element.
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
884 } 886 }
885 } 887 }
886 } 888 }
887 } 889 }
888 890
889 if (attemptLoad && canLoadURL(url, contentType, keySystem)) { 891 if (attemptLoad && canLoadURL(url, contentType, keySystem)) {
890 ASSERT(!webMediaPlayer()); 892 ASSERT(!webMediaPlayer());
891 893
892 if (!m_havePreparedToPlay && !autoplay() && m_preload == MediaPlayer::No ne) { 894 if (!m_havePreparedToPlay && !autoplay() && m_preload == MediaPlayer::No ne) {
893 WTF_LOG(Media, "HTMLMediaElement::loadResource : Delaying load becau se preload == 'none'"); 895 WTF_LOG(Media, "HTMLMediaElement::loadResource : Delaying load becau se preload == 'none'");
894 m_delayingLoadForPreloadNone = true; 896 deferredLoad();
acolwell GONE FROM CHROMIUM 2014/06/13 18:54:51 nit: s/deferredLoad/deferLoad/ ? That implies that
fs 2014/06/16 10:39:53 Renamed as suggested.
895 } else { 897 } else {
896 startPlayerLoad(); 898 startPlayerLoad();
897 } 899 }
898 } else { 900 } else {
899 mediaLoadingFailed(MediaPlayer::FormatError); 901 mediaLoadingFailed(MediaPlayer::FormatError);
900 } 902 }
901 903
902 // If there is no poster to display, allow the media engine to render video frames as soon as 904 // If there is no poster to display, allow the media engine to render video frames as soon as
903 // they are available. 905 // they are available.
904 updateDisplayState(); 906 updateDisplayState();
(...skipping 23 matching lines...) Expand all
928 if (!requestURL.pass().isEmpty()) 930 if (!requestURL.pass().isEmpty())
929 requestURL.setPass(String()); 931 requestURL.setPass(String());
930 932
931 m_player->load(loadType(), requestURL, corsMode()); 933 m_player->load(loadType(), requestURL, corsMode());
932 } 934 }
933 935
934 void HTMLMediaElement::setPlayerPreload() 936 void HTMLMediaElement::setPlayerPreload()
935 { 937 {
936 m_player->setPreload(m_preload); 938 m_player->setPreload(m_preload);
937 939
938 if (m_delayingLoadForPreloadNone && m_preload != MediaPlayer::None) 940 if (loadIsDeferred() && m_preload != MediaPlayer::None)
939 startDelayedLoad(); 941 startDeferredLoad();
940 } 942 }
941 943
942 void HTMLMediaElement::startDelayedLoad() 944 bool HTMLMediaElement::loadIsDeferred() const
943 { 945 {
944 ASSERT(m_delayingLoadForPreloadNone); 946 return m_deferredLoadState != NotDeferred;
947 }
945 948
946 m_delayingLoadForPreloadNone = false; 949 void HTMLMediaElement::deferredLoad()
950 {
951 // This implements the "optional" step 3 from the resource fetch algorithm.
952 ASSERT(!m_deferredLoadTimer.isActive());
953 ASSERT(m_deferredLoadState == NotDeferred);
954 // 1. Set the networkState to NETWORK_IDLE.
955 // 2. Queue a task to fire a simple event named suspend at the element.
956 changeNetworkStateFromLoadingToIdle();
957 // 3. Queue a task to set the element's delaying-the-load-event
958 // flag to false. This stops delaying the load event.
959 m_deferredLoadTimer.startOneShot(0, FROM_HERE);
960 // 4. Wait for the task to be run.
961 m_deferredLoadState = WaitingForStopDelayingLoadEventTask;
962 // Continued in executeDeferredLoad().
963 }
964
965 void HTMLMediaElement::cancelDeferredLoad()
966 {
967 m_deferredLoadTimer.stop();
968 m_deferredLoadState = NotDeferred;
969 }
970
971 void HTMLMediaElement::executeDeferredLoad()
972 {
973 ASSERT(m_deferredLoadState >= WaitingForTrigger);
974
975 // resource fetch algorithm step 3 - continued from deferredLoad().
976
977 // 5. Wait for an implementation-defined event (e.g. the user requesting tha t the media element begin playback).
978 // This is assumed to be whatever 'event' ended up calling this method.
979 cancelDeferredLoad();
980 // 6. Set the element's delaying-the-load-event flag back to true (this
981 // delays the load event again, in case it hasn't been fired yet).
982 setShouldDelayLoadEvent(true);
983 // 7. Set the networkState to NETWORK_LOADING.
984 m_networkState = NETWORK_LOADING;
985
986 startProgressEventTimer();
947 987
948 startPlayerLoad(); 988 startPlayerLoad();
949 } 989 }
950 990
991 void HTMLMediaElement::startDeferredLoad()
992 {
993 if (m_deferredLoadState == WaitingForTrigger) {
994 executeDeferredLoad();
995 return;
996 }
997 ASSERT(m_deferredLoadState == WaitingForStopDelayingLoadEventTask);
998 m_deferredLoadState = ExecuteOnStopDelayingLoadEventTask;
999 }
1000
1001 void HTMLMediaElement::deferredLoadTimerFired(Timer<HTMLMediaElement>*)
1002 {
1003 setShouldDelayLoadEvent(false);
1004
1005 if (m_deferredLoadState == ExecuteOnStopDelayingLoadEventTask) {
1006 executeDeferredLoad();
1007 return;
1008 }
1009 ASSERT(m_deferredLoadState == WaitingForStopDelayingLoadEventTask);
1010 m_deferredLoadState = WaitingForTrigger;
1011 }
1012
951 WebMediaPlayer::LoadType HTMLMediaElement::loadType() const 1013 WebMediaPlayer::LoadType HTMLMediaElement::loadType() const
952 { 1014 {
953 if (m_mediaSource) 1015 if (m_mediaSource)
954 return WebMediaPlayer::LoadTypeMediaSource; 1016 return WebMediaPlayer::LoadTypeMediaSource;
955 1017
956 if (isMediaStreamURL(m_currentSrc.string())) 1018 if (isMediaStreamURL(m_currentSrc.string()))
957 return WebMediaPlayer::LoadTypeMediaStream; 1019 return WebMediaPlayer::LoadTypeMediaStream;
958 1020
959 return WebMediaPlayer::LoadTypeURL; 1021 return WebMediaPlayer::LoadTypeURL;
960 } 1022 }
(...skipping 609 matching lines...) Expand 10 before | Expand all | Expand 10 after
1570 1632
1571 if (state == MediaPlayer::Loaded) { 1633 if (state == MediaPlayer::Loaded) {
1572 if (m_networkState != NETWORK_IDLE) 1634 if (m_networkState != NETWORK_IDLE)
1573 changeNetworkStateFromLoadingToIdle(); 1635 changeNetworkStateFromLoadingToIdle();
1574 m_completelyLoaded = true; 1636 m_completelyLoaded = true;
1575 } 1637 }
1576 } 1638 }
1577 1639
1578 void HTMLMediaElement::changeNetworkStateFromLoadingToIdle() 1640 void HTMLMediaElement::changeNetworkStateFromLoadingToIdle()
1579 { 1641 {
1642 ASSERT(m_player);
1580 m_progressEventTimer.stop(); 1643 m_progressEventTimer.stop();
1581 1644
1582 // Schedule one last progress event so we guarantee that at least one is fir ed 1645 // Schedule one last progress event so we guarantee that at least one is fir ed
1583 // for files that load very quickly. 1646 // for files that load very quickly.
1584 scheduleEvent(EventTypeNames::progress); 1647 if (m_player->didLoadingProgress())
1648 scheduleEvent(EventTypeNames::progress);
1585 scheduleEvent(EventTypeNames::suspend); 1649 scheduleEvent(EventTypeNames::suspend);
1586 m_networkState = NETWORK_IDLE; 1650 m_networkState = NETWORK_IDLE;
1587 } 1651 }
1588 1652
1589 void HTMLMediaElement::mediaPlayerReadyStateChanged() 1653 void HTMLMediaElement::mediaPlayerReadyStateChanged()
1590 { 1654 {
1591 setReadyState(static_cast<ReadyState>(webMediaPlayer()->readyState())); 1655 setReadyState(static_cast<ReadyState>(webMediaPlayer()->readyState()));
1592 } 1656 }
1593 1657
1594 void HTMLMediaElement::setReadyState(ReadyState state) 1658 void HTMLMediaElement::setReadyState(ReadyState state)
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
1738 return m_player ? m_player->supportsSave() : false; 1802 return m_player ? m_player->supportsSave() : false;
1739 } 1803 }
1740 1804
1741 void HTMLMediaElement::prepareToPlay() 1805 void HTMLMediaElement::prepareToPlay()
1742 { 1806 {
1743 WTF_LOG(Media, "HTMLMediaElement::prepareToPlay(%p)", this); 1807 WTF_LOG(Media, "HTMLMediaElement::prepareToPlay(%p)", this);
1744 if (m_havePreparedToPlay) 1808 if (m_havePreparedToPlay)
1745 return; 1809 return;
1746 m_havePreparedToPlay = true; 1810 m_havePreparedToPlay = true;
1747 1811
1748 if (m_delayingLoadForPreloadNone) 1812 if (loadIsDeferred())
1749 startDelayedLoad(); 1813 startDeferredLoad();
1750 } 1814 }
1751 1815
1752 void HTMLMediaElement::seek(double time, ExceptionState& exceptionState) 1816 void HTMLMediaElement::seek(double time, ExceptionState& exceptionState)
1753 { 1817 {
1754 WTF_LOG(Media, "HTMLMediaElement::seek(%f)", time); 1818 WTF_LOG(Media, "HTMLMediaElement::seek(%f)", time);
1755 1819
1756 // 4.8.10.9 Seeking 1820 // 4.8.10.9 Seeking
1757 1821
1758 // 1 - If the media element's readyState is HAVE_NOTHING, then raise an Inva lidStateError exception. 1822 // 1 - If the media element's readyState is HAVE_NOTHING, then raise an Inva lidStateError exception.
1759 if (m_readyState == HAVE_NOTHING || !m_player) { 1823 if (m_readyState == HAVE_NOTHING || !m_player) {
(...skipping 1376 matching lines...) Expand 10 before | Expand all | Expand 10 after
3136 m_audioSourceNode->unlock(); 3200 m_audioSourceNode->unlock();
3137 #endif 3201 #endif
3138 } 3202 }
3139 3203
3140 void HTMLMediaElement::clearMediaPlayer(int flags) 3204 void HTMLMediaElement::clearMediaPlayer(int flags)
3141 { 3205 {
3142 forgetResourceSpecificTracks(); 3206 forgetResourceSpecificTracks();
3143 3207
3144 closeMediaSource(); 3208 closeMediaSource();
3145 3209
3146 m_delayingLoadForPreloadNone = false; 3210 cancelDeferredLoad();
3147 3211
3148 clearMediaPlayerAndAudioSourceProviderClient(); 3212 clearMediaPlayerAndAudioSourceProviderClient();
3149 3213
3150 stopPeriodicTimers(); 3214 stopPeriodicTimers();
3151 m_loadTimer.stop(); 3215 m_loadTimer.stop();
3152 3216
3153 m_pendingActionFlags &= ~flags; 3217 m_pendingActionFlags &= ~flags;
3154 m_loadState = WaitingForSource; 3218 m_loadState = WaitingForSource;
3155 3219
3156 if (m_textTracks) 3220 if (m_textTracks)
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after
3654 visitor->trace(m_error); 3718 visitor->trace(m_error);
3655 visitor->trace(m_currentSourceNode); 3719 visitor->trace(m_currentSourceNode);
3656 visitor->trace(m_nextChildNodeToConsider); 3720 visitor->trace(m_nextChildNodeToConsider);
3657 visitor->trace(m_textTracks); 3721 visitor->trace(m_textTracks);
3658 visitor->trace(m_textTracksWhenResourceSelectionBegan); 3722 visitor->trace(m_textTracksWhenResourceSelectionBegan);
3659 WillBeHeapSupplementable<HTMLMediaElement>::trace(visitor); 3723 WillBeHeapSupplementable<HTMLMediaElement>::trace(visitor);
3660 HTMLElement::trace(visitor); 3724 HTMLElement::trace(visitor);
3661 } 3725 }
3662 3726
3663 } 3727 }
OLDNEW
« no previous file with comments | « Source/core/html/HTMLMediaElement.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698