blob: b20e2ef744f7716892692d4d2634d6cd4cfb6085 [file] [log] [blame]
// Copyright 2015 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.
#include "content/browser/background_sync/background_sync_registration.h"
#include "base/bind.h"
#include "base/location.h"
#include "base/logging.h"
#include "base/single_thread_task_runner.h"
#include "base/thread_task_runner_handle.h"
namespace content {
const BackgroundSyncRegistration::RegistrationId
BackgroundSyncRegistration::kInvalidRegistrationId = -1;
const BackgroundSyncRegistration::RegistrationId
BackgroundSyncRegistration::kInitialId = 0;
BackgroundSyncRegistration::BackgroundSyncRegistration() = default;
BackgroundSyncRegistration::~BackgroundSyncRegistration() = default;
bool BackgroundSyncRegistration::Equals(
const BackgroundSyncRegistration& other) const {
return options_.Equals(other.options_);
}
bool BackgroundSyncRegistration::IsValid() const {
return id_ != kInvalidRegistrationId;
}
void BackgroundSyncRegistration::AddFinishedCallback(
const StateCallback& callback) {
DCHECK(!HasCompleted());
notify_finished_callbacks_.push_back(callback);
}
void BackgroundSyncRegistration::RunFinishedCallbacks() {
DCHECK(HasCompleted());
for (auto& callback : notify_finished_callbacks_) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::Bind(callback, sync_state_));
}
notify_finished_callbacks_.clear();
}
bool BackgroundSyncRegistration::HasCompleted() const {
switch (sync_state_) {
case BACKGROUND_SYNC_STATE_PENDING:
case BACKGROUND_SYNC_STATE_FIRING:
case BACKGROUND_SYNC_STATE_REREGISTERED_WHILE_FIRING:
case BACKGROUND_SYNC_STATE_UNREGISTERED_WHILE_FIRING:
return false;
case BACKGROUND_SYNC_STATE_FAILED:
case BACKGROUND_SYNC_STATE_SUCCESS:
case BACKGROUND_SYNC_STATE_UNREGISTERED:
return true;
}
NOTREACHED();
return false;
}
bool BackgroundSyncRegistration::IsFiring() const {
switch (sync_state_) {
case BACKGROUND_SYNC_STATE_FIRING:
case BACKGROUND_SYNC_STATE_REREGISTERED_WHILE_FIRING:
case BACKGROUND_SYNC_STATE_UNREGISTERED_WHILE_FIRING:
return true;
case BACKGROUND_SYNC_STATE_PENDING:
case BACKGROUND_SYNC_STATE_FAILED:
case BACKGROUND_SYNC_STATE_SUCCESS:
case BACKGROUND_SYNC_STATE_UNREGISTERED:
return false;
}
NOTREACHED();
return false;
}
void BackgroundSyncRegistration::SetUnregisteredState() {
DCHECK(!HasCompleted());
bool is_firing = IsFiring();
sync_state_ = is_firing ? BACKGROUND_SYNC_STATE_UNREGISTERED_WHILE_FIRING
: BACKGROUND_SYNC_STATE_UNREGISTERED;
if (!is_firing) {
// If the registration is currently firing then wait to run
// RunFinishedCallbacks until after it has finished as it might
// change state to SUCCESS first.
RunFinishedCallbacks();
}
}
} // namespace content