diff options
author | vrk@google.com <vrk@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-20 23:42:21 +0000 |
---|---|---|
committer | vrk@google.com <vrk@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-20 23:42:21 +0000 |
commit | 929ee6479d6016026bc35bc3ecee26d08bbba19b (patch) | |
tree | 2eb78d955de7280799343419548805419f87a112 /webkit | |
parent | 0cfea58dc67d34b7c7781613e13ddbea413c23a1 (diff) | |
download | chromium_src-929ee6479d6016026bc35bc3ecee26d08bbba19b.zip chromium_src-929ee6479d6016026bc35bc3ecee26d08bbba19b.tar.gz chromium_src-929ee6479d6016026bc35bc3ecee26d08bbba19b.tar.bz2 |
Fire canplaythrough as soon as download defers to fix autoplay
Reenables delayed firing of canplaythrough for media elements, and fixes
the bug that had been introduced where a video with autoplay=true sometimes
never starts. With this change, a video with autoplay=true should always
(though not necessarily immediately) start playback on its own.
BUG=106480,73609
TEST=media_unitests, manually checking video files in various conditions
Review URL: https://chromiumcodereview.appspot.com/9113023
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@118546 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit')
-rw-r--r-- | webkit/media/buffered_data_source.cc | 19 | ||||
-rw-r--r-- | webkit/media/buffered_data_source_unittest.cc | 38 | ||||
-rw-r--r-- | webkit/media/webmediaplayer_impl.cc | 13 |
3 files changed, 42 insertions, 28 deletions
diff --git a/webkit/media/buffered_data_source.cc b/webkit/media/buffered_data_source.cc index 8537073..1b9eecf 100644 --- a/webkit/media/buffered_data_source.cc +++ b/webkit/media/buffered_data_source.cc @@ -552,11 +552,10 @@ void BufferedDataSource::ReadCallback(int error) { // before. Update the total size so Read()s past the end of the file will // fail like they would if we had known the file size at the beginning. total_bytes_ = loader_->instance_size(); + if (total_bytes_ != kPositionNotSpecified) + buffered_bytes_ = total_bytes_; - if (host() && total_bytes_ != kPositionNotSpecified) { - host()->SetTotalBytes(total_bytes_); - host()->SetBufferedBytes(total_bytes_); - } + UpdateHostState_Locked(); } DoneRead_Locked(error); } @@ -589,15 +588,10 @@ void BufferedDataSource::NetworkEventCallback() { if (stop_signal_received_) return; - if (is_downloading_data != is_downloading_data_) { - is_downloading_data_ = is_downloading_data; - if (host()) - host()->SetNetworkActivity(is_downloading_data); - } - + is_downloading_data_ = is_downloading_data; buffered_bytes_ = buffered_position + 1; - if (host()) - host()->SetBufferedBytes(buffered_bytes_); + + UpdateHostState_Locked(); } void BufferedDataSource::UpdateHostState_Locked() { @@ -609,6 +603,7 @@ void BufferedDataSource::UpdateHostState_Locked() { if (total_bytes_ != kPositionNotSpecified) host()->SetTotalBytes(total_bytes_); + host()->SetNetworkActivity(is_downloading_data_); host()->SetBufferedBytes(buffered_bytes_); } diff --git a/webkit/media/buffered_data_source_unittest.cc b/webkit/media/buffered_data_source_unittest.cc index 6680633..d371a8a 100644 --- a/webkit/media/buffered_data_source_unittest.cc +++ b/webkit/media/buffered_data_source_unittest.cc @@ -16,8 +16,8 @@ using ::testing::_; using ::testing::Assign; +using ::testing::AtLeast; using ::testing::Invoke; -using ::testing::StrictMock; using ::testing::NiceMock; using WebKit::WebFrame; @@ -83,7 +83,6 @@ class BufferedDataSourceTest : public testing::Test { data_source_ = new MockBufferedDataSource(message_loop_, view_->mainFrame()); - data_source_->set_host(&host_); } virtual ~BufferedDataSourceTest() { @@ -91,6 +90,13 @@ class BufferedDataSourceTest : public testing::Test { } void Initialize(media::PipelineStatus expected) { + Initialize(expected, true); + } + + void Initialize(media::PipelineStatus expected, bool set_host) { + if (set_host) + data_source_->set_host(&host_); + ExpectCreateResourceLoader(); data_source_->Initialize(response_generator_.gurl(), media::NewExpectedStatusCB(expected)); @@ -101,8 +107,10 @@ class BufferedDataSourceTest : public testing::Test { void InitializeWith206Response() { Initialize(media::PIPELINE_OK); - EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length())); - EXPECT_CALL(host_, SetBufferedBytes(0)); + EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length())) + .Times(AtLeast(1)); + EXPECT_CALL(host_, SetBufferedBytes(0)) + .Times(AtLeast(1)); Respond(response_generator_.Generate206(0)); } @@ -176,7 +184,7 @@ class BufferedDataSourceTest : public testing::Test { MockWebFrameClient client_; WebView* view_; - StrictMock<media::MockDataSourceHost> host_; + NiceMock<media::MockDataSourceHost> host_; MessageLoop* message_loop_; private: @@ -439,8 +447,10 @@ TEST_F(BufferedDataSourceTest, Read) { ReadAt(0); // When the read completes we'll update our network status. - EXPECT_CALL(host_, SetBufferedBytes(kDataSize)); - EXPECT_CALL(host_, SetNetworkActivity(true)); + EXPECT_CALL(host_, SetBufferedBytes(kDataSize)) + .Times(AtLeast(1)); + EXPECT_CALL(host_, SetNetworkActivity(true)) + .Times(AtLeast(1)); EXPECT_CALL(*this, ReadCallback(kDataSize)); FinishRead(); @@ -452,4 +462,18 @@ TEST_F(BufferedDataSourceTest, Read) { Stop(); } +// Make sure information regarding loaded data propogates to the host even if it +// gets initialized before the host is set. +TEST_F(BufferedDataSourceTest, HostSetAfterResponse) { + Initialize(media::PIPELINE_OK, false); + Respond(response_generator_.Generate206(0)); + + EXPECT_CALL(host_, SetNetworkActivity(_)); + EXPECT_CALL(host_, SetTotalBytes(_)); + EXPECT_CALL(host_, SetBufferedBytes(_)); + data_source_->set_host(&host_); + + Stop(); +} + } // namespace webkit_media diff --git a/webkit/media/webmediaplayer_impl.cc b/webkit/media/webmediaplayer_impl.cc index 011e630..1432dba 100644 --- a/webkit/media/webmediaplayer_impl.cc +++ b/webkit/media/webmediaplayer_impl.cc @@ -701,10 +701,7 @@ void WebMediaPlayerImpl::OnPipelineInitialize(PipelineStatus status) { SetNetworkState(WebKit::WebMediaPlayer::Loaded); SetReadyState(WebKit::WebMediaPlayer::HaveMetadata); - // Fire canplaythrough immediately after playback begins because of - // crbug.com/106480. - // TODO(vrk): set ready state to HaveFutureData when bug above is fixed. - SetReadyState(WebKit::WebMediaPlayer::HaveEnoughData); + SetReadyState(WebKit::WebMediaPlayer::HaveFutureData); } else { // TODO(hclam): should use |status| to determine the state // properly and reports error using MediaError. @@ -790,13 +787,11 @@ void WebMediaPlayerImpl::OnNetworkEvent(NetworkEvent type) { SetNetworkState(WebKit::WebMediaPlayer::Loading); break; case media::DOWNLOAD_PAUSED: - SetNetworkState(WebKit::WebMediaPlayer::Idle); + if (!pipeline_->IsLocalSource()) + SetNetworkState(WebKit::WebMediaPlayer::Idle); break; case media::CAN_PLAY_THROUGH: - // Temporarily disable delayed firing of CAN_PLAY_THROUGH due to - // crbug.com/106480. - // TODO(vrk): uncomment code below when bug above is fixed. - // SetReadyState(WebKit::WebMediaPlayer::HaveEnoughData); + SetReadyState(WebKit::WebMediaPlayer::HaveEnoughData); break; default: NOTREACHED(); |