[ABOM] Send ABOM status with WebCompat report (#33393)

The adds ability to send ABOM status with WebCompat
report. If ABOM feature is disabled or current locale is
not supported then ABOM status is not sent.
This commit is contained in:
Aleksei Seren
2026-02-03 18:00:32 -05:00
committed by GitHub
parent 93c95a9366
commit 42a4d9fc16
13 changed files with 83 additions and 5 deletions
@@ -12,19 +12,27 @@
#include "brave/common/brave_channel_info.h"
#include "brave/components/brave_shields/content/browser/ad_block_service.h"
#include "brave/components/brave_shields/core/browser/ad_block_component_service_manager.h"
#include "brave/components/brave_shields/core/browser/brave_shields_locale_utils.h"
#include "brave/components/brave_shields/core/browser/brave_shields_utils.h"
#include "brave/components/brave_shields/core/browser/filter_list_catalog_entry.h"
#include "brave/components/brave_shields/core/common/features.h"
#include "brave/components/brave_shields/core/common/pref_names.h"
#include "brave/components/webcompat_reporter/browser/webcompat_reporter_utils.h"
#include "components/component_updater/component_updater_service.h"
#include "components/prefs/pref_service.h"
namespace webcompat_reporter {
WebcompatReporterServiceDelegateImpl::WebcompatReporterServiceDelegateImpl(
PrefService& local_state,
const std::string& application_locale,
component_updater::ComponentUpdateService* component_update_service,
brave_shields::AdBlockService* adblock_service,
HostContentSettingsMap* host_content_settings_map,
scoped_refptr<content_settings::CookieSettings> content_settings)
: WebcompatReporterServiceDelegateBase(component_update_service),
local_state_(local_state),
application_locale_(application_locale),
adblock_service_(adblock_service),
host_content_settings_map_(host_content_settings_map),
cookie_settings_(content_settings) {}
@@ -90,4 +98,17 @@ WebcompatReporterServiceDelegateImpl::GetScriptBlockingFlag(
brave_shields::ControlType::BLOCK);
}
std::optional<std::string>
WebcompatReporterServiceDelegateImpl::GetAdblockOnlyModeEnabled() const {
if (!base::FeatureList::IsEnabled(
brave_shields::features::kAdblockOnlyMode) ||
!brave_shields::IsAdblockOnlyModeSupportedForLocale(
application_locale_)) {
return std::nullopt;
}
return BoolToString(
local_state_->GetBoolean(brave_shields::prefs::kAdBlockOnlyModeEnabled));
}
} // namespace webcompat_reporter
@@ -9,11 +9,15 @@
#include <string>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/memory/raw_ref.h"
#include "base/memory/scoped_refptr.h"
#include "brave/components/webcompat_reporter/browser/webcompat_reporter_service_delegate_base.h"
#include "components/content_settings/core/browser/cookie_settings.h"
#include "components/content_settings/core/browser/host_content_settings_map.h"
class PrefService;
namespace brave_shields {
class AdBlockService;
} // namespace brave_shields
@@ -24,6 +28,8 @@ class WebcompatReporterServiceDelegateImpl
: public WebcompatReporterServiceDelegateBase {
public:
explicit WebcompatReporterServiceDelegateImpl(
PrefService& local_state,
const std::string& application_locale,
component_updater::ComponentUpdateService* component_update_service,
brave_shields::AdBlockService* adblock_service,
HostContentSettingsMap* host_content_settings_map,
@@ -41,8 +47,11 @@ class WebcompatReporterServiceDelegateImpl
const std::optional<std::string>& current_url) const override;
std::optional<std::string> GetScriptBlockingFlag(
const std::optional<std::string>& current_url) const override;
std::optional<std::string> GetAdblockOnlyModeEnabled() const override;
private:
const raw_ref<PrefService> local_state_;
const std::string application_locale_;
const raw_ptr<brave_shields::AdBlockService> adblock_service_;
const raw_ptr<HostContentSettingsMap> host_content_settings_map_;
scoped_refptr<content_settings::CookieSettings> cookie_settings_;
@@ -70,9 +70,13 @@ WebcompatReporterServiceFactory::BuildServiceInstanceForBrowserContext(
auto report_uploader = std::make_unique<WebcompatReportUploader>(
default_storage_partition->GetURLLoaderFactoryForBrowserProcess());
PrefService* local_state = g_browser_process->local_state();
CHECK(local_state);
return std::make_unique<WebcompatReporterService>(
prefs,
std::make_unique<WebcompatReporterServiceDelegateImpl>(
*local_state, g_browser_process->GetApplicationLocale(),
g_browser_process->component_updater(),
g_brave_browser_process->ad_block_service(),
HostContentSettingsMapFactory::GetForProfile(context),
@@ -16,6 +16,7 @@ inline constexpr char kAdBlockListsField[] = "adBlockLists";
inline constexpr char kAdBlockComponentsVersionField[] =
"adBlockComponentsInfo";
inline constexpr char kShieldsEnabledField[] = "shieldsEnabled";
inline constexpr char kAdblockOnlyModeEnabledField[] = "adblockOnlyModeEnabled";
inline constexpr char kLanguagesField[] = "languages";
inline constexpr char kLanguageFarblingField[] = "languageFarblingEnabled";
inline constexpr char kBraveVPNEnabledField[] = "braveVPNEnabled";
@@ -121,6 +121,12 @@ void WebcompatReportUploader::SubmitReport(mojom::ReportInfoPtr report_info) {
report_info->shields_enabled.value() == kStringTrue);
}
if (report_info->adblock_only_mode_enabled) {
report_details_dict.Set(
kAdblockOnlyModeEnabledField,
report_info->adblock_only_mode_enabled.value() == kStringTrue);
}
if (report_info->ad_block_setting) {
report_details_dict.Set(kAdBlockSettingField,
report_info->ad_block_setting.value());
@@ -72,7 +72,8 @@ TEST_F(WebcompatReportUploaderUnitTest, GenerateReport) {
std::vector<std::string> webcompat_errors{"Could not create screenshot"};
auto report = webcompat_reporter::mojom::ReportInfo::New(
"dev", "1.231.45", "https://abc.url/p1/p2", "true", "ad_block_setting",
"dev", "1.231.45", "https://abc.url/p1/p2", "true",
/*adblock_only_mode_enabled=*/"true", "ad_block_setting",
"fp_block_setting", "ad_block_list_names", "languages", "true", "true",
"category", "details", "contact", "block", "true", std::move(components),
std::nullopt, webcompat_errors);
@@ -110,6 +111,8 @@ TEST_F(WebcompatReportUploaderUnitTest, GenerateReport) {
report_copy->language_farbling.has_value())
.Set("languages", *report_copy->languages)
.Set("shieldsEnabled", report_copy->shields_enabled.has_value())
.Set("adblockOnlyModeEnabled",
report_copy->adblock_only_mode_enabled.has_value())
.Set("url", GURL(report_copy->report_url.value()).spec())
.Set("version", *report_copy->brave_version)
.Set("webcompatReportErrors", std::move(errors_list)));
@@ -122,6 +122,14 @@ struct ReportFiller {
return *this;
}
ReportFiller& FillAdblockOnlyModeEnabled() {
if (!(*report_info)->adblock_only_mode_enabled) {
(*report_info)->adblock_only_mode_enabled =
service_delegate->GetAdblockOnlyModeEnabled();
}
return *this;
}
raw_ref<webcompat_reporter::mojom::ReportInfoPtr> report_info;
const raw_ptr<webcompat_reporter::WebcompatReporterService::Delegate>
service_delegate;
@@ -234,7 +242,8 @@ void WebcompatReporterService::SubmitWebcompatReport(
.FillReportWithComponetsInfo()
.FillReportWithAdblockListNames()
.FillCookiePolicy()
.FillScriptBlockingFlag();
.FillScriptBlockingFlag()
.FillAdblockOnlyModeEnabled();
ProcessContactInfo(profile_prefs_, report_info);
@@ -45,6 +45,7 @@ class WebcompatReporterService : public KeyedService,
const std::optional<std::string>& current_url) const = 0;
virtual std::optional<std::string> GetScriptBlockingFlag(
const std::optional<std::string>& current_url) const = 0;
virtual std::optional<std::string> GetAdblockOnlyModeEnabled() const = 0;
};
WebcompatReporterService(
@@ -30,6 +30,8 @@ constexpr char kChannelMockedValue[] = "MockedChannelValue";
constexpr char kCookiePolicyMockedValue[] = "MockedCookiePolicyValue";
constexpr char kGetScriptBlockingFlagMockedValue[] =
"MockedScriptBlockingFlagValue";
constexpr char kAdblockOnlyModeEnabledMockedValue[] =
"MockedAdblockOnlyModeEnabledValue";
class MockWebcompatReportUploader
: public webcompat_reporter::WebcompatReportUploader {
@@ -64,6 +66,10 @@ class MockWebCompatServiceDelegate : public WebCompatServiceDelegate {
GetScriptBlockingFlag,
(const std::optional<std::string>& current_url),
(const));
MOCK_METHOD(std::optional<std::string>,
GetAdblockOnlyModeEnabled,
(),
(const));
};
} // namespace
@@ -105,9 +111,10 @@ class WebcompatReporterServiceUnitTest : public testing::Test {
std::vector<std::string> webcompat_errors{"Could not create screenshot"};
auto report_info = webcompat_reporter::mojom::ReportInfo::New(
"channel", "brave_version", "https://abc.url/p1/p2", "true",
"ad_block_setting", "fp_block_setting", "ad_block_list_names",
"languages", "true", "true", "category", "details", contact, "block",
"true", std::move(components), screenshot, webcompat_errors);
/*adblock_only_mode_enabled=*/"true", "ad_block_setting",
"fp_block_setting", "ad_block_list_names", "languages", "true", "true",
"category", "details", contact, "block", "true", std::move(components),
screenshot, webcompat_errors);
EXPECT_CALL(*GetMockWebcompatReportUploader(), SubmitReport(_))
.Times(1)
.WillOnce([&](webcompat_reporter::mojom::ReportInfoPtr report) {
@@ -115,6 +122,7 @@ class WebcompatReporterServiceUnitTest : public testing::Test {
EXPECT_EQ(report->brave_version, "brave_version");
EXPECT_EQ(report->report_url, "https://abc.url/p1/p2");
EXPECT_EQ(report->shields_enabled, "true");
EXPECT_EQ(report->adblock_only_mode_enabled, "true");
EXPECT_EQ(report->ad_block_setting, "ad_block_setting");
EXPECT_EQ(report->fp_block_setting, "fp_block_setting");
EXPECT_EQ(report->ad_block_list_names, "ad_block_list_names");
@@ -146,6 +154,7 @@ class WebcompatReporterServiceUnitTest : public testing::Test {
EXPECT_CALL(*delegate_, GetComponentInfos).Times(0);
EXPECT_CALL(*delegate_, GetCookiePolicy).Times(0);
EXPECT_CALL(*delegate_, GetScriptBlockingFlag).Times(0);
EXPECT_CALL(*delegate_, GetAdblockOnlyModeEnabled).Times(0);
webcompat_reporter_service_->SubmitWebcompatReport(std::move(report_info));
}
@@ -240,6 +249,8 @@ TEST_F(WebcompatReporterServiceUnitTest, SubmitReportWithNoPropsOverride) {
EXPECT_EQ(report->cookie_policy.value(), kCookiePolicyMockedValue);
EXPECT_EQ(report->block_scripts.value(),
kGetScriptBlockingFlagMockedValue);
EXPECT_EQ(report->adblock_only_mode_enabled.value(),
kAdblockOnlyModeEnabledMockedValue);
EXPECT_FALSE(report->fp_block_setting);
EXPECT_FALSE(report->ad_block_setting);
EXPECT_FALSE(report->language_farbling);
@@ -261,6 +272,9 @@ TEST_F(WebcompatReporterServiceUnitTest, SubmitReportWithNoPropsOverride) {
EXPECT_CALL(*delegate_, GetScriptBlockingFlag)
.Times(1)
.WillOnce(testing::Return(kGetScriptBlockingFlagMockedValue));
EXPECT_CALL(*delegate_, GetAdblockOnlyModeEnabled)
.Times(1)
.WillOnce(testing::Return(kAdblockOnlyModeEnabledMockedValue));
webcompat_reporter_service_->SubmitWebcompatReport(std::move(report_info));
}
@@ -16,6 +16,7 @@ struct ReportInfo {
string? brave_version;
string? report_url;
string? shields_enabled;
string? adblock_only_mode_enabled;
string? ad_block_setting;
string? fp_block_setting;
string? ad_block_list_names;
@@ -211,6 +211,7 @@ struct SubmitReportView: View {
shieldsEnabled: String(
tab?.braveShieldsHelper?.isBraveShieldsEnabled(for: tab?.visibleURL) ?? true
),
adblockOnlyModeEnabled: nil,
adBlockSetting: (tab?.braveShieldsHelper?.shieldLevel(
for: tab?.visibleURL,
considerAllShieldsOption: false
@@ -31,6 +31,7 @@ class WebcompatReporterServiceDelegateImpl
const std::optional<std::string>& current_url) const override;
std::optional<std::string> GetScriptBlockingFlag(
const std::optional<std::string>& current_url) const override;
std::optional<std::string> GetAdblockOnlyModeEnabled() const override;
};
} // namespace webcompat_reporter
@@ -42,4 +42,11 @@ WebcompatReporterServiceDelegateImpl::GetScriptBlockingFlag(
// we don't need to implement it for iOS, as we get it from the front-end part
return std::nullopt;
}
std::optional<std::string>
WebcompatReporterServiceDelegateImpl::GetAdblockOnlyModeEnabled() const {
// we don't need to implement it for iOS, as we get it from the front-end part
return std::nullopt;
}
} // namespace webcompat_reporter