OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 } |
OLD | NEW |