diff --git a/browser/brave_content_browser_client.cc b/browser/brave_content_browser_client.cc index 4bea76fed8f1..b419eb426735 100644 --- a/browser/brave_content_browser_client.cc +++ b/browser/brave_content_browser_client.cc @@ -37,6 +37,7 @@ #include "brave/components/brave_shields/browser/brave_shields_util.h" #include "brave/components/brave_shields/browser/domain_block_navigation_throttle.h" #include "brave/components/brave_shields/common/brave_shield_constants.h" +#include "brave/components/brave_shields/common/features.h" #include "brave/components/brave_wallet/common/buildflags/buildflags.h" #include "brave/components/brave_webtorrent/browser/buildflags/buildflags.h" #include "brave/components/cosmetic_filters/browser/cosmetic_filters_resources.h" @@ -698,7 +699,9 @@ bool BraveContentBrowserClient::OverrideWebPreferencesAfterNavigation( HostContentSettingsMapFactory::GetForProfile(profile), url); // https://github.com/brave/brave-browser/issues/15265 // Always use color scheme Light if fingerprinting mode strict - if (shields_up && fingerprinting_type == ControlType::BLOCK) { + if (base::FeatureList::IsEnabled( + brave_shields::features::kBraveDarkModeBlock) && + shields_up && fingerprinting_type == ControlType::BLOCK) { prefs->preferred_color_scheme = blink::mojom::PreferredColorScheme::kLight; changed = true; } diff --git a/browser/farbling/brave_dark_mode_fingerprint_protection_browsertest.cc b/browser/farbling/brave_dark_mode_fingerprint_protection_browsertest.cc index 07afbdb83e76..4e0949cc03ed 100644 --- a/browser/farbling/brave_dark_mode_fingerprint_protection_browsertest.cc +++ b/browser/farbling/brave_dark_mode_fingerprint_protection_browsertest.cc @@ -6,6 +6,7 @@ #include "base/path_service.h" #include "base/strings/stringprintf.h" #include "base/task/post_task.h" +#include "base/test/scoped_feature_list.h" #include "base/test/thread_test_helper.h" #include "brave/browser/brave_content_browser_client.h" #include "brave/browser/extensions/brave_base_local_data_files_browsertest.h" @@ -13,6 +14,7 @@ #include "brave/common/pref_names.h" #include "brave/components/brave_component_updater/browser/local_data_files_service.h" #include "brave/components/brave_shields/browser/brave_shields_util.h" +#include "brave/components/brave_shields/common/features.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/ui/browser.h" #include "chrome/common/chrome_content_client.h" @@ -25,13 +27,14 @@ #include "ui/native_theme/test_native_theme.h" using brave_shields::ControlType; +using brave_shields::features::kBraveDarkModeBlock; const char kEmbeddedTestServerDirectory[] = "dark_mode_block"; const char kMatchDarkMode[] = "window.domAutomationController.send(window.matchMedia('(prefers-color-" "scheme: dark)').matches)"; -class BraveDarkModeFingerprintProtection : public InProcessBrowserTest { +class BraveDarkModeFingerprintProtectionTest : public InProcessBrowserTest { public: class BraveContentBrowserClientWithWebTheme : public BraveContentBrowserClient { @@ -106,7 +109,7 @@ class BraveDarkModeFingerprintProtection : public InProcessBrowserTest { GURL dark_mode_url_; }; -IN_PROC_BROWSER_TEST_F(BraveDarkModeFingerprintProtection, DarkModeCheck) { +IN_PROC_BROWSER_TEST_F(BraveDarkModeFingerprintProtectionTest, DarkModeCheck) { test_theme_.SetDarkMode(true); // On fingerprinting off, should return dark mode AllowFingerprinting(); @@ -126,7 +129,8 @@ IN_PROC_BROWSER_TEST_F(BraveDarkModeFingerprintProtection, DarkModeCheck) { EXPECT_EQ(u"light", tab_title); } -IN_PROC_BROWSER_TEST_F(BraveDarkModeFingerprintProtection, RegressionCheck) { +IN_PROC_BROWSER_TEST_F(BraveDarkModeFingerprintProtectionTest, + RegressionCheck) { test_theme_.SetDarkMode(false); // On all modes, should return light // Fingerprinting off @@ -147,7 +151,8 @@ IN_PROC_BROWSER_TEST_F(BraveDarkModeFingerprintProtection, RegressionCheck) { EXPECT_EQ(u"light", tab_title); } -IN_PROC_BROWSER_TEST_F(BraveDarkModeFingerprintProtection, SettingsPagesCheck) { +IN_PROC_BROWSER_TEST_F(BraveDarkModeFingerprintProtectionTest, + SettingsPagesCheck) { // On settings page should get dark mode with fingerprinting strict test_theme_.SetDarkMode(true); BlockFingerprinting(); @@ -157,3 +162,35 @@ IN_PROC_BROWSER_TEST_F(BraveDarkModeFingerprintProtection, SettingsPagesCheck) { &result)); EXPECT_TRUE(result); } + +class BraveDarkModeFingerprintProtectionFlagDisabledTest + : public BraveDarkModeFingerprintProtectionTest { + public: + BraveDarkModeFingerprintProtectionFlagDisabledTest() { + feature_list_.InitAndDisableFeature(kBraveDarkModeBlock); + } + + private: + base::test::ScopedFeatureList feature_list_; +}; + +IN_PROC_BROWSER_TEST_F(BraveDarkModeFingerprintProtectionFlagDisabledTest, + WithFeatureDisabled) { + test_theme_.SetDarkMode(true); + // On fingerprinting off, should return dark mode + AllowFingerprinting(); + NavigateToURLUntilLoadStop(dark_mode_url()); + std::u16string tab_title; + ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(), &tab_title)); + EXPECT_EQ(u"dark", tab_title); + // On fingerprinting default, should return dark mode + SetFingerprintingDefault(); + NavigateToURLUntilLoadStop(dark_mode_url()); + ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(), &tab_title)); + EXPECT_EQ(u"dark", tab_title); + // On fingerprinting block, should still return dark + BlockFingerprinting(); + NavigateToURLUntilLoadStop(dark_mode_url()); + ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(), &tab_title)); + EXPECT_EQ(u"dark", tab_title); +} diff --git a/chromium_src/chrome/browser/about_flags.cc b/chromium_src/chrome/browser/about_flags.cc index 70bac867a92f..e788c65d2ef4 100644 --- a/chromium_src/chrome/browser/about_flags.cc +++ b/chromium_src/chrome/browser/about_flags.cc @@ -30,6 +30,7 @@ using brave_shields::features::kBraveAdblockCollapseBlockedElements; using brave_shields::features::kBraveAdblockCosmeticFiltering; using brave_shields::features::kBraveAdblockCosmeticFilteringNative; using brave_shields::features::kBraveAdblockCspRules; +using brave_shields::features::kBraveDarkModeBlock; using brave_shields::features::kBraveDomainBlock; using brave_shields::features::kBraveExtensionNetworkBlocking; using ntp_background_images::features::kBraveNTPBrandedWallpaper; @@ -172,6 +173,10 @@ using ntp_background_images::features::kBraveNTPSuperReferralWallpaper; flag_descriptions::kBraveExtensionNetworkBlockingName, \ flag_descriptions::kBraveExtensionNetworkBlockingDescription, kOsAll, \ FEATURE_VALUE_TYPE(kBraveExtensionNetworkBlocking)}, \ + {"brave-dark-mode-block", \ + flag_descriptions::kBraveDarkModeBlockName, \ + flag_descriptions::kBraveDarkModeBlockDescription, kOsAll, \ + FEATURE_VALUE_TYPE(kBraveDarkModeBlock)}, \ SPEEDREADER_FEATURE_ENTRIES \ BRAVE_SYNC_FEATURE_ENTRIES \ BRAVE_IPFS_FEATURE_ENTRIES \ diff --git a/chromium_src/chrome/browser/flag_descriptions.cc b/chromium_src/chrome/browser/flag_descriptions.cc index 48bbea01018e..7a7e6a63bf59 100644 --- a/chromium_src/chrome/browser/flag_descriptions.cc +++ b/chromium_src/chrome/browser/flag_descriptions.cc @@ -48,6 +48,10 @@ const char kBraveExtensionNetworkBlockingName[] = "Enable extension network blocking"; const char kBraveExtensionNetworkBlockingDescription[] = "Enable blocking for network requests initiated by extensions"; +const char kBraveDarkModeBlockName[] = + "Enable dark mode blocking fingerprinting protection"; +const char kBraveDarkModeBlockDescription[] = + "Always report light mode when fingerprinting protections set to Strict"; const char kBraveSidebarName[] = "Enable Sidebar"; // TODO(simon): Use more better description. const char kBraveSidebarDescription[] = "Enable Sidebar"; diff --git a/chromium_src/chrome/browser/flag_descriptions.h b/chromium_src/chrome/browser/flag_descriptions.h index fb3dd1155edf..54381f83a4fe 100644 --- a/chromium_src/chrome/browser/flag_descriptions.h +++ b/chromium_src/chrome/browser/flag_descriptions.h @@ -31,6 +31,8 @@ extern const char kBraveDomainBlockName[]; extern const char kBraveDomainBlockDescription[]; extern const char kBraveExtensionNetworkBlockingName[]; extern const char kBraveExtensionNetworkBlockingDescription[]; +extern const char kBraveDarkModeBlockName[]; +extern const char kBraveDarkModeBlockDescription[]; extern const char kBraveSidebarName[]; extern const char kBraveSidebarDescription[]; extern const char kBraveSpeedreaderName[]; diff --git a/components/brave_shields/common/features.cc b/components/brave_shields/common/features.cc index bd52d8a11e8c..e9c945c19694 100644 --- a/components/brave_shields/common/features.cc +++ b/components/brave_shields/common/features.cc @@ -37,6 +37,8 @@ const base::Feature kBraveDomainBlock{"BraveDomainBlock", // potentially blocked by Brave Shields. const base::Feature kBraveExtensionNetworkBlocking{ "BraveExtensionNetworkBlocking", base::FEATURE_DISABLED_BY_DEFAULT}; - +// When enabled, Brave will always report Light in Fingerprinting: Strict mode +const base::Feature kBraveDarkModeBlock{"BraveDarkModeBlock", + base::FEATURE_ENABLED_BY_DEFAULT}; } // namespace features } // namespace brave_shields diff --git a/components/brave_shields/common/features.h b/components/brave_shields/common/features.h index 18f3184700c7..e005cd623ae5 100644 --- a/components/brave_shields/common/features.h +++ b/components/brave_shields/common/features.h @@ -19,6 +19,7 @@ extern const base::Feature kBraveAdblockCosmeticFilteringNative; extern const base::Feature kBraveAdblockCspRules; extern const base::Feature kBraveDomainBlock; extern const base::Feature kBraveExtensionNetworkBlocking; +extern const base::Feature kBraveDarkModeBlock; } // namespace features } // namespace brave_shields