Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(137)

Side by Side Diff: Source/core/html/HTMLMediaElement.cpp

Issue 517593003: Allow HTMLMediaElement.currentTime to be set before the transition to HAVE_METADATA (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 306 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 , m_defaultPlaybackRate(1.0f) 317 , m_defaultPlaybackRate(1.0f)
318 , m_networkState(NETWORK_EMPTY) 318 , m_networkState(NETWORK_EMPTY)
319 , m_readyState(HAVE_NOTHING) 319 , m_readyState(HAVE_NOTHING)
320 , m_readyStateMaximum(HAVE_NOTHING) 320 , m_readyStateMaximum(HAVE_NOTHING)
321 , m_volume(1.0f) 321 , m_volume(1.0f)
322 , m_lastSeekTime(0) 322 , m_lastSeekTime(0)
323 , m_previousProgressTime(std::numeric_limits<double>::max()) 323 , m_previousProgressTime(std::numeric_limits<double>::max())
324 , m_duration(std::numeric_limits<double>::quiet_NaN()) 324 , m_duration(std::numeric_limits<double>::quiet_NaN())
325 , m_lastTimeUpdateEventWallTime(0) 325 , m_lastTimeUpdateEventWallTime(0)
326 , m_lastTimeUpdateEventMovieTime(std::numeric_limits<double>::max()) 326 , m_lastTimeUpdateEventMovieTime(std::numeric_limits<double>::max())
327 , m_defaultPlaybackStartPosition(0)
327 , m_loadState(WaitingForSource) 328 , m_loadState(WaitingForSource)
328 , m_deferredLoadState(NotDeferred) 329 , m_deferredLoadState(NotDeferred)
329 , m_deferredLoadTimer(this, &HTMLMediaElement::deferredLoadTimerFired) 330 , m_deferredLoadTimer(this, &HTMLMediaElement::deferredLoadTimerFired)
330 , m_webLayer(0) 331 , m_webLayer(0)
331 , m_preload(MediaPlayer::Auto) 332 , m_preload(MediaPlayer::Auto)
332 , m_displayMode(Unknown) 333 , m_displayMode(Unknown)
333 , m_cachedTime(MediaPlayer::invalidTime()) 334 , m_cachedTime(MediaPlayer::invalidTime())
334 , m_cachedTimeWallClockUpdateTime(0) 335 , m_cachedTimeWallClockUpdateTime(0)
335 , m_minimumWallClockTimeToCacheMediaTime(0) 336 , m_minimumWallClockTimeToCacheMediaTime(0)
336 , m_fragmentStartTime(MediaPlayer::invalidTime()) 337 , m_fragmentStartTime(MediaPlayer::invalidTime())
(...skipping 1478 matching lines...) Expand 10 before | Expand all | Expand 10 after
1815 prepareMediaFragmentURI(); 1816 prepareMediaFragmentURI();
1816 1817
1817 selectInitialTracksIfNecessary(); 1818 selectInitialTracksIfNecessary();
1818 1819
1819 m_duration = duration(); 1820 m_duration = duration();
1820 scheduleEvent(EventTypeNames::durationchange); 1821 scheduleEvent(EventTypeNames::durationchange);
1821 1822
1822 if (isHTMLVideoElement()) 1823 if (isHTMLVideoElement())
1823 scheduleEvent(EventTypeNames::resize); 1824 scheduleEvent(EventTypeNames::resize);
1824 scheduleEvent(EventTypeNames::loadedmetadata); 1825 scheduleEvent(EventTypeNames::loadedmetadata);
1826
1827 if (m_defaultPlaybackStartPosition > 0) {
philipj_slow 2014/09/02 13:03:31 This looks like the correct place for this logic,
amogh.bihani 2014/09/02 13:39:54 Acknowledged.
1828 seek(m_defaultPlaybackStartPosition, IGNORE_EXCEPTION);
1829 m_defaultPlaybackStartPosition = 0;
1830 }
1831
1825 if (hasMediaControls()) 1832 if (hasMediaControls())
1826 mediaControls()->reset(); 1833 mediaControls()->reset();
1827 if (renderer()) 1834 if (renderer())
1828 renderer()->updateFromElement(); 1835 renderer()->updateFromElement();
1829 } 1836 }
1830 1837
1831 bool shouldUpdateDisplayState = false; 1838 bool shouldUpdateDisplayState = false;
1832 1839
1833 if (m_readyState >= HAVE_CURRENT_DATA && oldState < HAVE_CURRENT_DATA && !m_ haveFiredLoadedData) { 1840 if (m_readyState >= HAVE_CURRENT_DATA && oldState < HAVE_CURRENT_DATA && !m_ haveFiredLoadedData) {
1834 m_haveFiredLoadedData = true; 1841 m_haveFiredLoadedData = true;
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1921 if (loadIsDeferred()) 1928 if (loadIsDeferred())
1922 startDeferredLoad(); 1929 startDeferredLoad();
1923 } 1930 }
1924 1931
1925 void HTMLMediaElement::seek(double time, ExceptionState& exceptionState) 1932 void HTMLMediaElement::seek(double time, ExceptionState& exceptionState)
1926 { 1933 {
1927 WTF_LOG(Media, "HTMLMediaElement::seek(%f)", time); 1934 WTF_LOG(Media, "HTMLMediaElement::seek(%f)", time);
1928 1935
1929 // 4.8.10.9 Seeking 1936 // 4.8.10.9 Seeking
1930 1937
1931 // 1 - If the media element's readyState is HAVE_NOTHING, then raise an Inva lidStateError exception. 1938 // 1 - If the media element's readyState is HAVE_NOTHING, then set the defau lt playback start
1939 // position to that time.
1932 if (m_readyState == HAVE_NOTHING) { 1940 if (m_readyState == HAVE_NOTHING) {
1933 exceptionState.throwDOMException(InvalidStateError, "The element's ready State is HAVE_NOTHING."); 1941 m_defaultPlaybackStartPosition = time;
philipj_slow 2014/09/02 13:03:31 This should be moved to setCurrentTime, per "if th
amogh.bihani 2014/09/02 13:39:54 Acknowledged.
1934 return; 1942 return;
1935 } 1943 }
1936 1944
1937 // If the media engine has been told to postpone loading data, let it go ahe ad now. 1945 // If the media engine has been told to postpone loading data, let it go ahe ad now.
1938 if (m_preload < MediaPlayer::Auto && m_readyState < HAVE_FUTURE_DATA) 1946 if (m_preload < MediaPlayer::Auto && m_readyState < HAVE_FUTURE_DATA)
1939 prepareToPlay(); 1947 prepareToPlay();
1940 1948
1941 // Get the current time before setting m_seeking, m_lastSeekTime is returned once it is set. 1949 // Get the current time before setting m_seeking, m_lastSeekTime is returned once it is set.
1942 refreshCachedTime(); 1950 refreshCachedTime();
1943 double now = currentTime(); 1951 double now = currentTime();
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
2068 } 2076 }
2069 2077
2070 // playback state 2078 // playback state
2071 double HTMLMediaElement::currentTime() const 2079 double HTMLMediaElement::currentTime() const
2072 { 2080 {
2073 #if LOG_CACHED_TIME_WARNINGS 2081 #if LOG_CACHED_TIME_WARNINGS
2074 static const double minCachedDeltaForWarning = 0.01; 2082 static const double minCachedDeltaForWarning = 0.01;
2075 #endif 2083 #endif
2076 2084
2077 if (m_readyState == HAVE_NOTHING) 2085 if (m_readyState == HAVE_NOTHING)
2078 return 0; 2086 return m_defaultPlaybackStartPosition;
philipj_slow 2014/09/02 13:03:31 The spec says "return the media element's default
amogh.bihani 2014/09/02 13:39:54 Ok, I'll do that. I thought that its value is set
2079 2087
2080 if (m_seeking) { 2088 if (m_seeking) {
2081 WTF_LOG(Media, "HTMLMediaElement::currentTime - seeking, returning %f", m_lastSeekTime); 2089 WTF_LOG(Media, "HTMLMediaElement::currentTime - seeking, returning %f", m_lastSeekTime);
2082 return m_lastSeekTime; 2090 return m_lastSeekTime;
2083 } 2091 }
2084 2092
2085 if (m_cachedTime != MediaPlayer::invalidTime() && m_paused) { 2093 if (m_cachedTime != MediaPlayer::invalidTime() && m_paused) {
2086 #if LOG_CACHED_TIME_WARNINGS 2094 #if LOG_CACHED_TIME_WARNINGS
2087 double delta = m_cachedTime - webMediaPlayer()->currentTime(); 2095 double delta = m_cachedTime - webMediaPlayer()->currentTime();
2088 if (delta > minCachedDeltaForWarning) 2096 if (delta > minCachedDeltaForWarning)
2089 WTF_LOG(Media, "HTMLMediaElement::currentTime - WARNING, cached time is %f seconds off of media time when paused", delta); 2097 WTF_LOG(Media, "HTMLMediaElement::currentTime - WARNING, cached time is %f seconds off of media time when paused", delta);
2090 #endif 2098 #endif
2091 return m_cachedTime; 2099 return m_cachedTime;
2092 } 2100 }
2093 2101
2094 refreshCachedTime(); 2102 refreshCachedTime();
2095 2103
2096 return m_cachedTime; 2104 return m_cachedTime;
2097 } 2105 }
2098 2106
2099 void HTMLMediaElement::setCurrentTime(double time, ExceptionState& exceptionStat e) 2107 void HTMLMediaElement::setCurrentTime(double time, ExceptionState& exceptionStat e)
2100 { 2108 {
2101 if (m_mediaController) { 2109 if (m_mediaController) {
2102 exceptionState.throwDOMException(InvalidStateError, "The element is slav ed to a MediaController."); 2110 exceptionState.throwDOMException(InvalidStateError, "The element is slav ed to a MediaController.");
2103 return; 2111 return;
2104 } 2112 }
2113
2114 if (m_networkState == NETWORK_EMPTY) {
2115 exceptionState.throwDOMException(InvalidStateError, "There is no media a ttached.");
philipj_slow 2014/09/02 13:03:31 This condition is not in the spec, why is it neede
amogh.bihani 2014/09/02 13:39:54 Oh Sorry! I got confused with this line "Test that
2116 return;
2117 }
2118
2105 seek(time, exceptionState); 2119 seek(time, exceptionState);
2106 } 2120 }
2107 2121
2108 double HTMLMediaElement::duration() const 2122 double HTMLMediaElement::duration() const
2109 { 2123 {
2110 // FIXME: remove m_player check once we figure out how m_player is going 2124 // FIXME: remove m_player check once we figure out how m_player is going
2111 // out of sync with readystate. m_player is cleared but readystate is not se t 2125 // out of sync with readystate. m_player is cleared but readystate is not se t
2112 // to HAVE_NOTHING 2126 // to HAVE_NOTHING
2113 if (!m_player || m_readyState < HAVE_METADATA) 2127 if (!m_player || m_readyState < HAVE_METADATA)
2114 return std::numeric_limits<double>::quiet_NaN(); 2128 return std::numeric_limits<double>::quiet_NaN();
(...skipping 1874 matching lines...) Expand 10 before | Expand all | Expand 10 after
3989 4003
3990 #if ENABLE(WEB_AUDIO) 4004 #if ENABLE(WEB_AUDIO)
3991 void HTMLMediaElement::clearWeakMembers(Visitor* visitor) 4005 void HTMLMediaElement::clearWeakMembers(Visitor* visitor)
3992 { 4006 {
3993 if (!visitor->isAlive(m_audioSourceNode) && audioSourceProvider()) 4007 if (!visitor->isAlive(m_audioSourceNode) && audioSourceProvider())
3994 audioSourceProvider()->setClient(0); 4008 audioSourceProvider()->setClient(0);
3995 } 4009 }
3996 #endif 4010 #endif
3997 4011
3998 } 4012 }
OLDNEW
« Source/core/html/HTMLMediaElement.h ('K') | « Source/core/html/HTMLMediaElement.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698