#include "content/browser/background_sync/background_sync_launcher.h"
#include <algorithm>
#include <utility>
#include "base/barrier_closure.h"
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "content/browser/background_sync/background_sync_context_impl.h"
#include "content/public/browser/background_sync_context.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/storage_partition.h"
#if BUILDFLAG(IS_ANDROID)
#include "base/android/callback_android.h"
#endif
namespace content {
namespace {
base::LazyInstance<BackgroundSyncLauncher>::DestructorAtExit
g_background_sync_launcher = …;
}
BackgroundSyncLauncher* BackgroundSyncLauncher::Get() { … }
base::TimeDelta BackgroundSyncLauncher::GetSoonestWakeupDelta(
blink::mojom::BackgroundSyncType sync_type,
BrowserContext* browser_context) { … }
#if BUILDFLAG(IS_ANDROID)
void BackgroundSyncLauncher::FireBackgroundSyncEvents(
BrowserContext* browser_context,
blink::mojom::BackgroundSyncType sync_type,
const base::android::JavaParamRef<jobject>& j_runnable) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
DCHECK(browser_context);
Get()->FireBackgroundSyncEventsImpl(browser_context, sync_type, j_runnable);
}
void BackgroundSyncLauncher::FireBackgroundSyncEventsImpl(
BrowserContext* browser_context,
blink::mojom::BackgroundSyncType sync_type,
const base::android::JavaParamRef<jobject>& j_runnable) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
DCHECK(browser_context);
if (sync_type == blink::mojom::BackgroundSyncType::PERIODIC)
last_browser_wakeup_for_periodic_sync_ = base::Time::Now();
base::RepeatingClosure done_closure = base::BarrierClosure(
browser_context->GetLoadedStoragePartitionCount(),
base::BindOnce(base::android::RunRunnableAndroid,
base::android::ScopedJavaGlobalRef<jobject>(j_runnable)));
browser_context->ForEachLoadedStoragePartition(
[&](StoragePartition* storage_partition) {
BackgroundSyncContext* sync_context =
storage_partition->GetBackgroundSyncContext();
DCHECK(sync_context);
sync_context->FireBackgroundSyncEvents(sync_type, done_closure);
});
}
#endif
BackgroundSyncLauncher::BackgroundSyncLauncher() { … }
BackgroundSyncLauncher::~BackgroundSyncLauncher() = default;
void BackgroundSyncLauncher::SetGlobalSoonestWakeupDelta(
blink::mojom::BackgroundSyncType sync_type,
base::TimeDelta set_to) { … }
base::TimeDelta BackgroundSyncLauncher::GetGlobalSoonestWakeupDelta(
blink::mojom::BackgroundSyncType sync_type) { … }
base::TimeDelta BackgroundSyncLauncher::GetSoonestWakeupDeltaImpl(
blink::mojom::BackgroundSyncType sync_type,
BrowserContext* browser_context) { … }
void BackgroundSyncLauncher::GetSoonestWakeupDeltaForStoragePartition(
blink::mojom::BackgroundSyncType sync_type,
StoragePartition* storage_partition) { … }
void BackgroundSyncLauncher::SendSoonestWakeupDelta(
blink::mojom::BackgroundSyncType sync_type,
base::OnceCallback<void(base::TimeDelta)> callback) { … }
}