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 4f5b2e7f5bb4907b80bd488913302c84ba1203f4..a3d3261a02e3242c3a392d8d2c0ff9261ce5ae1e 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); |
download_manager_ = BrowserContext::GetDownloadManager(browser_context_); |
request_context_ = |
@@ -52,7 +71,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)); |
@@ -64,6 +83,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; |
@@ -126,8 +146,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(), |
- download_manager_, request_context_, |
+ registration_id, options, data_manager_.get(), download_manager_, |
+ request_context_, |
base::BindOnce(&BackgroundFetchContext::DidCompleteJob, this)); |
// TODO(peter): We should actually be able to use Background Fetch in layout |
@@ -149,11 +169,49 @@ 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. |
+ // The `backgroundfetched` and/or `backgroundfetchfail` event will only be |
+ // invoked for Background Fetch jobs which have been completed. |
+ if (controller->state() != BackgroundFetchJobController::State::COMPLETED) { |
harkness
2017/03/29 22:12:33
We need to call the aborted event if that's the st
Peter Beverloo
2017/03/29 22:20:28
As I understand it, `backgroundfetchabort` is for
Peter Beverloo
2017/03/30 10:19:37
https://github.com/WICG/background-fetch#reacting-
harkness
2017/03/30 14:15:28
Acknowledged.
|
+ 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); |
} |