Skip to content

Commit

Permalink
[ads] Suppress RichNTT if brave://settings/content/javascript is disa…
Browse files Browse the repository at this point in the history
…bled
  • Loading branch information
tmancey committed Feb 28, 2025
1 parent 777512a commit 6f81487
Show file tree
Hide file tree
Showing 76 changed files with 1,657 additions and 630 deletions.
1 change: 1 addition & 0 deletions browser/brave_ads/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ source_set("impl") {
"//chrome/browser:browser_process",
"//chrome/browser:browser_public_dependencies",
"//chrome/browser:primitives",
"//chrome/browser/content_settings:content_settings_factory",
"//chrome/browser/profiles:profile",
"//chrome/browser/regional_capabilities",
"//chrome/browser/ui",
Expand Down
3 changes: 2 additions & 1 deletion browser/brave_ads/ads_service_factory.cc
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "brave/components/brave_ads/browser/ads_service_impl.h"
#include "brave/components/brave_ads/core/browser/service/ads_service.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
#include "chrome/browser/history/history_service_factory.h"
#include "chrome/browser/notifications/notification_display_service.h"
#include "chrome/browser/notifications/notification_display_service_factory.h"
Expand Down Expand Up @@ -98,7 +99,7 @@ AdsServiceFactory::BuildServiceInstanceForBrowserContext(
std::make_unique<DeviceIdImpl>(),
std::make_unique<BatAdsServiceFactoryImpl>(),
g_brave_browser_process->resource_component(), history_service,
rewards_service);
rewards_service, HostContentSettingsMapFactory::GetForProfile(profile));
}

