@@ -683,13 +683,27 @@ void AdsServiceImpl::OnInitialize(const bool success) {
683
683
684
684
StartCheckIdleStateTimer ();
685
685
686
- if (!deprecated_data_files_removed_) {
687
- deprecated_data_files_removed_ = true ;
688
- file_task_runner_->PostTask (
689
- FROM_HERE, base::BindOnce (&RemoveDeprecatedAdsDataFiles, base_path_));
686
+ if (!is_setup_on_first_initialize_done_) {
687
+ SetupOnFirstInitialize ();
688
+ is_setup_on_first_initialize_done_ = true ;
690
689
}
691
690
}
692
691
692
+ void AdsServiceImpl::SetupOnFirstInitialize () {
693
+ DCHECK (!is_setup_on_first_initialize_done_);
694
+
695
+ file_task_runner_->PostTask (
696
+ FROM_HERE, base::BindOnce (&RemoveDeprecatedAdsDataFiles, base_path_));
697
+
698
+ // Initiate prefetching of the new tab page ad. Also need to purge orphaned
699
+ // new tab page ad events which may have remained from the previous browser
700
+ // startup.
701
+ PurgeOrphanedAdEventsForType (
702
+ ads::mojom::AdType::kNewTabPageAd ,
703
+ base::BindOnce (&AdsServiceImpl::OnPurgeOrphanedAdEventsForNewTabPageAds,
704
+ AsWeakPtr ()));
705
+ }
706
+
693
707
void AdsServiceImpl::ShutdownBatAds () {
694
708
if (!connected ()) {
695
709
return ;
@@ -1136,6 +1150,15 @@ void AdsServiceImpl::TriggerNewTabPageAdEvent(
1136
1150
event_type);
1137
1151
}
1138
1152
1153
+ void AdsServiceImpl::OnFailedToServeNewTabPageAd (
1154
+ const std::string& placement_id,
1155
+ const std::string& creative_instance_id) {
1156
+ if (!purge_orphaned_new_tab_page_ad_events_time_) {
1157
+ purge_orphaned_new_tab_page_ad_events_time_ =
1158
+ base::Time::Now () + base::Hours (1 );
1159
+ }
1160
+ }
1161
+
1139
1162
void AdsServiceImpl::TriggerPromotedContentAdEvent (
1140
1163
const std::string& placement_id,
1141
1164
const std::string& creative_instance_id,
@@ -1188,13 +1211,40 @@ void AdsServiceImpl::TriggerSearchResultAdEvent(
1188
1211
std::move (callback)));
1189
1212
}
1190
1213
1214
+ absl::optional<ads::NewTabPageAdInfo>
1215
+ AdsServiceImpl::GetPrefetchedNewTabPageAd () {
1216
+ if (!connected ()) {
1217
+ return absl::nullopt;
1218
+ }
1219
+
1220
+ absl::optional<ads::NewTabPageAdInfo> ad_info;
1221
+ if (prefetched_new_tab_page_ad_info_) {
1222
+ ad_info = prefetched_new_tab_page_ad_info_;
1223
+ prefetched_new_tab_page_ad_info_.reset ();
1224
+ }
1225
+
1226
+ if (purge_orphaned_new_tab_page_ad_events_time_ &&
1227
+ *purge_orphaned_new_tab_page_ad_events_time_ <= base::Time::Now ()) {
1228
+ purge_orphaned_new_tab_page_ad_events_time_.reset ();
1229
+ PurgeOrphanedAdEventsForType (
1230
+ ads::mojom::AdType::kNewTabPageAd ,
1231
+ base::BindOnce (&AdsServiceImpl::OnPurgeOrphanedAdEventsForNewTabPageAds,
1232
+ AsWeakPtr ()));
1233
+ } else {
1234
+ PrefetchNewTabPageAd ();
1235
+ }
1236
+
1237
+ return ad_info;
1238
+ }
1239
+
1191
1240
void AdsServiceImpl::PurgeOrphanedAdEventsForType (
1192
- const ads::mojom::AdType ad_type) {
1241
+ const ads::mojom::AdType ad_type,
1242
+ PurgeOrphanedAdEventsForTypeCallback callback) {
1193
1243
if (!connected ()) {
1194
1244
return ;
1195
1245
}
1196
1246
1197
- bat_ads_->PurgeOrphanedAdEventsForType (ad_type);
1247
+ bat_ads_->PurgeOrphanedAdEventsForType (ad_type, std::move (callback) );
1198
1248
}
1199
1249
1200
1250
void AdsServiceImpl::RetryOpeningNewTabWithAd (const std::string& placement_id) {
@@ -1247,6 +1297,40 @@ void AdsServiceImpl::RegisterResourceComponentsForLocale(
1247
1297
locale);
1248
1298
}
1249
1299
1300
+ void AdsServiceImpl::PrefetchNewTabPageAd () {
1301
+ if (!connected ()) {
1302
+ return ;
1303
+ }
1304
+
1305
+ // The previous prefetched new tab page ad is available. No need to do
1306
+ // prefetch again.
1307
+ if (prefetched_new_tab_page_ad_info_) {
1308
+ return ;
1309
+ }
1310
+
1311
+ bat_ads_->GetNewTabPageAd (
1312
+ base::BindOnce (&AdsServiceImpl::OnPrefetchNewTabPageAd, AsWeakPtr ()));
1313
+ }
1314
+
1315
+ void AdsServiceImpl::OnPrefetchNewTabPageAd (bool success,
1316
+ const std::string& json) {
1317
+ // The previous prefetched new tab page ad was not served.
1318
+ if (prefetched_new_tab_page_ad_info_ &&
1319
+ !purge_orphaned_new_tab_page_ad_events_time_) {
1320
+ purge_orphaned_new_tab_page_ad_events_time_ =
1321
+ base::Time::Now () + base::Hours (1 );
1322
+ }
1323
+
1324
+ if (!success) {
1325
+ prefetched_new_tab_page_ad_info_.reset ();
1326
+ return ;
1327
+ }
1328
+
1329
+ ads::NewTabPageAdInfo ad_info;
1330
+ ad_info.FromJson (json);
1331
+ prefetched_new_tab_page_ad_info_ = ad_info;
1332
+ }
1333
+
1250
1334
void AdsServiceImpl::OnURLRequestStarted (
1251
1335
const GURL& final_url,
1252
1336
const network::mojom::URLResponseHead& response_head) {
@@ -1331,6 +1415,17 @@ void AdsServiceImpl::OnTriggerSearchResultAdEvent(
1331
1415
std::move (callback).Run (success, placement_id, event_type);
1332
1416
}
1333
1417
1418
+ void AdsServiceImpl::OnPurgeOrphanedAdEventsForNewTabPageAds (
1419
+ const bool success) {
1420
+ if (!success) {
1421
+ VLOG (0 ) << " Failed to purge orphaned ad events for new tab page ads" ;
1422
+ return ;
1423
+ }
1424
+
1425
+ VLOG (0 ) << " Successfully purged orphaned ad events for new tab page ads" ;
1426
+ PrefetchNewTabPageAd ();
1427
+ }
1428
+
1334
1429
void AdsServiceImpl::OnGetHistory (OnGetHistoryCallback callback,
1335
1430
const std::string& json) {
1336
1431
ads::HistoryInfo history;
0 commit comments