diff --git a/browser/ntp_background/ntp_p3a_helper_impl.cc b/browser/ntp_background/ntp_p3a_helper_impl.cc index 14aa8bc47ff8..eab752d8f756 100644 --- a/browser/ntp_background/ntp_p3a_helper_impl.cc +++ b/browser/ntp_background/ntp_p3a_helper_impl.cc @@ -137,12 +137,12 @@ NTPP3AHelperImpl::NTPP3AHelperImpl( if (ntp_background_images_service) { if (const auto* sr_data = ntp_background_images_service->GetBrandedImagesData( - /*super_referral=*/true)) { + /*super_referral=*/true, /*supports_rich_media=*/true)) { CheckLoadedCampaigns(*sr_data); } if (const auto* si_data = ntp_background_images_service->GetBrandedImagesData( - /*super_referral=*/false)) { + /*super_referral=*/false, /*supports_rich_media=*/true)) { CheckLoadedCampaigns(*si_data); } ntp_background_images_service_observation_.Observe( diff --git a/browser/ntp_background/view_counter_service_factory.cc b/browser/ntp_background/view_counter_service_factory.cc index 38aa255df961..ef1a5dbc528a 100644 --- a/browser/ntp_background/view_counter_service_factory.cc +++ b/browser/ntp_background/view_counter_service_factory.cc @@ -78,9 +78,9 @@ ViewCounterServiceFactory::BuildServiceInstanceForBrowserContext( browser_context, std::make_unique(service)); content::URLDataSource::Add( browser_context, std::make_unique(service)); - content::URLDataSource::Add( - browser_context, - std::make_unique(service)); + content::URLDataSource::Add(browser_context, + std::make_unique( + service, profile->GetPrefs())); std::unique_ptr ntp_p3a_helper; if (g_brave_browser_process->p3a_service() != nullptr) { diff --git a/components/ntp_background_images/browser/ntp_background_images_service.cc b/components/ntp_background_images/browser/ntp_background_images_service.cc index 9382549ec5d8..6947d5d022e1 100644 --- a/components/ntp_background_images/browser/ntp_background_images_service.cc +++ b/components/ntp_background_images/browser/ntp_background_images_service.cc @@ -469,7 +469,8 @@ NTPBackgroundImagesData* NTPBackgroundImagesService::GetBackgroundImagesData() } NTPSponsoredImagesData* NTPBackgroundImagesService::GetBrandedImagesData( - bool super_referral) const { + bool super_referral, + bool supports_rich_media) const { const bool is_super_referrals_enabled = base::FeatureList::IsEnabled(features::kBraveNTPSuperReferralWallpaper); if (is_super_referrals_enabled) { @@ -494,11 +495,14 @@ NTPSponsoredImagesData* NTPBackgroundImagesService::GetBrandedImagesData( return nullptr; } - if (sponsored_images_data_ && sponsored_images_data_->IsValid()) { - return sponsored_images_data_.get(); + NTPSponsoredImagesData* const sponsored_images_data = + supports_rich_media ? sponsored_images_data_.get() + : sponsored_images_data_excluding_rich_media_.get(); + if (!sponsored_images_data || !sponsored_images_data->IsValid()) { + return nullptr; } - return nullptr; + return sponsored_images_data; } void NTPBackgroundImagesService::OnComponentReady( @@ -572,6 +576,23 @@ void NTPBackgroundImagesService::OnGetSponsoredComponentJsonData( } else { sponsored_images_data_ = std::make_unique( data, sponsored_images_installed_dir_); + sponsored_images_data_excluding_rich_media_ = + std::make_unique( + data, sponsored_images_installed_dir_); + for (auto& campaign : + sponsored_images_data_excluding_rich_media_->campaigns) { + std::erase_if(campaign.creatives, [](const auto& creative) { + return creative.wallpaper_type == WallpaperType::kRichMedia; + }); + } + std::erase_if( + sponsored_images_data_excluding_rich_media_->campaigns, + [](const auto& campaign) { return campaign.creatives.empty(); }); + if (!sponsored_images_data_excluding_rich_media_) { + sponsored_images_data_excluding_rich_media_ = + std::make_unique(); + } + for (auto& observer : observers_) { observer.OnSponsoredContentDidUpdate(data); } diff --git a/components/ntp_background_images/browser/ntp_background_images_service.h b/components/ntp_background_images/browser/ntp_background_images_service.h index ae9b8bf7d672..0d5c1b211d42 100644 --- a/components/ntp_background_images/browser/ntp_background_images_service.h +++ b/components/ntp_background_images/browser/ntp_background_images_service.h @@ -71,7 +71,8 @@ class NTPBackgroundImagesService { bool HasObserver(Observer* observer); NTPBackgroundImagesData* GetBackgroundImagesData() const; - NTPSponsoredImagesData* GetBrandedImagesData(bool super_referral) const; + NTPSponsoredImagesData* GetBrandedImagesData(bool super_referral, + bool supports_rich_media) const; bool test_data_used() const { return test_data_used_; } @@ -195,6 +196,8 @@ class NTPBackgroundImagesService { std::optional sponsored_images_component_id_; base::FilePath sponsored_images_installed_dir_; std::unique_ptr sponsored_images_data_; + std::unique_ptr + sponsored_images_data_excluding_rich_media_; base::FilePath super_referrals_installed_dir_; std::unique_ptr super_referrals_images_data_; diff --git a/components/ntp_background_images/browser/ntp_background_images_service_unittest.cc b/components/ntp_background_images/browser/ntp_background_images_service_unittest.cc index 33062aa57e08..06e0be431c19 100644 --- a/components/ntp_background_images/browser/ntp_background_images_service_unittest.cc +++ b/components/ntp_background_images/browser/ntp_background_images_service_unittest.cc @@ -458,7 +458,8 @@ TEST_F(NTPBackgroundImagesServiceTest, DISABLED_InternalDataTest) { // Check with json file w/o schema version with empty object. service_->sponsored_images_data_.reset(); service_->OnGetSponsoredComponentJsonData(/*is_super_referral=*/false, "{}"); - EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/false)); + EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/false, + /*supports_rich_media=*/true)); service_->background_images_data_.reset(); service_->OnGetComponentJsonData("{}"); EXPECT_FALSE(service_->GetBackgroundImagesData()); @@ -469,7 +470,8 @@ TEST_F(NTPBackgroundImagesServiceTest, DISABLED_InternalDataTest) { observer_.on_sponsored_images_updated = false; service_->OnGetSponsoredComponentJsonData(/*is_super_referral=*/false, kTestEmptyComponent); - EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/false)); + EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/false, + /*supports_rich_media=*/true)); EXPECT_TRUE(observer_.on_sponsored_images_updated); EXPECT_THAT(observer_.sponsored_images_data->campaigns, ::testing::IsEmpty()); observer_.background_images_data = nullptr; @@ -490,7 +492,8 @@ TEST_F(NTPBackgroundImagesServiceTest, DISABLED_InternalDataTest) { // Mark this is not SR to get SI data. service_->MarkThisInstallIsNotSuperReferralForever(); NTPSponsoredImagesData* const images_data = - service_->GetBrandedImagesData(/*super_referral=*/false); + service_->GetBrandedImagesData(/*super_referral=*/false, + /*supports_rich_media=*/true); EXPECT_TRUE(images_data); EXPECT_TRUE(images_data->IsValid()); EXPECT_FALSE(images_data->IsSuperReferral()); @@ -600,7 +603,8 @@ TEST_F(NTPBackgroundImagesServiceTest, DISABLED_InternalDataTest) { observer_.on_sponsored_images_updated = false; service_->OnGetSponsoredComponentJsonData(/*is_super_referral=*/false, test_json_string_higher_schema); - EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/false)); + EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/false, + /*supports_rich_media=*/true)); constexpr char kTestBackgroundJsonStringHigherSchema[] = R"( { @@ -638,7 +642,8 @@ TEST_F(NTPBackgroundImagesServiceTest, MultipleCampaignsTest) { // Mark this is not SR to get SI data. service_->MarkThisInstallIsNotSuperReferralForever(); const NTPSponsoredImagesData* const images_data = - service_->GetBrandedImagesData(/*super_referral=*/false); + service_->GetBrandedImagesData(/*super_referral=*/false, + /*supports_rich_media=*/true); EXPECT_TRUE(images_data); EXPECT_TRUE(images_data->IsValid()); EXPECT_FALSE(images_data->IsSuperReferral()); @@ -677,7 +682,8 @@ TEST_F(NTPBackgroundImagesServiceTest, // Mark this is not SR to get SI data. service_->MarkThisInstallIsNotSuperReferralForever(); - EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/false)); + EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/false, + /*supports_rich_media=*/true)); EXPECT_TRUE(observer_.on_sponsored_images_updated); EXPECT_THAT(observer_.sponsored_images_data->campaigns, ::testing::IsEmpty()); EXPECT_THAT(service_->sponsored_images_data_->campaigns, @@ -699,7 +705,8 @@ TEST_F(NTPBackgroundImagesServiceTest, // Mark this is not SR to get SI data. service_->MarkThisInstallIsNotSuperReferralForever(); - EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/false)); + EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/false, + /*supports_rich_media=*/true)); EXPECT_TRUE(observer_.on_sponsored_images_updated); EXPECT_THAT(observer_.sponsored_images_data->campaigns, ::testing::IsEmpty()); EXPECT_THAT(service_->sponsored_images_data_->campaigns, @@ -723,7 +730,8 @@ TEST_F( // Mark this is not SR to get SI data. service_->MarkThisInstallIsNotSuperReferralForever(); - EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/false)); + EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/false, + /*supports_rich_media=*/true)); EXPECT_TRUE(observer_.on_sponsored_images_updated); EXPECT_THAT(observer_.sponsored_images_data->campaigns, ::testing::IsEmpty()); EXPECT_THAT(service_->sponsored_images_data_->campaigns, @@ -747,7 +755,8 @@ TEST_F( // Mark this is not SR to get SI data. service_->MarkThisInstallIsNotSuperReferralForever(); - EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/false)); + EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/false, + /*supports_rich_media=*/true)); EXPECT_TRUE(observer_.on_sponsored_images_updated); EXPECT_THAT(observer_.sponsored_images_data->campaigns, ::testing::IsEmpty()); EXPECT_THAT(service_->sponsored_images_data_->campaigns, @@ -768,7 +777,8 @@ TEST_F(NTPBackgroundImagesServiceTest, SponsoredImageWithMissingImageUrlTest) { // Mark this is not SR to get SI data. service_->MarkThisInstallIsNotSuperReferralForever(); - EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/false)); + EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/false, + /*supports_rich_media=*/true)); EXPECT_TRUE(observer_.on_sponsored_images_updated); EXPECT_THAT(observer_.sponsored_images_data->campaigns, ::testing::IsEmpty()); EXPECT_THAT(service_->sponsored_images_data_->campaigns, @@ -873,7 +883,8 @@ TEST_F(NTPBackgroundImagesServiceTest, BasicSuperReferralTest) { service_->OnGetSponsoredComponentJsonData(/*is_super_referral=*/true, kTestSuperReferral); const NTPSponsoredImagesData* const images_data = - service_->GetBrandedImagesData(/*super_referral=*/true); + service_->GetBrandedImagesData(/*super_referral=*/true, + /*supports_rich_media=*/true); EXPECT_TRUE(images_data); EXPECT_THAT(images_data->campaigns[0].creatives, ::testing::SizeIs(1)); EXPECT_THAT(images_data->top_sites, ::testing::SizeIs(3)); @@ -943,7 +954,8 @@ TEST_F(NTPBackgroundImagesServiceTest, WithNonSuperReferralCodeTest) { kTestSponsoredImages); // NTP SI data is ready but don't give data until NTP SR initialization is // complete. Only gives NTP SI data when browser confirms this is not NTP SR. - EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/false)); + EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/false, + /*supports_rich_media=*/true)); observer_.on_super_referral_ended = false; service_->OnGetMappingTableData(kTestMappingTable); @@ -1000,7 +1012,8 @@ TEST_F(NTPBackgroundImagesServiceTest, WithSuperReferralCodeTest) { EXPECT_FALSE(pref_service_.GetBoolean( prefs::kNewTabPageGetInitialSuperReferralComponentInProgress)); const NTPSponsoredImagesData* const data = - service_->GetBrandedImagesData(/*super_referral=*/true); + service_->GetBrandedImagesData(/*super_referral=*/true, + /*supports_rich_media=*/true); EXPECT_TRUE(service_->IsValidSuperReferralComponentInfo(pref_service_.GetDict( prefs::kNewTabPageCachedSuperReferralComponentInfo))); EXPECT_TRUE(data->IsSuperReferral()); @@ -1029,19 +1042,23 @@ TEST_F(NTPBackgroundImagesServiceTest, CheckReferralServiceInitStatusTest) { Init(); // Initially, data is not available. - EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/true)); - EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/false)); + EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/true, + /*supports_rich_media=*/true)); + EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/false, + /*supports_rich_media=*/true)); // Simulate SI data is initialized first before referral service is // initialized. // Check SI data is not available before referrals service is initialized. service_->OnGetSponsoredComponentJsonData(/*is_super_referral=*/false, kTestSponsoredImages); - EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/false)); + EXPECT_FALSE(service_->GetBrandedImagesData(/*super_referral=*/false, + /*supports_rich_media=*/true)); // Simulate that this install is not SR. Then, SI data is returned properly. service_->MarkThisInstallIsNotSuperReferralForever(); - EXPECT_TRUE(service_->GetBrandedImagesData(/*super_referral=*/false)); + EXPECT_TRUE(service_->GetBrandedImagesData(/*super_referral=*/false, + /*supports_rich_media=*/true)); } TEST_F(NTPBackgroundImagesServiceTest, diff --git a/components/ntp_background_images/browser/ntp_sponsored_image_source.cc b/components/ntp_background_images/browser/ntp_sponsored_image_source.cc index fff7f1827b52..e85b4775fe19 100644 --- a/components/ntp_background_images/browser/ntp_sponsored_image_source.cc +++ b/components/ntp_background_images/browser/ntp_sponsored_image_source.cc @@ -111,7 +111,8 @@ base::FilePath NTPSponsoredImageSource::GetLocalFilePathFor( const std::string& path) { const bool is_super_referral_path = IsSuperReferralPath(path); const NTPSponsoredImagesData* const images_data = - service_->GetBrandedImagesData(is_super_referral_path); + service_->GetBrandedImagesData(is_super_referral_path, + /*supports_rich_media=*/false); CHECK(images_data); const base::FilePath basename_from_path = @@ -148,7 +149,8 @@ base::FilePath NTPSponsoredImageSource::GetLocalFilePathFor( bool NTPSponsoredImageSource::IsValidPath(const std::string& path) const { const bool is_super_referral_path = IsSuperReferralPath(path); const NTPSponsoredImagesData* const images_data = - service_->GetBrandedImagesData(is_super_referral_path); + service_->GetBrandedImagesData(is_super_referral_path, + /*supports_rich_media=*/false); if (!images_data) { return false; } diff --git a/components/ntp_background_images/browser/ntp_sponsored_rich_media_source.cc b/components/ntp_background_images/browser/ntp_sponsored_rich_media_source.cc index 2e256282ec09..b0388ad92a28 100644 --- a/components/ntp_background_images/browser/ntp_sponsored_rich_media_source.cc +++ b/components/ntp_background_images/browser/ntp_sponsored_rich_media_source.cc @@ -37,8 +37,11 @@ std::optional ReadFileToString(const base::FilePath& path) { } // namespace NTPSponsoredRichMediaSource::NTPSponsoredRichMediaSource( - NTPBackgroundImagesService* service) - : service_(service), weak_factory_(this) {} + NTPBackgroundImagesService* service, + const PrefService* pref_service) + : service_(service), pref_service_(pref_service), weak_factory_(this) { + CHECK(pref_service_); +} NTPSponsoredRichMediaSource::~NTPSponsoredRichMediaSource() = default; @@ -57,7 +60,8 @@ void NTPSponsoredRichMediaSource::StartDataRequest( } const NTPSponsoredImagesData* const images_data = - service_->GetBrandedImagesData(/*super_referral=*/false); + service_->GetBrandedImagesData(/*super_referral=*/false, + /*supports_rich_media=*/true); if (!images_data) { return DenyAccess(std::move(callback)); } diff --git a/components/ntp_background_images/browser/ntp_sponsored_rich_media_source.h b/components/ntp_background_images/browser/ntp_sponsored_rich_media_source.h index bb2cf3a2ac74..1485b02337d0 100644 --- a/components/ntp_background_images/browser/ntp_sponsored_rich_media_source.h +++ b/components/ntp_background_images/browser/ntp_sponsored_rich_media_source.h @@ -10,6 +10,7 @@ #include #include "base/memory/weak_ptr.h" +#include "components/prefs/pref_service.h" #include "content/public/browser/url_data_source.h" class GURL; @@ -23,7 +24,8 @@ class NTPBackgroundImagesService; class NTPSponsoredRichMediaSource : public content::URLDataSource { public: - explicit NTPSponsoredRichMediaSource(NTPBackgroundImagesService* service); + explicit NTPSponsoredRichMediaSource(NTPBackgroundImagesService* service, + const PrefService* pref_service); NTPSponsoredRichMediaSource(const NTPSponsoredRichMediaSource&) = delete; NTPSponsoredRichMediaSource& operator=(const NTPSponsoredRichMediaSource&) = @@ -49,6 +51,8 @@ class NTPSponsoredRichMediaSource : public content::URLDataSource { const raw_ptr service_; // not owned. + const raw_ptr pref_service_; // not owned. + base::WeakPtrFactory weak_factory_; }; diff --git a/components/ntp_background_images/browser/ntp_sponsored_rich_media_source_unittest.cc b/components/ntp_background_images/browser/ntp_sponsored_rich_media_source_unittest.cc index d3d32aa8e59d..1869771aa7a1 100644 --- a/components/ntp_background_images/browser/ntp_sponsored_rich_media_source_unittest.cc +++ b/components/ntp_background_images/browser/ntp_sponsored_rich_media_source_unittest.cc @@ -73,7 +73,7 @@ class NTPSponsoredRichMediaSourceTest : public testing::Test { background_images_service_ = std::make_unique( /*component_update_service=*/nullptr, &pref_service_); url_data_source_ = std::make_unique( - background_images_service_.get()); + background_images_service_.get(), &pref_service_); } void SetupSponsoredComponent() { diff --git a/components/ntp_background_images/browser/view_counter_service.cc b/components/ntp_background_images/browser/view_counter_service.cc index 977cf6ef4861..b9a2da53d992 100644 --- a/components/ntp_background_images/browser/view_counter_service.cc +++ b/components/ntp_background_images/browser/view_counter_service.cc @@ -133,6 +133,10 @@ ViewCounterService::ViewCounterService( prefs::kNewTabPageShowBackgroundImage, base::BindRepeating(&ViewCounterService::OnPreferenceChanged, base::Unretained(this))); + pref_change_registrar_.Add( + "profile.default_content_setting_values.javascript", + base::BindRepeating(&ViewCounterService::OnPreferenceChanged, + base::Unretained(this))); OnBackgroundImagesDataDidUpdate(GetCurrentWallpaperData()); OnSponsoredImagesDataDidUpdate(GetCurrentBrandedWallpaperData()); @@ -165,14 +169,19 @@ NTPBackgroundImagesData* ViewCounterService::GetCurrentWallpaperData() const { NTPSponsoredImagesData* ViewCounterService::GetCurrentBrandedWallpaperData() const { - NTPSponsoredImagesData* const images_data = - background_images_service_->GetBrandedImagesData(/*super_referral=*/true); - if (images_data && IsSuperReferralWallpaperOptedIn()) { - return images_data; + const bool supports_rich_media = + prefs_->GetInteger("profile.default_content_setting_values.javascript") != + 2; + + NTPSponsoredImagesData* sponsored_images_data = + background_images_service_->GetBrandedImagesData(/*super_referral=*/true, + supports_rich_media); + if (sponsored_images_data && IsSuperReferralWallpaperOptedIn()) { + return sponsored_images_data; } return background_images_service_->GetBrandedImagesData( - /*super_referral=*/false); + /*super_referral=*/false, supports_rich_media); } std::optional diff --git a/components/ntp_background_images/browser/view_counter_service_unittest.cc b/components/ntp_background_images/browser/view_counter_service_unittest.cc index 2f007eed99d1..b85d3c9a6a3b 100644 --- a/components/ntp_background_images/browser/view_counter_service_unittest.cc +++ b/components/ntp_background_images/browser/view_counter_service_unittest.cc @@ -156,6 +156,8 @@ class NTPBackgroundImagesViewCounterTest : public testing::Test { brave::RegisterPrefsForBraveReferralsService(local_registry); NTPBackgroundImagesService::RegisterLocalStatePrefs(local_registry); ViewCounterService::RegisterLocalStatePrefs(local_registry); + pref_registry->RegisterIntegerPref( + "profile.default_content_setting_values.javascript", 0); service_ = std::make_unique( /*component_updater_service=*/nullptr, &pref_service_); diff --git a/ios/browser/api/ntp_background_images/ntp_background_images_service_ios.mm b/ios/browser/api/ntp_background_images/ntp_background_images_service_ios.mm index 15172d329144..b9396533396d 100644 --- a/ios/browser/api/ntp_background_images/ntp_background_images_service_ios.mm +++ b/ios/browser/api/ntp_background_images/ntp_background_images_service_ios.mm @@ -88,7 +88,8 @@ - (void)dealloc { } - (NTPSponsoredImageData*)sponsoredImageData { - auto* data = _service->GetBrandedImagesData(/* super_referral */ false); + auto* data = _service->GetBrandedImagesData(/*super_referral=*/false, + /*supports_rich_media=*/false); if (data == nullptr) { return nil; } @@ -96,7 +97,8 @@ - (NTPSponsoredImageData*)sponsoredImageData { } - (NTPSponsoredImageData*)superReferralImageData { - auto* data = _service->GetBrandedImagesData(/* super_referral */ true); + auto* data = _service->GetBrandedImagesData(/* super_referral=*/true, + /*supports_rich_media=*/false); if (data == nullptr) { return nil; }