Commit 6e50a4b4 authored by hubbe's avatar hubbe Committed by Commit bot

Fix MultibufferDataSource::GetSize

When file loading is finished ResourceMultiBufferDataProvider count
DataBuffer queue size twice, so GetSize returned incorrect value.

BUG=625515, 627525, 624853

patch from issue 2110853006 at patchset 1 (http://crrev.com/2110853006#ps1)

Review-Url: https://codereview.chromium.org/2133803004
Cr-Commit-Position: refs/heads/master@{#405242}
parent 0c9dabff
......@@ -9,6 +9,7 @@
#include "base/macros.h"
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "base/strings/string_number_conversions.h"
#include "media/base/media_log.h"
#include "media/base/mock_filters.h"
#include "media/base/test_helpers.h"
......@@ -1425,4 +1426,26 @@ TEST_F(MultibufferDataSourceTest, LengthKnownAtEOF) {
Stop();
}
TEST_F(MultibufferDataSourceTest, FileSizeLessThanBlockSize) {
Initialize(kHttpUrl, true);
GURL gurl(kHttpUrl);
blink::WebURLResponse response(gurl);
response.setHTTPStatusCode(200);
response.setHTTPHeaderField(
WebString::fromUTF8("Content-Length"),
WebString::fromUTF8(base::Int64ToString(kDataSize / 2)));
response.setExpectedContentLength(kDataSize / 2);
Respond(response);
EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize / 2));
EXPECT_CALL(host_, SetTotalBytes(kDataSize / 2));
EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 2));
ReceiveData(kDataSize / 2);
FinishLoading();
int64_t len = 0;
EXPECT_TRUE(data_source_->GetSize(&len));
EXPECT_EQ(kDataSize / 2, len);
Stop();
}
} // namespace media
......@@ -72,8 +72,11 @@ void ResourceMultiBufferDataProvider::Start() {
request.setRequestContext(WebURLRequest::RequestContextVideo);
DVLOG(1) << __FUNCTION__ << " @ " << byte_pos();
if (url_data_->length() > 0) {
DCHECK_LT(byte_pos(), url_data_->length()) << " " << url_data_->url();
if (url_data_->length() > 0 && byte_pos() >= url_data_->length()) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::Bind(&ResourceMultiBufferDataProvider::Terminate,
weak_factory_.GetWeakPtr()));
return;
}
request.setHTTPHeaderField(
......@@ -403,8 +406,6 @@ void ResourceMultiBufferDataProvider::didFinishLoading(
// If we didn't know the |instance_size_| we do now.
int64_t size = byte_pos();
if (!fifo_.empty())
size += fifo_.back()->data_size();
// This request reports something smaller than what we've seen in the past,
// Maybe it's transient error?
......@@ -501,6 +502,11 @@ bool ResourceMultiBufferDataProvider::ParseContentRange(
return true;
}
void ResourceMultiBufferDataProvider::Terminate() {
fifo_.push_back(DataBuffer::CreateEOSBuffer());
url_data_->multibuffer()->OnDataProviderEvent(this);
}
int64_t ResourceMultiBufferDataProvider::byte_pos() const {
int64_t ret = pos_;
ret += fifo_.size();
......
......@@ -75,6 +75,9 @@ class MEDIA_BLINK_EXPORT ResourceMultiBufferDataProvider
friend class ResourceMultiBufferDataProviderTest;
friend class MockBufferedDataSource;
// Callback used when we're asked to fetch data after the end of the file.
void Terminate();
// Parse a Content-Range header into its component pieces and return true if
// each of the expected elements was found & parsed correctly.
// |*instance_size| may be set to kPositionNotSpecified if the range ends in
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment