Index: content/renderer/media/webmediaplayer_impl.cc |
diff --git a/content/renderer/media/webmediaplayer_impl.cc b/content/renderer/media/webmediaplayer_impl.cc |
index 91dc4f1b9bf24c82eedde9668e0fc348b0e512ff..166021cfb3eff8740f9ab5fc17cb62abd5c9eecd 100644 |
--- a/content/renderer/media/webmediaplayer_impl.cc |
+++ b/content/renderer/media/webmediaplayer_impl.cc |
@@ -151,6 +151,7 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( |
paused_(true), |
seeking_(false), |
playback_rate_(0.0f), |
+ ended_(false), |
pending_seek_(false), |
pending_seek_seconds_(0.0f), |
should_notify_time_changed_(false), |
@@ -310,6 +311,8 @@ void WebMediaPlayerImpl::seek(double seconds) { |
DVLOG(1) << __FUNCTION__ << "(" << seconds << ")"; |
DCHECK(main_task_runner_->BelongsToCurrentThread()); |
+ ended_ = false; |
+ |
if (ready_state_ > WebMediaPlayer::ReadyStateHaveMetadata) |
SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); |
@@ -443,6 +446,15 @@ double WebMediaPlayerImpl::timelineOffset() const { |
double WebMediaPlayerImpl::currentTime() const { |
DCHECK(main_task_runner_->BelongsToCurrentThread()); |
+ |
+ if (ready_state_ == WebMediaPlayer::ReadyStateHaveNothing) |
acolwell GONE FROM CHROMIUM
2014/09/02 22:33:21
nit: I'd really prefer to see this logic in Blink
scherkus (not reviewing)
2014/09/02 23:43:57
Yeah I thought about some more while driving. Agre
|
+ return 0.0; |
+ |
+ // TODO(scherkus): Replace with an explicit ended signal to HTMLMediaElement, |
+ // see http://crbug.com/409280 |
+ if (ended_) |
+ return duration(); |
+ |
return (paused_ ? paused_time_ : pipeline_.GetMediaTime()).InSecondsF(); |
} |
@@ -698,6 +710,12 @@ void WebMediaPlayerImpl::OnPipelineSeeked(bool time_changed, |
void WebMediaPlayerImpl::OnPipelineEnded() { |
DVLOG(1) << __FUNCTION__; |
DCHECK(main_task_runner_->BelongsToCurrentThread()); |
+ |
+ // Ignore state changes until we've completed all outstanding seeks. |
+ if (seeking_ || pending_seek_) |
+ return; |
+ |
+ ended_ = true; |
client_->timeChanged(); |
} |