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 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |