blob: 5630fd78fd1517b96e87d56edb571ac43e2d1c2d [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_BACKGROUND_FETCH_BACKGROUND_FETCH_EVENT_DISPATCHER_H_
#define CONTENT_BROWSER_BACKGROUND_FETCH_BACKGROUND_FETCH_EVENT_DISPATCHER_H_
#include <stdint.h>
#include <string>
#include "base/callback_forward.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "content/browser/service_worker/service_worker_metrics.h"
#include "content/common/content_export.h"
namespace content {
class BackgroundFetchContext;
class BackgroundFetchRegistrationId;
class DevToolsBackgroundServicesContextImpl;
class ServiceWorkerContextWrapper;
class ServiceWorkerRegistration;
class ServiceWorkerVersion;
// Responsible for dispatching the Background Fetch API events on a given
// Service Worker. Must only be used on the service worker core thread.
class CONTENT_EXPORT BackgroundFetchEventDispatcher {
public:
// This enumeration is used for recording histograms. Treat as append-only.
enum DispatchResult {
DISPATCH_RESULT_SUCCESS = 0,
DISPATCH_RESULT_CANNOT_FIND_WORKER = 1,
DISPATCH_RESULT_CANNOT_START_WORKER = 2,
DISPATCH_RESULT_CANNOT_DISPATCH_EVENT = 3,
DISPATCH_RESULT_COUNT
};
BackgroundFetchEventDispatcher(
BackgroundFetchContext* background_fetch_context,
scoped_refptr<ServiceWorkerContextWrapper> service_worker_context,
DevToolsBackgroundServicesContextImpl* devtools_context);
~BackgroundFetchEventDispatcher();
// Dispatches one of the update, fail, or success events depending on the
// provided registration.
void DispatchBackgroundFetchCompletionEvent(
const BackgroundFetchRegistrationId& registration_id,
blink::mojom::BackgroundFetchRegistrationDataPtr registration_data,
base::OnceClosure finished_closure);
// Dispatches the `backgroundfetchclick` event, which indicates that the user
// interface displayed for an active background fetch was activated.
void DispatchBackgroundFetchClickEvent(
const BackgroundFetchRegistrationId& registration_id,
blink::mojom::BackgroundFetchRegistrationDataPtr registration_data,
base::OnceClosure finished_closure);
private:
using ServiceWorkerLoadedCallback =
base::Callback<void(scoped_refptr<ServiceWorkerVersion>, int request_id)>;
// Dispatches the `backgroundfetchabort` event, which indicates that an active
// background fetch was aborted by the user or another external event.
void DispatchBackgroundFetchAbortEvent(
const BackgroundFetchRegistrationId& registration_id,
blink::mojom::BackgroundFetchRegistrationPtr registration,
base::OnceClosure finished_closure);
// Dispatches the `backgroundfetchfail` event, which indicates that a
// background fetch has finished with one or more failed fetches.
void DispatchBackgroundFetchFailEvent(
const BackgroundFetchRegistrationId& registration_id,
blink::mojom::BackgroundFetchRegistrationPtr registration,
base::OnceClosure finished_closure);
// Dispatches the `backgroundfetchsuccess` event, which indicates that a
// background fetch has successfully completed.
void DispatchBackgroundFetchSuccessEvent(
const BackgroundFetchRegistrationId& registration_id,
blink::mojom::BackgroundFetchRegistrationPtr registration,
base::OnceClosure finished_closure);
// Phase at which the dispatching process finished. Used for UMA.
enum class DispatchPhase { FINDING, STARTING, DISPATCHING };
// Loads the Service Worker identified included in the |registration_id| and
// ensures that there is an activated version. Will invoke |finished_closure|,
// log UMA and abort on error, or invoke |loaded_callback| on success.
void LoadServiceWorkerRegistrationForDispatch(
const BackgroundFetchRegistrationId& registration_id,
ServiceWorkerMetrics::EventType event,
base::OnceClosure finished_closure,
ServiceWorkerLoadedCallback loaded_callback);
// Verifies that the |registration| has successfully been loaded, then starts
// the active Service Worker on the registration to dispatch |event|. Will
// invoke |finished_closure|, log UMA and abort on error, or invoke the
// |loaded_callback| on success.
static void StartActiveWorkerForDispatch(
ServiceWorkerMetrics::EventType event,
base::OnceClosure finished_closure,
ServiceWorkerLoadedCallback loaded_callback,
blink::ServiceWorkerStatusCode service_worker_status,
scoped_refptr<ServiceWorkerRegistration> registration);
// Dispatches the actual event after the Service Worker has been started.
static void DispatchEvent(
ServiceWorkerMetrics::EventType event,
base::OnceClosure finished_closure,
ServiceWorkerLoadedCallback loaded_callback,
scoped_refptr<ServiceWorkerVersion> service_worker_version,
blink::ServiceWorkerStatusCode start_worker_status);
// Called when an event of type |event| has finished dispatching.
static void DidDispatchEvent(
ServiceWorkerMetrics::EventType event,
base::OnceClosure finished_closure,
DispatchPhase dispatch_phase,
blink::ServiceWorkerStatusCode service_worker_status);
// Methods that actually invoke the event on an activated Service Worker.
static void DoDispatchBackgroundFetchAbortEvent(
blink::mojom::BackgroundFetchRegistrationPtr registration,
scoped_refptr<ServiceWorkerVersion> service_worker_version,
int request_id);
static void DoDispatchBackgroundFetchClickEvent(
blink::mojom::BackgroundFetchRegistrationPtr registration,
scoped_refptr<ServiceWorkerVersion> service_worker_version,
int request_id);
static void DoDispatchBackgroundFetchFailEvent(
blink::mojom::BackgroundFetchRegistrationPtr registration,
scoped_refptr<ServiceWorkerVersion> service_worker_version,
int request_id);
static void DoDispatchBackgroundFetchSuccessEvent(
blink::mojom::BackgroundFetchRegistrationPtr registration,
scoped_refptr<ServiceWorkerVersion> service_worker_version,
int request_id);
// Informs the DevToolsBackgroundServicesContextImpl of the completion event.
void LogBackgroundFetchCompletionForDevTools(
const BackgroundFetchRegistrationId& registration_id,
ServiceWorkerMetrics::EventType event_type,
blink::mojom::BackgroundFetchFailureReason failure_reason);
// |background_fetch_context_| indirectly owns |this|.
BackgroundFetchContext* background_fetch_context_;
scoped_refptr<ServiceWorkerContextWrapper> service_worker_context_;
// Owned by BackgroundFetchContext.
DevToolsBackgroundServicesContextImpl* devtools_context_;
DISALLOW_COPY_AND_ASSIGN(BackgroundFetchEventDispatcher);
};
} // namespace content
#endif // CONTENT_BROWSER_BACKGROUND_FETCH_BACKGROUND_FETCH_EVENT_DISPATCHER_H_