Skip to content

Try trigger NTPSI ad on each NTP refresh. #14225

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 21, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions components/brave_ads/browser/ads_service.h
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,9 @@ class AdsService : public KeyedService {
const ads::mojom::InlineContentAdEventType event_type) = 0;

// Called to prefetch the next new tab page ad.
virtual void PrefetchNewTabPageAd() = 0;

// Called to get a prefetched new tab page ad.
virtual absl::optional<ads::NewTabPageAdInfo> GetPrefetchedNewTabPageAd() = 0;

// Called when failing to prefetch a new tab page ad for |placement_id| and
Expand Down
59 changes: 33 additions & 26 deletions components/brave_ads/browser/ads_service_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -724,8 +724,21 @@ void AdsServiceImpl::CleanUpOnFirstRun() {

RemoveDeprecatedFiles();

PurgeOrphanedAdEventsForType(ads::mojom::AdType::kNewTabPageAd,
base::DoNothing());
// Purge orphaned new tab page ad events which may have remained from the
// previous browser startup. If prefetch_new_tab_page_ad_on_first_run_ value
// is true, then it means that there was an attempt to prefetch a new tab page
// ad prior to CleanUpOnFirstRun() call. In this case, repeating the prefetch
// of a new tab page ad is needed after the purge.
if (prefetch_new_tab_page_ad_on_first_run_) {
prefetch_new_tab_page_ad_on_first_run_ = false;
PurgeOrphanedAdEventsForType(
ads::mojom::AdType::kNewTabPageAd,
base::BindOnce(&AdsServiceImpl::OnPurgeOrphanedNewTabPageAdEvents,
AsWeakPtr()));
} else {
PurgeOrphanedAdEventsForType(ads::mojom::AdType::kNewTabPageAd,
base::DoNothing());
}
}

void AdsServiceImpl::RemoveDeprecatedFiles() const {
Expand Down Expand Up @@ -1309,27 +1322,13 @@ AdsServiceImpl::GetPrefetchedNewTabPageAd() {
prefetched_new_tab_page_ad_info_.reset();
}

if (purge_orphaned_new_tab_page_ad_events_time_ &&
*purge_orphaned_new_tab_page_ad_events_time_ <= base::Time::Now()) {
purge_orphaned_new_tab_page_ad_events_time_.reset();
PurgeOrphanedAdEventsForType(
ads::mojom::AdType::kNewTabPageAd,
base::BindOnce(&AdsServiceImpl::OnPurgeOrphanedNewTabPageAdEvents,
AsWeakPtr()));
} else {
PrefetchNewTabPageAd();
}

return ad_info;
}

void AdsServiceImpl::OnFailedToPrefetchNewTabPageAd(
const std::string& placement_id,
const std::string& creative_instance_id) {
if (!purge_orphaned_new_tab_page_ad_events_time_) {
purge_orphaned_new_tab_page_ad_events_time_ =
base::Time::Now() + base::Hours(1);
}
need_purge_orphaned_new_tab_page_ad_events_ = true;
}

