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 4facffeac426a3d758822190ff7538302bea81c6..4a26d013e6d1c78924ba418793af0dede97745d6 100644 |
--- a/content/browser/background_fetch/background_fetch_context.cc |
+++ b/content/browser/background_fetch/background_fetch_context.cc |
@@ -10,7 +10,6 @@ |
#include "content/browser/background_fetch/background_fetch_job_controller.h" |
#include "content/browser/background_fetch/background_fetch_registration_id.h" |
#include "content/browser/service_worker/service_worker_context_wrapper.h" |
-#include "content/browser/storage_partition_impl.h" |
#include "content/public/browser/blob_handle.h" |
#include "content/public/browser/browser_context.h" |
#include "net/traffic_annotation/network_traffic_annotation.h" |
@@ -37,36 +36,26 @@ void RecordRegistrationDeletedError(blink::mojom::BackgroundFetchError error) { |
BackgroundFetchContext::BackgroundFetchContext( |
BrowserContext* browser_context, |
- StoragePartitionImpl* storage_partition, |
scoped_refptr<ServiceWorkerContextWrapper> service_worker_context) |
: browser_context_(browser_context), |
data_manager_( |
base::MakeUnique<BackgroundFetchDataManager>(browser_context)), |
event_dispatcher_(base::MakeUnique<BackgroundFetchEventDispatcher>( |
- std::move(service_worker_context))) { |
+ std::move(service_worker_context))), |
+ weak_factory_(this) { |
+ // Although this lives only on the IO thread, it is constructed on UI thread. |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
} |
BackgroundFetchContext::~BackgroundFetchContext() { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
} |
void BackgroundFetchContext::InitializeOnIOThread( |
scoped_refptr<net::URLRequestContextGetter> request_context_getter) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- request_context_getter_ = request_context_getter; |
-} |
-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); |
- active_fetches_.clear(); |
+ request_context_getter_ = request_context_getter; |
} |
void BackgroundFetchContext::StartFetch( |
@@ -75,10 +64,12 @@ void BackgroundFetchContext::StartFetch( |
const BackgroundFetchOptions& options, |
blink::mojom::BackgroundFetchService::FetchCallback callback) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ |
data_manager_->CreateRegistration( |
registration_id, requests, options, |
- base::BindOnce(&BackgroundFetchContext::DidCreateRegistration, this, |
- registration_id, options, std::move(callback))); |
+ base::BindOnce(&BackgroundFetchContext::DidCreateRegistration, |
+ weak_factory_.GetWeakPtr(), registration_id, options, |
+ std::move(callback))); |
} |
void BackgroundFetchContext::DidCreateRegistration( |
@@ -87,6 +78,8 @@ void BackgroundFetchContext::DidCreateRegistration( |
blink::mojom::BackgroundFetchService::FetchCallback callback, |
blink::mojom::BackgroundFetchError error, |
std::vector<scoped_refptr<BackgroundFetchRequestInfo>> initial_requests) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ |
RecordRegistrationCreatedError(error); |
if (error != blink::mojom::BackgroundFetchError::NONE) { |
std::move(callback).Run(error, base::nullopt /* registration */); |
@@ -112,6 +105,8 @@ std::vector<std::string> |
BackgroundFetchContext::GetActiveTagsForServiceWorkerRegistration( |
int64_t service_worker_registration_id, |
const url::Origin& origin) const { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ |
std::vector<std::string> tags; |
for (const auto& pair : active_fetches_) { |
const BackgroundFetchRegistrationId& registration_id = |
@@ -149,6 +144,8 @@ void BackgroundFetchContext::CreateController( |
const BackgroundFetchRegistrationId& registration_id, |
const BackgroundFetchOptions& options, |
std::vector<scoped_refptr<BackgroundFetchRequestInfo>> initial_requests) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ |
net::NetworkTrafficAnnotationTag traffic_annotation = |
net::DefineNetworkTrafficAnnotation("background_fetch_context", R"( |
semantics { |
@@ -179,7 +176,8 @@ void BackgroundFetchContext::CreateController( |
base::MakeUnique<BackgroundFetchJobController>( |
registration_id, options, data_manager_.get(), browser_context_, |
request_context_getter_, |
- base::BindOnce(&BackgroundFetchContext::DidCompleteJob, this), |
+ base::BindOnce(&BackgroundFetchContext::DidCompleteJob, |
+ weak_factory_.GetWeakPtr()), |
traffic_annotation); |
// TODO(peter): We should actually be able to use Background Fetch in layout |
@@ -196,6 +194,8 @@ void BackgroundFetchContext::CreateController( |
void BackgroundFetchContext::DidCompleteJob( |
BackgroundFetchJobController* controller) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ |
const BackgroundFetchRegistrationId& registration_id = |
controller->registration_id(); |
@@ -204,15 +204,15 @@ void BackgroundFetchContext::DidCompleteJob( |
case BackgroundFetchJobController::State::ABORTED: |
event_dispatcher_->DispatchBackgroundFetchAbortEvent( |
registration_id, |
- base::Bind(&BackgroundFetchContext::DeleteRegistration, this, |
- registration_id, |
+ base::Bind(&BackgroundFetchContext::DeleteRegistration, |
+ weak_factory_.GetWeakPtr(), registration_id, |
std::vector<std::unique_ptr<BlobHandle>>())); |
return; |
case BackgroundFetchJobController::State::COMPLETED: |
data_manager_->GetSettledFetchesForRegistration( |
registration_id, |
- base::BindOnce(&BackgroundFetchContext::DidGetSettledFetches, this, |
- registration_id)); |
+ base::BindOnce(&BackgroundFetchContext::DidGetSettledFetches, |
+ weak_factory_.GetWeakPtr(), registration_id)); |
return; |
case BackgroundFetchJobController::State::INITIALIZED: |
case BackgroundFetchJobController::State::FETCHING: |
@@ -229,6 +229,8 @@ void BackgroundFetchContext::DidGetSettledFetches( |
bool background_fetch_succeeded, |
std::vector<BackgroundFetchSettledFetch> settled_fetches, |
std::vector<std::unique_ptr<BlobHandle>> blob_handles) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ |
if (error != blink::mojom::BackgroundFetchError::NONE) { |
DeleteRegistration(registration_id, std::move(blob_handles)); |
return; |
@@ -240,19 +242,22 @@ void BackgroundFetchContext::DidGetSettledFetches( |
if (background_fetch_succeeded) { |
event_dispatcher_->DispatchBackgroundFetchedEvent( |
registration_id, std::move(settled_fetches), |
- base::Bind(&BackgroundFetchContext::DeleteRegistration, this, |
- registration_id, std::move(blob_handles))); |
+ base::Bind(&BackgroundFetchContext::DeleteRegistration, |
+ weak_factory_.GetWeakPtr(), registration_id, |
+ std::move(blob_handles))); |
} else { |
event_dispatcher_->DispatchBackgroundFetchFailEvent( |
registration_id, std::move(settled_fetches), |
- base::Bind(&BackgroundFetchContext::DeleteRegistration, this, |
- registration_id, std::move(blob_handles))); |
+ base::Bind(&BackgroundFetchContext::DeleteRegistration, |
+ weak_factory_.GetWeakPtr(), registration_id, |
+ std::move(blob_handles))); |
} |
} |
void BackgroundFetchContext::DeleteRegistration( |
const BackgroundFetchRegistrationId& registration_id, |
const std::vector<std::unique_ptr<BlobHandle>>& blob_handles) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
DCHECK_GT(active_fetches_.count(registration_id), 0u); |
// Delete all persistent information associated with the |registration_id|. |