diff --git a/browser/android/brave_shields_content_settings.cc b/browser/android/brave_shields_content_settings.cc index 10860ba180c5..3b281f6b67f6 100644 --- a/browser/android/brave_shields_content_settings.cc +++ b/browser/android/brave_shields_content_settings.cc @@ -155,7 +155,8 @@ void JNI_BraveShieldsContentSettings_SetCosmeticFilteringControlType( brave_shields::ControlTypeFromString( base::android::ConvertJavaStringToUTF8(env, type)), GURL(base::android::ConvertJavaStringToUTF8(env, url)), - g_browser_process->local_state()); + g_browser_process->local_state(), + ProfileAndroid::FromProfileAndroid(j_profile)->GetPrefs()); } base::android::ScopedJavaLocalRef @@ -182,7 +183,8 @@ void JNI_BraveShieldsContentSettings_SetFingerprintingControlType(JNIEnv* env, brave_shields::ControlTypeFromString( base::android::ConvertJavaStringToUTF8(env, type)), GURL(base::android::ConvertJavaStringToUTF8(env, url)), - g_browser_process->local_state()); + g_browser_process->local_state(), + ProfileAndroid::FromProfileAndroid(j_profile)->GetPrefs()); } base::android::ScopedJavaLocalRef diff --git a/browser/android/preferences/brave_pref_service_bridge.cc b/browser/android/preferences/brave_pref_service_bridge.cc index dc7f44feffc8..efaed6cff382 100644 --- a/browser/android/preferences/brave_pref_service_bridge.cc +++ b/browser/android/preferences/brave_pref_service_bridge.cc @@ -154,7 +154,8 @@ void JNI_BravePrefServiceBridge_SetCosmeticFilteringControlType(JNIEnv* env, // aggressive brave_shields::SetCosmeticFilteringControlType( HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()), - ControlType::BLOCK, GURL(), g_browser_process->local_state()); + ControlType::BLOCK, GURL(), g_browser_process->local_state(), + GetOriginalProfile()->GetPrefs()); brave_shields::SetAdControlType( HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()), ControlType::BLOCK, GURL(), g_browser_process->local_state()); @@ -163,7 +164,8 @@ void JNI_BravePrefServiceBridge_SetCosmeticFilteringControlType(JNIEnv* env, // standard brave_shields::SetCosmeticFilteringControlType( HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()), - ControlType::DEFAULT, GURL(), g_browser_process->local_state()); + ControlType::DEFAULT, GURL(), g_browser_process->local_state(), + GetOriginalProfile()->GetPrefs()); brave_shields::SetAdControlType( HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()), ControlType::BLOCK, GURL(), g_browser_process->local_state()); @@ -172,7 +174,8 @@ void JNI_BravePrefServiceBridge_SetCosmeticFilteringControlType(JNIEnv* env, // allow all brave_shields::SetCosmeticFilteringControlType( HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()), - ControlType::ALLOW, GURL(), g_browser_process->local_state()); + ControlType::ALLOW, GURL(), g_browser_process->local_state(), + GetOriginalProfile()->GetPrefs()); brave_shields::SetAdControlType( HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()), ControlType::ALLOW, GURL(), g_browser_process->local_state()); @@ -185,7 +188,8 @@ void JNI_BravePrefServiceBridge_SetCosmeticFilteringControlType(JNIEnv* env, ControlType::BLOCK, GURL(), g_browser_process->local_state()); brave_shields::SetCosmeticFilteringControlType( HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()), - ControlType::DEFAULT, GURL(), g_browser_process->local_state()); + ControlType::DEFAULT, GURL(), g_browser_process->local_state(), + GetOriginalProfile()->GetPrefs()); break; } } @@ -240,7 +244,8 @@ void JNI_BravePrefServiceBridge_SetFingerprintingControlType( HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile()), brave_shields::ControlTypeFromString( base::android::ConvertJavaStringToUTF8(env, type)), - GURL(), g_browser_process->local_state()); + GURL(), g_browser_process->local_state(), + GetOriginalProfile()->GetPrefs()); } base::android::ScopedJavaLocalRef diff --git a/browser/brave_local_state_prefs.cc b/browser/brave_local_state_prefs.cc index ca7ef26ef689..960bd9827296 100644 --- a/browser/brave_local_state_prefs.cc +++ b/browser/brave_local_state_prefs.cc @@ -90,7 +90,7 @@ void RegisterLocalStatePrefs(PrefRegistrySimple* registry) { #endif // BUILDFLAG(BRAVE_P3A_ENABLED) - brave_shields::RegisterShieldsP3APrefs(registry); + brave_shields::RegisterShieldsP3ALocalPrefs(registry); #if !BUILDFLAG(IS_ANDROID) BraveNewTabMessageHandler::RegisterLocalStatePrefs(registry); BraveWindowTracker::RegisterPrefs(registry); diff --git a/browser/brave_profile_prefs.cc b/browser/brave_profile_prefs.cc index e686178e1b11..9358d79e2643 100644 --- a/browser/brave_profile_prefs.cc +++ b/browser/brave_profile_prefs.cc @@ -24,6 +24,7 @@ #include "brave/components/brave_search/browser/brave_search_default_host.h" #include "brave/components/brave_search/common/brave_search_utils.h" #include "brave/components/brave_shields/browser/brave_farbling_service.h" +#include "brave/components/brave_shields/browser/brave_shields_p3a.h" #include "brave/components/brave_shields/common/pref_names.h" #include "brave/components/brave_sync/brave_sync_prefs.h" #include "brave/components/brave_today/browser/brave_news_controller.h" @@ -183,6 +184,8 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { brave_sync::Prefs::RegisterProfilePrefs(registry); + brave_shields::RegisterShieldsP3AProfilePrefs(registry); + #if BUILDFLAG(ENABLE_BRAVE_VPN) && !BUILDFLAG(IS_ANDROID) brave_vpn::prefs::RegisterProfilePrefs(registry); #endif diff --git a/browser/brave_shields/ad_block_pref_service_factory.cc b/browser/brave_shields/ad_block_pref_service_factory.cc index 6d9e319eaac3..ee9a345a67a8 100644 --- a/browser/brave_shields/ad_block_pref_service_factory.cc +++ b/browser/brave_shields/ad_block_pref_service_factory.cc @@ -35,9 +35,9 @@ AdBlockPrefServiceFactory::~AdBlockPrefServiceFactory() {} KeyedService* AdBlockPrefServiceFactory::BuildServiceInstanceFor( content::BrowserContext* context) const { - return new AdBlockPrefService( - g_brave_browser_process->ad_block_service(), - Profile::FromBrowserContext(context)->GetPrefs()); + Profile* profile = Profile::FromBrowserContext(context); + return new AdBlockPrefService(g_brave_browser_process->ad_block_service(), + profile->GetPrefs()); } content::BrowserContext* AdBlockPrefServiceFactory::GetBrowserContextToUse( diff --git a/browser/extensions/api/brave_shields_api.cc b/browser/extensions/api/brave_shields_api.cc index f4238d19e45a..e6592ed52289 100644 --- a/browser/extensions/api/brave_shields_api.cc +++ b/browser/extensions/api/brave_shields_api.cc @@ -172,10 +172,8 @@ BraveShieldsSetCosmeticFilteringControlTypeFunction::Run() { Profile* profile = Profile::FromBrowserContext(browser_context()); ::brave_shields::SetCosmeticFilteringControlType( - HostContentSettingsMapFactory::GetForProfile(profile), - control_type, - url, - g_browser_process->local_state()); + HostContentSettingsMapFactory::GetForProfile(profile), control_type, url, + g_browser_process->local_state(), profile->GetPrefs()); return RespondNow(NoArguments()); } @@ -312,10 +310,8 @@ BraveShieldsSetFingerprintingControlTypeFunction::Run() { Profile* profile = Profile::FromBrowserContext(browser_context()); ::brave_shields::SetFingerprintingControlType( - HostContentSettingsMapFactory::GetForProfile(profile), - control_type, - url, - g_browser_process->local_state()); + HostContentSettingsMapFactory::GetForProfile(profile), control_type, url, + g_browser_process->local_state(), profile->GetPrefs()); return RespondNow(NoArguments()); } diff --git a/browser/profiles/profile_util.cc b/browser/profiles/profile_util.cc index 940fe6a12e2d..552036c82308 100644 --- a/browser/profiles/profile_util.cc +++ b/browser/profiles/profile_util.cc @@ -16,10 +16,12 @@ #include "base/no_destructor.h" #include "brave/common/brave_constants.h" #include "brave/common/pref_names.h" +#include "brave/components/brave_shields/browser/brave_shields_p3a.h" #include "brave/components/ntp_background_images/common/pref_names.h" #include "brave/components/search_engines/brave_prepopulated_engines.h" #include "brave/components/tor/buildflags/buildflags.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_key.h" #include "chrome/browser/profiles/profile_manager.h" @@ -223,6 +225,11 @@ void RecordInitialP3AValues(Profile* profile) { return; } RecordSponsoredImagesEnabledP3A(profile); + if (profile->IsRegularProfile()) { + brave_shields::MaybeRecordInitialShieldsSettings( + profile->GetPrefs(), + HostContentSettingsMapFactory::GetForProfile(profile)); + } } void SetDefaultSearchVersion(Profile* profile, bool is_new_profile) { diff --git a/browser/ui/brave_shields_data_controller.cc b/browser/ui/brave_shields_data_controller.cc index 5302fa355d11..b609c54819c1 100644 --- a/browser/ui/brave_shields_data_controller.cc +++ b/browser/ui/brave_shields_data_controller.cc @@ -239,16 +239,21 @@ void BraveShieldsDataController::SetAdBlockMode(AdBlockMode mode) { if (mode == AdBlockMode::AGGRESSIVE) { control_type_cosmetic = ControlType::BLOCK; // aggressive - } else { + } else if (mode == AdBlockMode::STANDARD) { control_type_cosmetic = ControlType::BLOCK_THIRD_PARTY; // standard + } else { + control_type_cosmetic = ControlType::ALLOW; // allow } brave_shields::SetAdControlType(map, control_type_ad, GetCurrentSiteURL(), g_browser_process->local_state()); + PrefService* profile_prefs = + Profile::FromBrowserContext(web_contents()->GetBrowserContext()) + ->GetPrefs(); brave_shields::SetCosmeticFilteringControlType( map, control_type_cosmetic, GetCurrentSiteURL(), - g_browser_process->local_state()); + g_browser_process->local_state(), profile_prefs); ReloadWebContents(); } @@ -267,8 +272,12 @@ void BraveShieldsDataController::SetFingerprintMode(FingerprintMode mode) { control_type = ControlType::DEFAULT; // STANDARD } + PrefService* profile_prefs = + Profile::FromBrowserContext(web_contents()->GetBrowserContext()) + ->GetPrefs(); brave_shields::SetFingerprintingControlType( - map, control_type, GetCurrentSiteURL(), g_browser_process->local_state()); + map, control_type, GetCurrentSiteURL(), g_browser_process->local_state(), + profile_prefs); ReloadWebContents(); } diff --git a/browser/ui/brave_shields_data_controller_unittest.cc b/browser/ui/brave_shields_data_controller_unittest.cc index bb512432f7d4..9350ec96a0c0 100644 --- a/browser/ui/brave_shields_data_controller_unittest.cc +++ b/browser/ui/brave_shields_data_controller_unittest.cc @@ -125,7 +125,7 @@ TEST_F(BraveShieldsDataControllerTest, SetAdBlockMode_ForOrigin_1) { EXPECT_EQ(GetContentSettingFor(ContentSettingsType::BRAVE_ADS), CONTENT_SETTING_ALLOW); EXPECT_EQ(GetContentSettingFor(ContentSettingsType::BRAVE_COSMETIC_FILTERING), - CONTENT_SETTING_BLOCK); + CONTENT_SETTING_ALLOW); EXPECT_EQ(GetContentSettingFor(ContentSettingsType::BRAVE_COSMETIC_FILTERING, GURL("https://firstParty/")), CONTENT_SETTING_ALLOW); @@ -145,7 +145,7 @@ TEST_F(BraveShieldsDataControllerTest, SetAdBlockMode_ForOrigin_1) { EXPECT_EQ(GetContentSettingFor(ContentSettingsType::BRAVE_ADS), CONTENT_SETTING_ALLOW); EXPECT_EQ(GetContentSettingFor(ContentSettingsType::BRAVE_COSMETIC_FILTERING), - CONTENT_SETTING_BLOCK); + CONTENT_SETTING_ALLOW); EXPECT_EQ(GetContentSettingFor(ContentSettingsType::BRAVE_COSMETIC_FILTERING, GURL("https://firstParty/")), CONTENT_SETTING_ALLOW); @@ -165,7 +165,7 @@ TEST_F(BraveShieldsDataControllerTest, SetAdBlockMode_ForOrigin_1) { EXPECT_EQ(GetContentSettingFor(ContentSettingsType::BRAVE_ADS), CONTENT_SETTING_ALLOW); EXPECT_EQ(GetContentSettingFor(ContentSettingsType::BRAVE_COSMETIC_FILTERING), - CONTENT_SETTING_BLOCK); + CONTENT_SETTING_ALLOW); EXPECT_EQ(GetContentSettingFor(ContentSettingsType::BRAVE_COSMETIC_FILTERING, GURL("https://firstParty/")), CONTENT_SETTING_ALLOW); @@ -199,7 +199,7 @@ TEST_F(BraveShieldsDataControllerTest, SetAdBlockMode_ForOrigin_2) { EXPECT_EQ(GetContentSettingFor(ContentSettingsType::BRAVE_ADS), CONTENT_SETTING_ALLOW); EXPECT_EQ(GetContentSettingFor(ContentSettingsType::BRAVE_COSMETIC_FILTERING), - CONTENT_SETTING_BLOCK); + CONTENT_SETTING_ALLOW); EXPECT_EQ(GetContentSettingFor(ContentSettingsType::BRAVE_COSMETIC_FILTERING, GURL("https://firstParty/")), CONTENT_SETTING_ALLOW); @@ -263,7 +263,7 @@ TEST_F(BraveShieldsDataControllerTest, SetAdBlockMode_ForOrigin_3) { EXPECT_EQ(GetContentSettingFor(ContentSettingsType::BRAVE_ADS), CONTENT_SETTING_ALLOW); EXPECT_EQ(GetContentSettingFor(ContentSettingsType::BRAVE_COSMETIC_FILTERING), - CONTENT_SETTING_BLOCK); + CONTENT_SETTING_ALLOW); EXPECT_EQ(GetContentSettingFor(ContentSettingsType::BRAVE_COSMETIC_FILTERING, GURL("https://firstParty/")), CONTENT_SETTING_ALLOW); diff --git a/browser/ui/webui/settings/default_brave_shields_handler.cc b/browser/ui/webui/settings/default_brave_shields_handler.cc index 5b038d4efbb0..4d6d354920e1 100644 --- a/browser/ui/webui/settings/default_brave_shields_handler.cc +++ b/browser/ui/webui/settings/default_brave_shields_handler.cc @@ -114,7 +114,8 @@ void DefaultBraveShieldsHandler::SetCosmeticFilteringControlType( brave_shields::SetCosmeticFilteringControlType( HostContentSettingsMapFactory::GetForProfile(profile_), - ControlTypeFromString(value), GURL(), g_browser_process->local_state()); + ControlTypeFromString(value), GURL(), g_browser_process->local_state(), + profile_->GetPrefs()); } void DefaultBraveShieldsHandler::GetCookieControlType( @@ -162,7 +163,8 @@ void DefaultBraveShieldsHandler::SetFingerprintingControlType( brave_shields::SetFingerprintingControlType( HostContentSettingsMapFactory::GetForProfile(profile_), - ControlTypeFromString(value), GURL(), g_browser_process->local_state()); + ControlTypeFromString(value), GURL(), g_browser_process->local_state(), + profile_->GetPrefs()); } void DefaultBraveShieldsHandler::SetHTTPSEverywhereEnabled( diff --git a/chromium_src/chrome/renderer/worker_content_settings_client.cc b/chromium_src/chrome/renderer/worker_content_settings_client.cc index 04f99722b3d6..88a44caf8104 100644 --- a/chromium_src/chrome/renderer/worker_content_settings_client.cc +++ b/chromium_src/chrome/renderer/worker_content_settings_client.cc @@ -27,7 +27,7 @@ BraveFarblingLevel WorkerContentSettingsClient::GetBraveFarblingLevel() { setting = CONTENT_SETTING_ALLOW; } else { // Brave Shields is up, so check fingerprinting rules - setting = GetBraveFPContentSettingFromRules( + setting = brave_shields::GetBraveFPContentSettingFromRules( content_setting_rules_->fingerprinting_rules, primary_url); } } diff --git a/components/brave_shields/browser/ad_block_service.cc b/components/brave_shields/browser/ad_block_service.cc index 87977e851829..600d98924f8f 100644 --- a/components/brave_shields/browser/ad_block_service.cc +++ b/components/brave_shields/browser/ad_block_service.cc @@ -24,7 +24,6 @@ #include "brave/components/brave_shields/browser/ad_block_regional_service_manager.h" #include "brave/components/brave_shields/browser/ad_block_service_helper.h" #include "brave/components/brave_shields/browser/ad_block_subscription_service_manager.h" -#include "brave/components/brave_shields/browser/brave_shields_p3a.h" #include "brave/components/brave_shields/common/adblock_domain_resolver.h" #include "brave/components/brave_shields/common/brave_shield_constants.h" #include "brave/components/brave_shields/common/features.h" @@ -314,9 +313,6 @@ bool AdBlockService::Start() { regional_service_manager(); subscription_service_manager(); - MaybeRecordDefaultShieldsAdsSetting(local_state_); - MaybeRecordDefaultShieldsFingerprintSetting(local_state_); - return true; } diff --git a/components/brave_shields/browser/brave_shields_p3a.cc b/components/brave_shields/browser/brave_shields_p3a.cc index bc67c352b232..b0f7baa82307 100644 --- a/components/brave_shields/browser/brave_shields_p3a.cc +++ b/components/brave_shields/browser/brave_shields_p3a.cc @@ -5,24 +5,31 @@ #include "brave/components/brave_shields/browser/brave_shields_p3a.h" +#include + #include "base/logging.h" #include "base/metrics/histogram_functions.h" +#include "brave/components/brave_shields/browser/brave_shields_util.h" +#include "brave/components/brave_shields/common/brave_shield_utils.h" #include "brave/components/p3a/brave_p3a_utils.h" +#include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" +#include "url/gurl.h" namespace brave_shields { - namespace { -void MaybeRecordDefaultShieldsLevelSetting(PrefService* local_state, - const char* histogram_name, - const char* default_reported_pref) { - if (local_state->GetBoolean(default_reported_pref)) - return; - base::UmaHistogramExactLinear(histogram_name, 1, 3); - local_state->SetBoolean(default_reported_pref, true); -} +constexpr int kDomainCountBuckets[] = {0, 5, 10, 20, 30}; +constexpr int kDomainCountBucketCount = 6; + +constexpr ControlType kFPSettingOrder[] = { + ControlType::ALLOW, ControlType::DEFAULT, ControlType::BLOCK}; + +constexpr ControlType kAdsSettingOrder[] = { + ControlType::ALLOW, ControlType::BLOCK_THIRD_PARTY, ControlType::BLOCK}; + +constexpr int kSettingCount = 3; void RecordShieldsLevelSetting(const char* histogram_name, ControlType setting) { @@ -44,6 +51,79 @@ void RecordShieldsLevelSetting(const char* histogram_name, base::UmaHistogramExactLinear(histogram_name, hg_value, 3); } +const char* GetDomainSettingCountPrefName(bool is_fingerprint, + ControlType setting) { + if (is_fingerprint) { + switch (setting) { + case ControlType::ALLOW: + return kFPAllowCountPrefName; + case ControlType::DEFAULT: + return kFPStandardCountPrefName; + case ControlType::BLOCK: + return kFPStrictCountPrefName; + default: + return nullptr; + } + } else { + switch (setting) { + case ControlType::ALLOW: + return kAdsAllowCountPrefName; + case ControlType::BLOCK_THIRD_PARTY: + return kAdsStandardCountPrefName; + case ControlType::BLOCK: + return kAdsStrictCountPrefName; + default: + return nullptr; + } + } +} + +int GetDomainSettingCount(PrefService* profile_prefs, + bool is_fingerprint, + ControlType setting) { + const char* pref_name = + GetDomainSettingCountPrefName(is_fingerprint, setting); + if (pref_name == nullptr) { + return 0; + } + return profile_prefs->GetInteger(pref_name); +} + +void UpdateDomainSettingCount(PrefService* profile_prefs, + bool is_fingerprint, + ControlType setting, + int change) { + const char* pref_name = + GetDomainSettingCountPrefName(is_fingerprint, setting); + if (pref_name == nullptr) { + return; + } + int new_count = profile_prefs->GetInteger(pref_name) + change; + profile_prefs->SetInteger(pref_name, new_count); +} + +int DomainCountRelativeToGlobalSetting(PrefService* profile_prefs, + bool is_fingerprint, + ControlType global_setting, + bool count_above) { + const ControlType* setting_order = + is_fingerprint ? kFPSettingOrder : kAdsSettingOrder; + const ControlType* global_setting_order_it = + std::find(setting_order, setting_order + kSettingCount, global_setting); + if (global_setting_order_it == setting_order + kSettingCount) { + return 0; + } + int total = 0; + int sum_index_start = + global_setting_order_it - setting_order + (count_above ? 1 : -1); + for (int i = sum_index_start; count_above ? i < kSettingCount : i >= 0; + count_above ? i++ : i--) { + total += + GetDomainSettingCount(profile_prefs, is_fingerprint, setting_order[i]); + } + return total; +} + } // namespace void MaybeRecordShieldsUsageP3A(ShieldsIconUsage usage, @@ -52,17 +132,6 @@ void MaybeRecordShieldsUsageP3A(ShieldsIconUsage usage, usage, kUsageStatusHistogramName, kUsagePrefName, local_state); } -void MaybeRecordDefaultShieldsAdsSetting(PrefService* local_state) { - MaybeRecordDefaultShieldsLevelSetting(local_state, kAdsSettingHistogramName, - kAdsDefaultReportedPrefName); -} - -void MaybeRecordDefaultShieldsFingerprintSetting(PrefService* local_state) { - MaybeRecordDefaultShieldsLevelSetting(local_state, - kFingerprintSettingHistogramName, - kFingerprintDefaultReportedPrefName); -} - void RecordShieldsAdsSetting(ControlType setting) { RecordShieldsLevelSetting(kAdsSettingHistogramName, setting); } @@ -71,10 +140,114 @@ void RecordShieldsFingerprintSetting(ControlType setting) { RecordShieldsLevelSetting(kFingerprintSettingHistogramName, setting); } -void RegisterShieldsP3APrefs(PrefRegistrySimple* local_state) { +void RecordShieldsDomainSettingCounts(PrefService* profile_prefs, + bool is_fingerprint, + ControlType global_setting) { + if (profile_prefs == nullptr) { + return; + } + const char* above_hg_name = is_fingerprint + ? kDomainFPSettingsAboveHistogramName + : kDomainAdsSettingsAboveHistogramName; + const char* below_hg_name = is_fingerprint + ? kDomainFPSettingsBelowHistogramName + : kDomainAdsSettingsBelowHistogramName; + int above_total = DomainCountRelativeToGlobalSetting( + profile_prefs, is_fingerprint, global_setting, true); + int below_total = DomainCountRelativeToGlobalSetting( + profile_prefs, is_fingerprint, global_setting, false); + VLOG(1) << "BraveShieldsP3A: Recording counts: is_fp=" << is_fingerprint + << " above=" << above_total << " below=" << below_total; + int above_bucket_val = + std::lower_bound(kDomainCountBuckets, std::end(kDomainCountBuckets), + above_total) - + kDomainCountBuckets; + int below_bucket_val = + std::lower_bound(kDomainCountBuckets, std::end(kDomainCountBuckets), + below_total) - + kDomainCountBuckets; + base::UmaHistogramExactLinear(above_hg_name, above_bucket_val, + kDomainCountBucketCount); + base::UmaHistogramExactLinear(below_hg_name, below_bucket_val, + kDomainCountBucketCount); +} + +void RecordShieldsDomainSettingCountsWithChange(PrefService* profile_prefs, + bool is_fingerprint, + ControlType global_setting, + ControlType* prev_setting, + ControlType new_setting) { + if (profile_prefs == nullptr) { + return; + } + if (prev_setting != nullptr) { + UpdateDomainSettingCount(profile_prefs, is_fingerprint, *prev_setting, -1); + VLOG(1) << "BraveShieldsP3A: Decreasing prev setting count: prev_setting=" + << *prev_setting << " is_fp=" << is_fingerprint << " count=" + << GetDomainSettingCount(profile_prefs, is_fingerprint, + *prev_setting); + } + UpdateDomainSettingCount(profile_prefs, is_fingerprint, new_setting, 1); + VLOG(1) << "BraveShieldsP3A: Increasing new setting count: new_setting=" + << new_setting << " is_fp=" << is_fingerprint << " count=" + << GetDomainSettingCount(profile_prefs, is_fingerprint, new_setting); + RecordShieldsDomainSettingCounts(profile_prefs, is_fingerprint, + global_setting); +} + +void MaybeRecordInitialShieldsSettings(PrefService* profile_prefs, + HostContentSettingsMap* map) { + if (profile_prefs->GetBoolean(kFirstReportedPrefName)) { + return; + } + VLOG(1) << "BraveShieldsP3A: Starting initial report for profile"; + + ControlType global_ads_setting = GetCosmeticFilteringControlType(map, GURL()); + ControlType global_fp_setting = GetFingerprintingControlType(map, GURL()); + RecordShieldsAdsSetting(global_ads_setting); + RecordShieldsFingerprintSetting(global_fp_setting); + + ShieldsSettingCounts fp_counts = GetFPSettingCount(map); + ShieldsSettingCounts ads_counts = GetAdsSettingCount(map); + + VLOG(1) << "BraveShieldsP3A: Domain FP counts: allow=" << fp_counts.allow + << " standard=" << fp_counts.standard + << " agg=" << fp_counts.aggressive; + VLOG(1) << "BraveShieldsP3A: Domain Ad counts: allow=" << ads_counts.allow + << " standard=" << ads_counts.standard + << " agg=" << ads_counts.aggressive; + + UpdateDomainSettingCount(profile_prefs, true, ControlType::ALLOW, + fp_counts.allow); + UpdateDomainSettingCount(profile_prefs, true, ControlType::DEFAULT, + fp_counts.standard); + UpdateDomainSettingCount(profile_prefs, true, ControlType::BLOCK, + fp_counts.aggressive); + + UpdateDomainSettingCount(profile_prefs, false, ControlType::ALLOW, + ads_counts.allow); + UpdateDomainSettingCount(profile_prefs, false, ControlType::BLOCK_THIRD_PARTY, + ads_counts.standard); + UpdateDomainSettingCount(profile_prefs, false, ControlType::BLOCK, + ads_counts.aggressive); + + RecordShieldsDomainSettingCounts(profile_prefs, false, global_ads_setting); + RecordShieldsDomainSettingCounts(profile_prefs, true, global_fp_setting); + profile_prefs->SetBoolean(kFirstReportedPrefName, true); +} + +void RegisterShieldsP3ALocalPrefs(PrefRegistrySimple* local_state) { local_state->RegisterIntegerPref(kUsagePrefName, -1); - local_state->RegisterBooleanPref(kAdsDefaultReportedPrefName, false); - local_state->RegisterBooleanPref(kFingerprintDefaultReportedPrefName, false); +} + +void RegisterShieldsP3AProfilePrefs(PrefRegistrySimple* profile_state) { + profile_state->RegisterBooleanPref(kFirstReportedPrefName, false); + profile_state->RegisterIntegerPref(kAdsStrictCountPrefName, 0); + profile_state->RegisterIntegerPref(kAdsStandardCountPrefName, 0); + profile_state->RegisterIntegerPref(kAdsAllowCountPrefName, 0); + profile_state->RegisterIntegerPref(kFPStrictCountPrefName, 0); + profile_state->RegisterIntegerPref(kFPStandardCountPrefName, 0); + profile_state->RegisterIntegerPref(kFPAllowCountPrefName, 0); } } // namespace brave_shields diff --git a/components/brave_shields/browser/brave_shields_p3a.h b/components/brave_shields/browser/brave_shields_p3a.h index 419139f8b0ff..381d986cde34 100644 --- a/components/brave_shields/browser/brave_shields_p3a.h +++ b/components/brave_shields/browser/brave_shields_p3a.h @@ -10,18 +10,38 @@ class PrefRegistrySimple; class PrefService; +class HostContentSettingsMap; namespace brave_shields { constexpr char kUsagePrefName[] = "brave_shields.p3a_usage"; -constexpr char kAdsDefaultReportedPrefName[] = - "brave_shields.ads_default_reported"; -constexpr char kFingerprintDefaultReportedPrefName[] = - "brave_shields.fingerprint_default_reported"; +constexpr char kFirstReportedPrefName[] = "brave_shields.p3a_first_reported"; + +constexpr char kAdsStrictCountPrefName[] = + "brave_shields.p3a_ads_strict_domain_count"; +constexpr char kAdsStandardCountPrefName[] = + "brave_shields.p3a_ads_standard_domain_count"; +constexpr char kAdsAllowCountPrefName[] = + "brave_shields.p3a_ads_allow_domain_count"; +constexpr char kFPStrictCountPrefName[] = + "brave_shields.p3a_fp_strict_domain_count"; +constexpr char kFPStandardCountPrefName[] = + "brave_shields.p3a_fp_standard_domain_count"; +constexpr char kFPAllowCountPrefName[] = + "brave_shields.p3a_fp_allow_domain_count"; + constexpr char kAdsSettingHistogramName[] = "Brave.Shields.AdBlockSetting"; constexpr char kFingerprintSettingHistogramName[] = "Brave.Shields.FingerprintBlockSetting"; constexpr char kUsageStatusHistogramName[] = "Brave.Shields.UsageStatus"; +constexpr char kDomainAdsSettingsAboveHistogramName[] = + "Brave.Shields.DomainAdsSettingsAboveGlobal"; +constexpr char kDomainAdsSettingsBelowHistogramName[] = + "Brave.Shields.DomainAdsSettingsBelowGlobal"; +constexpr char kDomainFPSettingsAboveHistogramName[] = + "Brave.Shields.DomainFingerprintSettingsAboveGlobal"; +constexpr char kDomainFPSettingsBelowHistogramName[] = + "Brave.Shields.DomainFingerprintSettingsBelowGlobal"; // Note: append-only enumeration! Never remove any existing values, as this enum // is used to bucket a UMA histogram, and removing values breaks that. enum ShieldsIconUsage { @@ -40,15 +60,26 @@ enum ShieldsIconUsage { void MaybeRecordShieldsUsageP3A(ShieldsIconUsage usage, PrefService* local_state); -void MaybeRecordDefaultShieldsAdsSetting(PrefService* local_state); - -void MaybeRecordDefaultShieldsFingerprintSetting(PrefService* local_state); - void RecordShieldsAdsSetting(ControlType setting); void RecordShieldsFingerprintSetting(ControlType setting); -void RegisterShieldsP3APrefs(PrefRegistrySimple* local_state); +void RecordShieldsDomainSettingCounts(PrefService* profile_prefs, + bool is_fingerprint, + ControlType global_setting); + +void RecordShieldsDomainSettingCountsWithChange(PrefService* profile_prefs, + bool is_fingerprint, + ControlType global_setting, + ControlType* prev_setting, + ControlType new_setting); + +void RegisterShieldsP3ALocalPrefs(PrefRegistrySimple* local_state); + +void RegisterShieldsP3AProfilePrefs(PrefRegistrySimple* local_state); + +void MaybeRecordInitialShieldsSettings(PrefService* profile_prefs, + HostContentSettingsMap* map); } // namespace brave_shields diff --git a/components/brave_shields/browser/brave_shields_p3a_unittest.cc b/components/brave_shields/browser/brave_shields_p3a_unittest.cc new file mode 100644 index 000000000000..79d71bcd58ba --- /dev/null +++ b/components/brave_shields/browser/brave_shields_p3a_unittest.cc @@ -0,0 +1,194 @@ +/* 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 http://mozilla.org/MPL/2.0/. */ + +#include + +#include "base/test/metrics/histogram_tester.h" +#include "brave/components/brave_shields/browser/brave_shields_p3a.h" +#include "brave/components/brave_shields/browser/brave_shields_util.h" +#include "chrome/browser/content_settings/host_content_settings_map_factory.h" +#include "chrome/test/base/testing_profile.h" +#include "content/public/test/browser_task_environment.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace brave_shields { + +class BraveShieldsP3ATest : public testing::Test { + public: + void SetUp() override { + profile_ = std::make_unique(); + histogram_tester_ = std::make_unique(); + } + + Profile* GetProfile() const { return profile_.get(); } + + protected: + std::unique_ptr histogram_tester_; + + private: + content::BrowserTaskEnvironment task_environment_; + std::unique_ptr profile_; +}; + +TEST_F(BraveShieldsP3ATest, RecordGlobalAdBlockSetting) { + auto* map = HostContentSettingsMapFactory::GetForProfile(GetProfile()); + SetCosmeticFilteringControlType(map, ControlType::BLOCK, + GURL("https://brave.com")); + // Should not report to histogram if not a global change + histogram_tester_->ExpectTotalCount(kAdsSettingHistogramName, 0); + + SetCosmeticFilteringControlType(map, ControlType::BLOCK, GURL()); + histogram_tester_->ExpectBucketCount(kAdsSettingHistogramName, 2, 1); + + SetCosmeticFilteringControlType(map, ControlType::BLOCK_THIRD_PARTY, GURL()); + histogram_tester_->ExpectBucketCount(kAdsSettingHistogramName, 1, 1); + + SetCosmeticFilteringControlType(map, ControlType::ALLOW, GURL()); + histogram_tester_->ExpectBucketCount(kAdsSettingHistogramName, 0, 1); + + histogram_tester_->ExpectTotalCount(kAdsSettingHistogramName, 3); +} + +TEST_F(BraveShieldsP3ATest, RecordGlobalFingerprintBlockSetting) { + auto* map = HostContentSettingsMapFactory::GetForProfile(GetProfile()); + SetFingerprintingControlType(map, ControlType::BLOCK, + GURL("https://brave.com")); + // Should not report to histogram if not a global change + histogram_tester_->ExpectTotalCount(kFingerprintSettingHistogramName, 0); + + SetFingerprintingControlType(map, ControlType::BLOCK, GURL()); + histogram_tester_->ExpectBucketCount(kFingerprintSettingHistogramName, 2, 1); + + SetFingerprintingControlType(map, ControlType::DEFAULT, GURL()); + histogram_tester_->ExpectBucketCount(kFingerprintSettingHistogramName, 1, 1); + + SetFingerprintingControlType(map, ControlType::ALLOW, GURL()); + histogram_tester_->ExpectBucketCount(kFingerprintSettingHistogramName, 0, 1); + + histogram_tester_->ExpectTotalCount(kFingerprintSettingHistogramName, 3); +} + +TEST_F(BraveShieldsP3ATest, RecordDomainAdBlockCounts) { + auto* map = HostContentSettingsMapFactory::GetForProfile(GetProfile()); + auto* prefs = GetProfile()->GetPrefs(); + + SetCosmeticFilteringControlType(map, ControlType::BLOCK_THIRD_PARTY, GURL()); + SetCosmeticFilteringControlType(map, ControlType::BLOCK, + GURL("https://brave.com")); + + // Test initial count + MaybeRecordInitialShieldsSettings(GetProfile()->GetPrefs(), map); + histogram_tester_->ExpectBucketCount(kDomainAdsSettingsAboveHistogramName, 1, + 1); + histogram_tester_->ExpectBucketCount(kDomainAdsSettingsBelowHistogramName, 0, + 1); + + // Test delta counting + SetCosmeticFilteringControlType(map, ControlType::ALLOW, + GURL("https://brave.com"), nullptr, prefs); + histogram_tester_->ExpectBucketCount(kDomainAdsSettingsAboveHistogramName, 0, + 1); + histogram_tester_->ExpectBucketCount(kDomainAdsSettingsBelowHistogramName, 1, + 1); + + SetCosmeticFilteringControlType(map, ControlType::BLOCK, + GURL("https://yahoo.com"), nullptr, prefs); + SetCosmeticFilteringControlType(map, ControlType::BLOCK, + GURL("https://reddit.com"), nullptr, prefs); + SetCosmeticFilteringControlType( + map, ControlType::BLOCK, GURL("https://craigslist.com"), nullptr, prefs); + SetCosmeticFilteringControlType(map, ControlType::BLOCK, + GURL("https://github.com"), nullptr, prefs); + SetCosmeticFilteringControlType(map, ControlType::BLOCK, + GURL("https://amazon.com"), nullptr, prefs); + histogram_tester_->ExpectBucketCount(kDomainAdsSettingsAboveHistogramName, 1, + 6); + histogram_tester_->ExpectBucketCount(kDomainAdsSettingsBelowHistogramName, 1, + 6); + + SetCosmeticFilteringControlType(map, ControlType::BLOCK, + GURL("https://brave.com"), nullptr, prefs); + histogram_tester_->ExpectBucketCount(kDomainAdsSettingsAboveHistogramName, 2, + 1); + histogram_tester_->ExpectBucketCount(kDomainAdsSettingsBelowHistogramName, 0, + 2); + + // Change global setting + SetCosmeticFilteringControlType(map, ControlType::BLOCK, GURL(), nullptr, + prefs); + histogram_tester_->ExpectBucketCount(kDomainAdsSettingsAboveHistogramName, 0, + 2); + histogram_tester_->ExpectBucketCount(kDomainAdsSettingsBelowHistogramName, 0, + 3); + + SetCosmeticFilteringControlType(map, ControlType::BLOCK_THIRD_PARTY, + GURL("https://amazon.com"), nullptr, prefs); + histogram_tester_->ExpectBucketCount(kDomainAdsSettingsAboveHistogramName, 0, + 3); + histogram_tester_->ExpectBucketCount(kDomainAdsSettingsBelowHistogramName, 1, + 7); +} + +TEST_F(BraveShieldsP3ATest, RecordDomainFingerprintBlockCounts) { + auto* map = HostContentSettingsMapFactory::GetForProfile(GetProfile()); + auto* prefs = GetProfile()->GetPrefs(); + + SetFingerprintingControlType(map, ControlType::DEFAULT, GURL()); + SetFingerprintingControlType(map, ControlType::BLOCK, + GURL("https://brave.com")); + + // Test initial count + MaybeRecordInitialShieldsSettings(GetProfile()->GetPrefs(), map); + histogram_tester_->ExpectBucketCount(kDomainFPSettingsAboveHistogramName, 1, + 1); + histogram_tester_->ExpectBucketCount(kDomainFPSettingsBelowHistogramName, 0, + 1); + + // Test delta counting + SetFingerprintingControlType(map, ControlType::ALLOW, + GURL("https://brave.com"), nullptr, prefs); + histogram_tester_->ExpectBucketCount(kDomainFPSettingsAboveHistogramName, 0, + 1); + histogram_tester_->ExpectBucketCount(kDomainFPSettingsBelowHistogramName, 1, + 1); + + SetFingerprintingControlType(map, ControlType::BLOCK, + GURL("https://yahoo.com"), nullptr, prefs); + SetFingerprintingControlType(map, ControlType::BLOCK, + GURL("https://reddit.com"), nullptr, prefs); + SetFingerprintingControlType(map, ControlType::BLOCK, + GURL("https://craigslist.com"), nullptr, prefs); + SetFingerprintingControlType(map, ControlType::BLOCK, + GURL("https://github.com"), nullptr, prefs); + SetFingerprintingControlType(map, ControlType::BLOCK, + GURL("https://amazon.com"), nullptr, prefs); + histogram_tester_->ExpectBucketCount(kDomainFPSettingsAboveHistogramName, 1, + 6); + histogram_tester_->ExpectBucketCount(kDomainFPSettingsBelowHistogramName, 1, + 6); + + SetFingerprintingControlType(map, ControlType::BLOCK, + GURL("https://brave.com"), nullptr, prefs); + histogram_tester_->ExpectBucketCount(kDomainFPSettingsAboveHistogramName, 2, + 1); + histogram_tester_->ExpectBucketCount(kDomainFPSettingsBelowHistogramName, 0, + 2); + + // Change global setting + SetFingerprintingControlType(map, ControlType::BLOCK, GURL(), nullptr, prefs); + histogram_tester_->ExpectBucketCount(kDomainFPSettingsAboveHistogramName, 0, + 2); + histogram_tester_->ExpectBucketCount(kDomainFPSettingsBelowHistogramName, 0, + 3); + + SetFingerprintingControlType(map, ControlType::DEFAULT, + GURL("https://amazon.com"), nullptr, prefs); + histogram_tester_->ExpectBucketCount(kDomainFPSettingsAboveHistogramName, 0, + 3); + histogram_tester_->ExpectBucketCount(kDomainFPSettingsBelowHistogramName, 1, + 7); +} + +} // namespace brave_shields diff --git a/components/brave_shields/browser/brave_shields_util.cc b/components/brave_shields/browser/brave_shields_util.cc index b055ec37acc2..ca6680ecafca 100644 --- a/components/brave_shields/browser/brave_shields_util.cc +++ b/components/brave_shields/browser/brave_shields_util.cc @@ -184,13 +184,22 @@ ControlType GetAdControlType(HostContentSettingsMap* map, const GURL& url) { void SetCosmeticFilteringControlType(HostContentSettingsMap* map, ControlType type, const GURL& url, - PrefService* local_state) { + PrefService* local_state, + PrefService* profile_state) { auto primary_pattern = GetPatternFromURL(url); if (!primary_pattern.IsValid()) { return; } + ControlType prev_setting = GetCosmeticFilteringControlType(map, url); + content_settings::SettingInfo setting_info; + base::Value web_setting = map->GetWebsiteSetting( + url, GURL(), ContentSettingsType::BRAVE_COSMETIC_FILTERING, + &setting_info); + bool was_default = + web_setting.is_none() || setting_info.primary_pattern.MatchesAllHosts(); + map->SetContentSettingCustomScope( primary_pattern, ContentSettingsPattern::Wildcard(), ContentSettingsType::BRAVE_COSMETIC_FILTERING, @@ -202,10 +211,21 @@ void SetCosmeticFilteringControlType(HostContentSettingsMap* map, ContentSettingsType::BRAVE_COSMETIC_FILTERING, GetDefaultAllowFromControlType(type)); - RecordShieldsSettingChanged(local_state); - if (url.is_empty()) { - // If global setting changed, report to P3A - RecordShieldsAdsSetting(type); + if (!map->IsOffTheRecord()) { + // Only report to P3A if not a guest/incognito profile + RecordShieldsSettingChanged(local_state); + if (url.is_empty()) { + // If global setting changed, report global setting and recalulate + // domain specific setting counts + RecordShieldsAdsSetting(type); + RecordShieldsDomainSettingCounts(profile_state, false, type); + } else { + // If domain specific setting changed, recalculate counts + ControlType global_setting = GetCosmeticFilteringControlType(map, GURL()); + RecordShieldsDomainSettingCountsWithChange( + profile_state, false, global_setting, + was_default ? nullptr : &prev_setting, type); + } } } @@ -368,12 +388,21 @@ bool AllowReferrers(HostContentSettingsMap* map, const GURL& url) { void SetFingerprintingControlType(HostContentSettingsMap* map, ControlType type, const GURL& url, - PrefService* local_state) { + PrefService* local_state, + PrefService* profile_state) { auto primary_pattern = GetPatternFromURL(url); if (!primary_pattern.IsValid()) return; + ControlType prev_setting = GetFingerprintingControlType(map, url); + content_settings::SettingInfo setting_info; + base::Value web_setting = map->GetWebsiteSetting( + url, GURL("https://balanced/*"), + ContentSettingsType::BRAVE_FINGERPRINTING_V2, &setting_info); + bool was_default = + web_setting.is_none() || setting_info.primary_pattern.MatchesAllHosts(); + // Clear previous value to have only one rule for one pattern. map->SetContentSettingCustomScope( primary_pattern, ContentSettingsPattern::FromString("https://balanced/*"), @@ -395,10 +424,21 @@ void SetFingerprintingControlType(HostContentSettingsMap* map, primary_pattern, secondary_pattern, ContentSettingsType::BRAVE_FINGERPRINTING_V2, content_setting); - RecordShieldsSettingChanged(local_state); - if (url.is_empty()) { - // If global setting changed, report to P3A - RecordShieldsFingerprintSetting(type); + if (!map->IsOffTheRecord()) { + // Only report to P3A if not a guest/incognito profile + RecordShieldsSettingChanged(local_state); + if (url.is_empty()) { + // If global setting changed, report global setting and recalulate + // domain specific setting counts + RecordShieldsFingerprintSetting(type); + RecordShieldsDomainSettingCounts(profile_state, true, type); + } else { + // If domain specific setting changed, recalculate counts + ControlType global_setting = GetFingerprintingControlType(map, GURL()); + RecordShieldsDomainSettingCountsWithChange( + profile_state, true, global_setting, + was_default ? nullptr : &prev_setting, type); + } } } @@ -518,4 +558,18 @@ bool MaybeChangeReferrer(bool allow_referrers, return true; } +ShieldsSettingCounts GetFPSettingCount(HostContentSettingsMap* map) { + ContentSettingsForOneType fp_rules; + map->GetSettingsForOneType(ContentSettingsType::BRAVE_FINGERPRINTING_V2, + &fp_rules); + return GetFPSettingCountFromRules(fp_rules); +} + +ShieldsSettingCounts GetAdsSettingCount(HostContentSettingsMap* map) { + ContentSettingsForOneType cosmetic_rules; + map->GetSettingsForOneType(ContentSettingsType::BRAVE_COSMETIC_FILTERING, + &cosmetic_rules); + return GetAdsSettingCountFromRules(cosmetic_rules); +} + } // namespace brave_shields diff --git a/components/brave_shields/browser/brave_shields_util.h b/components/brave_shields/browser/brave_shields_util.h index 99e86cb12fdb..68c049f80bed 100644 --- a/components/brave_shields/browser/brave_shields_util.h +++ b/components/brave_shields/browser/brave_shields_util.h @@ -43,6 +43,8 @@ enum class DomainBlockingType { kAggressive, }; +struct ShieldsSettingCounts; + ContentSettingsPattern GetPatternFromURL(const GURL& url); std::string ControlTypeToString(ControlType type); ControlType ControlTypeFromString(const std::string& string); @@ -64,7 +66,8 @@ ControlType GetAdControlType(HostContentSettingsMap* map, const GURL& url); void SetCosmeticFilteringControlType(HostContentSettingsMap* map, ControlType type, const GURL& url, - PrefService* local_state = nullptr); + PrefService* local_state = nullptr, + PrefService* profile_state = nullptr); ControlType GetCosmeticFilteringControlType(HostContentSettingsMap* map, const GURL& url); bool IsFirstPartyCosmeticFilteringEnabled(HostContentSettingsMap* map, @@ -94,7 +97,8 @@ bool AllowReferrers(HostContentSettingsMap* map, const GURL& url); void SetFingerprintingControlType(HostContentSettingsMap* map, ControlType type, const GURL& url, - PrefService* local_state = nullptr); + PrefService* local_state = nullptr, + PrefService* profile_state = nullptr); ControlType GetFingerprintingControlType(HostContentSettingsMap* map, const GURL& url); @@ -121,6 +125,9 @@ bool MaybeChangeReferrer(bool allow_referrers, const GURL& target_url, content::Referrer* output_referrer); +ShieldsSettingCounts GetFPSettingCount(HostContentSettingsMap* map); +ShieldsSettingCounts GetAdsSettingCount(HostContentSettingsMap* map); + } // namespace brave_shields #endif // BRAVE_COMPONENTS_BRAVE_SHIELDS_BROWSER_BRAVE_SHIELDS_UTIL_H_ diff --git a/components/brave_shields/browser/brave_shields_util_unittest.cc b/components/brave_shields/browser/brave_shields_util_unittest.cc index c51cbc5e5825..fee818fea64b 100644 --- a/components/brave_shields/browser/brave_shields_util_unittest.cc +++ b/components/brave_shields/browser/brave_shields_util_unittest.cc @@ -5,7 +5,6 @@ #include -#include "base/test/metrics/histogram_tester.h" #include "brave/components/brave_shields/browser/brave_shields_p3a.h" #include "brave/components/brave_shields/browser/brave_shields_util.h" #include "brave/components/brave_shields/common/brave_shield_constants.h" @@ -33,10 +32,7 @@ class BraveShieldsUtilTest : public testing::Test { BraveShieldsUtilTest& operator=(const BraveShieldsUtilTest&) = delete; ~BraveShieldsUtilTest() override = default; - void SetUp() override { - profile_ = std::make_unique(); - histogram_tester_ = std::make_unique(); - } + void SetUp() override { profile_ = std::make_unique(); } TestingProfile* profile() { return profile_.get(); } @@ -47,9 +43,6 @@ class BraveShieldsUtilTest : public testing::Test { EXPECT_EQ(domain_blocking_type, setting); } - protected: - std::unique_ptr histogram_tester_; - private: content::BrowserTaskEnvironment task_environment_; std::unique_ptr profile_; @@ -953,58 +946,6 @@ TEST_F(BraveShieldsUtilTest, GetDomainBlockingType_ControlTypes) { } } -TEST_F(BraveShieldsUtilTest, RecordAdBlockSetting) { - auto* map = HostContentSettingsMapFactory::GetForProfile(profile()); - brave_shields::SetCosmeticFilteringControlType(map, ControlType::BLOCK, - GURL("https://brave.com")); - // Should not report to histogram if not a global change - histogram_tester_->ExpectTotalCount(brave_shields::kAdsSettingHistogramName, - 0); - - brave_shields::SetCosmeticFilteringControlType(map, ControlType::BLOCK, - GURL()); - histogram_tester_->ExpectBucketCount(brave_shields::kAdsSettingHistogramName, - 2, 1); - - brave_shields::SetCosmeticFilteringControlType( - map, ControlType::BLOCK_THIRD_PARTY, GURL()); - histogram_tester_->ExpectBucketCount(brave_shields::kAdsSettingHistogramName, - 1, 1); - - brave_shields::SetCosmeticFilteringControlType(map, ControlType::ALLOW, - GURL()); - histogram_tester_->ExpectBucketCount(brave_shields::kAdsSettingHistogramName, - 0, 1); - - histogram_tester_->ExpectTotalCount(brave_shields::kAdsSettingHistogramName, - 3); -} - -TEST_F(BraveShieldsUtilTest, RecordFingerprintBlockSetting) { - auto* map = HostContentSettingsMapFactory::GetForProfile(profile()); - brave_shields::SetFingerprintingControlType(map, ControlType::BLOCK, - GURL("https://brave.com")); - // Should not report to histogram if not a global change - histogram_tester_->ExpectTotalCount( - brave_shields::kFingerprintSettingHistogramName, 0); - - brave_shields::SetFingerprintingControlType(map, ControlType::BLOCK, GURL()); - histogram_tester_->ExpectBucketCount( - brave_shields::kFingerprintSettingHistogramName, 2, 1); - - brave_shields::SetFingerprintingControlType(map, ControlType::DEFAULT, - GURL()); - histogram_tester_->ExpectBucketCount( - brave_shields::kFingerprintSettingHistogramName, 1, 1); - - brave_shields::SetFingerprintingControlType(map, ControlType::ALLOW, GURL()); - histogram_tester_->ExpectBucketCount( - brave_shields::kFingerprintSettingHistogramName, 0, 1); - - histogram_tester_->ExpectTotalCount( - brave_shields::kFingerprintSettingHistogramName, 3); -} - class BraveShieldsUtilDomainBlock1PESFeatureTest : public BraveShieldsUtilTest { public: BraveShieldsUtilDomainBlock1PESFeatureTest() { diff --git a/components/brave_shields/common/brave_shield_utils.cc b/components/brave_shields/common/brave_shield_utils.cc index 011f1a9a0e16..7d5cec7c1d8f 100644 --- a/components/brave_shields/common/brave_shield_utils.cc +++ b/components/brave_shields/common/brave_shield_utils.cc @@ -5,10 +5,15 @@ #include "brave/components/brave_shields/common/brave_shield_utils.h" +#include +#include + #include "components/content_settings/core/common/content_settings_pattern.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "url/gurl.h" +namespace brave_shields { + ContentSetting GetBraveFPContentSettingFromRules( const ContentSettingsForOneType& fp_rules, const GURL& primary_url) { @@ -47,3 +52,64 @@ ContentSetting GetBraveFPContentSettingFromRules( return CONTENT_SETTING_DEFAULT; } + +ShieldsSettingCounts GetFPSettingCountFromRules( + const ContentSettingsForOneType& fp_rules) { + ShieldsSettingCounts result = {}; + + for (const auto& rule : fp_rules) { + if (rule.primary_pattern.MatchesAllHosts()) { + continue; + } + if (rule.secondary_pattern.MatchesAllHosts()) { + if (rule.GetContentSetting() == CONTENT_SETTING_ALLOW) { + result.allow++; + } else { + result.aggressive++; + } + } else { + if (rule.GetContentSetting() == CONTENT_SETTING_BLOCK) { + result.standard++; + } + } + } + + return result; +} + +ShieldsSettingCounts GetAdsSettingCountFromRules( + const ContentSettingsForOneType& ads_rules) { + ShieldsSettingCounts result = {}; + + std::set block_set; + // Look at primary rules + for (const auto& rule : ads_rules) { + if (rule.primary_pattern.MatchesAllHosts() || + !rule.secondary_pattern.MatchesAllHosts()) { + continue; + } + if (rule.GetContentSetting() == CONTENT_SETTING_ALLOW) { + result.allow++; + } else { + block_set.insert(rule.primary_pattern.ToString()); + } + } + + // And then look at "first party" rules + for (const auto& rule : ads_rules) { + if (rule.primary_pattern.MatchesAllHosts() || + rule.secondary_pattern.MatchesAllHosts() || + block_set.find(rule.primary_pattern.ToString()) == block_set.end()) { + continue; + } + if (rule.GetContentSetting() == CONTENT_SETTING_BLOCK) { + result.aggressive++; + } else { + result.standard++; + } + } + + return result; +} + +} // namespace brave_shields diff --git a/components/brave_shields/common/brave_shield_utils.h b/components/brave_shields/common/brave_shield_utils.h index 6b114c3286ca..0fcf44f8f8bc 100644 --- a/components/brave_shields/common/brave_shield_utils.h +++ b/components/brave_shields/common/brave_shield_utils.h @@ -10,8 +10,22 @@ class GURL; +namespace brave_shields { + +struct ShieldsSettingCounts { + int allow; + int standard; + int aggressive; +}; + ContentSetting GetBraveFPContentSettingFromRules( const ContentSettingsForOneType& fp_rules, const GURL& primary_url); +ShieldsSettingCounts GetFPSettingCountFromRules( + const ContentSettingsForOneType& fp_rules); +ShieldsSettingCounts GetAdsSettingCountFromRules( + const ContentSettingsForOneType& ads_rules); +} // namespace brave_shields + #endif // BRAVE_COMPONENTS_BRAVE_SHIELDS_COMMON_BRAVE_SHIELD_UTILS_H_ diff --git a/components/content_settings/renderer/brave_content_settings_agent_impl.cc b/components/content_settings/renderer/brave_content_settings_agent_impl.cc index 3da18932b5cc..2da7e6ee1188 100644 --- a/components/content_settings/renderer/brave_content_settings_agent_impl.cc +++ b/components/content_settings/renderer/brave_content_settings_agent_impl.cc @@ -297,7 +297,7 @@ BraveFarblingLevel BraveContentSettingsAgentImpl::GetBraveFarblingLevel() { url::Origin(frame->GetSecurityOrigin()).GetURL())) { setting = CONTENT_SETTING_ALLOW; } else { - setting = GetBraveFPContentSettingFromRules( + setting = brave_shields::GetBraveFPContentSettingFromRules( content_setting_rules_->fingerprinting_rules, GetOriginOrURL(frame)); } } diff --git a/components/p3a/brave_p3a_service.cc b/components/p3a/brave_p3a_service.cc index 0387b82996b5..b0e470ef275d 100644 --- a/components/p3a/brave_p3a_service.cc +++ b/components/p3a/brave_p3a_service.cc @@ -89,9 +89,13 @@ constexpr const char* kCollectedHistograms[] = { "Brave.Savings.BandwidthSavingsMB", "Brave.Search.DefaultEngine.4", "Brave.Search.SwitchEngine", - "Brave.Shields.UsageStatus", "Brave.Shields.AdBlockSetting", + "Brave.Shields.DomainAdsSettingsAboveGlobal", + "Brave.Shields.DomainAdsSettingsBelowGlobal", + "Brave.Shields.DomainFingerprintSettingsAboveGlobal", + "Brave.Shields.DomainFingerprintSettingsBelowGlobal", "Brave.Shields.FingerprintBlockSetting", + "Brave.Shields.UsageStatus", "Brave.SpeedReader.Enabled", "Brave.SpeedReader.ToggleCount", "Brave.Today.DirectFeedsTotal", diff --git a/test/BUILD.gn b/test/BUILD.gn index 4103c854a465..44dd1b25ab2c 100644 --- a/test/BUILD.gn +++ b/test/BUILD.gn @@ -336,6 +336,7 @@ test("brave_unit_tests") { "//brave/chromium_src/components/search_engines/brave_template_url_prepopulate_data_unittest.cc", "//brave/chromium_src/components/search_engines/brave_template_url_service_util_unittest.cc", "//brave/chromium_src/components/translate/core/browser/translate_manager_unittest.cc", + "//brave/components/brave_shields/browser/brave_shields_p3a_unittest.cc", "//brave/components/brave_shields/browser/brave_shields_util_unittest.cc", "//brave/components/omnibox/browser/fake_autocomplete_provider_client.cc", "//brave/components/omnibox/browser/fake_autocomplete_provider_client.h",