Skip to content

Commit

Permalink
Introduce UserPerformanceTuningManager
Browse files Browse the repository at this point in the history
This CL introduces a new component that manages the state of User
Controlled Performance features, and surfaces signals related to them
so that UI can decide when and what to display.

This CL also moves the existing High Efficiency and Battery Saver Mode
behaviors to this new component. A follow up will finish implementing
the different signals and expose the manager to other code.

Design Doc: go/uv-performance-bsm-manager

Bug: 1348590
Change-Id: I51158c3e262d649c331c5f5db36a7bd996a11f09
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3817866
Reviewed-by: Francois Pierre Doray <fdoray@chromium.org>
Commit-Queue: Anthony Vallée-Dubois <anthonyvd@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1033113}
  • Loading branch information
Anthony Vallee-Dubois authored and Chromium LUCI CQ committed Aug 9, 2022
1 parent bde0265 commit 768e1fd
Show file tree
Hide file tree
Showing 10 changed files with 338 additions and 104 deletions.
4 changes: 2 additions & 2 deletions chrome/browser/BUILD.gn
Expand Up @@ -4033,14 +4033,14 @@ static_library("browser") {
"performance_manager/policies/background_tab_loading_policy_helpers.h",
"performance_manager/policies/high_efficiency_mode_policy.cc",
"performance_manager/policies/high_efficiency_mode_policy.h",
"performance_manager/policies/high_efficiency_mode_policy_helper.cc",
"performance_manager/policies/high_efficiency_mode_policy_helper.h",
"performance_manager/policies/page_discarding_helper.cc",
"performance_manager/policies/page_discarding_helper.h",
"performance_manager/policies/urgent_page_discarding_policy.cc",
"performance_manager/policies/urgent_page_discarding_policy.h",
"performance_manager/user_tuning/profile_discard_opt_out_list_helper.cc",
"performance_manager/user_tuning/profile_discard_opt_out_list_helper.h",
"performance_manager/user_tuning/user_performance_tuning_manager.cc",
"performance_manager/user_tuning/user_performance_tuning_manager.h",
"permissions/attestation_permission_request.cc",
"permissions/attestation_permission_request.h",
"policy/browsing_history_policy_handler.cc",
Expand Down
Expand Up @@ -49,10 +49,10 @@
#if !BUILDFLAG(IS_ANDROID)
#include "chrome/browser/performance_manager/mechanisms/page_freezer.h"
#include "chrome/browser/performance_manager/policies/high_efficiency_mode_policy.h"
#include "chrome/browser/performance_manager/policies/high_efficiency_mode_policy_helper.h"
#include "chrome/browser/performance_manager/policies/page_discarding_helper.h"
#include "chrome/browser/performance_manager/policies/page_freezing_policy.h"
#include "chrome/browser/performance_manager/policies/urgent_page_discarding_policy.h"
#include "chrome/browser/performance_manager/user_tuning/user_performance_tuning_manager.h"
#include "chrome/browser/tab_contents/form_interaction_tab_helper.h"
#include "components/performance_manager/graph/policies/bfcache_policy.h"
#endif // !BUILDFLAG(IS_ANDROID)
Expand Down Expand Up @@ -211,8 +211,8 @@ void ChromeBrowserMainExtraPartsPerformanceManager::PreMainMessageLoopRun() {
performance_manager::features::kHighEfficiencyModeAvailable) ||
base::FeatureList::IsEnabled(
performance_manager::features::kBatterySaverModeAvailable)) {
high_efficiency_mode_policy_helper_ = std::make_unique<
performance_manager::policies::HighEfficiencyModePolicyHelper>(
user_performance_tuning_manager_ = std::make_unique<
performance_manager::user_tuning::UserPerformanceTuningManager>(
g_browser_process->local_state());
}
#endif
Expand All @@ -235,7 +235,7 @@ void ChromeBrowserMainExtraPartsPerformanceManager::PostMainMessageLoopRun() {
page_load_metrics_observer_.reset();

#if !BUILDFLAG(IS_ANDROID)
high_efficiency_mode_policy_helper_.reset();
user_performance_tuning_manager_.reset();
profile_discard_opt_out_list_helper_.reset();
#endif

Expand Down
Expand Up @@ -34,8 +34,8 @@ class PerformanceManagerLifetime;
class ExtensionWatcher;
#endif

namespace policies {
class HighEfficiencyModePolicyHelper;
namespace user_tuning {
class UserPerformanceTuningManager;
}

namespace user_tuning {
Expand Down Expand Up @@ -115,8 +115,9 @@ class ChromeBrowserMainExtraPartsPerformanceManager
#endif

#if !BUILDFLAG(IS_ANDROID)
std::unique_ptr<performance_manager::policies::HighEfficiencyModePolicyHelper>
high_efficiency_mode_policy_helper_;
std::unique_ptr<
performance_manager::user_tuning::UserPerformanceTuningManager>
user_performance_tuning_manager_;
std::unique_ptr<
performance_manager::user_tuning::ProfileDiscardOptOutListHelper>
profile_discard_opt_out_list_helper_;
Expand Down

This file was deleted.

This file was deleted.

Expand Up @@ -7,7 +7,6 @@
#include "base/test/scoped_feature_list.h"
#include "base/test/task_environment.h"
#include "base/time/time.h"
#include "chrome/browser/performance_manager/policies/high_efficiency_mode_policy_helper.h"
#include "chrome/browser/performance_manager/test_support/page_discarding_utils.h"
#include "components/performance_manager/public/features.h"
#include "components/performance_manager/public/user_tuning/prefs.h"
Expand Down
@@ -0,0 +1,134 @@
// Copyright 2022 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 "chrome/browser/performance_manager/user_tuning/user_performance_tuning_manager.h"

#include "base/feature_list.h"
#include "chrome/browser/performance_manager/policies/high_efficiency_mode_policy.h"
#include "components/performance_manager/public/features.h"
#include "components/performance_manager/public/performance_manager.h"
#include "components/performance_manager/public/user_tuning/prefs.h"
#include "components/prefs/pref_service.h"
#include "content/public/browser/frame_rate_throttling.h"

namespace performance_manager::user_tuning {
namespace {

class FrameThrottlingDelegateImpl
: public performance_manager::user_tuning::UserPerformanceTuningManager::
FrameThrottlingDelegate {
public:
void StartThrottlingAllFrameSinks() override {
content::StartThrottlingAllFrameSinks(base::Hertz(30));
}

void StopThrottlingAllFrameSinks() override {
content::StopThrottlingAllFrameSinks();
}

~FrameThrottlingDelegateImpl() override = default;
};

} // namespace

UserPerformanceTuningManager::UserPerformanceTuningManager(
PrefService* local_state,
std::unique_ptr<FrameThrottlingDelegate> frame_throttling_delegate)
: frame_throttling_delegate_(
frame_throttling_delegate
? std::move(frame_throttling_delegate)
: std::make_unique<FrameThrottlingDelegateImpl>()) {
pref_change_registrar_.Init(local_state);

if (base::FeatureList::IsEnabled(
performance_manager::features::kHighEfficiencyModeAvailable)) {
pref_change_registrar_.Add(
performance_manager::user_tuning::prefs::kHighEfficiencyModeEnabled,
base::BindRepeating(
&UserPerformanceTuningManager::OnHighEfficiencyModePrefChanged,
base::Unretained(this)));
// Make sure the initial state of the pref is passed on to the policy.
OnHighEfficiencyModePrefChanged();
}

if (base::FeatureList::IsEnabled(
performance_manager::features::kBatterySaverModeAvailable)) {
pref_change_registrar_.Add(
performance_manager::user_tuning::prefs::kBatterySaverModeEnabled,
base::BindRepeating(
&UserPerformanceTuningManager::OnBatterySaverModePrefChanged,
base::Unretained(this)));
OnBatterySaverModePrefChanged();
}
}

UserPerformanceTuningManager::~UserPerformanceTuningManager() = default;

void UserPerformanceTuningManager::AddObserver(Observer* o) {
observers_.AddObserver(o);
}

void UserPerformanceTuningManager::RemoveObserver(Observer* o) {
observers_.RemoveObserver(o);
}

bool UserPerformanceTuningManager::DeviceHasBattery() const {
// TODO(crbug.com/1348590): Check platform-specific APIs to return whether
// this device has a battery.
return true;
}

void UserPerformanceTuningManager::SetTemporaryBatterySaver(bool enabled) {
// Setting the temporary mode to its current state is a no-op.
if (temporary_battery_saver_enabled_ == enabled)
return;

temporary_battery_saver_enabled_ = enabled;
UpdateBatterySaverModeState();
}

bool UserPerformanceTuningManager::IsBatterySaverActive() const {
return battery_saver_mode_enabled_;
}

void UserPerformanceTuningManager::OnHighEfficiencyModePrefChanged() {
bool enabled = pref_change_registrar_.prefs()->GetBoolean(
performance_manager::user_tuning::prefs::kHighEfficiencyModeEnabled);
performance_manager::PerformanceManager::CallOnGraph(
FROM_HERE, base::BindOnce(
[](bool enabled, performance_manager::Graph* graph) {
policies::HighEfficiencyModePolicy::GetInstance()
->OnHighEfficiencyModeChanged(enabled);
},
enabled));
}

void UserPerformanceTuningManager::OnBatterySaverModePrefChanged() {
UpdateBatterySaverModeState();
}

void UserPerformanceTuningManager::UpdateBatterySaverModeState() {
bool pref_enabled = pref_change_registrar_.prefs()->GetBoolean(
performance_manager::user_tuning::prefs::kBatterySaverModeEnabled);

bool previously_enabled = battery_saver_mode_enabled_;
battery_saver_mode_enabled_ =
pref_enabled || temporary_battery_saver_enabled_;

// Don't change throttling or notify observers if the mode didn't change.
if (previously_enabled == battery_saver_mode_enabled_)
return;

if (battery_saver_mode_enabled_) {
frame_throttling_delegate_->StartThrottlingAllFrameSinks();
} else {
frame_throttling_delegate_->StopThrottlingAllFrameSinks();
}

for (auto& obs : observers_) {
obs.OnBatterySaverModeChanged(battery_saver_mode_enabled_);
}
}

} // namespace performance_manager::user_tuning

0 comments on commit 768e1fd

Please sign in to comment.