bool AdsServiceFactory::ServiceIsNULLWhileTesting() const {
Expand Down
1 change: 1 addition & 0 deletions browser/ntp_background/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ source_set("ntp_background") {
"//brave/components/ntp_background_images/buildflags",
"//brave/components/p3a",
"//chrome/browser:browser_process",
"//chrome/browser/content_settings:content_settings_factory",
"//chrome/browser/profiles:profile",
"//components/keyed_service/content",
"//components/pref_registry",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -283,8 +283,9 @@ void NTPBackgroundImagesBridge::OnBackgroundImagesDataDidUpdate(
void NTPBackgroundImagesBridge::OnSponsoredImagesDataDidUpdate(
NTPSponsoredImagesData* data) {
// Don't have interest about in-effective component data update.
if (data != view_counter_service_->GetCurrentBrandedWallpaperData())
if (data != view_counter_service_->GetSponsoredImagesData()) {
return;
}

JNIEnv* env = AttachCurrentThread();
Java_NTPBackgroundImagesBridge_onUpdated(env, java_object_);
Expand Down
8 changes: 4 additions & 4 deletions browser/ntp_background/ntp_p3a_helper_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -136,13 +136,13 @@ NTPP3AHelperImpl::NTPP3AHelperImpl(
&NTPP3AHelperImpl::OnP3ARotation, base::Unretained(this)));
if (ntp_background_images_service) {
if (const auto* sr_data =
ntp_background_images_service->GetBrandedImagesData(
/*super_referral=*/true)) {
ntp_background_images_service->GetSponsoredImagesData(
/*super_referral=*/true, /*supports_rich_media=*/true)) {
CheckLoadedCampaigns(*sr_data);
}
if (const auto* si_data =
ntp_background_images_service->GetBrandedImagesData(
/*super_referral=*/false)) {
ntp_background_images_service->GetSponsoredImagesData(
/*super_referral=*/false, /*supports_rich_media=*/true)) {
CheckLoadedCampaigns(*si_data);
}
ntp_background_images_service_observation_.Observe(
Expand Down
9 changes: 5 additions & 4 deletions browser/ntp_background/view_counter_service_factory.cc
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include "brave/components/ntp_background_images/browser/view_counter_service.h"
#include "brave/components/ntp_background_images/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 "components/keyed_service/content/browser_context_dependency_manager.h"
#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
Expand Down Expand Up @@ -78,9 +79,9 @@ ViewCounterServiceFactory::BuildServiceInstanceForBrowserContext(
browser_context, std::make_unique<NTPBackgroundImagesSource>(service));
content::URLDataSource::Add(
browser_context, std::make_unique<NTPSponsoredImageSource>(service));
content::URLDataSource::Add(
browser_context,
std::make_unique<NTPSponsoredRichMediaSource>(service));
content::URLDataSource::Add(browser_context,
std::make_unique<NTPSponsoredRichMediaSource>(
service, profile->GetPrefs()));

std::unique_ptr<NTPP3AHelperImpl> ntp_p3a_helper;
if (g_brave_browser_process->p3a_service() != nullptr) {
Expand All @@ -92,7 +93,7 @@ ViewCounterServiceFactory::BuildServiceInstanceForBrowserContext(
}

return std::make_unique<ViewCounterService>(
service,
HostContentSettingsMapFactory::GetForProfile(profile), service,
#if BUILDFLAG(ENABLE_CUSTOM_BACKGROUND)
BraveNTPCustomBackgroundServiceFactory::GetForContext(profile),
#else
Expand Down
1 change: 1 addition & 0 deletions components/brave_ads/browser/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ static_library("browser") {
"//brave/components/ntp_background_images/common",
"//brave/components/p3a_utils",
"//brave/components/time_period_storage",
"//components/content_settings/core/browser",
"//components/pref_registry",
"//components/prefs",
"//components/sessions",
Expand Down
46 changes: 42 additions & 4 deletions components/brave_ads/browser/ads_service_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@
#include "brave/components/ntp_background_images/common/pref_names.h"
#include "brave/components/services/bat_ads/public/interfaces/bat_ads.mojom.h"
#include "build/build_config.h"
#include "components/content_settings/core/browser/host_content_settings_map.h"
#include "components/content_settings/core/common/content_settings.h"
#include "components/content_settings/core/common/content_settings_pattern.h"
#include "components/prefs/pref_service.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_thread.h"
Expand Down Expand Up @@ -194,13 +197,15 @@ AdsServiceImpl::AdsServiceImpl(
std::unique_ptr<BatAdsServiceFactory> bat_ads_service_factory,
brave_ads::ResourceComponent* resource_component,
history::HistoryService* history_service,
brave_rewards::RewardsService* rewards_service)
brave_rewards::RewardsService* rewards_service,
HostContentSettingsMap* host_content_settings_map)
: AdsService(std::move(delegate)),
prefs_(prefs),
local_state_(local_state),
url_loader_(std::move(url_loader)),
channel_name_(channel_name),
history_service_(history_service),
host_content_settings_map_(host_content_settings_map),
ads_tooltips_delegate_(std::move(ads_tooltips_delegate)),
device_id_(std::move(device_id)),
bat_ads_service_factory_(std::move(bat_ads_service_factory)),
Expand Down Expand Up @@ -485,6 +490,8 @@ void AdsServiceImpl::InitializeBatAdsCallback(bool success) {

BackgroundHelper::GetInstance()->AddObserver(this);

host_content_settings_map_->AddObserver(this);

MaybeShowOnboardingNotification();

MaybeOpenNewTabWithAd();
Expand Down Expand Up @@ -599,6 +606,25 @@ void AdsServiceImpl::SetFlags() {
bat_ads_associated_remote_->SetFlags(std::move(mojom_flags));
}

void AdsServiceImpl::SetContentSettings() {
if (!bat_ads_associated_remote_.is_bound()) {
return;
}

const ContentSetting javascript_content_setting =
host_content_settings_map_->GetDefaultContentSetting(
ContentSettingsType::JAVASCRIPT);

mojom::ContentSettingsPtr mojom_content_settings =
mojom::ContentSettings::New();
mojom_content_settings->allow_javascript =
javascript_content_setting == CONTENT_SETTING_ALLOW ||
javascript_content_setting == CONTENT_SETTING_SESSION_ONLY;

bat_ads_associated_remote_->SetContentSettings(
std::move(mojom_content_settings));
}

bool AdsServiceImpl::ShouldShowOnboardingNotification() {
const bool should_show_onboarding_notification =
prefs_->GetBoolean(prefs::kShouldShowOnboardingNotification);
Expand Down Expand Up @@ -1103,6 +1129,8 @@ void AdsServiceImpl::ShutdownAdsService() {

if (is_bat_ads_initialized_) {
BackgroundHelper::GetInstance()->RemoveObserver(this);

host_content_settings_map_->RemoveObserver(this);
}

CloseAllNotificationAds();
Expand Down Expand Up @@ -1275,7 +1303,7 @@ void AdsServiceImpl::PrefetchNewTabPageAd() {
}

std::optional<NewTabPageAdInfo>
AdsServiceImpl::MaybeGetPrefetchedNewTabPageAdForDisplay() {
AdsServiceImpl::MaybeGetPrefetchedNewTabPageAd() {
if (!bat_ads_associated_remote_.is_bound()) {
return std::nullopt;
}
Expand All @@ -1299,7 +1327,7 @@ void AdsServiceImpl::OnFailedToPrefetchNewTabPageAd(
}

void AdsServiceImpl::ParseAndSaveCreativeNewTabPageAds(
const base::Value::Dict& data,
const base::Value::Dict& dict,
ParseAndSaveCreativeNewTabPageAdsCallback callback) {
if (!bat_ads_associated_remote_.is_bound()) {
return std::move(callback).Run(/*success*/ false);
Expand All @@ -1308,7 +1336,7 @@ void AdsServiceImpl::ParseAndSaveCreativeNewTabPageAds(
// Since `data` contains small JSON from a CRX component, cloning it has
// no performance impact.
bat_ads_associated_remote_->ParseAndSaveCreativeNewTabPageAds(
data.Clone(), std::move(callback));
dict.Clone(), std::move(callback));
}

void AdsServiceImpl::TriggerNewTabPageAdEvent(
Expand Down Expand Up @@ -1895,4 +1923,14 @@ void AdsServiceImpl::OnCompleteReset(bool success) {
}
}

void AdsServiceImpl::OnContentSettingChanged(
const ContentSettingsPattern& /*primary_pattern*/,
const ContentSettingsPattern& /*secondary_pattern*/,
ContentSettingsTypeSet content_type_set) {
if (content_type_set.Contains(ContentSettingsType::JAVASCRIPT)) {
SetContentSettings();
PrefetchNewTabPageAd();
}
}

} // namespace brave_ads
25 changes: 20 additions & 5 deletions components/brave_ads/browser/ads_service_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@
#include "brave/components/brave_ads/core/public/service/ads_service_callback.h"
#include "brave/components/brave_rewards/core/mojom/rewards.mojom-forward.h"
#include "brave/components/services/bat_ads/public/interfaces/bat_ads.mojom.h"
#include "components/content_settings/core/browser/content_settings_observer.h"
#include "components/content_settings/core/browser/content_settings_type_set.h"
#include "components/content_settings/core/common/content_settings_pattern.h"
#include "components/history/core/browser/history_service.h"
#include "components/prefs/pref_change_registrar.h"
#include "mojo/public/cpp/bindings/associated_receiver.h"
Expand All @@ -39,6 +42,7 @@
#include "ui/base/idle/idle.h"

class GURL;
class HostContentSettingsMap;
class PrefService;

namespace base {
Expand Down Expand Up @@ -69,7 +73,8 @@ class AdsServiceImpl final : public AdsService,
public bat_ads::mojom::BatAdsObserver,
BackgroundHelper::Observer,
public ResourceComponentObserver,
public brave_rewards::RewardsServiceObserver {
public brave_rewards::RewardsServiceObserver,
public content_settings::Observer {
public:
explicit AdsServiceImpl(
std::unique_ptr<Delegate> delegate,
Expand All @@ -83,7 +88,8 @@ class AdsServiceImpl final : public AdsService,
std::unique_ptr<BatAdsServiceFactory> bat_ads_service_factory,
brave_ads::ResourceComponent* resource_component,
history::HistoryService* history_service,
brave_rewards::RewardsService* rewards_service);
brave_rewards::RewardsService* rewards_service,
HostContentSettingsMap* host_content_settings);

AdsServiceImpl(const AdsServiceImpl&) = delete;
AdsServiceImpl& operator=(const AdsServiceImpl&) = delete;
Expand Down Expand Up @@ -145,6 +151,7 @@ class AdsServiceImpl final : public AdsService,
void SetSysInfo();
void SetBuildChannel();
void SetFlags();
void SetContentSettings();

bool ShouldShowOnboardingNotification();
void MaybeShowOnboardingNotification();
Expand Down Expand Up @@ -243,14 +250,13 @@ class AdsServiceImpl final : public AdsService,
mojom::InlineContentAdEventType mojom_ad_event_type,
TriggerAdEventCallback callback) override;

std::optional<NewTabPageAdInfo> MaybeGetPrefetchedNewTabPageAdForDisplay()
override;
std::optional<NewTabPageAdInfo> MaybeGetPrefetchedNewTabPageAd() override;
void PrefetchNewTabPageAd() override;
void OnFailedToPrefetchNewTabPageAd(
const std::string& placement_id,
const std::string& creative_instance_id) override;
void ParseAndSaveCreativeNewTabPageAds(
const base::Value::Dict& data,
const base::Value::Dict& dict,
ParseAndSaveCreativeNewTabPageAdsCallback callback) override;
void TriggerNewTabPageAdEvent(
const std::string& placement_id,
Expand Down Expand Up @@ -406,6 +412,12 @@ class AdsServiceImpl final : public AdsService,
void OnExternalWalletConnected() override;
void OnCompleteReset(bool success) override;

// content_settings::Observer:
void OnContentSettingChanged(
const ContentSettingsPattern& primary_pattern,
const ContentSettingsPattern& secondary_pattern,
ContentSettingsTypeSet content_type_set) override;

bool is_bat_ads_initialized_ = false;

bool is_shutting_down_ = false;
Expand Down Expand Up @@ -455,6 +467,9 @@ class AdsServiceImpl final : public AdsService,
const raw_ptr<history::HistoryService> history_service_ =
nullptr; // Not owned.

const raw_ptr<HostContentSettingsMap> host_content_settings_map_ =
nullptr; // Not owned.

const std::unique_ptr<AdsTooltipsDelegate> ads_tooltips_delegate_;

const std::unique_ptr<DeviceId> device_id_;
Expand Down
4 changes: 2 additions & 2 deletions components/brave_ads/browser/ads_service_mock.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ class AdsServiceMock : public AdsService {
TriggerAdEventCallback));

MOCK_METHOD(std::optional<NewTabPageAdInfo>,
MaybeGetPrefetchedNewTabPageAdForDisplay,
MaybeGetPrefetchedNewTabPageAd,
());
MOCK_METHOD(void, PrefetchNewTabPageAd, ());
MOCK_METHOD(void,
Expand All @@ -71,7 +71,7 @@ class AdsServiceMock : public AdsService {
(const std::string&, const std::string&));
MOCK_METHOD(void,
ParseAndSaveCreativeNewTabPageAds,
(const base::Value::Dict& data,
(const base::Value::Dict& dict,
ParseAndSaveCreativeNewTabPageAdsCallback));

MOCK_METHOD(void,
Expand Down
5 changes: 2 additions & 3 deletions components/brave_ads/core/browser/service/ads_service.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,8 +130,7 @@ class AdsService : public KeyedService {
virtual void PrefetchNewTabPageAd() = 0;

// Called to get the prefetched new tab page ad for display.
virtual std::optional<NewTabPageAdInfo>
MaybeGetPrefetchedNewTabPageAdForDisplay() = 0;
virtual std::optional<NewTabPageAdInfo> MaybeGetPrefetchedNewTabPageAd() = 0;

// Called when failing to prefetch a new tab page ad for the specified
// `placement_id` and `creative_instance_id`.
Expand All @@ -142,7 +141,7 @@ class AdsService : public KeyedService {
// Called to parse and save creative new tab page ads. The callback takes one
// argument - `bool` is set to `true` if successful otherwise `false`.
virtual void ParseAndSaveCreativeNewTabPageAds(
const base::Value::Dict& data,
const base::Value::Dict& dict,
ParseAndSaveCreativeNewTabPageAdsCallback callback) = 0;

// Called when a user views or interacts with a new tab page ad to trigger a
Expand Down
6 changes: 6 additions & 0 deletions components/brave_ads/core/internal/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -500,6 +500,8 @@ static_library("internal") {
"common/url/url_util.cc",
"common/url/url_util_internal.cc",
"common/url/url_util_internal.h",
"content_settings/content_settings_util.cc",
"content_settings/content_settings_util.h",
"creatives/campaigns_database_table.cc",
"creatives/campaigns_database_table.h",
"creatives/conversions/creative_set_conversion_builder.cc",
Expand Down Expand Up @@ -540,6 +542,10 @@ static_library("internal") {
"creatives/inline_content_ads/inline_content_ad_builder.h",
"creatives/new_tab_page_ads/creative_new_tab_page_ad_info.cc",
"creatives/new_tab_page_ads/creative_new_tab_page_ad_info.h",
"creatives/new_tab_page_ads/creative_new_tab_page_ad_wallpaper_type.h",
"creatives/new_tab_page_ads/creative_new_tab_page_ad_wallpaper_type_constants.h",
"creatives/new_tab_page_ads/creative_new_tab_page_ad_wallpaper_type_util.cc",
"creatives/new_tab_page_ads/creative_new_tab_page_ad_wallpaper_type_util.h",
"creatives/new_tab_page_ads/creative_new_tab_page_ads_database_table.cc",
"creatives/new_tab_page_ads/creative_new_tab_page_ads_database_table.h",
"creatives/new_tab_page_ads/creative_new_tab_page_ads_database_util.cc",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "brave/components/brave_ads/core/internal/common/test/test_base.h"
#include "brave/components/brave_ads/core/internal/creatives/new_tab_page_ads/creative_new_tab_page_ad_info.h"
#include "brave/components/brave_ads/core/internal/creatives/new_tab_page_ads/creative_new_tab_page_ad_test_util.h"
#include "brave/components/brave_ads/core/internal/creatives/new_tab_page_ads/creative_new_tab_page_ad_wallpaper_type.h"
#include "brave/components/brave_ads/core/internal/creatives/new_tab_page_ads/new_tab_page_ad_builder.h"

// npm run test -- brave_unit_tests --filter=BraveAds*
Expand All @@ -19,7 +20,8 @@ class BraveAdsNewTabPageAdInfoTest : public test::TestBase {};
TEST_F(BraveAdsNewTabPageAdInfoTest, IsValid) {
// Arrange
const CreativeNewTabPageAdInfo creative_ad =
test::BuildCreativeNewTabPageAd(/*should_generate_random_uuids=*/true);
test::BuildCreativeNewTabPageAd(CreativeNewTabPageAdWallpaperType::kImage,
/*should_generate_random_uuids=*/true);
const NewTabPageAdInfo ad = BuildNewTabPageAd(creative_ad);

// Act & Assert
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,8 @@ class BraveAdsNewTabPageAdIntegrationTest : public test::TestBase {
EXPECT_CALL(callback, Run(/*success=*/true))
.WillOnce(base::test::RunOnceClosure(run_loop.QuitClosure()));

base::Value::Dict data = base::test::ParseJsonDict(json);
GetAds().ParseAndSaveCreativeNewTabPageAds(std::move(data), callback.Get());
base::Value::Dict dict = base::test::ParseJsonDict(json);
GetAds().ParseAndSaveCreativeNewTabPageAds(std::move(dict), callback.Get());
run_loop.Run();
}

Expand Down
Loading

0 comments on commit 6f81487

Please sign in to comment.