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

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: deferredLoad -> deferLoad. 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 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 , m_networkState(NETWORK_EMPTY) 240 , m_networkState(NETWORK_EMPTY)
241 , m_readyState(HAVE_NOTHING) 241 , m_readyState(HAVE_NOTHING)
242 , m_readyStateMaximum(HAVE_NOTHING) 242 , m_readyStateMaximum(HAVE_NOTHING)
243 , m_volume(1.0f) 243 , m_volume(1.0f)
244 , m_lastSeekTime(0) 244 , m_lastSeekTime(0)
245 , m_previousProgressTime(std::numeric_limits<double>::max()) 245 , m_previousProgressTime(std::numeric_limits<double>::max())
246 , m_duration(std::numeric_limits<double>::quiet_NaN()) 246 , m_duration(std::numeric_limits<double>::quiet_NaN())
247 , m_lastTimeUpdateEventWallTime(0) 247 , m_lastTimeUpdateEventWallTime(0)
248 , m_lastTimeUpdateEventMovieTime(std::numeric_limits<double>::max()) 248 , m_lastTimeUpdateEventMovieTime(std::numeric_limits<double>::max())
249 , m_loadState(WaitingForSource) 249 , m_loadState(WaitingForSource)
250 , m_deferredLoadState(NotDeferred)
251 , m_deferredLoadTimer(this, &HTMLMediaElement::deferredLoadTimerFired)
250 , m_webLayer(0) 252 , m_webLayer(0)
251 , m_preload(MediaPlayer::Auto) 253 , m_preload(MediaPlayer::Auto)
252 , m_displayMode(Unknown) 254 , m_displayMode(Unknown)
253 , m_cachedTime(MediaPlayer::invalidTime()) 255 , m_cachedTime(MediaPlayer::invalidTime())
254 , m_cachedTimeWallClockUpdateTime(0) 256 , m_cachedTimeWallClockUpdateTime(0)
255 , m_minimumWallClockTimeToCacheMediaTime(0) 257 , m_minimumWallClockTimeToCacheMediaTime(0)
256 , m_fragmentStartTime(MediaPlayer::invalidTime()) 258 , m_fragmentStartTime(MediaPlayer::invalidTime())
257 , m_fragmentEndTime(MediaPlayer::invalidTime()) 259 , m_fragmentEndTime(MediaPlayer::invalidTime())
258 , m_pendingActionFlags(0) 260 , m_pendingActionFlags(0)
259 , m_userGestureRequiredForPlay(false) 261 , m_userGestureRequiredForPlay(false)
260 , m_playing(false) 262 , m_playing(false)
261 , m_shouldDelayLoadEvent(false) 263 , m_shouldDelayLoadEvent(false)
262 , m_haveFiredLoadedData(false) 264 , m_haveFiredLoadedData(false)
263 , m_active(true) 265 , m_active(true)
264 , m_autoplaying(true) 266 , m_autoplaying(true)
265 , m_muted(false) 267 , m_muted(false)
266 , m_paused(true) 268 , m_paused(true)
267 , m_seeking(false) 269 , m_seeking(false)
268 , m_sentStalledEvent(false) 270 , m_sentStalledEvent(false)
269 , m_sentEndEvent(false) 271 , m_sentEndEvent(false)
270 , m_pausedInternal(false) 272 , m_pausedInternal(false)
271 , m_closedCaptionsVisible(false) 273 , m_closedCaptionsVisible(false)
272 , m_completelyLoaded(false) 274 , m_completelyLoaded(false)
273 , m_havePreparedToPlay(false) 275 , m_havePreparedToPlay(false)
274 , m_delayingLoadForPreloadNone(false)
275 , m_tracksAreReady(true) 276 , m_tracksAreReady(true)
276 , m_haveVisibleTextTrack(false) 277 , m_haveVisibleTextTrack(false)
277 , m_processingPreferenceChange(false) 278 , m_processingPreferenceChange(false)
278 #if ENABLE(OILPAN) 279 #if ENABLE(OILPAN)
279 , m_isFinalizing(false) 280 , m_isFinalizing(false)
280 #endif 281 #endif
281 , m_lastTextTrackUpdateTime(-1) 282 , m_lastTextTrackUpdateTime(-1)
282 , m_textTracks(nullptr) 283 , m_textTracks(nullptr)
283 , m_ignoreTrackDisplayUpdate(0) 284 , m_ignoreTrackDisplayUpdate(0)
284 #if ENABLE(WEB_AUDIO) 285 #if ENABLE(WEB_AUDIO)
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after
634 prepareToPlay(); 635 prepareToPlay();
635 } 636 }
636 637
637 void HTMLMediaElement::prepareForLoad() 638 void HTMLMediaElement::prepareForLoad()
638 { 639 {
639 WTF_LOG(Media, "HTMLMediaElement::prepareForLoad"); 640 WTF_LOG(Media, "HTMLMediaElement::prepareForLoad");
640 641
641 // Perform the cleanup required for the resource load algorithm to run. 642 // Perform the cleanup required for the resource load algorithm to run.
642 stopPeriodicTimers(); 643 stopPeriodicTimers();
643 m_loadTimer.stop(); 644 m_loadTimer.stop();
645 cancelDeferredLoad();
644 // FIXME: Figure out appropriate place to reset LoadTextTrackResource if nec essary and set m_pendingActionFlags to 0 here. 646 // FIXME: Figure out appropriate place to reset LoadTextTrackResource if nec essary and set m_pendingActionFlags to 0 here.
645 m_pendingActionFlags &= ~LoadMediaResource; 647 m_pendingActionFlags &= ~LoadMediaResource;
646 m_sentEndEvent = false; 648 m_sentEndEvent = false;
647 m_sentStalledEvent = false; 649 m_sentStalledEvent = false;
648 m_haveFiredLoadedData = false; 650 m_haveFiredLoadedData = false;
649 m_completelyLoaded = false; 651 m_completelyLoaded = false;
650 m_havePreparedToPlay = false; 652 m_havePreparedToPlay = false;
651 m_displayMode = Unknown; 653 m_displayMode = Unknown;
652 654
653 // 1 - Abort any already-running instance of the resource selection algorith m for this element. 655 // 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
889 } 891 }
890 } 892 }
891 } 893 }
892 } 894 }
893 895
894 if (attemptLoad && canLoadURL(url, contentType, keySystem)) { 896 if (attemptLoad && canLoadURL(url, contentType, keySystem)) {
895 ASSERT(!webMediaPlayer()); 897 ASSERT(!webMediaPlayer());
896 898
897 if (!m_havePreparedToPlay && !autoplay() && m_preload == MediaPlayer::No ne) { 899 if (!m_havePreparedToPlay && !autoplay() && m_preload == MediaPlayer::No ne) {
898 WTF_LOG(Media, "HTMLMediaElement::loadResource : Delaying load becau se preload == 'none'"); 900 WTF_LOG(Media, "HTMLMediaElement::loadResource : Delaying load becau se preload == 'none'");
899 m_delayingLoadForPreloadNone = true; 901 deferLoad();
900 } else { 902 } else {
901 startPlayerLoad(); 903 startPlayerLoad();
902 } 904 }
903 } else { 905 } else {
904 mediaLoadingFailed(MediaPlayer::FormatError); 906 mediaLoadingFailed(MediaPlayer::FormatError);
905 } 907 }
906 908
907 // If there is no poster to display, allow the media engine to render video frames as soon as 909 // If there is no poster to display, allow the media engine to render video frames as soon as
908 // they are available. 910 // they are available.
909 updateDisplayState(); 911 updateDisplayState();
(...skipping 23 matching lines...) Expand all
933 if (!requestURL.pass().isEmpty()) 935 if (!requestURL.pass().isEmpty())
934 requestURL.setPass(String()); 936 requestURL.setPass(String());
935 937
936 m_player->load(loadType(), requestURL, corsMode()); 938 m_player->load(loadType(), requestURL, corsMode());
937 } 939 }
938 940
939 void HTMLMediaElement::setPlayerPreload() 941 void HTMLMediaElement::setPlayerPreload()
940 { 942 {
941 m_player->setPreload(m_preload); 943 m_player->setPreload(m_preload);
942 944
943 if (m_delayingLoadForPreloadNone && m_preload != MediaPlayer::None) 945 if (loadIsDeferred() && m_preload != MediaPlayer::None)
944 startDelayedLoad(); 946 startDeferredLoad();
945 } 947 }
946 948
947 void HTMLMediaElement::startDelayedLoad() 949 bool HTMLMediaElement::loadIsDeferred() const
948 { 950 {
949 ASSERT(m_delayingLoadForPreloadNone); 951 return m_deferredLoadState != NotDeferred;
952 }
950 953
951 m_delayingLoadForPreloadNone = false; 954 void HTMLMediaElement::deferLoad()
955 {
956 // This implements the "optional" step 3 from the resource fetch algorithm.
957 ASSERT(!m_deferredLoadTimer.isActive());
958 ASSERT(m_deferredLoadState == NotDeferred);
959 // 1. Set the networkState to NETWORK_IDLE.
960 // 2. Queue a task to fire a simple event named suspend at the element.
961 changeNetworkStateFromLoadingToIdle();
962 // 3. Queue a task to set the element's delaying-the-load-event
963 // flag to false. This stops delaying the load event.
964 m_deferredLoadTimer.startOneShot(0, FROM_HERE);
965 // 4. Wait for the task to be run.
966 m_deferredLoadState = WaitingForStopDelayingLoadEventTask;
967 // Continued in executeDeferredLoad().
968 }
969
970 void HTMLMediaElement::cancelDeferredLoad()
971 {
972 m_deferredLoadTimer.stop();
973 m_deferredLoadState = NotDeferred;
974 }
975
976 void HTMLMediaElement::executeDeferredLoad()
977 {
978 ASSERT(m_deferredLoadState >= WaitingForTrigger);
979
980 // resource fetch algorithm step 3 - continued from deferLoad().
981
982 // 5. Wait for an implementation-defined event (e.g. the user requesting tha t the media element begin playback).
983 // This is assumed to be whatever 'event' ended up calling this method.
984 cancelDeferredLoad();
985 // 6. Set the element's delaying-the-load-event flag back to true (this
986 // delays the load event again, in case it hasn't been fired yet).
987 setShouldDelayLoadEvent(true);
988 // 7. Set the networkState to NETWORK_LOADING.
989 m_networkState = NETWORK_LOADING;
990
991 startProgressEventTimer();
952 992
953 startPlayerLoad(); 993 startPlayerLoad();
954 } 994 }
955 995
996 void HTMLMediaElement::startDeferredLoad()
997 {
998 if (m_deferredLoadState == WaitingForTrigger) {
999 executeDeferredLoad();
1000 return;
1001 }
1002 ASSERT(m_deferredLoadState == WaitingForStopDelayingLoadEventTask);
1003 m_deferredLoadState = ExecuteOnStopDelayingLoadEventTask;
1004 }
1005
1006 void HTMLMediaElement::deferredLoadTimerFired(Timer<HTMLMediaElement>*)
1007 {
1008 setShouldDelayLoadEvent(false);
1009
1010 if (m_deferredLoadState == ExecuteOnStopDelayingLoadEventTask) {
1011 executeDeferredLoad();
1012 return;
1013 }
1014 ASSERT(m_deferredLoadState == WaitingForStopDelayingLoadEventTask);
1015 m_deferredLoadState = WaitingForTrigger;
1016 }
1017
956 WebMediaPlayer::LoadType HTMLMediaElement::loadType() const 1018 WebMediaPlayer::LoadType HTMLMediaElement::loadType() const
957 { 1019 {
958 if (m_mediaSource) 1020 if (m_mediaSource)
959 return WebMediaPlayer::LoadTypeMediaSource; 1021 return WebMediaPlayer::LoadTypeMediaSource;
960 1022
961 if (isMediaStreamURL(m_currentSrc.string())) 1023 if (isMediaStreamURL(m_currentSrc.string()))
962 return WebMediaPlayer::LoadTypeMediaStream; 1024 return WebMediaPlayer::LoadTypeMediaStream;
963 1025
964 return WebMediaPlayer::LoadTypeURL; 1026 return WebMediaPlayer::LoadTypeURL;
965 } 1027 }
(...skipping 609 matching lines...) Expand 10 before | Expand all | Expand 10 after
1575 1637
1576 if (state == MediaPlayer::Loaded) { 1638 if (state == MediaPlayer::Loaded) {
1577 if (m_networkState != NETWORK_IDLE) 1639 if (m_networkState != NETWORK_IDLE)
1578 changeNetworkStateFromLoadingToIdle(); 1640 changeNetworkStateFromLoadingToIdle();
1579 m_completelyLoaded = true; 1641 m_completelyLoaded = true;
1580 } 1642 }
1581 } 1643 }
1582 1644
1583 void HTMLMediaElement::changeNetworkStateFromLoadingToIdle() 1645 void HTMLMediaElement::changeNetworkStateFromLoadingToIdle()
1584 { 1646 {
1647 ASSERT(m_player);
1585 m_progressEventTimer.stop(); 1648 m_progressEventTimer.stop();
1586 1649
1587 // Schedule one last progress event so we guarantee that at least one is fir ed 1650 // Schedule one last progress event so we guarantee that at least one is fir ed
1588 // for files that load very quickly. 1651 // for files that load very quickly.
1589 scheduleEvent(EventTypeNames::progress); 1652 if (m_player->didLoadingProgress())
1653 scheduleEvent(EventTypeNames::progress);
1590 scheduleEvent(EventTypeNames::suspend); 1654 scheduleEvent(EventTypeNames::suspend);
1591 m_networkState = NETWORK_IDLE; 1655 m_networkState = NETWORK_IDLE;
1592 } 1656 }
1593 1657
1594 void HTMLMediaElement::mediaPlayerReadyStateChanged() 1658 void HTMLMediaElement::mediaPlayerReadyStateChanged()
1595 { 1659 {
1596 setReadyState(static_cast<ReadyState>(webMediaPlayer()->readyState())); 1660 setReadyState(static_cast<ReadyState>(webMediaPlayer()->readyState()));
1597 } 1661 }
1598 1662
1599 void HTMLMediaElement::setReadyState(ReadyState state) 1663 void HTMLMediaElement::setReadyState(ReadyState state)
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
1743 return m_player ? m_player->supportsSave() : false; 1807 return m_player ? m_player->supportsSave() : false;
1744 } 1808 }
1745 1809
1746 void HTMLMediaElement::prepareToPlay() 1810 void HTMLMediaElement::prepareToPlay()
1747 { 1811 {
1748 WTF_LOG(Media, "HTMLMediaElement::prepareToPlay(%p)", this); 1812 WTF_LOG(Media, "HTMLMediaElement::prepareToPlay(%p)", this);
1749 if (m_havePreparedToPlay) 1813 if (m_havePreparedToPlay)
1750 return; 1814 return;
1751 m_havePreparedToPlay = true; 1815 m_havePreparedToPlay = true;
1752 1816
1753 if (m_delayingLoadForPreloadNone) 1817 if (loadIsDeferred())
1754 startDelayedLoad(); 1818 startDeferredLoad();
1755 } 1819 }
1756 1820
1757 void HTMLMediaElement::seek(double time, ExceptionState& exceptionState) 1821 void HTMLMediaElement::seek(double time, ExceptionState& exceptionState)
1758 { 1822 {
1759 WTF_LOG(Media, "HTMLMediaElement::seek(%f)", time); 1823 WTF_LOG(Media, "HTMLMediaElement::seek(%f)", time);
1760 1824
1761 // 4.8.10.9 Seeking 1825 // 4.8.10.9 Seeking
1762 1826
1763 // 1 - If the media element's readyState is HAVE_NOTHING, then raise an Inva lidStateError exception. 1827 // 1 - If the media element's readyState is HAVE_NOTHING, then raise an Inva lidStateError exception.
1764 if (m_readyState == HAVE_NOTHING || !m_player) { 1828 if (m_readyState == HAVE_NOTHING || !m_player) {
(...skipping 1367 matching lines...) Expand 10 before | Expand all | Expand 10 after
3132 #endif 3196 #endif
3133 m_player.clear(); 3197 m_player.clear();
3134 } 3198 }
3135 3199
3136 void HTMLMediaElement::clearMediaPlayer(int flags) 3200 void HTMLMediaElement::clearMediaPlayer(int flags)
3137 { 3201 {
3138 forgetResourceSpecificTracks(); 3202 forgetResourceSpecificTracks();
3139 3203
3140 closeMediaSource(); 3204 closeMediaSource();
3141 3205
3142 m_delayingLoadForPreloadNone = false; 3206 cancelDeferredLoad();
3143 3207
3144 #if ENABLE(WEB_AUDIO) 3208 #if ENABLE(WEB_AUDIO)
3145 if (m_audioSourceNode) 3209 if (m_audioSourceNode)
3146 m_audioSourceNode->lock(); 3210 m_audioSourceNode->lock();
3147 #endif 3211 #endif
3148 3212
3149 clearMediaPlayerAndAudioSourceProviderClientWithoutLocking(); 3213 clearMediaPlayerAndAudioSourceProviderClientWithoutLocking();
3150 3214
3151 #if ENABLE(WEB_AUDIO) 3215 #if ENABLE(WEB_AUDIO)
3152 if (m_audioSourceNode) 3216 if (m_audioSourceNode)
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after
3677 3741
3678 #if ENABLE(WEB_AUDIO) 3742 #if ENABLE(WEB_AUDIO)
3679 void HTMLMediaElement::clearWeakMembers(Visitor* visitor) 3743 void HTMLMediaElement::clearWeakMembers(Visitor* visitor)
3680 { 3744 {
3681 if (!visitor->isAlive(m_audioSourceNode) && audioSourceProvider()) 3745 if (!visitor->isAlive(m_audioSourceNode) && audioSourceProvider())
3682 audioSourceProvider()->setClient(0); 3746 audioSourceProvider()->setClient(0);
3683 } 3747 }
3684 #endif 3748 #endif
3685 3749
3686 } 3750 }
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