Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(362)

Unified Diff: webkit/media/buffered_resource_loader.cc

Issue 8667002: Split a portion of BufferedResourceLoader into a separate class ActiveLoader. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src
Patch Set: Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..be330aff6426876f996511c3456b7a61619c9fd2 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,7 @@ BufferedResourceLoader::BufferedResourceLoader(
read_buffer_(NULL),
first_offset_(0),
last_offset_(0),
- keep_test_loader_(false),
+ test_loader_(NULL),
bitrate_(bitrate),
playback_rate_(playback_rate),
media_log_(media_log) {
@@ -134,10 +131,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 +152,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 +170,22 @@ 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_) {
+ loader = test_loader_;
+ test_loader_ = NULL;
+ } 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,16 +202,8 @@ 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,
@@ -292,9 +279,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 +311,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_ = test_loader;
}
/////////////////////////////////////////////////////////////////////////////
@@ -371,6 +355,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 +393,6 @@ void BufferedResourceLoader::didReceiveResponse(
if (error != net::OK) {
DoneStart(error);
- Stop();
return;
}
} else {
@@ -436,8 +420,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,9 +468,8 @@ void BufferedResourceLoader::didFinishLoading(
WebURLLoader* loader,
double finishTime) {
VLOG(1) << "didFinishLoading";
-
- DCHECK(!completed_);
- completed_ = true;
+ DCHECK(active_loader_.get());
+ active_loader_.reset();
// If we didn't know the |instance_size_| we do now.
if (instance_size_ == kPositionNotSpecified) {
@@ -517,35 +499,27 @@ void BufferedResourceLoader::didFinishLoading(
// 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());
+ active_loader_.reset();
- DCHECK(!completed_);
- completed_ = true;
+ NotifyNetworkEvent();
- // If there is a start callback, calls it.
+ // Don't leave start callbacks hanging around.
if (start_callback_.get()) {
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 +568,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 +604,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 +633,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 +645,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 +656,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 +669,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 +735,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 +745,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() {

Powered by Google App Engine
This is Rietveld 408576698