Chromium Code Reviews| 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 |