Skip to content

Commit f8e707e

Browse files
committed
Fire ad events if brave ads are disabled.
1 parent 8bc0336 commit f8e707e

File tree

21 files changed

+462
-32
lines changed

21 files changed

+462
-32
lines changed

browser/brave_ads/ads_service_impl.cc

+17-5
Original file line numberDiff line numberDiff line change
@@ -701,12 +701,13 @@ void AdsServiceImpl::OnInitialize(const bool success) {
701701
void AdsServiceImpl::SetupOnFirstInitialize() {
702702
DCHECK(!is_setup_on_first_initialize_done_);
703703

704-
PurgeOrphanedAdEventsForType(
705-
ads::mojom::AdType::kNewTabPageAd,
706-
base::BindOnce(&AdsServiceImpl::PrefetchNewTabPageAd, AsWeakPtr()));
707-
708704
file_task_runner_->PostTask(
709705
FROM_HERE, base::BindOnce(&RemoveDeprecatedAdsDataFiles, base_path_));
706+
707+
PurgeOrphanedAdEventsForType(
708+
ads::mojom::AdType::kNewTabPageAd,
709+
base::BindOnce(&AdsServiceImpl::OnPurgeOrphanedAdEventsForNewTabPageAds,
710+
AsWeakPtr()));
710711
}
711712

712713
void AdsServiceImpl::ShutdownBatAds() {
@@ -1190,7 +1191,7 @@ void AdsServiceImpl::OnInlineContentAdEvent(
11901191

11911192
void AdsServiceImpl::PurgeOrphanedAdEventsForType(
11921193
const ads::mojom::AdType ad_type,
1193-
base::OnceClosure callback) {
1194+
PurgeOrphanedAdEventsForTypeCallback callback) {
11941195
if (!connected()) {
11951196
return;
11961197
}
@@ -1342,6 +1343,17 @@ void AdsServiceImpl::OnGetInlineContentAd(OnGetInlineContentAdCallback callback,
13421343
std::move(callback).Run(success, dimensions, dictionary);
13431344
}
13441345

1346+
void AdsServiceImpl::OnPurgeOrphanedAdEventsForNewTabPageAds(
1347+
const bool success) {
1348+
if (!success) {
1349+
VLOG(0) << "Failed to purge orphaned ad events for new tab page ads";
1350+
return;
1351+
}
1352+
1353+
VLOG(0) << "Successfully purged orphaned ad events for new tab page ads";
1354+
PrefetchNewTabPageAd();
1355+
}
1356+
13451357
void AdsServiceImpl::OnGetAdsHistory(OnGetAdsHistoryCallback callback,
13461358
const std::string& json) {
13471359
ads::AdsHistoryInfo ads_history;

browser/brave_ads/ads_service_impl.h

+5-3
Original file line numberDiff line numberDiff line change
@@ -177,8 +177,9 @@ class AdsServiceImpl : public AdsService,
177177

178178
absl::optional<ads::NewTabPageAdInfo> GetPrefetchedNewTabPageAd() override;
179179

180-
void PurgeOrphanedAdEventsForType(const ads::mojom::AdType ad_type,
181-
base::OnceClosure callback) override;
180+
void PurgeOrphanedAdEventsForType(
181+
const ads::mojom::AdType ad_type,
182+
PurgeOrphanedAdEventsForTypeCallback callback) override;
182183

183184
void GetAdsHistory(const double from_timestamp,
184185
const double to_timestamp,
@@ -271,7 +272,6 @@ class AdsServiceImpl : public AdsService,
271272
void RegisterResourceComponentsForLocale(const std::string& locale);
272273

273274
void PrefetchNewTabPageAd();
274-
275275
void OnPrefetchNewTabPageAd(bool success, const std::string& json);
276276

277277
void OnURLRequestStarted(
@@ -289,6 +289,8 @@ class AdsServiceImpl : public AdsService,
289289
const std::string& dimensions,
290290
const std::string& json);
291291

292+
void OnPurgeOrphanedAdEventsForNewTabPageAds(const bool success);
293+
292294
void OnGetAdsHistory(OnGetAdsHistoryCallback callback,
293295
const std::string& json);
294296

browser/notifications/BUILD.gn

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ source_set("notifications") {
1515
deps = [
1616
"//base",
1717
"//brave/components/brave_adaptive_captcha/buildflags",
18-
"//brave/vendor/bat-native-ads",
18+
"//brave/components/brave_ads/browser",
1919
"//chrome/browser/notifications",
2020
"//third_party/abseil-cpp:absl",
2121
"//url",

components/brave_ads/browser/ads_service.h

+6-2
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ using GetAccountStatementCallback = base::OnceCallback<
5656
using GetAdDiagnosticsCallback =
5757
base::OnceCallback<void(const bool, const std::string&)>;
5858

59+
using PurgeOrphanedAdEventsForTypeCallback =
60+
base::OnceCallback<void(const bool)>;
61+
5962
class AdsService : public KeyedService {
6063
public:
6164
AdsService();
@@ -140,8 +143,9 @@ class AdsService : public KeyedService {
140143

141144
virtual absl::optional<ads::NewTabPageAdInfo> GetPrefetchedNewTabPageAd() = 0;
142145

143-
virtual void PurgeOrphanedAdEventsForType(const ads::mojom::AdType ad_type,
144-
base::OnceClosure callback) = 0;
146+
virtual void PurgeOrphanedAdEventsForType(
147+
const ads::mojom::AdType ad_type,
148+
PurgeOrphanedAdEventsForTypeCallback callback) = 0;
145149

146150
virtual void GetAdsHistory(const double from_timestamp,
147151
const double to_timestamp,

components/brave_ads/browser/mock_ads_service.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ class MockAdsService : public AdsService {
9393
absl::optional<ads::NewTabPageAdInfo>());
9494

9595
MOCK_METHOD2(PurgeOrphanedAdEventsForType,
96-
void(ads::mojom::AdType, base::OnceClosure));
96+
void(ads::mojom::AdType, PurgeOrphanedAdEventsForTypeCallback));
9797

9898
MOCK_METHOD3(GetAdsHistory, void(double, double, OnGetAdsHistoryCallback));
9999

components/brave_ads/test/BUILD.gn

+1
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ source_set("brave_ads_unit_tests") {
9393
"//brave/vendor/bat-native-ads/src/bat/ads/internal/ads/inline_content_ads/inline_content_ad_permission_rules_unittest_util.cc",
9494
"//brave/vendor/bat-native-ads/src/bat/ads/internal/ads/inline_content_ads/inline_content_ad_permission_rules_unittest_util.h",
9595
"//brave/vendor/bat-native-ads/src/bat/ads/internal/ads/inline_content_ads/inline_content_ad_unittest.cc",
96+
"//brave/vendor/bat-native-ads/src/bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad_if_ads_disabled_unittest.cc",
9697
"//brave/vendor/bat-native-ads/src/bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad_permission_rules_unittest_util.cc",
9798
"//brave/vendor/bat-native-ads/src/bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad_permission_rules_unittest_util.h",
9899
"//brave/vendor/bat-native-ads/src/bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad_unittest.cc",

components/ntp_background_images/browser/view_counter_service.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,9 @@ base::Value ViewCounterService::GetCurrentBrandedWallpaper() const {
170170
return base::Value();
171171
}
172172

173-
const bool should_ads_frequency_cap =
173+
const bool should_frequency_cap_ads =
174174
ads_service_ && ads_service_->IsEnabled();
175-
if (should_ads_frequency_cap && !images_data->IsSuperReferral()) {
175+
if (should_frequency_cap_ads && !images_data->IsSuperReferral()) {
176176
return GetCurrentBrandedWallpaperByAdInfo();
177177
}
178178

components/services/bat_ads/bat_ads_impl.cc

+4-3
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ void BatAdsImpl::PurgeOrphanedAdEventsForType(
186186
AsWeakPtr(), std::move(callback));
187187

188188
auto purge_ad_events_for_type_callback =
189-
std::bind(BatAdsImpl::OnPurgeOrphanedAdEventsForType, holder);
189+
std::bind(BatAdsImpl::OnPurgeOrphanedAdEventsForType, holder, _1);
190190

191191
ads_->PurgeOrphanedAdEventsForType(ad_type,
192192
purge_ad_events_for_type_callback);
@@ -338,9 +338,10 @@ void BatAdsImpl::OnGetInlineContentAd(
338338
}
339339

340340
void BatAdsImpl::OnPurgeOrphanedAdEventsForType(
341-
CallbackHolder<PurgeOrphanedAdEventsForTypeCallback>* holder) {
341+
CallbackHolder<PurgeOrphanedAdEventsForTypeCallback>* holder,
342+
const bool success) {
342343
if (holder->is_valid()) {
343-
std::move(holder->get()).Run();
344+
std::move(holder->get()).Run(success);
344345
}
345346

346347
delete holder;

components/services/bat_ads/bat_ads_impl.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,8 @@ class BatAdsImpl :
186186
const ads::InlineContentAdInfo& ad);
187187

188188
static void OnPurgeOrphanedAdEventsForType(
189-
CallbackHolder<PurgeOrphanedAdEventsForTypeCallback>* holder);
189+
CallbackHolder<PurgeOrphanedAdEventsForTypeCallback>* holder,
190+
const bool success);
190191

191192
static void OnRemoveAllHistory(
192193
CallbackHolder<RemoveAllHistoryCallback>* holder,

components/services/bat_ads/public/interfaces/bat_ads.mojom

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ interface BatAds {
9393
OnPromotedContentAdEvent(string uuid, string creative_instance_id, ads.mojom.PromotedContentAdEventType event_type);
9494
GetInlineContentAd(string size) => (bool success, string dimensions, string ad);
9595
OnInlineContentAdEvent(string uuid, string creative_instance_id, ads.mojom.InlineContentAdEventType event_type);
96-
PurgeOrphanedAdEventsForType(ads.mojom.AdType ad_type) => ();
96+
PurgeOrphanedAdEventsForType(ads.mojom.AdType ad_type) => (bool success);
9797
RemoveAllHistory() => (bool success);
9898
OnWalletUpdated(string payment_id, string seed);
9999
GetAdsHistory(double from_timestamp, double to_timestamp) => (string json);

ios/browser/api/ads/brave_ads.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,8 @@ OBJC_EXPORT
161161
eventType:(AdsPromotedContentAdEventType)eventType;
162162

163163
/// Purge orphaned ad events for a given ad type
164-
- (void)purgeOrphanedAdEvents:(AdsAdType)adType;
164+
- (void)purgeOrphanedAdEvents:(AdsAdType)adType
165+
completion:(void (^)(BOOL success))completion;
165166

166167
/// Get the number of ads received and the estimated earnings of viewing said
167168
/// ads for this cycle

ios/browser/api/ads/brave_ads.mm

+4-3
Original file line numberDiff line numberDiff line change
@@ -651,12 +651,13 @@ - (void)reportPromotedContentAdEvent:(NSString*)uuid
651651
static_cast<ads::mojom::PromotedContentAdEventType>(eventType));
652652
}
653653

654-
- (void)purgeOrphanedAdEvents:(AdsAdType)adType {
654+
- (void)purgeOrphanedAdEvents:(AdsAdType)adType
655+
completion:(void (^)(BOOL success))completion {
655656
if (![self isAdsServiceRunning]) {
656657
return;
657658
}
658-
ads->PurgeOrphanedAdEventsForType(static_cast<ads::mojom::AdType>(adType), ^{
659-
});
659+
ads->PurgeOrphanedAdEventsForType(static_cast<ads::mojom::AdType>(adType),
660+
completion);
660661
}
661662

662663
- (void)detailsForCurrentCycle:(void (^)(NSInteger adsReceived,

vendor/bat-native-ads/include/bat/ads/ads_aliases.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ using GetAccountStatementCallback =
3232
using GetAdDiagnosticsCallback =
3333
std::function<void(const bool, const std::string&)>;
3434

35-
using PurgeOrphanedAdEventsForTypeCallback = std::function<void()>;
35+
using PurgeOrphanedAdEventsForTypeCallback = std::function<void(const bool)>;
3636

3737
} // namespace ads
3838

vendor/bat-native-ads/src/bat/ads/internal/ad_serving/new_tab_page_ads/new_tab_page_ad_serving.cc

+1
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ bool AdServing::IsSupported() const {
111111
bool AdServing::ServeAd(const NewTabPageAdInfo& ad,
112112
GetNewTabPageAdCallback callback) const {
113113
DCHECK(ad.IsValid());
114+
DCHECK(!ad.wallpapers.empty());
114115

115116
BLOG(1, "Serving new tab page ad:\n"
116117
<< " uuid: " << ad.uuid << "\n"

vendor/bat-native-ads/src/bat/ads/internal/ad_serving/new_tab_page_ads/new_tab_page_ad_serving_test.cc

+50-6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
#include "bat/ads/internal/ad_serving/new_tab_page_ads/new_tab_page_ad_serving.h"
77

8+
#include <algorithm>
9+
810
#include "bat/ads/internal/ad_events/ad_event_unittest_util.h"
911
#include "bat/ads/internal/ad_serving/ad_serving_features.h"
1012
#include "bat/ads/internal/ad_serving/ad_targeting/geographic/subdivision/subdivision_targeting.h"
@@ -123,7 +125,7 @@ TEST_F(BatAdsNewTabPageAdServingTest, ServeAd) {
123125
}
124126

125127
TEST_F(BatAdsNewTabPageAdServingTest,
126-
DoNotServeAdIfExceededPerDayCapFromCatalog) {
128+
ServeAdIfNotExceededPerDayExclusionRuleFrequencyCap) {
127129
// Arrange
128130
new_tab_page_ads::frequency_capping::ForcePermissionRules();
129131

@@ -132,9 +134,47 @@ TEST_F(BatAdsNewTabPageAdServingTest,
132134
creative_ads.push_back(creative_ad);
133135
Save(creative_ads);
134136

137+
const int allowed_ad_count_per_day =
138+
std::min(creative_ad.per_day, creative_ad.daily_cap);
139+
135140
AdEventInfo ad_event = BuildAdEvent(creative_ad, AdType::kNewTabPageAd,
136141
ConfirmationType::kServed, Now());
137-
for (int i = 0; i < creative_ad.per_day; ++i) {
142+
for (int i = 0; i < allowed_ad_count_per_day - 1; ++i) {
143+
FireAdEvent(ad_event);
144+
}
145+
146+
AdvanceClock(base::Hours(1));
147+
148+
// Act
149+
ad_serving_->MaybeServeAd(
150+
[&creative_ad](const bool success, const NewTabPageAdInfo& ad) {
151+
ASSERT_TRUE(success);
152+
153+
NewTabPageAdInfo expected_ad = BuildNewTabPageAd(creative_ad);
154+
expected_ad.uuid = ad.uuid;
155+
156+
EXPECT_EQ(expected_ad, ad);
157+
});
158+
159+
// Assert
160+
}
161+
162+
TEST_F(BatAdsNewTabPageAdServingTest,
163+
DoNotServeAdIfExceededPerDayExclusionRuleFrequencyCap) {
164+
// Arrange
165+
new_tab_page_ads::frequency_capping::ForcePermissionRules();
166+
167+
CreativeNewTabPageAdList creative_ads;
168+
CreativeNewTabPageAdInfo creative_ad = BuildCreativeNewTabPageAd();
169+
creative_ads.push_back(creative_ad);
170+
Save(creative_ads);
171+
172+
const int allowed_ad_count_per_day =
173+
std::min(creative_ad.per_day, creative_ad.daily_cap);
174+
175+
AdEventInfo ad_event = BuildAdEvent(creative_ad, AdType::kNewTabPageAd,
176+
ConfirmationType::kServed, Now());
177+
for (int i = 0; i < allowed_ad_count_per_day; ++i) {
138178
FireAdEvent(ad_event);
139179
}
140180

@@ -162,7 +202,8 @@ TEST_F(BatAdsNewTabPageAdServingTest,
162202
// Assert
163203
}
164204

165-
TEST_F(BatAdsNewTabPageAdServingTest, ServeAdIfNotExceededAdsPerHourCap) {
205+
TEST_F(BatAdsNewTabPageAdServingTest,
206+
ServeAdIfNotExceededAdsPerHourPermissionRuleFrequencyCap) {
166207
// Arrange
167208
new_tab_page_ads::frequency_capping::ForcePermissionRules();
168209

@@ -195,7 +236,8 @@ TEST_F(BatAdsNewTabPageAdServingTest, ServeAdIfNotExceededAdsPerHourCap) {
195236
// Assert
196237
}
197238

198-
TEST_F(BatAdsNewTabPageAdServingTest, DoNotServeAdIfExceededAdsPerHourCap) {
239+
TEST_F(BatAdsNewTabPageAdServingTest,
240+
DoNotServeAdIfExceededAdsPerHourPermissionRuleFrequencyCap) {
199241
// Arrange
200242
new_tab_page_ads::frequency_capping::ForcePermissionRules();
201243

@@ -222,7 +264,8 @@ TEST_F(BatAdsNewTabPageAdServingTest, DoNotServeAdIfExceededAdsPerHourCap) {
222264
// Assert
223265
}
224266

225-
TEST_F(BatAdsNewTabPageAdServingTest, ServeAdIfNotExceededAdsPerDayCap) {
267+
TEST_F(BatAdsNewTabPageAdServingTest,
268+
ServeAdIfNotExceededAdsPerDayPermissionRuleFrequencyCap) {
226269
// Arrange
227270
new_tab_page_ads::frequency_capping::ForcePermissionRules();
228271

@@ -257,7 +300,8 @@ TEST_F(BatAdsNewTabPageAdServingTest, ServeAdIfNotExceededAdsPerDayCap) {
257300
// Assert
258301
}
259302

260-
TEST_F(BatAdsNewTabPageAdServingTest, DoNotServeAdIfExceededAdsPerDayCap) {
303+
TEST_F(BatAdsNewTabPageAdServingTest,
304+
DoNotServeAdIfExceededAdsPerDayPermissionRuleFrequencyCap) {
261305
// Arrange
262306
new_tab_page_ads::frequency_capping::ForcePermissionRules();
263307

vendor/bat-native-ads/src/bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad.cc

+19
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "bat/ads/internal/ads/new_tab_page_ads/new_tab_page_ad.h"
77

88
#include "base/check.h"
9+
#include "bat/ads/internal/account/account_util.h"
910
#include "bat/ads/internal/ad_events/ad_event.h"
1011
#include "bat/ads/internal/ad_events/ad_event_info.h"
1112
#include "bat/ads/internal/ad_events/ad_event_util.h"
@@ -44,6 +45,16 @@ void NewTabPageAd::FireEvent(const std::string& uuid,
4445
return;
4546
}
4647

48+
// Apply permission rules frequency capping for new tab page ad view events
49+
// if Brave Ads are disabled.
50+
new_tab_page_ads::frequency_capping::PermissionRules permission_rules;
51+
if (event_type == mojom::NewTabPageAdEventType::kViewed &&
52+
!ShouldRewardUser() && !permission_rules.HasPermission()) {
53+
BLOG(1, "New tab page ad: Not allowed due to permission rules");
54+
NotifyNewTabPageAdEventFailed(uuid, creative_instance_id, event_type);
55+
return;
56+
}
57+
4758
database::table::CreativeNewTabPageAds database_table;
4859
database_table.GetForCreativeInstanceId(
4960
creative_instance_id,
@@ -88,6 +99,14 @@ void NewTabPageAd::FireEvent(const NewTabPageAdInfo& ad,
8899
return;
89100
}
90101

102+
if (event_type == mojom::NewTabPageAdEventType::kViewed &&
103+
!ShouldRewardUser()) {
104+
// Fire an ad served event if Brave Ads are disabled and the ad
105+
// wasn't served by ads library.
106+
FireEvent(uuid, creative_instance_id,
107+
mojom::NewTabPageAdEventType::kServed);
108+
}
109+
91110
const auto ad_event =
92111
new_tab_page_ads::AdEventFactory::Build(event_type);
93112
ad_event->FireEvent(ad);

0 commit comments

Comments
 (0)