diff --git a/android/java/org/chromium/base/BraveFeatureList.java b/android/java/org/chromium/base/BraveFeatureList.java index 6e4275585f2..719767534df 100644 --- a/android/java/org/chromium/base/BraveFeatureList.java +++ b/android/java/org/chromium/base/BraveFeatureList.java @@ -19,4 +19,5 @@ public abstract class BraveFeatureList { public static final String BRAVE_ANDROID_SAFE_BROWSING = "BraveAndroidSafeBrowsing"; public static final String BRAVE_VPN_LINK_SUBSCRIPTION_ANDROID_UI = "BraveVPNLinkSubscriptionAndroidUI"; + public static final String DEBOUNCE = "BraveDebounce"; } diff --git a/android/java/org/chromium/chrome/browser/privacy/settings/BravePrivacySettings.java b/android/java/org/chromium/chrome/browser/privacy/settings/BravePrivacySettings.java index 03d1954bac9..633d288fc76 100644 --- a/android/java/org/chromium/chrome/browser/privacy/settings/BravePrivacySettings.java +++ b/android/java/org/chromium/chrome/browser/privacy/settings/BravePrivacySettings.java @@ -72,6 +72,7 @@ public class BravePrivacySettings extends PrivacySettings implements ConnectionE private static final String PREF_HTTPSE = "httpse"; private static final String PREF_DE_AMP = "de_amp"; + private static final String PREF_DEBOUNCE = "debounce"; private static final String PREF_IPFS_GATEWAY = "ipfs_gateway"; private static final String PREF_BLOCK_COOKIE_CONSENT_NOTICES = "block_cookie_consent_notices"; private static final String PREF_AD_BLOCK = "ad_block"; @@ -103,7 +104,7 @@ public class BravePrivacySettings extends PrivacySettings implements ConnectionE private static final String[] NEW_PRIVACY_PREFERENCE_ORDER = { PREF_BRAVE_SHIELDS_GLOBALS_SECTION, // shields globals section - PREF_SHIELDS_SUMMARY, PREF_BLOCK_TRACKERS_ADS, PREF_DE_AMP, PREF_HTTPSE, + PREF_SHIELDS_SUMMARY, PREF_BLOCK_TRACKERS_ADS, PREF_DE_AMP, PREF_DEBOUNCE, PREF_HTTPSE, PREF_HTTPS_FIRST_MODE, PREF_BLOCK_SCRIPTS, PREF_BLOCK_CROSS_SITE_COOKIES, PREF_FINGERPRINTING_PROTECTION, PREF_FINGERPRINT_LANGUAGE, PREF_CLEAR_DATA_SECTION, // clear data automatically section @@ -137,6 +138,7 @@ public class BravePrivacySettings extends PrivacySettings implements ConnectionE private ChromeSwitchPreference mAutocompleteTopSites; private ChromeSwitchPreference mHttpsePref; private ChromeSwitchPreference mDeAmpPref; + private ChromeSwitchPreference mDebouncePref; private ChromeSwitchPreference mHttpsFirstModePref; private BraveDialogPreference mFingerprintingProtectionPref; private ChromeSwitchPreference mBlockScriptsPref; @@ -199,6 +201,13 @@ public class BravePrivacySettings extends PrivacySettings implements ConnectionE mDeAmpPref = (ChromeSwitchPreference) findPreference(PREF_DE_AMP); mDeAmpPref.setOnPreferenceChangeListener(this); + if (ChromeFeatureList.isEnabled(BraveFeatureList.DEBOUNCE)) { + mDebouncePref = (ChromeSwitchPreference) findPreference(PREF_DEBOUNCE); + mDebouncePref.setOnPreferenceChangeListener(this); + } else { + removePreferenceIfPresent(PREF_DEBOUNCE); + } + mHttpsFirstModePref = (ChromeSwitchPreference) findPreference(PREF_HTTPS_FIRST_MODE); mHttpsFirstModePref.setVisible(mHttpsePref.isChecked()); @@ -353,7 +362,9 @@ public class BravePrivacySettings extends PrivacySettings implements ConnectionE } } else if (PREF_DE_AMP.equals(key)) { BravePrefServiceBridge.getInstance().setDeAmpEnabled((boolean) newValue); - + } else if (PREF_DEBOUNCE.equals(key)) { + UserPrefs.get(Profile.getLastUsedRegularProfile()) + .setBoolean(BravePref.DEBOUNCE_ENABLED, (boolean) newValue); } else if (PREF_IPFS_GATEWAY.equals(key)) { BravePrefServiceBridge.getInstance().setIpfsGatewayEnabled((boolean) newValue); } else if (PREF_BLOCK_COOKIE_CONSENT_NOTICES.equals(key)) { @@ -583,6 +594,11 @@ public class BravePrivacySettings extends PrivacySettings implements ConnectionE mCookieListOptInPageAndroidHandler.isFilterListEnabled( isEnabled -> { mBlockCookieConsentNoticesPref.setChecked(isEnabled); }); } + // Debounce + if (mDebouncePref != null) { + mDebouncePref.setChecked(UserPrefs.get(Profile.getLastUsedRegularProfile()) + .getBoolean(BravePref.DEBOUNCE_ENABLED)); + } } private void removePreferenceIfPresent(String key) { diff --git a/android/java/res/xml/brave_privacy_preferences.xml b/android/java/res/xml/brave_privacy_preferences.xml index 6e646083471..3066754fb33 100644 --- a/android/java/res/xml/brave_privacy_preferences.xml +++ b/android/java/res/xml/brave_privacy_preferences.xml @@ -56,7 +56,10 @@ android:title="@string/de_amp_switch" android:summary="@string/de_amp_summary" android:defaultValue="true" /> - + diff --git a/android/javatests/org/chromium/chrome/browser/privacy/settings/BravePrivacySettingsTest.java b/android/javatests/org/chromium/chrome/browser/privacy/settings/BravePrivacySettingsTest.java index 49d0089a093..29160fc6123 100644 --- a/android/javatests/org/chromium/chrome/browser/privacy/settings/BravePrivacySettingsTest.java +++ b/android/javatests/org/chromium/chrome/browser/privacy/settings/BravePrivacySettingsTest.java @@ -46,7 +46,7 @@ public class BravePrivacySettingsTest { private static final String PREF_INCOGNITO_LOCK = "incognito_lock"; private static final String PREF_PHONE_AS_A_SECURITY_KEY = "phone_as_a_security_key"; - private static int BRAVE_PRIVACY_SETTINGS_NUMBER_OF_ITEMS = 22; + private static int BRAVE_PRIVACY_SETTINGS_NUMBER_OF_ITEMS = 23; private int mItemsLeft; diff --git a/app/brave_settings_strings.grdp b/app/brave_settings_strings.grdp index f903060a2b8..1658052b54b 100644 --- a/app/brave_settings_strings.grdp +++ b/app/brave_settings_strings.grdp @@ -212,6 +212,12 @@ Prefer publisher page URLs, instead of AMP and similar versions. + + Auto-redirect tracking URLs + + + Enable support for bypassing top-level redirect tracking URLs. + Prevent sites from fingerprinting me based on my language preferences diff --git a/browser/android/preferences/BUILD.gn b/browser/android/preferences/BUILD.gn index 6d8cd3ee943..774d69a409c 100644 --- a/browser/android/preferences/BUILD.gn +++ b/browser/android/preferences/BUILD.gn @@ -39,6 +39,7 @@ java_cpp_strings("java_pref_names_srcjar") { "//brave/components/brave_shields/common/pref_names.cc", "//brave/components/brave_vpn/pref_names.cc", "//brave/components/constants/pref_names.cc", + "//brave/components/debounce/common/pref_names.cc", "//brave/components/ntp_background_images/common/pref_names.cc", "//brave/components/omnibox/browser/brave_omnibox_prefs.cc", "//components/translate/core/browser/translate_pref_names.cc", diff --git a/browser/brave_profile_prefs.cc b/browser/brave_profile_prefs.cc index d42a69a0ea8..02d1735853d 100644 --- a/browser/brave_profile_prefs.cc +++ b/browser/brave_profile_prefs.cc @@ -33,6 +33,7 @@ #include "brave/components/brave_webtorrent/browser/buildflags/buildflags.h" #include "brave/components/constants/pref_names.h" #include "brave/components/de_amp/common/pref_names.h" +#include "brave/components/debounce/browser/debounce_service.h" #include "brave/components/ipfs/buildflags/buildflags.h" #include "brave/components/ntp_background_images/buildflags/buildflags.h" #include "brave/components/omnibox/browser/brave_omnibox_prefs.h" @@ -397,6 +398,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { #endif de_amp::RegisterProfilePrefs(registry); + debounce::DebounceService::RegisterProfilePrefs(registry); #if BUILDFLAG(ENABLE_TOR) tor::TorProfileService::RegisterProfilePrefs(registry); diff --git a/browser/debounce/debounce_browsertest.cc b/browser/debounce/debounce_browsertest.cc index d0d43cb8832..61121ed700e 100644 --- a/browser/debounce/debounce_browsertest.cc +++ b/browser/debounce/debounce_browsertest.cc @@ -15,6 +15,7 @@ #include "brave/components/constants/brave_paths.h" #include "brave/components/debounce/browser/debounce_component_installer.h" #include "brave/components/debounce/common/features.h" +#include "brave/components/debounce/common/pref_names.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" #include "components/network_session_configurator/common/network_switches.h" @@ -120,6 +121,10 @@ class DebounceBrowserTest : public BaseLocalDataFilesBrowserTest { DebounceComponentInstallerWaiter(component_installer).Wait(); } + void ToggleDebouncePref(bool on) { + browser()->profile()->GetPrefs()->SetBoolean(prefs::kDebounceEnabled, on); + } + GURL add_redirect_param(const GURL& original_url, const GURL& landing_url) { return net::AppendOrReplaceQueryParameter(original_url, "url", landing_url.spec()); @@ -158,14 +163,27 @@ class DebounceBrowserTest : public BaseLocalDataFilesBrowserTest { // Test simple redirection by query parameter. IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, Redirect) { ASSERT_TRUE(InstallMockExtension()); + ToggleDebouncePref(true); GURL base_url = embedded_test_server()->GetURL("simple.a.com", "/"); GURL landing_url = embedded_test_server()->GetURL("simple.b.com", "/"); GURL original_url = add_redirect_param(base_url, landing_url); NavigateToURLAndWaitForRedirects(original_url, landing_url); } +// Test with pref off +IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, DisabledIfPrefOff) { + ASSERT_TRUE(InstallMockExtension()); + ToggleDebouncePref(false); + web_contents()->GetController().Reload(content::ReloadType::NORMAL, false); + GURL base_url = embedded_test_server()->GetURL("simple.a.com", "/"); + GURL landing_url = embedded_test_server()->GetURL("simple.b.com", "/"); + GURL original_url = add_redirect_param(base_url, landing_url); + NavigateToURLAndWaitForRedirects(original_url, original_url); +} + IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, BackForward) { ASSERT_TRUE(InstallMockExtension()); + ToggleDebouncePref(true); // starting page for back/foward GURL start_url = embedded_test_server()->GetURL("z.com", "/"); @@ -191,6 +209,7 @@ IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, BackForward) { // Test base64-encoded redirection by query parameter. IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, Base64Redirect) { ASSERT_TRUE(InstallMockExtension()); + ToggleDebouncePref(true); GURL base_url = embedded_test_server()->GetURL("base64.a.com", "/"); GURL landing_url = embedded_test_server()->GetURL("base64.b.com", "/"); GURL original_url = add_base64_redirect_param(base_url, landing_url); @@ -199,6 +218,7 @@ IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, Base64Redirect) { IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, DoubleRedirect) { ASSERT_TRUE(InstallMockExtension()); + ToggleDebouncePref(true); GURL url_z = embedded_test_server()->GetURL("z.com", "/"); GURL url_b = add_redirect_param( embedded_test_server()->GetURL("double.b.com", "/"), url_z); @@ -217,6 +237,7 @@ IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, DoubleRedirect) { // Test a long redirect chain. IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, QuadRedirect) { ASSERT_TRUE(InstallMockExtension()); + ToggleDebouncePref(true); GURL url_z = embedded_test_server()->GetURL("z.com", "/"); GURL url_d = add_redirect_param( embedded_test_server()->GetURL("quad.d.com", "/"), url_z); @@ -234,6 +255,7 @@ IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, QuadRedirect) { // the final URL share an eTLD+1. IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, SameSiteTracker) { ASSERT_TRUE(InstallMockExtension()); + ToggleDebouncePref(true); GURL final_url = embedded_test_server()->GetURL("z.com", "/"); GURL intermediate_url = add_redirect_param( embedded_test_server()->GetURL("tracker.z.com", "/"), final_url); @@ -249,6 +271,7 @@ IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, RedirectThroughOriginalSite) { auto* old_client = content::SetBrowserClientForTesting(&browser_client); ASSERT_TRUE(InstallMockExtension()); + ToggleDebouncePref(true); GURL url_z = embedded_test_server()->GetURL("z.com", "/"); GURL url_tracker_a = add_redirect_param( embedded_test_server()->GetURL("tracker.a.com", "/"), url_z); @@ -268,6 +291,7 @@ IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, RedirectThroughOriginalSite) { IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, RedirectLoop) { ASSERT_TRUE(InstallMockExtension()); + ToggleDebouncePref(true); GURL finish_url = embedded_test_server()->GetURL("double.a.com", "/"); GURL loop_url = add_redirect_param( embedded_test_server()->GetURL("double.b.com", "/"), finish_url); @@ -282,6 +306,7 @@ IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, RedirectLoop) { // debounced because it matches a wildcard include pattern. IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, WildcardInclude) { ASSERT_TRUE(InstallMockExtension()); + ToggleDebouncePref(true); GURL landing_url = embedded_test_server()->GetURL("z.com", "/"); GURL start_url = add_redirect_param( embedded_test_server()->GetURL("included.c.com", "/"), landing_url); @@ -291,6 +316,7 @@ IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, WildcardInclude) { // Test that unknown actions are ignored. IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, UnknownAction) { ASSERT_TRUE(InstallMockExtension()); + ToggleDebouncePref(true); GURL landing_url = embedded_test_server()->GetURL("z.com", "/"); GURL start_url = add_redirect_param( embedded_test_server()->GetURL("included.d.com", "/"), landing_url); @@ -302,6 +328,7 @@ IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, UnknownAction) { // that should not be debounced because it matches an exclude pattern. IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, ExcludeOverridesWildcardInclude) { ASSERT_TRUE(InstallMockExtension()); + ToggleDebouncePref(true); GURL landing_url = embedded_test_server()->GetURL("z.com", "/"); GURL start_url_1 = add_redirect_param( embedded_test_server()->GetURL("included.e.com", "/"), landing_url); @@ -315,6 +342,7 @@ IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, ExcludeOverridesWildcardInclude) { // exactly. IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, NoParamMatch) { ASSERT_TRUE(InstallMockExtension()); + ToggleDebouncePref(true); GURL landing_url = embedded_test_server()->GetURL("z.com", "/"); GURL start_url = add_redirect_param( embedded_test_server()->GetURL("included.f.com", "/"), landing_url); @@ -325,6 +353,7 @@ IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, NoParamMatch) { // processed and applied. IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, IgnoreExtraKeys) { ASSERT_TRUE(InstallMockExtension()); + ToggleDebouncePref(true); GURL base_url = embedded_test_server()->GetURL("simple.g.com", "/"); GURL landing_url = embedded_test_server()->GetURL("z.com", "/"); GURL original_url = add_redirect_param(base_url, landing_url); @@ -334,6 +363,7 @@ IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, IgnoreExtraKeys) { // Test that URLs in private registries are treated the same as all other URLs. IN_PROC_BROWSER_TEST_F(DebounceBrowserTest, ExcludePrivateRegistries) { ASSERT_TRUE(InstallMockExtension()); + ToggleDebouncePref(true); GURL base_url = embedded_test_server()->GetURL("example.blogspot.com", "/"); GURL landing_url = embedded_test_server()->GetURL("z.com", "/"); GURL original_url = add_redirect_param(base_url, landing_url); diff --git a/browser/extensions/api/settings_private/brave_prefs_util.cc b/browser/extensions/api/settings_private/brave_prefs_util.cc index 7cf18bad564..cc69dcb0b4a 100644 --- a/browser/extensions/api/settings_private/brave_prefs_util.cc +++ b/browser/extensions/api/settings_private/brave_prefs_util.cc @@ -16,6 +16,7 @@ #include "brave/components/brave_wayback_machine/buildflags.h" #include "brave/components/constants/pref_names.h" #include "brave/components/de_amp/common/pref_names.h" +#include "brave/components/debounce/common/pref_names.h" #include "brave/components/decentralized_dns/core/pref_names.h" #include "brave/components/ipfs/buildflags/buildflags.h" #include "brave/components/ntp_background_images/common/pref_names.h" @@ -182,6 +183,9 @@ const PrefsUtil::TypedPrefMap& BravePrefsUtil::GetAllowlistedKeys() { // De-AMP feature (*s_brave_allowlist)[de_amp::kDeAmpPrefEnabled] = settings_api::PrefType::PREF_TYPE_BOOLEAN; + // Debounce feature + (*s_brave_allowlist)[debounce::prefs::kDebounceEnabled] = + settings_api::PrefType::PREF_TYPE_BOOLEAN; // new tab prefs (*s_brave_allowlist)[kNewTabPageShowSponsoredImagesBackgroundImage] = settings_api::PrefType::PREF_TYPE_BOOLEAN; diff --git a/browser/resources/settings/default_brave_shields_page/default_brave_shields_page.html b/browser/resources/settings/default_brave_shields_page/default_brave_shields_page.html index bac3f791e79..2170aa18f30 100644 --- a/browser/resources/settings/default_brave_shields_page/default_brave_shields_page.html +++ b/browser/resources/settings/default_brave_shields_page/default_brave_shields_page.html @@ -56,6 +56,15 @@ sub-label="$i18n{deAmpSettingSubLabel}" learn-more-url="$i18n{deAmpLearnMoreURL}"> + Always visit original (non-AMP) page URLs, instead of Google's Accelerated Mobile Page versions + + Auto-redirect tracking URLs + + + Enable support for bypassing top-level redirect tracking URLs. + Block Scripts diff --git a/browser/ui/webui/brave_settings_ui.cc b/browser/ui/webui/brave_settings_ui.cc index 63d2e8ae983..3a09eafd3bc 100644 --- a/browser/ui/webui/brave_settings_ui.cc +++ b/browser/ui/webui/brave_settings_ui.cc @@ -26,6 +26,7 @@ #include "brave/components/brave_vpn/buildflags/buildflags.h" #include "brave/components/brave_wallet/common/features.h" #include "brave/components/de_amp/common/features.h" +#include "brave/components/debounce/common/features.h" #include "brave/components/ntp_background_images/browser/view_counter_service.h" #include "brave/components/sidebar/buildflags/buildflags.h" #include "brave/components/speedreader/common/buildflags.h" @@ -123,6 +124,9 @@ void BraveSettingsUI::AddResources(content::WebUIDataSource* html_source, html_source->AddBoolean( "isDeAmpFeatureEnabled", base::FeatureList::IsEnabled(de_amp::features::kBraveDeAMP)); + html_source->AddBoolean( + "isDebounceFeatureEnabled", + base::FeatureList::IsEnabled(debounce::features::kBraveDebounce)); html_source->AddBoolean("isBraveRewardsSupported", brave_rewards::IsSupportedForProfile(profile)); diff --git a/browser/ui/webui/settings/brave_settings_localized_strings_provider.cc b/browser/ui/webui/settings/brave_settings_localized_strings_provider.cc index 3aa7006b16a..d377f3dc805 100644 --- a/browser/ui/webui/settings/brave_settings_localized_strings_provider.cc +++ b/browser/ui/webui/settings/brave_settings_localized_strings_provider.cc @@ -67,6 +67,8 @@ const char16_t kBraveSyncGuideUrl[] = u"https://support.brave.com/hc/en-us/articles/360047642371-Sync-FAQ"; const char16_t kDeAmpLearnMoreUrl[] = u"https://support.brave.com/hc/en-us/articles/8611298579981"; +const char16_t kDebounceLearnMoreUrl[] = + u"https://brave.com/privacy-updates/11-debouncing/"; void BraveAddCommonStrings(content::WebUIDataSource* html_source, Profile* profile) { @@ -153,6 +155,8 @@ void BraveAddCommonStrings(content::WebUIDataSource* html_source, {"speedreaderSettingSubLabel", IDS_SETTINGS_SPEEDREADER_SUB_LABEL}, {"deAmpSettingLabel", IDS_SETTINGS_DE_AMP_LABEL}, {"deAmpSettingSubLabel", IDS_SETTINGS_DE_AMP_SUB_LABEL}, + {"debounceSettingLabel", IDS_SETTINGS_DEBOUNCE_LABEL}, + {"debounceSettingSubLabel", IDS_SETTINGS_DEBOUNCE_SUB_LABEL}, {"braveShieldsTitle", IDS_SETTINGS_BRAVE_SHIELDS_TITLE}, {"braveShieldsDefaultsSectionTitle", IDS_SETTINGS_BRAVE_SHIELDS_DEFAULTS_TITLE}, @@ -583,6 +587,7 @@ void BraveAddCommonStrings(content::WebUIDataSource* html_source, html_source->AddString("googleLoginLearnMoreURL", kGoogleLoginLearnMoreURL); html_source->AddString("ipfsDNSLinkLearnMoreURL", kDNSLinkLearnMoreURL); html_source->AddString("deAmpLearnMoreURL", kDeAmpLearnMoreUrl); + html_source->AddString("debounceLearnMoreURL", kDebounceLearnMoreUrl); auto confirmation_phrase = brave_l10n::GetLocalizedResourceUTF16String( IDS_SETTINGS_WALLET_RESET_CONFIRMATION_PHRASE); html_source->AddString("walletResetConfirmationPhrase", confirmation_phrase); diff --git a/chromium_src/chrome/browser/DEPS b/chromium_src/chrome/browser/DEPS index 9a04885dc8b..50541737a6c 100644 --- a/chromium_src/chrome/browser/DEPS +++ b/chromium_src/chrome/browser/DEPS @@ -20,6 +20,7 @@ include_rules = [ "+brave/components/brave_webtorrent/grit", "+brave/components/constants", "+brave/components/content_settings/core", + "+brave/components/debounce", "+brave/components/decentralized_dns", "+brave/components/ipfs", "+brave/components/l10n/common", diff --git a/chromium_src/chrome/browser/flags/android/chrome_feature_list.cc b/chromium_src/chrome/browser/flags/android/chrome_feature_list.cc index 94966012bf5..14bffe722d6 100644 --- a/chromium_src/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chromium_src/chrome/browser/flags/android/chrome_feature_list.cc @@ -11,6 +11,7 @@ #include "brave/components/brave_today/common/features.h" #include "brave/components/brave_vpn/features.h" #include "brave/components/brave_wallet/common/features.h" +#include "brave/components/debounce/common/features.h" #include "third_party/blink/public/common/features.h" // clang-format off @@ -22,7 +23,8 @@ &brave_wallet::features::kNativeBraveWalletFeature, \ &brave_wallet::features::kBraveWalletSolanaFeature, \ &preferences::features::kBraveBackgroundVideoPlayback, \ - &safe_browsing::features::kBraveAndroidSafeBrowsing + &safe_browsing::features::kBraveAndroidSafeBrowsing, \ + &debounce::features::kBraveDebounce // clang-format on #include "src/chrome/browser/flags/android/chrome_feature_list.cc" diff --git a/components/debounce/browser/BUILD.gn b/components/debounce/browser/BUILD.gn index ecd049b621b..05d5618b651 100644 --- a/components/debounce/browser/BUILD.gn +++ b/components/debounce/browser/BUILD.gn @@ -16,8 +16,11 @@ source_set("browser") { "//base", "//brave/components/brave_component_updater/browser", "//brave/components/brave_shields/browser", + "//brave/components/debounce/common:common", "//brave/extensions:common", + "//components/prefs", "//components/prefs:prefs", + "//components/user_prefs", "//content/public/browser", "//third_party/re2:re2", "//ui/base", diff --git a/components/debounce/browser/debounce_navigation_throttle.cc b/components/debounce/browser/debounce_navigation_throttle.cc index c3adeaebb48..c1d0318a841 100644 --- a/components/debounce/browser/debounce_navigation_throttle.cc +++ b/components/debounce/browser/debounce_navigation_throttle.cc @@ -15,6 +15,9 @@ #include "base/memory/weak_ptr.h" #include "base/threading/sequenced_task_runner_handle.h" #include "brave/components/debounce/browser/debounce_service.h" +#include "brave/components/debounce/common/pref_names.h" +#include "components/user_prefs/user_prefs.h" +#include "content/public/browser/browser_context.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/navigation_throttle.h" @@ -90,6 +93,10 @@ DebounceNavigationThrottle::MaybeCreateThrottleFor( if (!debounce_service) return nullptr; + if (!debounce_service->IsEnabled()) { + return nullptr; + } + return std::make_unique(navigation_handle, debounce_service); } diff --git a/components/debounce/browser/debounce_service.cc b/components/debounce/browser/debounce_service.cc index ab1b53bff19..2380e06885e 100644 --- a/components/debounce/browser/debounce_service.cc +++ b/components/debounce/browser/debounce_service.cc @@ -13,6 +13,8 @@ #include "base/containers/flat_set.h" #include "base/logging.h" #include "brave/components/debounce/browser/debounce_component_installer.h" +#include "brave/components/debounce/common/pref_names.h" +#include "components/prefs/pref_registry_simple.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h" #include "url/origin.h" @@ -49,4 +51,13 @@ bool DebounceService::Debounce(const GURL& original_url, return false; } +// static +void DebounceService::RegisterProfilePrefs(PrefRegistrySimple* registry) { + registry->RegisterBooleanPref(prefs::kDebounceEnabled, true); // default on +} + +bool DebounceService::IsEnabled() { + return prefs_->GetBoolean(prefs::kDebounceEnabled); +} + } // namespace debounce diff --git a/components/debounce/browser/debounce_service.h b/components/debounce/browser/debounce_service.h index e250de73a08..2fd81248348 100644 --- a/components/debounce/browser/debounce_service.h +++ b/components/debounce/browser/debounce_service.h @@ -8,6 +8,7 @@ #include "base/memory/weak_ptr.h" #include "components/keyed_service/core/keyed_service.h" +#include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" class GURL; @@ -24,6 +25,8 @@ class DebounceService : public KeyedService { DebounceService& operator=(const DebounceService&) = delete; ~DebounceService() override; bool Debounce(const GURL& original_url, GURL* final_url) const; + static void RegisterProfilePrefs(PrefRegistrySimple* registry); + bool IsEnabled(); private: DebounceComponentInstaller* component_installer_ = nullptr; // NOT OWNED diff --git a/components/debounce/common/BUILD.gn b/components/debounce/common/BUILD.gn index 2c6bcead9ed..bc3a4cfdeb8 100644 --- a/components/debounce/common/BUILD.gn +++ b/components/debounce/common/BUILD.gn @@ -2,10 +2,13 @@ source_set("common") { sources = [ "features.cc", "features.h", + "pref_names.cc", + "pref_names.h", ] deps = [ "//base", + "//components/prefs", "//url", ] } diff --git a/components/debounce/common/pref_names.cc b/components/debounce/common/pref_names.cc new file mode 100644 index 00000000000..fea262129d6 --- /dev/null +++ b/components/debounce/common/pref_names.cc @@ -0,0 +1,12 @@ +// Copyright (c) 2022 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/debounce/common/pref_names.h" + +namespace debounce::prefs { + +const char kDebounceEnabled[] = "brave.debounce.enabled"; + +} // namespace debounce::prefs diff --git a/components/debounce/common/pref_names.h b/components/debounce/common/pref_names.h new file mode 100644 index 00000000000..9295e0fc4e1 --- /dev/null +++ b/components/debounce/common/pref_names.h @@ -0,0 +1,16 @@ +// Copyright (c) 2022 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_DEBOUNCE_COMMON_PREF_NAMES_H_ +#define BRAVE_COMPONENTS_DEBOUNCE_COMMON_PREF_NAMES_H_ + +namespace debounce::prefs { + +// Is debounce feature currently enabled +extern const char kDebounceEnabled[]; + +} // namespace debounce::prefs + +#endif // BRAVE_COMPONENTS_DEBOUNCE_COMMON_PREF_NAMES_H_