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 2e4392e369539acc8ad2a2591e7d710256206c26..ede338ba8117284a520a2d637d0b9d044780851f 100644 |
--- a/content/browser/background_fetch/background_fetch_context.cc |
+++ b/content/browser/background_fetch/background_fetch_context.cc |
@@ -6,24 +6,43 @@ |
#include "base/memory/ptr_util.h" |
#include "content/browser/background_fetch/background_fetch_data_manager.h" |
+#include "content/browser/background_fetch/background_fetch_event_dispatcher.h" |
#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/url_request/url_request_context_getter.h" |
#include "url/origin.h" |
namespace content { |
+namespace { |
+ |
+// Records the |error| status issued by the DataManager after it was requested |
+// to create and store a new Background Fetch registration. |
+void RecordRegistrationCreatedError(blink::mojom::BackgroundFetchError error) { |
+ // TODO(peter): Add UMA. |
+} |
+ |
+// Records the |error| status issued by the DataManager after the storage |
+// associated with a registration has been completely deleted. |
+void RecordRegistrationDeletedError(blink::mojom::BackgroundFetchError error) { |
+ // TODO(peter): Add UMA. |
+} |
+ |
+} // namespace |
+ |
BackgroundFetchContext::BackgroundFetchContext( |
BrowserContext* browser_context, |
StoragePartitionImpl* storage_partition, |
- const scoped_refptr<ServiceWorkerContextWrapper>& service_worker_context) |
+ scoped_refptr<ServiceWorkerContextWrapper> service_worker_context) |
: browser_context_(browser_context), |
- service_worker_context_(service_worker_context), |
- background_fetch_data_manager_( |
- base::MakeUnique<BackgroundFetchDataManager>(browser_context)) { |
+ data_manager_( |
+ base::MakeUnique<BackgroundFetchDataManager>(browser_context)), |
+ event_dispatcher_(base::MakeUnique<BackgroundFetchEventDispatcher>( |
+ std::move(service_worker_context))) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
request_context_ = |
make_scoped_refptr(storage_partition->GetURLRequestContext()); |
@@ -51,7 +70,7 @@ void BackgroundFetchContext::StartFetch( |
const BackgroundFetchOptions& options, |
const blink::mojom::BackgroundFetchService::FetchCallback& callback) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- background_fetch_data_manager_->CreateRegistration( |
+ data_manager_->CreateRegistration( |
registration_id, requests, options, |
base::BindOnce(&BackgroundFetchContext::DidCreateRegistration, this, |
registration_id, options, callback)); |
@@ -63,6 +82,7 @@ void BackgroundFetchContext::DidCreateRegistration( |
const blink::mojom::BackgroundFetchService::FetchCallback& callback, |
blink::mojom::BackgroundFetchError error, |
std::vector<BackgroundFetchRequestInfo> initial_requests) { |
+ RecordRegistrationCreatedError(error); |
if (error != blink::mojom::BackgroundFetchError::NONE) { |
callback.Run(error, base::nullopt /* registration */); |
return; |
@@ -125,8 +145,8 @@ void BackgroundFetchContext::CreateController( |
std::vector<BackgroundFetchRequestInfo> initial_requests) { |
std::unique_ptr<BackgroundFetchJobController> controller = |
base::MakeUnique<BackgroundFetchJobController>( |
- registration_id, options, background_fetch_data_manager_.get(), |
- browser_context_, request_context_, |
+ registration_id, options, data_manager_.get(), browser_context_, |
+ request_context_, |
base::BindOnce(&BackgroundFetchContext::DidCompleteJob, this)); |
// TODO(peter): We should actually be able to use Background Fetch in layout |
@@ -148,11 +168,52 @@ void BackgroundFetchContext::DidCompleteJob( |
DCHECK_GT(active_fetches_.count(registration_id), 0u); |
- if (controller->state() == BackgroundFetchJobController::State::COMPLETED) { |
- // TODO(peter): Dispatch the `backgroundfetched` or `backgroundfetchfail` |
- // event to the Service Worker to inform the developer. |
+ // TODO(peter): Fire `backgroundfetchabort` if the |controller|'s state is |
+ // ABORTED, which does not require a sequence of the settled fetches. |
+ |
+ // The `backgroundfetched` and/or `backgroundfetchfail` event will only be |
+ // invoked for Background Fetch jobs which have been completed. |
+ if (controller->state() != BackgroundFetchJobController::State::COMPLETED) { |
+ DeleteRegistration(registration_id); |
+ return; |
+ } |
+ |
+ // Get the sequence of settled fetches from the data manager. |
+ data_manager_->GetSettledFetchesForRegistration( |
+ registration_id, |
+ base::BindOnce(&BackgroundFetchContext::DidGetSettledFetches, this, |
+ registration_id)); |
+} |
+ |
+void BackgroundFetchContext::DidGetSettledFetches( |
+ const BackgroundFetchRegistrationId& registration_id, |
+ blink::mojom::BackgroundFetchError error, |
+ std::vector<BackgroundFetchSettledFetch> settled_fetches, |
+ std::vector<std::unique_ptr<BlobHandle>> blob_handles) { |
+ if (error != blink::mojom::BackgroundFetchError::NONE) { |
+ DeleteRegistration(registration_id); |
+ return; |
} |
+ // TODO(peter): Distinguish between the `backgroundfetched` and |
+ // `backgroundfetchfail` events based on the status code of all fetches. We |
+ // don't populate that field yet, so always assume it's successful for now. |
+ |
+ event_dispatcher_->DispatchBackgroundFetchedEvent( |
+ registration_id, std::move(settled_fetches), |
+ base::Bind(&BackgroundFetchContext::DeleteRegistration, this, |
+ registration_id)); |
+} |
+ |
+void BackgroundFetchContext::DeleteRegistration( |
+ const BackgroundFetchRegistrationId& registration_id) { |
+ DCHECK_GT(active_fetches_.count(registration_id), 0u); |
+ |
+ // Delete all persistent information associated with the |registration_id|. |
+ data_manager_->DeleteRegistration( |
+ registration_id, base::BindOnce(&RecordRegistrationDeletedError)); |
+ |
+ // Delete the local state associated with the |registration_id|. |
active_fetches_.erase(registration_id); |
} |