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_