summaryrefslogtreecommitdiffstats
path: root/webkit
diff options
context:
space:
mode:
authorvrk@google.com <vrk@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-20 23:42:21 +0000
committervrk@google.com <vrk@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-20 23:42:21 +0000
commit929ee6479d6016026bc35bc3ecee26d08bbba19b (patch)
tree2eb78d955de7280799343419548805419f87a112 /webkit
parent0cfea58dc67d34b7c7781613e13ddbea413c23a1 (diff)
downloadchromium_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.cc19
-rw-r--r--webkit/media/buffered_data_source_unittest.cc38
-rw-r--r--webkit/media/webmediaplayer_impl.cc13
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();