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

Unified Diff: Source/core/html/HTMLMediaElement.cpp

Issue 898883003: Fixes play seek when user sets loop after ended. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Responding to feedback Created 5 years, 10 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 side-by-side diff with in-line comments
Download patch
« Source/core/html/HTMLMediaElement.h ('K') | « Source/core/html/HTMLMediaElement.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/html/HTMLMediaElement.cpp
diff --git a/Source/core/html/HTMLMediaElement.cpp b/Source/core/html/HTMLMediaElement.cpp
index d950813509f57be4ced709d0b6c95b819abd7b1e..a244282d0338957f6a9d7357b32324ccd17582ea 100644
--- a/Source/core/html/HTMLMediaElement.cpp
+++ b/Source/core/html/HTMLMediaElement.cpp
@@ -2299,7 +2299,10 @@ void HTMLMediaElement::playInternal()
if (!m_player || m_networkState == NETWORK_EMPTY)
scheduleDelayedAction(LoadMediaResource);
- if (endedPlayback())
+ // Generally "ended" and "looping" are exclusive. Here, the loop attribute
+ // is ignored to seek back to start in case loop was set after playback
+ // ended. See http://crbug.com/364442
+ if (endedPlayback(LoopFactor::Ignored))
seek(0);
if (m_mediaController)
@@ -3242,7 +3245,7 @@ PassRefPtrWillBeRawPtr<TimeRanges> HTMLMediaElement::seekable() const
bool HTMLMediaElement::potentiallyPlaying() const
{
// "pausedToBuffer" means the media engine's rate is 0, but only because it had to stop playing
- // when it ran out of buffered data. A movie is this state is "potentially playing", modulo the
+ // when it ran out of buffered data. A movie in this state is "potentially playing", modulo the
// checks in couldPlayIfEnoughData().
bool pausedToBuffer = m_readyStateMaximum >= HAVE_FUTURE_DATA && m_readyState < HAVE_FUTURE_DATA;
return (pausedToBuffer || m_readyState >= HAVE_FUTURE_DATA) && couldPlayIfEnoughData() && !isBlockedOnMediaController();
@@ -3255,6 +3258,14 @@ bool HTMLMediaElement::couldPlayIfEnoughData() const
bool HTMLMediaElement::endedPlayback() const
{
+ // For general usage, presence of the loop attribute should be considered to mean playback
+ // has not "ended", as "ended" and "looping" are mutually exclusive. See
+ // http://dev.w3.org/html5/spec-preview/media-elements.html#ended-playback
fs 2015/02/13 11:49:22 Make this link https://html.spec.whatwg.org/multi
chcunningham 2015/02/13 23:01:43 Done. Now in the .h since its an explanation of th
+ return endedPlayback(LoopFactor::Included);
+}
+
+bool HTMLMediaElement::endedPlayback(LoopFactor loopFactor) const
+{
double dur = duration();
if (!m_player || std::isnan(dur))
return false;
@@ -3271,7 +3282,7 @@ bool HTMLMediaElement::endedPlayback() const
// or the media element has a current media controller.
double now = currentTime();
if (directionOfPlayback() == Forward)
- return dur > 0 && now >= dur && (!loop() || m_mediaController);
+ return dur > 0 && now >= dur && (loopFactor == LoopFactor::Ignored || !loop() || m_mediaController);
// or the current playback position is the earliest possible position and the direction
// of playback is backwards
« 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