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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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(
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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},
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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_
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user