Add top level toggle to enable/disable Speedreader (#30600)

* Add top level toggle to enable/disable Speedreader

This migrates away an old bad named feature for automatically using
speedreader for all sites.  The pref was wrongly named `enabled`.

This also adds a new preference for actually enabling/disabling the
feature.

* Fixes Android presubmit

---------

Co-authored-by: Serg <serg.zhukovsky@gmail.com>
This commit is contained in:
Brian R. Bondy
2025-08-13 11:14:10 -04:00
committed by GitHub
co-authored by Serg
parent f6dd48d2e6
commit 7240ef2e2e
20 changed files with 286 additions and 42 deletions
@@ -7,7 +7,6 @@ package org.chromium.chrome.browser.settings;
import static org.chromium.chrome.browser.settings.MainSettings.PREF_UI_THEME;
import android.content.SharedPreferences;
import android.os.Bundle;
import androidx.preference.Preference;
@@ -161,7 +160,8 @@ public class AppearancePreferences extends BravePreferenceFragment
((ChromeSwitchPreference) enableSpeedreader)
.setChecked(
UserPrefs.get(ProfileManager.getLastUsedRegularProfile())
.getBoolean(BravePref.SPEEDREADER_PREF_ENABLED));
.getBoolean(
BravePref.SPEEDREADER_PREF_ENABLED_FOR_ALL_SITES));
}
}
@@ -250,21 +250,17 @@ public class AppearancePreferences extends BravePreferenceFragment
String key = preference.getKey();
boolean shouldRelaunch = false;
if (BravePreferenceKeys.BRAVE_BOTTOM_TOOLBAR_ENABLED_KEY.equals(key)) {
SharedPreferences prefs = ContextUtils.getAppSharedPreferences();
Boolean originalStatus = BottomToolbarConfiguration.isBraveBottomControlsEnabled();
updatePreferenceSummary(
BravePreferenceKeys.BRAVE_BOTTOM_TOOLBAR_ENABLED_KEY,
!originalStatus ? R.string.text_on : R.string.text_off);
prefs.edit()
.putBoolean(
BravePreferenceKeys.BRAVE_BOTTOM_TOOLBAR_ENABLED_KEY, !originalStatus)
.apply();
ChromeSharedPreferences.getInstance()
.writeBoolean(
BravePreferenceKeys.BRAVE_BOTTOM_TOOLBAR_ENABLED_KEY, !originalStatus);
shouldRelaunch = true;
} else if (PREF_SHOW_BRAVE_REWARDS_ICON.equals(key)) {
SharedPreferences sharedPreferences = ContextUtils.getAppSharedPreferences();
SharedPreferences.Editor sharedPreferencesEditor = sharedPreferences.edit();
sharedPreferencesEditor.putBoolean(PREF_SHOW_BRAVE_REWARDS_ICON, !(boolean) newValue);
sharedPreferencesEditor.apply();
ChromeSharedPreferences.getInstance()
.writeBoolean(PREF_SHOW_BRAVE_REWARDS_ICON, !(boolean) newValue);
shouldRelaunch = true;
} else if (PREF_ADS_SWITCH.equals(key)) {
setPrefAdsInBackgroundEnabled((boolean) newValue);
@@ -281,7 +277,8 @@ public class AppearancePreferences extends BravePreferenceFragment
.writeBoolean(BravePreferenceKeys.BRAVE_TAB_GROUPS_ENABLED, (boolean) newValue);
} else if (PREF_BRAVE_ENABLE_SPEEDREADER.equals(key)) {
UserPrefs.get(ProfileManager.getLastUsedRegularProfile())
.setBoolean(BravePref.SPEEDREADER_PREF_ENABLED, (boolean) newValue);
.setBoolean(
BravePref.SPEEDREADER_PREF_ENABLED_FOR_ALL_SITES, (boolean) newValue);
shouldRelaunch = true;
} else if (PREF_ENABLE_MULTI_WINDOWS.equals(key)) {
if (!(boolean) newValue) {
@@ -324,16 +321,12 @@ public class AppearancePreferences extends BravePreferenceFragment
/** Returns the user preference for whether the brave ads in background is enabled. */
public static boolean getPrefAdsInBackgroundEnabled() {
SharedPreferences sharedPreferences = ContextUtils.getAppSharedPreferences();
return sharedPreferences.getBoolean(PREF_ADS_SWITCH, false);
return ChromeSharedPreferences.getInstance().readBoolean(PREF_ADS_SWITCH, false);
}
/** Sets the user preference for whether the brave ads in background is enabled. */
public void setPrefAdsInBackgroundEnabled(boolean enabled) {
SharedPreferences sharedPreferences = ContextUtils.getAppSharedPreferences();
SharedPreferences.Editor sharedPreferencesEditor = sharedPreferences.edit();
sharedPreferencesEditor.putBoolean(PREF_ADS_SWITCH, enabled);
sharedPreferencesEditor.apply();
ChromeSharedPreferences.getInstance().writeBoolean(PREF_ADS_SWITCH, enabled);
}
private void updatePreferenceIcon(String preferenceString, int drawable) {
@@ -169,7 +169,7 @@ public class BraveSpeedReaderManager extends EmptyTabObserver implements UserDat
boolean isPrefEnabled =
UserPrefs.get(ProfileManager.getLastUsedRegularProfile())
.getBoolean(BravePref.SPEEDREADER_PREF_ENABLED);
.getBoolean(BravePref.SPEEDREADER_PREF_FEATURE_ENABLED);
return isPrefEnabled;
}
}
@@ -321,7 +321,7 @@ public class BraveTabbedAppMenuPropertiesDelegate extends TabbedAppMenuPropertie
}
if (ChromeFeatureList.isEnabled(BraveFeatureList.BRAVE_SPEEDREADER)
&& UserPrefs.get(assumeNonNull(mTabModelSelector.getCurrentModel().getProfile()))
.getBoolean(BravePref.SPEEDREADER_PREF_ENABLED)) {
.getBoolean(BravePref.SPEEDREADER_PREF_FEATURE_ENABLED)) {
final Tab currentTab = mActivityTabProvider.get();
if (currentTab != null && BraveSpeedReaderUtils.tabSupportsDistillation(currentTab)) {
addMenuItemAfter(
+11 -2
View File
@@ -246,10 +246,19 @@
<message name="IDS_SETTINGS_TABS_SEARCH_SHOW" desc="The button for searching tabs on the left of tab strip region.">
Show tab search button
</message>
<message name="IDS_SETTINGS_SPEEDREADER_LABEL" desc="The label to activate Speedreader">
<message name="IDS_SETTINGS_SPEEDREADER_SETTING_LABEL" desc="The main label for the Speedreader settings section">
Speedreader
</message>
<message name="IDS_SETTINGS_SPEEDREADER_SUB_LABEL" desc="The sub-label describing Speedreader">
<message name="IDS_SETTINGS_SPEEDREADER_FEATURE_LABEL" desc="The label for the Speedreader feature toggle">
Speedreader
</message>
<message name="IDS_SETTINGS_SPEEDREADER_FEATURE_SUB_LABEL" desc="The sub-label describing the Speedreader feature">
Enable the Speedreader feature
</message>
<message name="IDS_SETTINGS_SPEEDREADER_ENABLED_FOR_ALL_SITES_LABEL" desc="The label for enabling Speedreader on all sites">
Automatically use Speedreader when possible
</message>
<message name="IDS_SETTINGS_SPEEDREADER_ENABLED_FOR_ALL_SITES_SUB_LABEL" desc="The sub-label for enabling Speedreader on all sites">
Articles automatically load in reader mode, saving you time
</message>
<message name="IDS_SETTINGS_DISABLE_CLICKABLE_MUTE_INDICATORS" desc="The text for the settings option for disabling clickable tab mute indicators">
+6
View File
@@ -86,6 +86,7 @@
#endif
#if BUILDFLAG(ENABLE_SPEEDREADER)
#include "brave/components/speedreader/speedreader_pref_migration.h"
#include "brave/components/speedreader/speedreader_service.h"
#endif
@@ -320,6 +321,11 @@ void RegisterProfilePrefsForMigration(
#if !BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_ANDROID)
registry->RegisterBooleanPref(kWebTorrentEnabled, false);
#endif
// Added 2025-08 - Speedreader preference migration
#if BUILDFLAG(ENABLE_SPEEDREADER)
speedreader::RegisterProfilePrefsForMigration(registry);
#endif
}
void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
@@ -166,7 +166,9 @@ const PrefsUtil::TypedPrefMap& BravePrefsUtil::GetAllowlistedKeys() {
settings_api::PrefType::kNumber;
#endif
#if BUILDFLAG(ENABLE_SPEEDREADER)
(*s_brave_allowlist)[speedreader::kSpeedreaderPrefEnabled] =
(*s_brave_allowlist)[speedreader::kSpeedreaderPrefFeatureEnabled] =
settings_api::PrefType::kBoolean;
(*s_brave_allowlist)[speedreader::kSpeedreaderPrefEnabledForAllSites] =
settings_api::PrefType::kBoolean;
#endif
// De-AMP feature
@@ -75,8 +75,11 @@ void MaybeEnableBraveFeatureForPerfTesting(Profile* profile) {
profile->GetPrefs()->SetBoolean(brave_news::prefs::kBraveNewsOptedIn, true);
#if BUILDFLAG(ENABLE_SPEEDREADER)
// Speedreader
profile->GetPrefs()->SetBoolean(speedreader::kSpeedreaderPrefEnabled, true);
// Speedreader - enable both the feature toggle and all-sites setting
profile->GetPrefs()->SetBoolean(speedreader::kSpeedreaderPrefFeatureEnabled,
true);
profile->GetPrefs()->SetBoolean(
speedreader::kSpeedreaderPrefEnabledForAllSites, true);
#endif
profile->GetPrefs()->SetTime(ai_chat::prefs::kLastAcceptedDisclaimer,
@@ -5,9 +5,19 @@ You can obtain one at https://mozilla.org/MPL/2.0/. -->
<settings-toggle-button
class="cr-row first"
id="speedreader"
pref="{{prefs.brave.speedreader.enabled}}"
label="$i18n{speedreaderSettingLabel}"
sub-label="$i18n{speedreaderSettingSubLabel}"
id="speedreaderFeature"
pref="{{prefs.brave.speedreader.feature_enabled}}"
label="$i18n{speedreaderFeatureLabel}"
sub-label="$i18n{speedreaderFeatureSubLabel}"
learn-more-url="$i18n{speedreaderLearnMoreURL}">
</settings-toggle-button>
<template is="dom-if" if="[[prefs.brave.speedreader.feature_enabled.value]]">
<settings-toggle-button
class="cr-row continuation"
id="speedreaderEnabledForAllSites"
pref="{{prefs.brave.speedreader.enabled_for_all_sites}}"
label="$i18n{speedreaderEnabledForAllSitesLabel}"
sub-label="$i18n{speedreaderEnabledForAllSitesSubLabel}">
</settings-toggle-button>
</template>
@@ -8,6 +8,7 @@
#include <string>
#include "brave/app/brave_command_ids.h"
#include "brave/browser/speedreader/speedreader_service_factory.h"
#include "brave/browser/speedreader/speedreader_tab_helper.h"
#include "brave/browser/ui/color/brave_color_id.h"
#include "brave/components/speedreader/common/features.h"
@@ -39,6 +40,18 @@ SpeedreaderIconView::SpeedreaderIconView(
SpeedreaderIconView::~SpeedreaderIconView() = default;
void SpeedreaderIconView::UpdateImpl() {
// Check if Speedreader feature is enabled
auto* web_contents = GetWebContents();
if (web_contents) {
auto* speedreader_service =
speedreader::SpeedreaderServiceFactory::GetForBrowserContext(
web_contents->GetBrowserContext());
if (!speedreader_service || !speedreader_service->IsFeatureEnabled()) {
SetVisible(false);
return;
}
}
const auto state = GetDistillState();
if (!speedreader::DistillStates::IsDistilled(state) &&
!speedreader::DistillStates::IsDistillable(state)) {
@@ -283,8 +283,14 @@ void BraveAddCommonStrings(content::WebUIDataSource* html_source,
{"autofillInPrivateSettingDesc",
IDS_SETTINGS_BRAVE_AUTOFILL_PRIVATE_WINDOWS_DESC},
{"mruCyclingSettingLabel", IDS_SETTINGS_BRAVE_MRU_CYCLING_LABEL},
{"speedreaderSettingLabel", IDS_SETTINGS_SPEEDREADER_LABEL},
{"speedreaderSettingSubLabel", IDS_SETTINGS_SPEEDREADER_SUB_LABEL},
{"speedreaderSettingLabel", IDS_SETTINGS_SPEEDREADER_SETTING_LABEL},
{"speedreaderFeatureLabel", IDS_SETTINGS_SPEEDREADER_FEATURE_LABEL},
{"speedreaderFeatureSubLabel",
IDS_SETTINGS_SPEEDREADER_FEATURE_SUB_LABEL},
{"speedreaderEnabledForAllSitesLabel",
IDS_SETTINGS_SPEEDREADER_ENABLED_FOR_ALL_SITES_LABEL},
{"speedreaderEnabledForAllSitesSubLabel",
IDS_SETTINGS_SPEEDREADER_ENABLED_FOR_ALL_SITES_SUB_LABEL},
{"deAmpSettingLabel", IDS_SETTINGS_DE_AMP_LABEL},
{"deAmpSettingSubLabel", IDS_SETTINGS_DE_AMP_SUB_LABEL},
{"debounceSettingLabel", IDS_SETTINGS_DEBOUNCE_LABEL},
+2
View File
@@ -20,6 +20,8 @@ include_rules = [
"+brave/components/omnibox/browser/brave_omnibox_prefs.h",
"+brave/components/p3a/metric_log_store.h",
"+brave/components/p3a/rotation_scheduler.h",
"+brave/components/speedreader/common/buildflags/buildflags.h",
"+brave/components/speedreader/speedreader_pref_migration.h",
"+brave/components/tor/buildflags/buildflags.h",
"+brave/components/brave_vpn/common/brave_vpn_utils.h",
"+brave/components/tor/pref_names.h",
@@ -34,6 +34,7 @@
#include "brave/components/omnibox/browser/brave_omnibox_prefs.h"
#include "brave/components/p3a/metric_log_store.h"
#include "brave/components/p3a/rotation_scheduler.h"
#include "brave/components/speedreader/common/buildflags/buildflags.h"
#include "brave/components/tor/buildflags/buildflags.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/channel_info.h"
@@ -84,6 +85,10 @@
#include "brave/components/sidebar/browser/pref_names.h"
#endif
#if BUILDFLAG(ENABLE_SPEEDREADER)
#include "brave/components/speedreader/speedreader_pref_migration.h"
#endif
// This method should be periodically pruned of year+ old migrations.
void MigrateObsoleteProfilePrefs(PrefService* profile_prefs,
const base::FilePath& profile_path) {
@@ -211,6 +216,11 @@ void MigrateObsoleteProfilePrefs(PrefService* profile_prefs,
profile_prefs->ClearPref(kWebTorrentEnabled);
#endif
// Added 2025-08 - Speedreader preference migration
#if BUILDFLAG(ENABLE_SPEEDREADER)
speedreader::MigrateObsoleteProfilePrefs(profile_prefs);
#endif
// END_MIGRATE_OBSOLETE_PROFILE_PREFS
}
@@ -7,11 +7,11 @@
<if expr="not is_android">
<message name="IDS_SPEEDREADER_ICON_TURN_OFF_READER_MODE" desc="Accessible text shown when a page is in Reader Mode">Turn off Speedreader</message>
<message name="IDS_SPEEDREADER_ICON_TURN_ON_READER_MODE" desc="Accessible text shown when a page can be distilled">Turn on Speedreader</message>
<message name="IDS_READER_MODE_ALWAYS_LOAD_FOR_SITE_LABEL" desc="Used for a toogle button label">Always use Speedreader for this site</message>
<message name="IDS_READER_MODE_ALWAYS_LOAD_FOR_SITE_LABEL" desc="Used for a toggle button label">Always use Speedreader for this site</message>
<message name="IDS_READER_MODE_ALWAYS_LOAD_FOR_SITE_ACC" desc="Accessible text for the toggle to enable or disable Speedreader per site">
Toggle to turn on/off Speedreader for this website.
</message>
<message name="IDS_READER_MODE_ALWAYS_LOAD_FOR_ALL_SITES_LABEL" desc="Used for a toogble button label">Always use Speedreader for all sites</message>
<message name="IDS_READER_MODE_ALWAYS_LOAD_FOR_ALL_SITES_LABEL" desc="Used for a toogble button label">Automatically use Speedreader when possible on all sites</message>
<message name="IDS_READER_MODE_ALWAYS_LOAD_FOR_ALL_SITES_ACC" desc="Accessible text for the toggle to enable or disable Speedreader per site">
Toggle to turn on/off Speedreader for all websites.
</message>
+2
View File
@@ -24,6 +24,8 @@ static_library("speedreader") {
"speedreader_extended_info_handler.h",
"speedreader_metrics.cc",
"speedreader_metrics.h",
"speedreader_pref_migration.cc",
"speedreader_pref_migration.h",
"speedreader_pref_names.h",
"speedreader_rewriter_service.cc",
"speedreader_rewriter_service.h",
@@ -0,0 +1,34 @@
/* Copyright (c) 2025 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at https://mozilla.org/MPL/2.0/. */
#include "brave/components/speedreader/speedreader_pref_migration.h"
#include "brave/components/speedreader/speedreader_pref_names.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/pref_service.h"
namespace speedreader {
void RegisterProfilePrefsForMigration(PrefRegistrySimple* registry) {
// Legacy preference - keep for migration purposes only
registry->RegisterBooleanPref(kSpeedreaderPrefEnabledDeprecated, false);
}
void MigrateObsoleteProfilePrefs(PrefService* prefs) {
// Check if the deprecated pref has been explicitly set by a user
if (prefs->HasPrefPath(kSpeedreaderPrefEnabledDeprecated)) {
bool old_value = prefs->GetBoolean(kSpeedreaderPrefEnabledDeprecated);
// The old "enabled" pref controlled whether speedreader was enabled for
// all sites. Migrate only the all-sites preference - let the feature
// toggle use its default value (enabled).
prefs->SetBoolean(kSpeedreaderPrefEnabledForAllSites, old_value);
// Clear the deprecated preference
prefs->ClearPref(kSpeedreaderPrefEnabledDeprecated);
}
}
} // namespace speedreader
@@ -0,0 +1,20 @@
/* Copyright (c) 2025 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at https://mozilla.org/MPL/2.0/. */
#ifndef BRAVE_COMPONENTS_SPEEDREADER_SPEEDREADER_PREF_MIGRATION_H_
#define BRAVE_COMPONENTS_SPEEDREADER_SPEEDREADER_PREF_MIGRATION_H_
class PrefService;
class PrefRegistrySimple;
namespace speedreader {
void RegisterProfilePrefsForMigration(PrefRegistrySimple* registry);
void MigrateObsoleteProfilePrefs(PrefService* prefs);
} // namespace speedreader
#endif // BRAVE_COMPONENTS_SPEEDREADER_SPEEDREADER_PREF_MIGRATION_H_
@@ -8,9 +8,11 @@
namespace speedreader {
// Is Speedreader currently enabled
// Deprecated - migrated to kSpeedreaderPrefFeatureEnabled and
// kSpeedreaderPrefEnabledForAllSites (08/2025)
// java_cpp_string.py doesn't work when the variable is constexpr
inline constexpr char kSpeedreaderPrefEnabled[] = "brave.speedreader.enabled";
inline constexpr char kSpeedreaderPrefEnabledDeprecated[] =
"brave.speedreader.enabled";
// Set if Speedreader was enabled at least once
inline constexpr char kSpeedreaderPrefEverEnabled[] =
@@ -50,6 +52,16 @@ inline constexpr char kSpeedreaderPageViewsStoragePref[] =
inline constexpr char kSpeedreaderDisabledByPolicy[] =
"brave.speedreader.disabled_by_policy";
// Top-level feature toggle for Speedreader (named feature_enabled to
// distinguish from the legacy "enabled" pref which actually controls all-sites
// behavior)
inline constexpr char kSpeedreaderPrefFeatureEnabled[] =
"brave.speedreader.feature_enabled";
// Whether Speedreader should be enabled for all sites
inline constexpr char kSpeedreaderPrefEnabledForAllSites[] =
"brave.speedreader.enabled_for_all_sites";
} // namespace speedreader
#endif // BRAVE_COMPONENTS_SPEEDREADER_SPEEDREADER_PREF_NAMES_H_
+18 -7
View File
@@ -14,6 +14,7 @@
#include "base/strings/string_number_conversions.h"
#include "brave/components/speedreader/common/features.h"
#include "brave/components/speedreader/common/speedreader_toolbar.mojom.h"
#include "brave/components/speedreader/speedreader_pref_migration.h"
#include "brave/components/speedreader/speedreader_pref_names.h"
#include "components/content_settings/core/browser/host_content_settings_map.h"
#include "components/content_settings/core/common/content_settings_pattern.h"
@@ -62,17 +63,20 @@ SpeedreaderService::~SpeedreaderService() = default;
// static
void SpeedreaderService::RegisterProfilePrefs(PrefRegistrySimple* registry) {
bool enabled_by_deault = false;
bool enabled_by_default = false;
#if DCHECK_IS_ON()
// Enable speedreader by default if the data collector command line key is
// specified.
constexpr const char kCollectSwitch[] = "speedreader-collect-test-data";
enabled_by_deault =
enabled_by_default =
base::CommandLine::ForCurrentProcess()->HasSwitch(kCollectSwitch);
#endif
registry->RegisterBooleanPref(kSpeedreaderPrefEnabled, enabled_by_deault);
registry->RegisterBooleanPref(kSpeedreaderPrefFeatureEnabled, true);
registry->RegisterBooleanPref(kSpeedreaderPrefEnabledForAllSites,
enabled_by_default);
registry->RegisterBooleanPref(kSpeedreaderPrefEverEnabled, false);
registry->RegisterListPref(kSpeedreaderPrefToggleCount);
registry->RegisterIntegerPref(kSpeedreaderPrefPromptCount, 0);
@@ -103,10 +107,17 @@ void SpeedreaderService::RemoveObserver(Observer* observer) {
observers_.RemoveObserver(observer);
}
bool SpeedreaderService::IsEnabledForAllSites() {
bool SpeedreaderService::IsFeatureEnabled() {
bool disabled_by_policy = speedreader::IsDisabledByPolicy(prefs_);
bool enabled_pref = prefs_->GetBoolean(kSpeedreaderPrefEnabled);
return !disabled_by_policy && enabled_pref;
bool feature_enabled = prefs_->GetBoolean(kSpeedreaderPrefFeatureEnabled);
return !disabled_by_policy && feature_enabled;
}
bool SpeedreaderService::IsEnabledForAllSites() {
if (!IsFeatureEnabled()) {
return false;
}
return prefs_->GetBoolean(kSpeedreaderPrefEnabledForAllSites);
}
ContentSetting SpeedreaderService::GetEnabledForSiteSetting(const GURL& url) {
@@ -175,7 +186,7 @@ void SpeedreaderService::EnableForAllSites(bool enabled) {
if (IsEnabledForAllSites() == enabled) {
return;
}
prefs_->SetBoolean(kSpeedreaderPrefEnabled, enabled);
prefs_->SetBoolean(kSpeedreaderPrefEnabledForAllSites, enabled);
for (auto& o : observers_) {
o.OnAllSitesEnableSettingChanged(enabled);
@@ -60,6 +60,9 @@ class SpeedreaderService : public KeyedService {
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
// Returns |true| if the Speedreader feature is enabled globally.
bool IsFeatureEnabled();
// Returns |true| if Speedreader is turned on for all sites.
bool IsEnabledForAllSites();
@@ -6,6 +6,7 @@
#include "brave/components/speedreader/speedreader_service.h"
#include "base/test/task_environment.h"
#include "brave/components/speedreader/speedreader_pref_migration.h"
#include "brave/components/speedreader/speedreader_pref_names.h"
#include "build/build_config.h"
#include "components/content_settings/core/browser/host_content_settings_map.h"
@@ -98,4 +99,111 @@ TEST_F(SpeedreaderPolicyTest, PolicyWorksWithDefaultsWrite) {
EXPECT_TRUE(IsDisabledByPolicy(&pref_service_));
}
class SpeedreaderPrefMigrationTest : public testing::Test {
public:
SpeedreaderPrefMigrationTest() {
SpeedreaderService::RegisterProfilePrefs(pref_service_.registry());
RegisterProfilePrefsForMigration(pref_service_.registry());
}
protected:
sync_preferences::TestingPrefServiceSyncable pref_service_;
};
TEST_F(SpeedreaderPrefMigrationTest, MigratesEnabledPrefToNewStructure) {
// Set up the old preference structure - user had speedreader enabled
pref_service_.SetBoolean(kSpeedreaderPrefEnabledDeprecated, true);
// Verify initial state
EXPECT_TRUE(pref_service_.HasPrefPath(kSpeedreaderPrefEnabledDeprecated));
EXPECT_TRUE(pref_service_.GetBoolean(kSpeedreaderPrefEnabledDeprecated));
EXPECT_TRUE(pref_service_.GetBoolean(
kSpeedreaderPrefFeatureEnabled)); // Default is true
EXPECT_FALSE(pref_service_.GetBoolean(
kSpeedreaderPrefEnabledForAllSites)); // Default is false
// Run migration
MigrateObsoleteProfilePrefs(&pref_service_);
// Verify migration results
EXPECT_FALSE(
pref_service_.HasPrefPath(kSpeedreaderPrefEnabledDeprecated)); // Cleared
EXPECT_TRUE(pref_service_.GetBoolean(
kSpeedreaderPrefFeatureEnabled)); // Still default (true)
EXPECT_TRUE(pref_service_.GetBoolean(
kSpeedreaderPrefEnabledForAllSites)); // Migrated to true
}
TEST_F(SpeedreaderPrefMigrationTest, MigratesDisabledPrefToNewStructure) {
// Set up the old preference structure - user had speedreader disabled
pref_service_.SetBoolean(kSpeedreaderPrefEnabledDeprecated, false);
// Verify initial state
EXPECT_TRUE(pref_service_.HasPrefPath(kSpeedreaderPrefEnabledDeprecated));
EXPECT_FALSE(pref_service_.GetBoolean(kSpeedreaderPrefEnabledDeprecated));
EXPECT_TRUE(pref_service_.GetBoolean(
kSpeedreaderPrefFeatureEnabled)); // Default is true
EXPECT_FALSE(pref_service_.GetBoolean(
kSpeedreaderPrefEnabledForAllSites)); // Default is false
// Run migration
MigrateObsoleteProfilePrefs(&pref_service_);
// Verify migration results
EXPECT_FALSE(
pref_service_.HasPrefPath(kSpeedreaderPrefEnabledDeprecated)); // Cleared
EXPECT_TRUE(pref_service_.GetBoolean(
kSpeedreaderPrefFeatureEnabled)); // Still default (true)
EXPECT_FALSE(pref_service_.GetBoolean(
kSpeedreaderPrefEnabledForAllSites)); // Migrated to false
}
TEST_F(SpeedreaderPrefMigrationTest, HandlesNewInstallationWithDefaults) {
// Simulate new installation - deprecated pref path doesn't exist
EXPECT_FALSE(pref_service_.HasPrefPath(kSpeedreaderPrefEnabledDeprecated));
// Verify initial defaults
EXPECT_TRUE(pref_service_.GetBoolean(
kSpeedreaderPrefFeatureEnabled)); // Default is true
EXPECT_FALSE(pref_service_.GetBoolean(
kSpeedreaderPrefEnabledForAllSites)); // Default is false
// Run migration
MigrateObsoleteProfilePrefs(&pref_service_);
// Verify migration does nothing for new installations
EXPECT_FALSE(pref_service_.HasPrefPath(kSpeedreaderPrefEnabledDeprecated));
EXPECT_TRUE(pref_service_.GetBoolean(
kSpeedreaderPrefFeatureEnabled)); // Still default
EXPECT_FALSE(pref_service_.GetBoolean(
kSpeedreaderPrefEnabledForAllSites)); // Still default
}
TEST_F(SpeedreaderPrefMigrationTest, MigrationIdempotent) {
// Set up the old preference structure
pref_service_.SetBoolean(kSpeedreaderPrefEnabledDeprecated, true);
// Verify the deprecated pref path exists
EXPECT_TRUE(pref_service_.HasPrefPath(kSpeedreaderPrefEnabledDeprecated));
// Run migration first time
MigrateObsoleteProfilePrefs(&pref_service_);
// Verify migration worked and deprecated pref is cleared
EXPECT_FALSE(pref_service_.HasPrefPath(kSpeedreaderPrefEnabledDeprecated));
EXPECT_TRUE(pref_service_.GetBoolean(kSpeedreaderPrefFeatureEnabled));
EXPECT_TRUE(pref_service_.GetBoolean(kSpeedreaderPrefEnabledForAllSites));
// Manually change preferences to test idempotency
pref_service_.SetBoolean(kSpeedreaderPrefFeatureEnabled, false);
pref_service_.SetBoolean(kSpeedreaderPrefEnabledForAllSites, false);
// Run migration again - should do nothing since deprecated pref is gone
MigrateObsoleteProfilePrefs(&pref_service_);
// Verify values weren't changed by second migration
EXPECT_FALSE(pref_service_.GetBoolean(kSpeedreaderPrefFeatureEnabled));
EXPECT_FALSE(pref_service_.GetBoolean(kSpeedreaderPrefEnabledForAllSites));
}
} // namespace speedreader