void AdsServiceImpl::TriggerNewTabPageAdEvent(
Expand Down Expand Up @@ -1922,6 +1921,13 @@ void AdsServiceImpl::OnResourceComponentUpdated(const std::string& id) {
}

void AdsServiceImpl::PrefetchNewTabPageAd() {
if (!did_cleanup_on_first_run_) {
// Postpone prefetching of a new tab page ad at a later time during
// CleanUpOnFirstRun() call.
prefetch_new_tab_page_ad_on_first_run_ = true;
return;
}

if (!IsBatAdsBound()) {
return;
}
Expand All @@ -1932,8 +1938,16 @@ void AdsServiceImpl::PrefetchNewTabPageAd() {
return;
}

bat_ads_->MaybeServeNewTabPageAd(
base::BindOnce(&AdsServiceImpl::OnPrefetchNewTabPageAd, AsWeakPtr()));
if (need_purge_orphaned_new_tab_page_ad_events_) {
need_purge_orphaned_new_tab_page_ad_events_ = false;
PurgeOrphanedAdEventsForType(
ads::mojom::AdType::kNewTabPageAd,
base::BindOnce(&AdsServiceImpl::OnPurgeOrphanedNewTabPageAdEvents,
AsWeakPtr()));
} else {
bat_ads_->MaybeServeNewTabPageAd(
base::BindOnce(&AdsServiceImpl::OnPrefetchNewTabPageAd, AsWeakPtr()));
}
}

void AdsServiceImpl::OnPrefetchNewTabPageAd(bool success,
Expand All @@ -1942,13 +1956,6 @@ void AdsServiceImpl::OnPrefetchNewTabPageAd(bool success,
return;
}

// The previous successfully prefetched new tab page ad was not served.
if (prefetched_new_tab_page_ad_info_ &&
!purge_orphaned_new_tab_page_ad_events_time_) {
purge_orphaned_new_tab_page_ad_events_time_ =
base::Time::Now() + base::Hours(1);
}

ads::NewTabPageAdInfo ad_info;
ad_info.FromJson(json);
prefetched_new_tab_page_ad_info_ = ad_info;
Expand Down
5 changes: 3 additions & 2 deletions components/brave_ads/browser/ads_service_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ class AdsServiceImpl : public AdsService,
bool StopNotificationAdTimeOutTimer(const std::string& placement_id);
void NotificationAdTimedOut(const std::string& placement_id);

void PrefetchNewTabPageAd();
void PrefetchNewTabPageAd() override;
void OnPrefetchNewTabPageAd(bool success, const std::string& json);

void OnTriggerSearchResultAdEvent(
Expand Down Expand Up @@ -482,7 +482,8 @@ class AdsServiceImpl : public AdsService,
notification_ad_timers_;

absl::optional<ads::NewTabPageAdInfo> prefetched_new_tab_page_ad_info_;
absl::optional<base::Time> purge_orphaned_new_tab_page_ad_events_time_;
bool need_purge_orphaned_new_tab_page_ad_events_ = false;
bool prefetch_new_tab_page_ad_on_first_run_ = false;

std::string retry_opening_new_tab_for_ad_with_placement_id_;

Expand Down
1 change: 1 addition & 0 deletions components/brave_ads/browser/mock_ads_service.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ class MockAdsService : public AdsService {

MOCK_METHOD0(GetPrefetchedNewTabPageAd,
absl::optional<ads::NewTabPageAdInfo>());
MOCK_METHOD0(PrefetchNewTabPageAd, void());
MOCK_METHOD3(TriggerNewTabPageAdEvent,
void(const std::string&,
const std::string&,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,7 @@ base::Value NTPSponsoredImagesData::GetBackgroundByAdInfo(
}
}
if (campaign_index == campaigns.size()) {
VLOG(0) << "Ad campaign wasn't found in NTP sposored images data: "
VLOG(0) << "The ad campaign wasn't found in the NTP sponsored images data: "
<< ad_info.campaign_id;
return base::Value();
}
Expand Down
12 changes: 12 additions & 0 deletions components/ntp_background_images/browser/view_counter_service.cc
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,7 @@ void ViewCounterService::RegisterPageView() {
// This will be no-op when component is not ready.
service_->CheckNTPSIComponentUpdateIfNeeded();
model_.RegisterPageView();
MaybePrefetchNewTabPageAd();
}

void ViewCounterService::BrandedWallpaperLogoClicked(
Expand Down Expand Up @@ -374,6 +375,17 @@ std::string ViewCounterService::GetSuperReferralCode() const {
return service_->GetSuperReferralCode();
}

void ViewCounterService::MaybePrefetchNewTabPageAd() {
NTPSponsoredImagesData* images_data = GetCurrentBrandedWallpaperData();
if (!IsBrandedWallpaperActive() || !ads_service_ ||
!ads_service_->IsEnabled() || !images_data ||
images_data->IsSuperReferral()) {
return;
}

ads_service_->PrefetchNewTabPageAd();
}

void ViewCounterService::UpdateP3AValues() const {
uint64_t new_tab_count = new_tab_count_state_->GetHighestValueInWeek();
p3a_utils::RecordToHistogramBucket("Brave.NTP.NewTabsCreated",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,8 @@ class ViewCounterService : public KeyedService,

void ResetModel();

void MaybePrefetchNewTabPageAd();

void UpdateP3AValues() const;

raw_ptr<NTPBackgroundImagesService> service_ = nullptr;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,10 +207,13 @@ class NTPBackgroundImagesViewCounterTest : public testing::Test {
return ad_info;
}

int GetInitialCountToBrandedWallpaper() const {
return ViewCounterModel::kInitialCountToBrandedWallpaper;
}

base::Value TryGetFirstSponsoredImageWallpaper() {
// Loading initial count times.
for (int i = 0; i < ViewCounterModel::kInitialCountToBrandedWallpaper;
++i) {
for (int i = 0; i < GetInitialCountToBrandedWallpaper(); ++i) {
base::Value wallpaper = view_counter_->GetCurrentWallpaperForDisplay();
EXPECT_TRUE(wallpaper.FindBoolKey(ntp_background_images::kIsBackgroundKey)
.value_or(false));
Expand Down Expand Up @@ -367,7 +370,7 @@ TEST_F(NTPBackgroundImagesViewCounterTest, ModelTest) {

// Initial count is not changed because branded wallpaper is always
// visible in SR mode.
int expected_count = ViewCounterModel::kInitialCountToBrandedWallpaper;
int expected_count = GetInitialCountToBrandedWallpaper();
view_counter_->RegisterPageView();
view_counter_->RegisterPageView();
EXPECT_EQ(expected_count, view_counter_->model_.count_to_branded_wallpaper_);
Expand Down Expand Up @@ -409,8 +412,9 @@ TEST_F(NTPBackgroundImagesViewCounterTest,
GetSposoredImageWallpaperAdsServiceDisabled) {
InitBackgroundAndSponsoredImageWallpapers();

EXPECT_CALL(ads_service_, IsEnabled()).WillOnce(Return(false));
EXPECT_CALL(ads_service_, IsEnabled()).WillRepeatedly(Return(false));
EXPECT_CALL(ads_service_, GetPrefetchedNewTabPageAd()).Times(0);
EXPECT_CALL(ads_service_, PrefetchNewTabPageAd()).Times(0);

base::Value si_wallpaper = TryGetFirstSponsoredImageWallpaper();
EXPECT_FALSE(si_wallpaper.FindBoolKey(ntp_background_images::kIsBackgroundKey)
Expand All @@ -430,9 +434,11 @@ TEST_F(NTPBackgroundImagesViewCounterTest,
TEST_F(NTPBackgroundImagesViewCounterTest, SponsoredImageAdFrequencyCapped) {
InitBackgroundAndSponsoredImageWallpapers();

EXPECT_CALL(ads_service_, IsEnabled()).WillOnce(Return(true));
EXPECT_CALL(ads_service_, IsEnabled()).WillRepeatedly(Return(true));
EXPECT_CALL(ads_service_, GetPrefetchedNewTabPageAd())
.WillOnce(Return(absl::nullopt));
EXPECT_CALL(ads_service_, PrefetchNewTabPageAd())
.Times(GetInitialCountToBrandedWallpaper());
EXPECT_CALL(ads_service_, OnFailedToPrefetchNewTabPageAd(_, _)).Times(0);

base::Value si_wallpaper = TryGetFirstSponsoredImageWallpaper();
Expand All @@ -450,9 +456,11 @@ TEST_F(NTPBackgroundImagesViewCounterTest, SponsoredImageAdServed) {
ads::NewTabPageAdInfo ad_info = CreateNewTabPageAdInfo();
EXPECT_TRUE(AdInfoMatchesSponsoredImage(ad_info, 0, 1));

EXPECT_CALL(ads_service_, IsEnabled()).WillOnce(Return(true));
EXPECT_CALL(ads_service_, IsEnabled()).WillRepeatedly(Return(true));
EXPECT_CALL(ads_service_, GetPrefetchedNewTabPageAd())
.WillOnce(Return(ad_info));
EXPECT_CALL(ads_service_, PrefetchNewTabPageAd())
.Times(GetInitialCountToBrandedWallpaper());
EXPECT_CALL(ads_service_, OnFailedToPrefetchNewTabPageAd(_, _)).Times(0);

base::Value si_wallpaper = TryGetFirstSponsoredImageWallpaper();
Expand All @@ -477,9 +485,11 @@ TEST_F(NTPBackgroundImagesViewCounterTest, WrongSponsoredImageAdServed) {
ad_info.creative_instance_id = "wrong_creative_instance_id";
EXPECT_FALSE(AdInfoMatchesSponsoredImage(ad_info, 0, 1));

EXPECT_CALL(ads_service_, IsEnabled()).WillOnce(Return(true));
EXPECT_CALL(ads_service_, IsEnabled()).WillRepeatedly(Return(true));
EXPECT_CALL(ads_service_, GetPrefetchedNewTabPageAd())
.WillOnce(Return(ad_info));
EXPECT_CALL(ads_service_, PrefetchNewTabPageAd())
.Times(GetInitialCountToBrandedWallpaper());
EXPECT_CALL(ads_service_, OnFailedToPrefetchNewTabPageAd(_, _));

base::Value si_wallpaper = TryGetFirstSponsoredImageWallpaper();
Expand Down