blob: 5d9d95dd5df6caf351d951e305a6318589eeb41c [file] [log] [blame]
// Copyright 2021 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/common/process_visibility_tracker.h"
#include "components/power_scheduler/power_mode_arbiter.h"
namespace content {
// static
ProcessVisibilityTracker* ProcessVisibilityTracker::GetInstance() {
static base::NoDestructor<ProcessVisibilityTracker> instance;
return instance.get();
}
ProcessVisibilityTracker::ProcessVisibilityTracker()
: power_mode_visibility_voter_(
power_scheduler::PowerModeArbiter::GetInstance()->NewVoter(
"PowerModeVoter.Visibility")) {}
ProcessVisibilityTracker::~ProcessVisibilityTracker() {
DCHECK_CALLED_ON_VALID_SEQUENCE(main_thread_);
}
void ProcessVisibilityTracker::AddObserver(
ProcessVisibilityObserver* observer) {
DCHECK_CALLED_ON_VALID_SEQUENCE(main_thread_);
observers_.AddObserver(observer);
if (is_visible_.has_value())
observer->OnVisibilityChanged(*is_visible_);
}
void ProcessVisibilityTracker::RemoveObserver(
ProcessVisibilityObserver* observer) {
DCHECK_CALLED_ON_VALID_SEQUENCE(main_thread_);
observers_.RemoveObserver(observer);
}
void ProcessVisibilityTracker::OnProcessVisibilityChanged(bool visible) {
DCHECK_CALLED_ON_VALID_SEQUENCE(main_thread_);
if (is_visible_.has_value() && *is_visible_ == visible)
return;
is_visible_ = visible;
power_mode_visibility_voter_->VoteFor(
*is_visible_ ? power_scheduler::PowerMode::kIdle
: power_scheduler::PowerMode::kBackground);
for (ProcessVisibilityObserver& observer : observers_)
observer.OnVisibilityChanged(*is_visible_);
}
} // namespace content