Index: webkit/media/buffered_resource_loader.cc |
diff --git a/webkit/media/buffered_resource_loader.cc b/webkit/media/buffered_resource_loader.cc |
index b571dbc108408ce01ead35bbee58e981eae0739f..16144e7d8b171548f21e6aef90c996c9c6a405c2 100644 |
--- a/webkit/media/buffered_resource_loader.cc |
+++ b/webkit/media/buffered_resource_loader.cc |
@@ -93,7 +93,6 @@ static void ComputeTargetBufferWindow(float playback_rate, int bitrate, |
std::swap(*out_forward_capacity, *out_backward_capacity); |
} |
- |
BufferedResourceLoader::BufferedResourceLoader( |
const GURL& url, |
int64 first_byte_position, |
@@ -102,9 +101,7 @@ BufferedResourceLoader::BufferedResourceLoader( |
int bitrate, |
float playback_rate, |
media::MediaLog* media_log) |
- : deferred_(false), |
- defer_strategy_(strategy), |
- completed_(false), |
+ : defer_strategy_(strategy), |
range_requested_(false), |
range_supported_(false), |
saved_forward_capacity_(0), |
@@ -122,7 +119,6 @@ BufferedResourceLoader::BufferedResourceLoader( |
read_buffer_(NULL), |
first_offset_(0), |
last_offset_(0), |
- keep_test_loader_(false), |
bitrate_(bitrate), |
playback_rate_(playback_rate), |
media_log_(media_log) { |
@@ -134,10 +130,7 @@ BufferedResourceLoader::BufferedResourceLoader( |
buffer_.reset(new media::SeekableBuffer(backward_capacity, forward_capacity)); |
} |
-BufferedResourceLoader::~BufferedResourceLoader() { |
- if (!completed_ && url_loader_.get()) |
- url_loader_->cancel(); |
-} |
+BufferedResourceLoader::~BufferedResourceLoader() {} |
void BufferedResourceLoader::Start(net::OldCompletionCallback* start_callback, |
const base::Closure& event_callback, |
@@ -158,10 +151,6 @@ void BufferedResourceLoader::Start(net::OldCompletionCallback* start_callback, |
offset_ = first_byte_position_; |
} |
- // Increment the reference count right before we start the request. This |
- // reference will be release when this request has ended. |
- AddRef(); |
- |
// Prepare the request. |
WebURLRequest request(url_); |
request.setTargetType(WebURLRequest::TargetIsMedia); |
@@ -180,17 +169,21 @@ void BufferedResourceLoader::Start(net::OldCompletionCallback* start_callback, |
WebString::fromUTF8(net::HttpRequestHeaders::kAcceptEncoding), |
WebString::fromUTF8("identity;q=1, *;q=0")); |
- // This flag is for unittests as we don't want to reset |url_loader| |
- if (!keep_test_loader_) { |
+ // Check for our test WebURLLoader. |
+ WebURLLoader* loader = NULL; |
+ if (test_loader_.get()) { |
+ loader = test_loader_.release(); |
+ } else { |
WebURLLoaderOptions options; |
options.allowCredentials = true; |
options.crossOriginRequestPolicy = |
WebURLLoaderOptions::CrossOriginRequestPolicyAllow; |
- url_loader_.reset(frame->createAssociatedURLLoader(options)); |
+ loader = frame->createAssociatedURLLoader(options); |
} |
// Start the resource loading. |
- url_loader_->loadAsynchronously(request, this); |
+ loader->loadAsynchronously(request, this); |
+ active_loader_.reset(new ActiveLoader(this, loader)); |
} |
void BufferedResourceLoader::Stop() { |
@@ -207,22 +200,15 @@ void BufferedResourceLoader::Stop() { |
// Destroy internal buffer. |
buffer_.reset(); |
- if (url_loader_.get()) { |
- if (deferred_) |
- url_loader_->setDefersLoading(false); |
- deferred_ = false; |
- |
- if (!completed_) { |
- url_loader_->cancel(); |
- completed_ = true; |
- } |
- } |
+ // Cancel and reset any active loaders. |
+ active_loader_.reset(); |
} |
void BufferedResourceLoader::Read(int64 position, |
int read_size, |
uint8* buffer, |
net::OldCompletionCallback* read_callback) { |
+ DCHECK(!start_callback_.get()); |
DCHECK(!read_callback_.get()); |
DCHECK(buffer_.get()); |
DCHECK(read_callback); |
@@ -292,9 +278,7 @@ void BufferedResourceLoader::Read(int64 position, |
} |
// Make sure we stop deferring now that there's additional capacity. |
- // |
- // XXX: can we DCHECK(url_loader_.get()) at this point in time? |
- if (deferred_) |
+ if (active_loader_->deferred()) |
SetDeferred(false); |
DCHECK(!ShouldEnableDefer()) |
@@ -326,16 +310,15 @@ bool BufferedResourceLoader::range_supported() { |
} |
bool BufferedResourceLoader::is_downloading_data() { |
- return !completed_ && !deferred_; |
+ return active_loader_.get() && !active_loader_->deferred(); |
} |
const GURL& BufferedResourceLoader::url() { |
return url_; |
} |
-void BufferedResourceLoader::SetURLLoaderForTest(WebURLLoader* mock_loader) { |
- url_loader_.reset(mock_loader); |
- keep_test_loader_ = true; |
+void BufferedResourceLoader::SetURLLoaderForTest(WebURLLoader* test_loader) { |
+ test_loader_.reset(test_loader); |
} |
///////////////////////////////////////////////////////////////////////////// |
@@ -371,6 +354,7 @@ void BufferedResourceLoader::didReceiveResponse( |
WebURLLoader* loader, |
const WebURLResponse& response) { |
VLOG(1) << "didReceiveResponse: " << response.httpStatusCode(); |
+ DCHECK(active_loader_.get()); |
// The loader may have been stopped and |start_callback| is destroyed. |
// In this case we shouldn't do anything. |
@@ -408,7 +392,6 @@ void BufferedResourceLoader::didReceiveResponse( |
if (error != net::OK) { |
DoneStart(error); |
- Stop(); |
return; |
} |
} else { |
@@ -436,8 +419,7 @@ void BufferedResourceLoader::didReceiveData( |
int data_length, |
int encoded_data_length) { |
VLOG(1) << "didReceiveData: " << data_length << " bytes"; |
- |
- DCHECK(!completed_); |
+ DCHECK(active_loader_.get()); |
DCHECK_GT(data_length, 0); |
// If this loader has been stopped, |buffer_| would be destroyed. |
@@ -485,21 +467,26 @@ void BufferedResourceLoader::didFinishLoading( |
WebURLLoader* loader, |
double finishTime) { |
VLOG(1) << "didFinishLoading"; |
+ DCHECK(active_loader_.get()); |
- DCHECK(!completed_); |
- completed_ = true; |
+ // We're done with the loader. |
+ active_loader_.reset(); |
+ NotifyNetworkEvent(); |
// If we didn't know the |instance_size_| we do now. |
if (instance_size_ == kPositionNotSpecified) { |
instance_size_ = offset_ + buffer_->forward_bytes(); |
} |
- // If there is a start callback, calls it. |
+ // If there is a start callback, call it. |
if (start_callback_.get()) { |
+ DCHECK(read_callback_.get()) |
+ << "Shouldn't have a read callback during start"; |
DoneStart(net::OK); |
+ return; |
} |
- // If there is a pending read but the request has ended, returns with what |
+ // If there is a pending read but the request has ended, return with what |
// we have. |
if (HasPendingRead()) { |
// Make sure we have a valid buffer before we satisfy a read request. |
@@ -514,38 +501,30 @@ void BufferedResourceLoader::didFinishLoading( |
// There must not be any outstanding read request. |
DCHECK(!HasPendingRead()); |
- |
- // Notify that network response is completed. |
- NotifyNetworkEvent(); |
- |
- url_loader_.reset(); |
- Release(); |
} |
void BufferedResourceLoader::didFail( |
WebURLLoader* loader, |
const WebURLError& error) { |
VLOG(1) << "didFail: " << error.reason; |
+ DCHECK(active_loader_.get()); |
- DCHECK(!completed_); |
- completed_ = true; |
+ // We don't need to continue loading after failure. |
+ active_loader_->Cancel(); |
+ NotifyNetworkEvent(); |
- // If there is a start callback, calls it. |
+ // Don't leave start callbacks hanging around. |
if (start_callback_.get()) { |
+ DCHECK(read_callback_.get()) |
+ << "Shouldn't have a read callback during start"; |
DoneStart(error.reason); |
+ return; |
} |
- // If there is a pending read but the request failed, return with the |
- // reason for the error. |
+ // Don't leave read callbacks hanging around. |
if (HasPendingRead()) { |
DoneRead(error.reason); |
} |
- |
- // Notify that network response is completed. |
- NotifyNetworkEvent(); |
- |
- url_loader_.reset(); |
- Release(); |
} |
bool BufferedResourceLoader::HasSingleOrigin() const { |
@@ -594,26 +573,23 @@ void BufferedResourceLoader::UpdateBufferWindow() { |
} |
void BufferedResourceLoader::UpdateDeferBehavior() { |
- if (!url_loader_.get() || !buffer_.get()) |
+ if (!active_loader_.get() || !buffer_.get()) |
return; |
// If necessary, toggle defer state and continue/pause downloading data |
// accordingly. |
if (ShouldEnableDefer() || ShouldDisableDefer()) |
- SetDeferred(!deferred_); |
+ SetDeferred(!active_loader_->deferred()); |
} |
void BufferedResourceLoader::SetDeferred(bool deferred) { |
- deferred_ = deferred; |
- if (url_loader_.get()) { |
- url_loader_->setDefersLoading(deferred); |
- NotifyNetworkEvent(); |
- } |
+ active_loader_->SetDeferred(deferred); |
+ NotifyNetworkEvent(); |
} |
-bool BufferedResourceLoader::ShouldEnableDefer() { |
+bool BufferedResourceLoader::ShouldEnableDefer() const { |
// If we're already deferring, then enabling makes no sense. |
- if (deferred_) |
+ if (active_loader_->deferred()) |
return false; |
switch(defer_strategy_) { |
@@ -633,9 +609,9 @@ bool BufferedResourceLoader::ShouldEnableDefer() { |
return false; |
} |
-bool BufferedResourceLoader::ShouldDisableDefer() { |
+bool BufferedResourceLoader::ShouldDisableDefer() const { |
// If we're not deferring, then disabling makes no sense. |
- if (!deferred_) |
+ if (!active_loader_->deferred()) |
return false; |
switch(defer_strategy_) { |
@@ -662,7 +638,7 @@ bool BufferedResourceLoader::ShouldDisableDefer() { |
return false; |
} |
-bool BufferedResourceLoader::CanFulfillRead() { |
+bool BufferedResourceLoader::CanFulfillRead() const { |
// If we are reading too far in the backward direction. |
if (first_offset_ < 0 && |
first_offset_ + static_cast<int>(buffer_->backward_bytes()) < 0) |
@@ -674,7 +650,7 @@ bool BufferedResourceLoader::CanFulfillRead() { |
// At the point, we verified that first byte requested is within the buffer. |
// If the request has completed, then just returns with what we have now. |
- if (completed_) |
+ if (!active_loader_.get()) |
return true; |
// If the resource request is still active, make sure the whole requested |
@@ -685,7 +661,7 @@ bool BufferedResourceLoader::CanFulfillRead() { |
return true; |
} |
-bool BufferedResourceLoader::WillFulfillRead() { |
+bool BufferedResourceLoader::WillFulfillRead() const { |
// Trying to read too far behind. |
if (first_offset_ < 0 && |
first_offset_ + static_cast<int>(buffer_->backward_bytes()) < 0) |
@@ -698,7 +674,7 @@ bool BufferedResourceLoader::WillFulfillRead() { |
// The resource request has completed, there's no way we can fulfill the |
// read request. |
- if (completed_) |
+ if (!active_loader_.get()) |
return false; |
return true; |
@@ -764,8 +740,6 @@ std::string BufferedResourceLoader::GenerateHeaders( |
} |
void BufferedResourceLoader::DoneRead(int error) { |
- read_callback_->RunWithParams(Tuple1<int>(error)); |
- read_callback_.reset(); |
if (buffer_.get() && saved_forward_capacity_) { |
buffer_->set_forward_capacity(saved_forward_capacity_); |
saved_forward_capacity_ = 0; |
@@ -776,11 +750,16 @@ void BufferedResourceLoader::DoneRead(int error) { |
first_offset_ = 0; |
last_offset_ = 0; |
Log(); |
+ |
+ scoped_ptr<net::OldCompletionCallback> read_callback; |
+ read_callback.swap(read_callback_); |
+ read_callback->RunWithParams(Tuple1<int>(error)); |
} |
void BufferedResourceLoader::DoneStart(int error) { |
- start_callback_->RunWithParams(Tuple1<int>(error)); |
- start_callback_.reset(); |
+ scoped_ptr<net::OldCompletionCallback> start_callback; |
+ start_callback.swap(start_callback_); |
+ start_callback->RunWithParams(Tuple1<int>(error)); |
} |
void BufferedResourceLoader::NotifyNetworkEvent() { |