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

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

Issue 319213002: Fix MediaSource.duration setter behavior to match the current spec. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase Created 6 years, 6 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
Index: Source/core/html/HTMLMediaElement.cpp
diff --git a/Source/core/html/HTMLMediaElement.cpp b/Source/core/html/HTMLMediaElement.cpp
index 54ebb9466532426b8b362d8f52407a83b3755922..e5657c43b4852d6cbc922608d1703caba6155a08 100644
--- a/Source/core/html/HTMLMediaElement.cpp
+++ b/Source/core/html/HTMLMediaElement.cpp
@@ -1645,7 +1645,10 @@ void HTMLMediaElement::setReadyState(MediaPlayer::ReadyState state)
if (m_readyState >= HAVE_METADATA && oldState < HAVE_METADATA) {
prepareMediaFragmentURI();
+
+ m_duration = duration();
scheduleEvent(EventTypeNames::durationchange);
+
if (isHTMLVideoElement(*this))
scheduleEvent(EventTypeNames::resize);
scheduleEvent(EventTypeNames::loadedmetadata);
@@ -1749,9 +1752,9 @@ void HTMLMediaElement::prepareToPlay()
startDelayedLoad();
}
-void HTMLMediaElement::seek(double time, ExceptionState& exceptionState)
+void HTMLMediaElement::seek(SeekSkipPermission seekSkip, double time, ExceptionState& exceptionState)
{
- WTF_LOG(Media, "HTMLMediaElement::seek(%f)", time);
+ WTF_LOG(Media, "HTMLMediaElement::seek(%d, %f)", seekSkip, time);
// 4.8.10.9 Seeking
@@ -1807,9 +1810,8 @@ void HTMLMediaElement::seek(double time, ExceptionState& exceptionState)
// Short circuit seeking to the current time by just firing the events if no seek is required.
// Don't skip calling the media engine if we are in poster mode because a seek should always
// cancel poster display.
- bool noSeekRequired = !seekableRanges->length() || (time == now && displayMode() != Poster);
-
- if (noSeekRequired) {
+ if (!seekableRanges->length()
+ || (seekSkip == SkipAllowed && time == now && displayMode() != Poster)) {
philipj_slow 2014/06/16 13:26:19 Do you know why we actually need this short circui
acolwell GONE FROM CHROMIUM 2014/06/17 01:24:02 I've never been a fan of this block of code. I'll
philipj_slow 2014/06/17 11:59:06 Thanks, I hope it turns out that the short circuit
acolwell GONE FROM CHROMIUM 2014/06/17 22:39:02 I've removed the short circuiting in https://coder
if (time == now) {
scheduleEvent(EventTypeNames::seeking);
if (previousSeekStillPending)
@@ -1927,7 +1929,7 @@ void HTMLMediaElement::setCurrentTime(double time, ExceptionState& exceptionStat
exceptionState.throwDOMException(InvalidStateError, "The element is slaved to a MediaController.");
return;
}
- seek(time, exceptionState);
+ seek(SkipAllowed, time, exceptionState);
}
double HTMLMediaElement::duration() const
@@ -2054,7 +2056,7 @@ void HTMLMediaElement::playInternal()
scheduleDelayedAction(LoadMediaResource);
if (endedPlayback())
- seek(0, IGNORE_EXCEPTION);
+ seek(SkipAllowed, 0, IGNORE_EXCEPTION);
if (m_mediaController)
m_mediaController->bringElementUpToSpeed(this);
@@ -2782,7 +2784,7 @@ void HTMLMediaElement::mediaPlayerTimeChanged()
if (loop() && !m_mediaController) {
m_sentEndEvent = false;
// then seek to the earliest possible position of the media resource and abort these steps.
- seek(0, IGNORE_EXCEPTION);
+ seek(SkipAllowed, 0, IGNORE_EXCEPTION);
} else {
// If the media element does not have a current media controller, and the media element
// has still ended playback, and the direction of playback is still forwards, and paused
@@ -2811,18 +2813,22 @@ void HTMLMediaElement::mediaPlayerTimeChanged()
void HTMLMediaElement::mediaPlayerDurationChanged()
{
WTF_LOG(Media, "HTMLMediaElement::mediaPlayerDurationChanged");
- durationChanged(duration());
+ durationChanged(duration(), currentTime() > duration());
philipj_slow 2014/06/16 13:26:19 This was already the case, but isn't it weird that
acolwell GONE FROM CHROMIUM 2014/06/17 01:24:02 With the current code this condition should always
philipj_slow 2014/06/17 11:59:06 A FIXME or ASSERT to clarify the current status of
acolwell GONE FROM CHROMIUM 2014/06/17 22:39:02 Done.
}
-void HTMLMediaElement::durationChanged(double duration)
+void HTMLMediaElement::durationChanged(double duration, bool requestSeek)
{
- WTF_LOG(Media, "HTMLMediaElement::durationChanged(%f)", duration);
+ WTF_LOG(Media, "HTMLMediaElement::durationChanged(%f, %d)", duration, requestSeek);
// Abort if duration unchanged.
if (m_duration == duration)
return;
+ double oldDuration = m_duration;
m_duration = duration;
+
+ WTF_LOG(Media, "HTMLMediaElement::durationChanged : %f -> %f", oldDuration, duration);
+
scheduleEvent(EventTypeNames::durationchange);
if (hasMediaControls())
@@ -2830,8 +2836,13 @@ void HTMLMediaElement::durationChanged(double duration)
if (renderer())
renderer()->updateFromElement();
- if (currentTime() > duration)
- seek(duration, IGNORE_EXCEPTION);
+ if (requestSeek) {
+ // Prevent seek skipping if the duration is getting smaller. The webMediaPlayer()
+ // may be clamping currentTime to duration() so the normal "are we seeking to the current location?"
+ // skip check may not be reliable.
+ SeekSkipPermission seekSkip = (duration < oldDuration) ? SkipNotAllowed : SkipAllowed;
acolwell GONE FROM CHROMIUM 2014/06/06 23:20:04 This change and ones related to it are needed beca
philipj_slow 2014/06/16 13:26:19 OK, that explains why requestSeek is initialized w
+ seek(seekSkip, duration, IGNORE_EXCEPTION);
+ }
}
void HTMLMediaElement::mediaPlayerPlaybackStateChanged()
@@ -3599,7 +3610,7 @@ void HTMLMediaElement::applyMediaFragmentURI()
if (m_fragmentStartTime != MediaPlayer::invalidTime()) {
m_sentEndEvent = false;
UseCounter::count(document(), UseCounter::HTMLMediaElementSeekToFragmentStart);
- seek(m_fragmentStartTime, IGNORE_EXCEPTION);
+ seek(SkipAllowed, m_fragmentStartTime, IGNORE_EXCEPTION);
}
}

Powered by Google App Engine
This is Rietveld 408576698