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 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
307 , m_lastSeekTime(0) | 307 , m_lastSeekTime(0) |
308 , m_previousProgressTime(std::numeric_limits<double>::max()) | 308 , m_previousProgressTime(std::numeric_limits<double>::max()) |
309 , m_duration(std::numeric_limits<double>::quiet_NaN()) | 309 , m_duration(std::numeric_limits<double>::quiet_NaN()) |
310 , m_lastTimeUpdateEventWallTime(0) | 310 , m_lastTimeUpdateEventWallTime(0) |
311 , m_lastTimeUpdateEventMovieTime(0) | 311 , m_lastTimeUpdateEventMovieTime(0) |
312 , m_defaultPlaybackStartPosition(0) | 312 , m_defaultPlaybackStartPosition(0) |
313 , m_loadState(WaitingForSource) | 313 , m_loadState(WaitingForSource) |
314 , m_deferredLoadState(NotDeferred) | 314 , m_deferredLoadState(NotDeferred) |
315 , m_deferredLoadTimer(this, &HTMLMediaElement::deferredLoadTimerFired) | 315 , m_deferredLoadTimer(this, &HTMLMediaElement::deferredLoadTimerFired) |
316 , m_webLayer(nullptr) | 316 , m_webLayer(nullptr) |
317 , m_displayMode(Unknown) | |
318 , m_cachedTime(std::numeric_limits<double>::quiet_NaN()) | 317 , m_cachedTime(std::numeric_limits<double>::quiet_NaN()) |
319 , m_fragmentEndTime(std::numeric_limits<double>::quiet_NaN()) | 318 , m_fragmentEndTime(std::numeric_limits<double>::quiet_NaN()) |
320 , m_pendingActionFlags(0) | 319 , m_pendingActionFlags(0) |
321 , m_userGestureRequiredForPlay(false) | 320 , m_userGestureRequiredForPlay(false) |
322 , m_playing(false) | 321 , m_playing(false) |
323 , m_shouldDelayLoadEvent(false) | 322 , m_shouldDelayLoadEvent(false) |
324 , m_haveFiredLoadedData(false) | 323 , m_haveFiredLoadedData(false) |
325 , m_autoplaying(true) | 324 , m_autoplaying(true) |
326 , m_muted(false) | 325 , m_muted(false) |
327 , m_paused(true) | 326 , m_paused(true) |
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
730 stopPeriodicTimers(); | 729 stopPeriodicTimers(); |
731 m_loadTimer.stop(); | 730 m_loadTimer.stop(); |
732 cancelDeferredLoad(); | 731 cancelDeferredLoad(); |
733 // FIXME: Figure out appropriate place to reset LoadTextTrackResource if nec
essary and set m_pendingActionFlags to 0 here. | 732 // FIXME: Figure out appropriate place to reset LoadTextTrackResource if nec
essary and set m_pendingActionFlags to 0 here. |
734 m_pendingActionFlags &= ~LoadMediaResource; | 733 m_pendingActionFlags &= ~LoadMediaResource; |
735 m_sentEndEvent = false; | 734 m_sentEndEvent = false; |
736 m_sentStalledEvent = false; | 735 m_sentStalledEvent = false; |
737 m_haveFiredLoadedData = false; | 736 m_haveFiredLoadedData = false; |
738 m_completelyLoaded = false; | 737 m_completelyLoaded = false; |
739 m_havePreparedToPlay = false; | 738 m_havePreparedToPlay = false; |
740 m_displayMode = Unknown; | 739 setShowPoster(true); |
741 | 740 |
742 // 1 - Abort any already-running instance of the resource selection algorith
m for this element. | 741 // 1 - Abort any already-running instance of the resource selection algorith
m for this element. |
743 m_loadState = WaitingForSource; | 742 m_loadState = WaitingForSource; |
744 m_currentSourceNode = nullptr; | 743 m_currentSourceNode = nullptr; |
745 | 744 |
746 // 2 - If there are any tasks from the media element's media element event t
ask source in | 745 // 2 - If there are any tasks from the media element's media element event t
ask source in |
747 // one of the task queues, then remove those tasks. | 746 // one of the task queues, then remove those tasks. |
748 cancelPendingEventsAndCallbacks(); | 747 cancelPendingEventsAndCallbacks(); |
749 | 748 |
750 // 3 - If the media element's networkState is set to NETWORK_LOADING or NETW
ORK_IDLE, queue | 749 // 3 - If the media element's networkState is set to NETWORK_LOADING or NETW
ORK_IDLE, queue |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
856 mode = children; | 855 mode = children; |
857 m_nextChildNodeToConsider = element; | 856 m_nextChildNodeToConsider = element; |
858 m_currentSourceNode = nullptr; | 857 m_currentSourceNode = nullptr; |
859 } else { | 858 } else { |
860 // Otherwise the media element has neither a src attribute nor a sou
rce element | 859 // Otherwise the media element has neither a src attribute nor a sou
rce element |
861 // child: set the networkState to NETWORK_EMPTY, and abort these ste
ps; the | 860 // child: set the networkState to NETWORK_EMPTY, and abort these ste
ps; the |
862 // synchronous section ends. | 861 // synchronous section ends. |
863 m_loadState = WaitingForSource; | 862 m_loadState = WaitingForSource; |
864 setShouldDelayLoadEvent(false); | 863 setShouldDelayLoadEvent(false); |
865 m_networkState = NETWORK_EMPTY; | 864 m_networkState = NETWORK_EMPTY; |
866 updateDisplayState(); | 865 updateDisplayState(false); |
867 | 866 |
868 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), nothing t
o load", this); | 867 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), nothing t
o load", this); |
869 return; | 868 return; |
870 } | 869 } |
871 } | 870 } |
872 | 871 |
873 // 4 - Set the media element's delaying-the-load-event flag to true (this de
lays the load event), | 872 // 4 - Set the media element's delaying-the-load-event flag to true (this de
lays the load event), |
874 // and set its networkState to NETWORK_LOADING. | 873 // and set its networkState to NETWORK_LOADING. |
875 setShouldDelayLoadEvent(true); | 874 setShouldDelayLoadEvent(true); |
876 m_networkState = NETWORK_LOADING; | 875 m_networkState = NETWORK_LOADING; |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
947 | 946 |
948 #if ENABLE(WEB_AUDIO) | 947 #if ENABLE(WEB_AUDIO) |
949 if (m_audioSourceNode) | 948 if (m_audioSourceNode) |
950 m_audioSourceNode->onCurrentSrcChanged(m_currentSrc); | 949 m_audioSourceNode->onCurrentSrcChanged(m_currentSrc); |
951 #endif | 950 #endif |
952 | 951 |
953 WTF_LOG(Media, "HTMLMediaElement::loadResource(%p) - m_currentSrc -> %s", th
is, urlForLoggingMedia(m_currentSrc).utf8().data()); | 952 WTF_LOG(Media, "HTMLMediaElement::loadResource(%p) - m_currentSrc -> %s", th
is, urlForLoggingMedia(m_currentSrc).utf8().data()); |
954 | 953 |
955 startProgressEventTimer(); | 954 startProgressEventTimer(); |
956 | 955 |
957 // Reset display mode to force a recalculation of what to show because we ar
e resetting the player. | 956 setShowPoster(true); |
958 setDisplayMode(Unknown); | |
959 | 957 |
960 setPlayerPreload(); | 958 setPlayerPreload(); |
961 | 959 |
962 if (fastHasAttribute(mutedAttr)) | 960 if (fastHasAttribute(mutedAttr)) |
963 m_muted = true; | 961 m_muted = true; |
964 updateVolume(); | 962 updateVolume(); |
965 | 963 |
966 ASSERT(!m_mediaSource); | 964 ASSERT(!m_mediaSource); |
967 | 965 |
968 bool attemptLoad = true; | 966 bool attemptLoad = true; |
(...skipping 23 matching lines...) Expand all Loading... |
992 deferLoad(); | 990 deferLoad(); |
993 } else { | 991 } else { |
994 startPlayerLoad(); | 992 startPlayerLoad(); |
995 } | 993 } |
996 } else { | 994 } else { |
997 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); | 995 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); |
998 } | 996 } |
999 | 997 |
1000 // If there is no poster to display, allow the media engine to render video
frames as soon as | 998 // If there is no poster to display, allow the media engine to render video
frames as soon as |
1001 // they are available. | 999 // they are available. |
1002 updateDisplayState(); | 1000 updateDisplayState(false); |
1003 | 1001 |
1004 if (layoutObject()) | 1002 if (layoutObject()) |
1005 layoutObject()->updateFromElement(); | 1003 layoutObject()->updateFromElement(); |
1006 } | 1004 } |
1007 | 1005 |
1008 void HTMLMediaElement::startPlayerLoad() | 1006 void HTMLMediaElement::startPlayerLoad() |
1009 { | 1007 { |
1010 ASSERT(!m_webMediaPlayer); | 1008 ASSERT(!m_webMediaPlayer); |
1011 // Filter out user:pass as those two URL components aren't | 1009 // Filter out user:pass as those two URL components aren't |
1012 // considered for media resource fetches (including for the CORS | 1010 // considered for media resource fetches (including for the CORS |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1244 | 1242 |
1245 stopPeriodicTimers(); | 1243 stopPeriodicTimers(); |
1246 m_loadState = WaitingForSource; | 1244 m_loadState = WaitingForSource; |
1247 | 1245 |
1248 // 6.17 - Waiting: Set the element's networkState attribute to the NETWORK_N
O_SOURCE value | 1246 // 6.17 - Waiting: Set the element's networkState attribute to the NETWORK_N
O_SOURCE value |
1249 m_networkState = NETWORK_NO_SOURCE; | 1247 m_networkState = NETWORK_NO_SOURCE; |
1250 | 1248 |
1251 // 6.18 - Set the element's delaying-the-load-event flag to false. This stop
s delaying the load event. | 1249 // 6.18 - Set the element's delaying-the-load-event flag to false. This stop
s delaying the load event. |
1252 setShouldDelayLoadEvent(false); | 1250 setShouldDelayLoadEvent(false); |
1253 | 1251 |
1254 updateDisplayState(); | 1252 updateDisplayState(false); |
1255 | 1253 |
1256 if (layoutObject()) | 1254 if (layoutObject()) |
1257 layoutObject()->updateFromElement(); | 1255 layoutObject()->updateFromElement(); |
1258 } | 1256 } |
1259 | 1257 |
1260 void HTMLMediaElement::noneSupported() | 1258 void HTMLMediaElement::noneSupported() |
1261 { | 1259 { |
1262 WTF_LOG(Media, "HTMLMediaElement::noneSupported(%p)", this); | 1260 WTF_LOG(Media, "HTMLMediaElement::noneSupported(%p)", this); |
1263 | 1261 |
1264 stopPeriodicTimers(); | 1262 stopPeriodicTimers(); |
(...skipping 18 matching lines...) Expand all Loading... |
1283 scheduleEvent(EventTypeNames::error); | 1281 scheduleEvent(EventTypeNames::error); |
1284 | 1282 |
1285 closeMediaSource(); | 1283 closeMediaSource(); |
1286 | 1284 |
1287 // 8 - Set the element's delaying-the-load-event flag to false. This stops d
elaying the load event. | 1285 // 8 - Set the element's delaying-the-load-event flag to false. This stops d
elaying the load event. |
1288 setShouldDelayLoadEvent(false); | 1286 setShouldDelayLoadEvent(false); |
1289 | 1287 |
1290 // 9 - Abort these steps. Until the load() method is invoked or the src attr
ibute is changed, | 1288 // 9 - Abort these steps. Until the load() method is invoked or the src attr
ibute is changed, |
1291 // the element won't attempt to load another resource. | 1289 // the element won't attempt to load another resource. |
1292 | 1290 |
1293 updateDisplayState(); | 1291 updateDisplayState(false); |
1294 | 1292 |
1295 if (layoutObject()) | 1293 if (layoutObject()) |
1296 layoutObject()->updateFromElement(); | 1294 layoutObject()->updateFromElement(); |
1297 } | 1295 } |
1298 | 1296 |
1299 void HTMLMediaElement::mediaEngineError(MediaError* err) | 1297 void HTMLMediaElement::mediaEngineError(MediaError* err) |
1300 { | 1298 { |
1301 ASSERT(m_readyState >= HAVE_METADATA); | 1299 ASSERT(m_readyState >= HAVE_METADATA); |
1302 WTF_LOG(Media, "HTMLMediaElement::mediaEngineError(%p, %d)", this, static_ca
st<int>(err->code())); | 1300 WTF_LOG(Media, "HTMLMediaElement::mediaEngineError(%p, %d)", this, static_ca
st<int>(err->code())); |
1303 | 1301 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1369 | 1367 |
1370 if (error == WebMediaPlayer::NetworkStateNetworkError && m_readyState >= HAV
E_METADATA) | 1368 if (error == WebMediaPlayer::NetworkStateNetworkError && m_readyState >= HAV
E_METADATA) |
1371 mediaEngineError(MediaError::create(MediaError::MEDIA_ERR_NETWORK)); | 1369 mediaEngineError(MediaError::create(MediaError::MEDIA_ERR_NETWORK)); |
1372 else if (error == WebMediaPlayer::NetworkStateDecodeError) | 1370 else if (error == WebMediaPlayer::NetworkStateDecodeError) |
1373 mediaEngineError(MediaError::create(MediaError::MEDIA_ERR_DECODE)); | 1371 mediaEngineError(MediaError::create(MediaError::MEDIA_ERR_DECODE)); |
1374 else if ((error == WebMediaPlayer::NetworkStateFormatError | 1372 else if ((error == WebMediaPlayer::NetworkStateFormatError |
1375 || error == WebMediaPlayer::NetworkStateNetworkError) | 1373 || error == WebMediaPlayer::NetworkStateNetworkError) |
1376 && m_loadState == LoadingFromSrcAttr) | 1374 && m_loadState == LoadingFromSrcAttr) |
1377 noneSupported(); | 1375 noneSupported(); |
1378 | 1376 |
1379 updateDisplayState(); | 1377 updateDisplayState(false); |
1380 if (mediaControls()) | 1378 if (mediaControls()) |
1381 mediaControls()->reset(); | 1379 mediaControls()->reset(); |
1382 } | 1380 } |
1383 | 1381 |
1384 void HTMLMediaElement::setNetworkState(WebMediaPlayer::NetworkState state) | 1382 void HTMLMediaElement::setNetworkState(WebMediaPlayer::NetworkState state) |
1385 { | 1383 { |
1386 WTF_LOG(Media, "HTMLMediaElement::setNetworkState(%p, %d) - current state is
%d", this, static_cast<int>(state), static_cast<int>(m_networkState)); | 1384 WTF_LOG(Media, "HTMLMediaElement::setNetworkState(%p, %d) - current state is
%d", this, static_cast<int>(state), static_cast<int>(m_networkState)); |
1387 | 1385 |
1388 if (state == WebMediaPlayer::NetworkStateEmpty) { | 1386 if (state == WebMediaPlayer::NetworkStateEmpty) { |
1389 // Just update the cached state and leave, we can't do anything. | 1387 // Just update the cached state and leave, we can't do anything. |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1573 scheduleEvent(EventTypeNames::playing); | 1571 scheduleEvent(EventTypeNames::playing); |
1574 } | 1572 } |
1575 } | 1573 } |
1576 | 1574 |
1577 scheduleEvent(EventTypeNames::canplaythrough); | 1575 scheduleEvent(EventTypeNames::canplaythrough); |
1578 | 1576 |
1579 shouldUpdateDisplayState = true; | 1577 shouldUpdateDisplayState = true; |
1580 } | 1578 } |
1581 | 1579 |
1582 if (shouldUpdateDisplayState) { | 1580 if (shouldUpdateDisplayState) { |
1583 updateDisplayState(); | 1581 updateDisplayState(false); |
1584 if (mediaControls()) | 1582 if (mediaControls()) |
1585 mediaControls()->refreshClosedCaptionsButtonVisibility(); | 1583 mediaControls()->refreshClosedCaptionsButtonVisibility(); |
1586 } | 1584 } |
1587 | 1585 |
1588 updatePlayState(); | 1586 updatePlayState(); |
1589 updateMediaController(); | 1587 updateMediaController(); |
1590 cueTimeline().updateActiveCues(currentTime()); | 1588 cueTimeline().updateActiveCues(currentTime()); |
1591 } | 1589 } |
1592 | 1590 |
1593 void HTMLMediaElement::progressEventTimerFired(Timer<HTMLMediaElement>*) | 1591 void HTMLMediaElement::progressEventTimerFired(Timer<HTMLMediaElement>*) |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1715 | 1713 |
1716 // 14 - Set the seeking IDL attribute to false. | 1714 // 14 - Set the seeking IDL attribute to false. |
1717 m_seeking = false; | 1715 m_seeking = false; |
1718 | 1716 |
1719 // 16 - Queue a task to fire a simple event named timeupdate at the element. | 1717 // 16 - Queue a task to fire a simple event named timeupdate at the element. |
1720 scheduleTimeupdateEvent(false); | 1718 scheduleTimeupdateEvent(false); |
1721 | 1719 |
1722 // 17 - Queue a task to fire a simple event named seeked at the element. | 1720 // 17 - Queue a task to fire a simple event named seeked at the element. |
1723 scheduleEvent(EventTypeNames::seeked); | 1721 scheduleEvent(EventTypeNames::seeked); |
1724 | 1722 |
1725 setDisplayMode(Video); | 1723 setShowPoster(false); |
1726 } | 1724 } |
1727 | 1725 |
1728 HTMLMediaElement::ReadyState HTMLMediaElement::readyState() const | 1726 HTMLMediaElement::ReadyState HTMLMediaElement::readyState() const |
1729 { | 1727 { |
1730 return m_readyState; | 1728 return m_readyState; |
1731 } | 1729 } |
1732 | 1730 |
1733 bool HTMLMediaElement::hasAudio() const | 1731 bool HTMLMediaElement::hasAudio() const |
1734 { | 1732 { |
1735 return webMediaPlayer() && webMediaPlayer()->hasAudio(); | 1733 return webMediaPlayer() && webMediaPlayer()->hasAudio(); |
(...skipping 1132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2868 if (mediaControls()) | 2866 if (mediaControls()) |
2869 mediaControls()->stoppedCasting(); | 2867 mediaControls()->stoppedCasting(); |
2870 } | 2868 } |
2871 | 2869 |
2872 // MediaPlayerPresentation methods | 2870 // MediaPlayerPresentation methods |
2873 void HTMLMediaElement::repaint() | 2871 void HTMLMediaElement::repaint() |
2874 { | 2872 { |
2875 if (m_webLayer) | 2873 if (m_webLayer) |
2876 m_webLayer->invalidate(); | 2874 m_webLayer->invalidate(); |
2877 | 2875 |
2878 updateDisplayState(); | 2876 updateDisplayState(false); |
2879 if (layoutObject()) | 2877 if (layoutObject()) |
2880 layoutObject()->setShouldDoFullPaintInvalidation(); | 2878 layoutObject()->setShouldDoFullPaintInvalidation(); |
2881 } | 2879 } |
2882 | 2880 |
2883 void HTMLMediaElement::sizeChanged() | 2881 void HTMLMediaElement::sizeChanged() |
2884 { | 2882 { |
2885 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerSizeChanged(%p)", this); | 2883 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerSizeChanged(%p)", this); |
2886 | 2884 |
2887 ASSERT(hasVideo()); // "resize" makes no sense absent video. | 2885 ASSERT(hasVideo()); // "resize" makes no sense absent video. |
2888 if (m_readyState > HAVE_NOTHING && isHTMLVideoElement()) | 2886 if (m_readyState > HAVE_NOTHING && isHTMLVideoElement()) |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2981 | 2979 |
2982 void HTMLMediaElement::updatePlayState() | 2980 void HTMLMediaElement::updatePlayState() |
2983 { | 2981 { |
2984 bool isPlaying = webMediaPlayer() && !webMediaPlayer()->paused(); | 2982 bool isPlaying = webMediaPlayer() && !webMediaPlayer()->paused(); |
2985 bool shouldBePlaying = potentiallyPlaying(); | 2983 bool shouldBePlaying = potentiallyPlaying(); |
2986 | 2984 |
2987 WTF_LOG(Media, "HTMLMediaElement::updatePlayState(%p) - shouldBePlaying = %s
, isPlaying = %s", | 2985 WTF_LOG(Media, "HTMLMediaElement::updatePlayState(%p) - shouldBePlaying = %s
, isPlaying = %s", |
2988 this, boolString(shouldBePlaying), boolString(isPlaying)); | 2986 this, boolString(shouldBePlaying), boolString(isPlaying)); |
2989 | 2987 |
2990 if (shouldBePlaying) { | 2988 if (shouldBePlaying) { |
2991 setDisplayMode(Video); | 2989 setShowPoster(false); |
2992 invalidateCachedTime(); | 2990 invalidateCachedTime(); |
2993 | 2991 |
2994 if (!isPlaying) { | 2992 if (!isPlaying) { |
2995 // Set rate, muted before calling play in case they were set before
the media engine was setup. | 2993 // Set rate, muted before calling play in case they were set before
the media engine was setup. |
2996 // The media engine should just stash the rate and muted values sinc
e it isn't already playing. | 2994 // The media engine should just stash the rate and muted values sinc
e it isn't already playing. |
2997 webMediaPlayer()->setRate(effectivePlaybackRate()); | 2995 webMediaPlayer()->setRate(effectivePlaybackRate()); |
2998 updateVolume(); | 2996 updateVolume(); |
2999 webMediaPlayer()->play(); | 2997 webMediaPlayer()->play(); |
3000 } | 2998 } |
3001 | 2999 |
(...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3814 visitor->trace(m_client); | 3812 visitor->trace(m_client); |
3815 } | 3813 } |
3816 | 3814 |
3817 DEFINE_TRACE(HTMLMediaElement::AudioSourceProviderImpl) | 3815 DEFINE_TRACE(HTMLMediaElement::AudioSourceProviderImpl) |
3818 { | 3816 { |
3819 visitor->trace(m_client); | 3817 visitor->trace(m_client); |
3820 } | 3818 } |
3821 #endif | 3819 #endif |
3822 | 3820 |
3823 } | 3821 } |
OLD | NEW |