| Index: chrome/browser/chromeos/drive/job_scheduler.cc
|
| diff --git a/chrome/browser/chromeos/drive/job_scheduler.cc b/chrome/browser/chromeos/drive/job_scheduler.cc
|
| index a6507a90071d2577687299b91c894e9cf1ca165e..f305e0c0f6e0cf0738848bfb6264537ce9ef65cb 100644
|
| --- a/chrome/browser/chromeos/drive/job_scheduler.cc
|
| +++ b/chrome/browser/chromeos/drive/job_scheduler.cc
|
| @@ -91,6 +91,34 @@ google_apis::CancelCallback RunResumeUploadFile(
|
| params.progress_callback);
|
| }
|
|
|
| +// Helper for CreateErrorRunCallback.
|
| +template<typename P1>
|
| +struct CreateErrorRunCallbackHelper {
|
| + static void Run(
|
| + const base::Callback<void(google_apis::GDataErrorCode, P1)>& callback,
|
| + google_apis::GDataErrorCode error) {
|
| + callback.Run(error, P1());
|
| + }
|
| +};
|
| +
|
| +template<typename P1>
|
| +struct CreateErrorRunCallbackHelper<const P1&> {
|
| + static void Run(
|
| + const base::Callback<void(google_apis::GDataErrorCode,
|
| + const P1&)>& callback,
|
| + google_apis::GDataErrorCode error) {
|
| + callback.Run(error, P1());
|
| + }
|
| +};
|
| +
|
| +// Returns a callback with the tail parameter bound to its default value.
|
| +// In other words, returned_callback.Run(error) runs callback.Run(error, T()).
|
| +template<typename P1>
|
| +base::Callback<void(google_apis::GDataErrorCode)> CreateErrorRunCallback(
|
| + const base::Callback<void(google_apis::GDataErrorCode, P1)>& callback) {
|
| + return base::Bind(&CreateErrorRunCallbackHelper<P1>::Run, callback);
|
| +}
|
| +
|
| } // namespace
|
|
|
| const int JobScheduler::kMaxJobCount[] = {
|
| @@ -165,9 +193,17 @@ void JobScheduler::CancelJob(JobID job_id) {
|
|
|
| JobEntry* job = job_map_.Lookup(job_id);
|
| if (job) {
|
| - // TODO(kinaba): crbug.com/251116 Support cancelling jobs not yet started.
|
| - if (!job->cancel_callback.is_null())
|
| + if (!job->cancel_callback.is_null()) {
|
| + // Non null |cancel_callback| means the corresponding HTTP request is
|
| + // in-flight. Cancel the request by calling the callback, and wait for
|
| + // its termination in the normal callback handling.
|
| job->cancel_callback.Run();
|
| + } else {
|
| + base::Callback<void(google_apis::GDataErrorCode)> callback = job->abort;
|
| + queue_[GetJobQueueType(job->job_info.job_type)]->Remove(job_id);
|
| + job_map_.Remove(job_id);
|
| + callback.Run(google_apis::GDATA_CANCELLED);
|
| + }
|
| }
|
| }
|
|
|
| @@ -193,6 +229,7 @@ void JobScheduler::GetAboutResource(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -209,6 +246,7 @@ void JobScheduler::GetAppList(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -225,6 +263,7 @@ void JobScheduler::GetAllResourceList(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -244,6 +283,7 @@ void JobScheduler::GetResourceListInDirectory(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -262,6 +302,7 @@ void JobScheduler::Search(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -280,6 +321,7 @@ void JobScheduler::GetChangeList(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -298,6 +340,7 @@ void JobScheduler::ContinueGetResourceList(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -318,6 +361,7 @@ void JobScheduler::GetResourceEntry(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -337,6 +381,7 @@ void JobScheduler::DeleteResource(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort = callback;
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -359,6 +404,7 @@ void JobScheduler::CopyResource(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -379,6 +425,7 @@ void JobScheduler::CopyHostedDocument(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -399,6 +446,7 @@ void JobScheduler::RenameResource(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort = callback;
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -421,6 +469,7 @@ void JobScheduler::TouchResource(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -441,6 +490,7 @@ void JobScheduler::AddResourceToDirectory(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort = callback;
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -460,6 +510,7 @@ void JobScheduler::RemoveResourceFromDirectory(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort = callback;
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -479,6 +530,7 @@ void JobScheduler::AddNewDirectory(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -507,7 +559,7 @@ JobID JobScheduler::DownloadFile(
|
| base::Bind(&JobScheduler::UpdateProgress,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id));
|
| -
|
| + new_job->abort = CreateErrorRunCallback(download_action_callback);
|
| StartJob(new_job);
|
| return new_job->job_info.job_id;
|
| }
|
| @@ -545,7 +597,7 @@ void JobScheduler::UploadNewFile(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id);
|
| new_job->task = base::Bind(&RunUploadNewFile, uploader_.get(), params);
|
| -
|
| + new_job->abort = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -582,7 +634,7 @@ void JobScheduler::UploadExistingFile(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id);
|
| new_job->task = base::Bind(&RunUploadExistingFile, uploader_.get(), params);
|
| -
|
| + new_job->abort = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -619,7 +671,7 @@ void JobScheduler::CreateFile(
|
| params.progress_callback = google_apis::ProgressCallback();
|
|
|
| new_job->task = base::Bind(&RunUploadNewFile, uploader_.get(), params);
|
| -
|
| + new_job->abort = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
|
|