| 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 |