Chromium Code Reviews| Index: webkit/media/buffered_data_source.cc |
| diff --git a/webkit/media/buffered_data_source.cc b/webkit/media/buffered_data_source.cc |
| index 0aec84a95ed9ecb2f044e0fdbccfd36fed2213f6..4528761a1829492f88f85a03ff5c21ea26269793 100644 |
| --- a/webkit/media/buffered_data_source.cc |
| +++ b/webkit/media/buffered_data_source.cc |
| @@ -22,6 +22,11 @@ static const int kInitialReadBufferSize = 32768; |
| // error. |
| static const int kNumCacheMissRetries = 3; |
| +// Non-HTTP resources are assumed to be fully loaded so we ignore any |
| +// loading/progress related callbacks. |
|
scherkus (not reviewing)
2012/07/06 16:28:35
see http://codereview.chromium.org/10692106/ -- I
Ami GONE FROM CHROMIUM
2012/07/09 03:25:10
FTR, you mean https://chromiumcodereview.appspot.c
|
| +static void NonHttpLoadingCallback(BufferedResourceLoader::LoadingState) {} |
| +static void NonHttpProgressCallback(int64) {} |
| + |
| BufferedDataSource::BufferedDataSource( |
| MessageLoop* render_loop, |
| WebFrame* frame, |
| @@ -95,7 +100,8 @@ void BufferedDataSource::Initialize( |
| loader_.reset(CreateResourceLoader(0, kPositionNotSpecified)); |
| loader_->Start( |
| base::Bind(&BufferedDataSource::HttpInitialStartCallback, this), |
| - base::Bind(&BufferedDataSource::NetworkEventCallback, this), |
| + base::Bind(&BufferedDataSource::HttpLoadingCallback, this), |
| + base::Bind(&BufferedDataSource::HttpProgressCallback, this), |
| frame_); |
| return; |
| } |
| @@ -107,7 +113,8 @@ void BufferedDataSource::Initialize( |
| kPositionNotSpecified)); |
| loader_->Start( |
| base::Bind(&BufferedDataSource::NonHttpInitialStartCallback, this), |
| - base::Bind(&BufferedDataSource::NetworkEventCallback, this), |
| + base::Bind(&NonHttpLoadingCallback), |
| + base::Bind(&NonHttpProgressCallback), |
| frame_); |
| } |
| @@ -255,12 +262,22 @@ void BufferedDataSource::RestartLoadingTask() { |
| return; |
| } |
| + // Start reading from where we last left off until the end of the resource. |
| loader_.reset( |
| CreateResourceLoader(last_read_start_, kPositionNotSpecified)); |
| - loader_->Start( |
| - base::Bind(&BufferedDataSource::PartialReadStartCallback, this), |
| - base::Bind(&BufferedDataSource::NetworkEventCallback, this), |
| - frame_); |
| + if (url_.SchemeIs(kHttpScheme) || url_.SchemeIs(kHttpsScheme)) { |
| + loader_->Start( |
| + base::Bind(&BufferedDataSource::PartialReadStartCallback, this), |
| + base::Bind(&BufferedDataSource::HttpLoadingCallback, this), |
| + base::Bind(&BufferedDataSource::HttpProgressCallback, this), |
| + frame_); |
| + } else { |
| + loader_->Start( |
| + base::Bind(&BufferedDataSource::NonHttpInitialStartCallback, this), |
| + base::Bind(&NonHttpLoadingCallback), |
| + base::Bind(&NonHttpProgressCallback), |
| + frame_); |
| + } |
| } |
| void BufferedDataSource::SetPlaybackRateTask(float playback_rate) { |
| @@ -504,14 +521,8 @@ void BufferedDataSource::ReadCallback( |
| bytes_read = kReadError; |
| } |
| - // We need to prevent calling to filter host and running the callback if |
| - // we have received the stop signal. We need to lock down the whole callback |
| - // method to prevent bad things from happening. The reason behind this is |
| - // that we cannot guarantee tasks on render thread have completely stopped |
| - // when we receive the Stop() method call. So only way to solve this is to |
| - // let tasks on render thread to run but make sure they don't call outside |
| - // this object when Stop() method is ever called. Locking this method is safe |
| - // because |lock_| is only acquired in tasks on render thread. |
| + // TODO(scherkus): we shouldn't have to lock to signal host(), see |
| + // http://crbug.com/113712 for details. |
| base::AutoLock auto_lock(lock_); |
| if (stop_signal_received_) |
| return; |
| @@ -532,46 +543,58 @@ void BufferedDataSource::ReadCallback( |
| DoneRead_Locked(bytes_read); |
| } |
| -void BufferedDataSource::NetworkEventCallback() { |
| +void BufferedDataSource::HttpLoadingCallback( |
| + BufferedResourceLoader::LoadingState state) { |
| DCHECK(MessageLoop::current() == render_loop_); |
| - DCHECK(loader_.get()); |
| - |
| - // In case of non-HTTP request we don't need to report network events, |
| - // so return immediately. |
| - if (!url_.SchemeIs(kHttpScheme) && !url_.SchemeIs(kHttpsScheme)) |
| - return; |
| + DCHECK(url_.SchemeIs(kHttpScheme) || url_.SchemeIs(kHttpsScheme)); |
| - bool is_downloading_data = loader_->is_downloading_data(); |
| - int64 current_buffered_position = loader_->GetBufferedPosition(); |
| - |
| - // If we get an unspecified value, return immediately. |
| - if (current_buffered_position == kPositionNotSpecified) |
| - return; |
| - |
| - // We need to prevent calling to filter host and running the callback if |
| - // we have received the stop signal. We need to lock down the whole callback |
| - // method to prevent bad things from happening. The reason behind this is |
| - // that we cannot guarantee tasks on render thread have completely stopped |
| - // when we receive the Stop() method call. So only way to solve this is to |
| - // let tasks on render thread to run but make sure they don't call outside |
| - // this object when Stop() method is ever called. Locking this method is safe |
| - // because |lock_| is only acquired in tasks on render thread. |
| + // TODO(scherkus): we shouldn't have to lock to signal host(), see |
| + // http://crbug.com/113712 for details. |
| base::AutoLock auto_lock(lock_); |
| if (stop_signal_received_) |
| return; |
| + bool is_downloading_data; |
| + switch (state) { |
| + case BufferedResourceLoader::kLoading: |
| + is_downloading_data = true; |
| + break; |
| + case BufferedResourceLoader::kLoadingDeferred: |
| + is_downloading_data = false; |
| + break; |
| + |
| + // TODO(scherkus): we don't signal network activity changes when loads |
| + // complete or fail to preserve existing behaviour when deferring is |
| + // toggled, however SetNetworkActivity() should use a similar enum as there |
| + // isn't any signal today to notify the client that loading has |
| + // failed/finished (we only get errors on subsequent reads). |
| + case BufferedResourceLoader::kLoadingFailed: |
| + case BufferedResourceLoader::kLoadingFinished: |
| + return; |
| + } |
| + |
| if (is_downloading_data != is_downloading_data_) { |
| is_downloading_data_ = is_downloading_data; |
| if (host()) |
| host()->SetNetworkActivity(is_downloading_data); |
| } |
| +} |
| + |
| +void BufferedDataSource::HttpProgressCallback(int64 position) { |
| + DCHECK(MessageLoop::current() == render_loop_); |
| + DCHECK(url_.SchemeIs(kHttpScheme) || url_.SchemeIs(kHttpsScheme)); |
| + |
| + // TODO(scherkus): we shouldn't have to lock to signal host(), see |
| + // http://crbug.com/113712 for details. |
| + base::AutoLock auto_lock(lock_); |
| + if (stop_signal_received_) |
| + return; |
| - if (host() && current_buffered_position > last_read_start_) |
| - host()->AddBufferedByteRange(last_read_start_, current_buffered_position); |
| + if (host() && position > last_read_start_) |
| + host()->AddBufferedByteRange(last_read_start_, position); |
| } |
| void BufferedDataSource::UpdateHostState_Locked() { |
| - // Called from various threads, under lock. |
| lock_.AssertAcquired(); |
| if (!host()) |