blob: c342cab62c311007839a10c888abfcbbd261b43e [file] [log] [blame]
// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_BACKGROUND_SYNC_BACKGROUND_SYNC_CONTEXT_IMPL_H_
#define CONTENT_BROWSER_BACKGROUND_SYNC_BACKGROUND_SYNC_CONTEXT_IMPL_H_
#include <map>
#include <memory>
#include "base/containers/unique_ptr_adapters.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_refptr.h"
#include "base/sequence_checker.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "content/common/content_export.h"
#include "content/public/browser/background_sync_context.h"
#include "third_party/blink/public/mojom/background_sync/background_sync.mojom.h"
namespace content {
class BackgroundSyncManager;
class DevToolsBackgroundServicesContextImpl;
class OneShotBackgroundSyncServiceImpl;
class PeriodicBackgroundSyncServiceImpl;
class RenderProcessHost;
class ServiceWorkerContextWrapper;
// One instance of this exists per StoragePartition, and services multiple child
// processes/origins. Most logic is delegated to the owned BackgroundSyncManager
// instance. Lives on the UI thread.
//
// TODO(falken): Consider removing this delegating. Previously these were
// separate classes because this lived on the IO and UI thread until
// https://crbug.com/824858.
class CONTENT_EXPORT BackgroundSyncContextImpl
: public BackgroundSyncContext,
public base::RefCounted<BackgroundSyncContextImpl> {
public:
REQUIRE_ADOPTION_FOR_REFCOUNTED_TYPE();
BackgroundSyncContextImpl();
BackgroundSyncContextImpl(const BackgroundSyncContextImpl&) = delete;
BackgroundSyncContextImpl& operator=(const BackgroundSyncContextImpl&) =
delete;
// Called when StoragePartition is being setup.
void Init(
const scoped_refptr<ServiceWorkerContextWrapper>& service_worker_context,
DevToolsBackgroundServicesContextImpl& devtools_context);
// Called when StoragePartition is being torn down. Must be called before
// deleting `this`.
void Shutdown();
// Creates a OneShotBackgroundSyncServiceImpl that is owned by `this`.
void CreateOneShotSyncService(
const url::Origin& origin,
RenderProcessHost* render_process_host,
mojo::PendingReceiver<blink::mojom::OneShotBackgroundSyncService>
receiver);
// Creates a PeriodicBackgroundSyncServiceImpl that is owned by `this`.
void CreatePeriodicSyncService(
const url::Origin& origin,
RenderProcessHost* render_process_host,
mojo::PendingReceiver<blink::mojom::PeriodicBackgroundSyncService>
receiver);
// Called by *BackgroundSyncServiceImpl objects so that they can be deleted.
void OneShotSyncServiceHadConnectionError(
OneShotBackgroundSyncServiceImpl* service);
void PeriodicSyncServiceHadConnectionError(
PeriodicBackgroundSyncServiceImpl* service);
BackgroundSyncManager* background_sync_manager() const;
// BackgroundSyncContext implementation.
void FireBackgroundSyncEvents(blink::mojom::BackgroundSyncType sync_type,
base::OnceClosure done_closure) override;
void RevivePeriodicBackgroundSyncRegistrations(url::Origin origin) override;
void UnregisterPeriodicSyncForOrigin(url::Origin origin) override;
// Gets the soonest time delta from now, when the browser should be woken up
// to fire any Background Sync events.
base::TimeDelta GetSoonestWakeupDelta(
blink::mojom::BackgroundSyncType sync_type,
base::Time last_browser_wakeup_for_periodic_sync);
protected:
friend class base::RefCounted<BackgroundSyncContextImpl>;
~BackgroundSyncContextImpl() override;
void set_background_sync_manager_for_testing(
std::unique_ptr<BackgroundSyncManager> manager);
void set_wakeup_delta_for_testing(blink::mojom::BackgroundSyncType sync_type,
base::TimeDelta wakeup_delta);
private:
friend class OneShotBackgroundSyncServiceImplTest;
friend class PeriodicBackgroundSyncServiceImplTest;
friend class BackgroundSyncLauncherTest;
friend class BackgroundSyncManagerTest;
virtual void CreateBackgroundSyncManager(
scoped_refptr<ServiceWorkerContextWrapper> service_worker_context,
DevToolsBackgroundServicesContextImpl& devtools_context);
// The services are owned by this. They're either deleted during Shutdown()
// or when the channel is closed via *ServiceHadConnectionError.
std::set<std::unique_ptr<OneShotBackgroundSyncServiceImpl>,
base::UniquePtrComparator>
one_shot_sync_services_;
std::set<std::unique_ptr<PeriodicBackgroundSyncServiceImpl>,
base::UniquePtrComparator>
periodic_sync_services_;
std::unique_ptr<BackgroundSyncManager> background_sync_manager_;
std::map<blink::mojom::BackgroundSyncType, base::TimeDelta>
test_wakeup_delta_;
SEQUENCE_CHECKER(sequence_checker_);
};
} // namespace content
#endif // CONTENT_BROWSER_BACKGROUND_SYNC_BACKGROUND_SYNC_CONTEXT_IMPL_H_