Index: content/browser/background_fetch/background_fetch_context.cc |
diff --git a/content/browser/background_fetch/background_fetch_context.cc b/content/browser/background_fetch/background_fetch_context.cc |
index 2fde2c68454d1fabccfca1805a53360911a1802a..256eb5a460c629275cb80ebc341f5dd906706ad0 100644 |
--- a/content/browser/background_fetch/background_fetch_context.cc |
+++ b/content/browser/background_fetch/background_fetch_context.cc |
@@ -8,7 +8,6 @@ |
#include "content/browser/background_fetch/background_fetch_request_info.h" |
#include "content/browser/service_worker/service_worker_context_wrapper.h" |
#include "content/public/browser/browser_context.h" |
-#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/download_manager.h" |
#include "content/public/browser/storage_partition.h" |
@@ -18,8 +17,9 @@ BackgroundFetchContext::BackgroundFetchContext( |
BrowserContext* browser_context, |
StoragePartition* storage_partition, |
const scoped_refptr<ServiceWorkerContextWrapper>& service_worker_context) |
- : service_worker_context_(service_worker_context), |
- background_fetch_job_controller_(browser_context, storage_partition), |
+ : browser_context_(browser_context), |
+ storage_partition_(storage_partition), |
+ service_worker_context_(service_worker_context), |
background_fetch_data_manager_(this) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
// TODO(harkness): BackgroundFetchContext should have |
@@ -39,18 +39,39 @@ void BackgroundFetchContext::Init() { |
void BackgroundFetchContext::Shutdown() { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ base::Bind(&BackgroundFetchContext::ShutdownOnIO, this)); |
+} |
+ |
+void BackgroundFetchContext::ShutdownOnIO() { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ |
+ // Call Shutdown on all pending job controllers to give them a chance to flush |
+ // any status to the DataManager. |
+ for (auto& job : job_map_) |
+ job.second->Shutdown(); |
} |
void BackgroundFetchContext::CreateRequest( |
const BackgroundFetchJobInfo& job_info, |
std::vector<BackgroundFetchRequestInfo>& request_infos) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
DCHECK_GE(1U, request_infos.size()); |
+ |
// Inform the data manager about the new download. |
- BackgroundFetchJobData* job_data = |
+ std::unique_ptr<BackgroundFetchJobData> job_data = |
background_fetch_data_manager_.CreateRequest(job_info, request_infos); |
+ |
// If job_data is null, the DataManager will have logged an error. |
- if (job_data) |
- background_fetch_job_controller_.ProcessJob(job_info.guid(), job_data); |
+ if (job_data) { |
+ // Create a controller which drives the processing of the job. It will use |
+ // the JobData to get information about individual requests for the job. |
+ job_map_[job_info.guid()] = base::MakeUnique<BackgroundFetchJobController>( |
+ job_info.guid(), browser_context_, storage_partition_, |
+ std::move(job_data)); |
+ } |
} |
} // namespace content |