| 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 ec7a62dc34d8ebbea8135a2a4c8eba440c8db312..855d637b2bdd31d6174afb186aab8f36516100b5 100644
|
| --- a/chrome/browser/chromeos/drive/job_scheduler.cc
|
| +++ b/chrome/browser/chromeos/drive/job_scheduler.cc
|
| @@ -89,6 +89,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[] = {
|
| @@ -163,9 +191,20 @@ 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())
|
| - job->cancel_callback.Run();
|
| + if (job->job_info.state == STATE_RUNNING) {
|
| + // If the job is running an HTTP request, cancel it via |cancel_callback|
|
| + // returned from the request, and wait for termination in the normal
|
| + // callback handler, OnJobDone.
|
| + if (!job->cancel_callback.is_null())
|
| + job->cancel_callback.Run();
|
| + } else {
|
| + // Otherwise, just remove from the queue and calls back to the client.
|
| + base::Callback<void(google_apis::GDataErrorCode)> callback =
|
| + job->abort_callback;
|
| + queue_[GetJobQueueType(job->job_info.job_type)]->Remove(job_id);
|
| + job_map_.Remove(job_id);
|
| + callback.Run(google_apis::GDATA_CANCELLED);
|
| + }
|
| }
|
| }
|
|
|
| @@ -191,6 +230,7 @@ void JobScheduler::GetAboutResource(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort_callback = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -207,6 +247,7 @@ void JobScheduler::GetAppList(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort_callback = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -223,6 +264,7 @@ void JobScheduler::GetAllResourceList(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort_callback = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -242,6 +284,7 @@ void JobScheduler::GetResourceListInDirectory(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort_callback = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -260,6 +303,7 @@ void JobScheduler::Search(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort_callback = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -278,6 +322,7 @@ void JobScheduler::GetChangeList(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort_callback = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -296,6 +341,7 @@ void JobScheduler::ContinueGetResourceList(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort_callback = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -316,6 +362,7 @@ void JobScheduler::GetResourceEntry(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort_callback = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -335,6 +382,7 @@ void JobScheduler::DeleteResource(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort_callback = callback;
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -357,6 +405,7 @@ void JobScheduler::CopyResource(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort_callback = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -377,6 +426,7 @@ void JobScheduler::CopyHostedDocument(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort_callback = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -397,6 +447,7 @@ void JobScheduler::RenameResource(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort_callback = callback;
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -419,6 +470,7 @@ void JobScheduler::TouchResource(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort_callback = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -439,6 +491,7 @@ void JobScheduler::AddResourceToDirectory(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort_callback = callback;
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -458,6 +511,7 @@ void JobScheduler::RemoveResourceFromDirectory(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort_callback = callback;
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -477,6 +531,7 @@ void JobScheduler::AddNewDirectory(
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id,
|
| callback));
|
| + new_job->abort_callback = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -505,7 +560,7 @@ JobID JobScheduler::DownloadFile(
|
| base::Bind(&JobScheduler::UpdateProgress,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| new_job->job_info.job_id));
|
| -
|
| + new_job->abort_callback = CreateErrorRunCallback(download_action_callback);
|
| StartJob(new_job);
|
| return new_job->job_info.job_id;
|
| }
|
| @@ -543,7 +598,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_callback = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -580,7 +635,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_callback = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
| @@ -617,7 +672,7 @@ void JobScheduler::CreateFile(
|
| params.progress_callback = google_apis::ProgressCallback();
|
|
|
| new_job->task = base::Bind(&RunUploadNewFile, uploader_.get(), params);
|
| -
|
| + new_job->abort_callback = CreateErrorRunCallback(callback);
|
| StartJob(new_job);
|
| }
|
|
|
|
|