Skip to content

Commit 573dca2

Browse files
committed
Handle SI by bat-native-ads library.
fix brave/brave-browser#14015
1 parent c4c966f commit 573dca2

18 files changed

+285
-39
lines changed

browser/brave_ads/ads_service_impl.cc

+51-4
Original file line numberDiff line numberDiff line change
@@ -682,13 +682,24 @@ void AdsServiceImpl::OnInitialize(const bool success) {
682682

683683
StartCheckIdleStateTimer();
684684

685-
if (!deprecated_data_files_removed_) {
686-
deprecated_data_files_removed_ = true;
687-
file_task_runner_->PostTask(
688-
FROM_HERE, base::BindOnce(&RemoveDeprecatedAdsDataFiles, base_path_));
685+
if (!is_setup_on_first_initialize_done_) {
686+
SetupOnFirstInitialize();
687+
is_setup_on_first_initialize_done_ = true;
689688
}
690689
}
691690

691+
void AdsServiceImpl::SetupOnFirstInitialize() {
692+
DCHECK(!is_setup_on_first_initialize_done_);
693+
694+
if (base::FeatureList::IsEnabled(features::kNewTabPageAdFrequencyCap)) {
695+
PrefetchNewTabPageAd();
696+
PurgeOrphanedAdEventsForType(ads::mojom::AdType::kNewTabPageAd);
697+
}
698+
699+
file_task_runner_->PostTask(
700+
FROM_HERE, base::BindOnce(&RemoveDeprecatedAdsDataFiles, base_path_));
701+
}
702+
692703
void AdsServiceImpl::ShutdownBatAds() {
693704
if (!connected()) {
694705
return;
@@ -1106,6 +1117,22 @@ void AdsServiceImpl::OnOpenNewTabWithAd(const std::string& json) {
11061117
OpenNewTabWithUrl(notification.target_url);
11071118
}
11081119

1120+
absl::optional<std::string> AdsServiceImpl::GetPrefetchedNewTabPageAd() {
1121+
if (!connected()) {
1122+
return absl::nullopt;
1123+
}
1124+
1125+
absl::optional<std::string> ad_info;
1126+
if (prefetched_new_tab_page_ad_info_) {
1127+
ad_info = prefetched_new_tab_page_ad_info_;
1128+
prefetched_new_tab_page_ad_info_.reset();
1129+
}
1130+
1131+
PrefetchNewTabPageAd();
1132+
1133+
return ad_info;
1134+
}
1135+
11091136
void AdsServiceImpl::OnNewTabPageAdEvent(
11101137
const std::string& uuid,
11111138
const std::string& creative_instance_id,
@@ -1211,6 +1238,26 @@ void AdsServiceImpl::RegisterResourceComponentsForLocale(
12111238
locale);
12121239
}
12131240

1241+
void AdsServiceImpl::PrefetchNewTabPageAd() {
1242+
if (!connected()) {
1243+
prefetched_new_tab_page_ad_info_.reset();
1244+
return;
1245+
}
1246+
1247+
bat_ads_->GetNewTabPageAd(
1248+
base::BindOnce(&AdsServiceImpl::OnPrefetchNewTabPageAd, AsWeakPtr()));
1249+
}
1250+
1251+
void AdsServiceImpl::OnPrefetchNewTabPageAd(bool success,
1252+
const std::string& json) {
1253+
if (!success) {
1254+
prefetched_new_tab_page_ad_info_.reset();
1255+
return;
1256+
}
1257+
1258+
prefetched_new_tab_page_ad_info_ = json;
1259+
}
1260+
12141261
void AdsServiceImpl::OnURLRequestStarted(
12151262
const GURL& final_url,
12161263
const network::mojom::URLResponseHead& response_head) {

browser/brave_ads/ads_service_impl.h

+10-1
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,8 @@ class AdsServiceImpl : public AdsService,
164164
const std::string& creative_instance_id,
165165
const ads::mojom::InlineContentAdEventType event_type) override;
166166

167+
absl::optional<std::string> GetPrefetchedNewTabPageAd() override;
168+
167169
void PurgeOrphanedAdEventsForType(const ads::mojom::AdType ad_type) override;
168170

169171
void GetAdsHistory(const double from_timestamp,
@@ -208,6 +210,7 @@ class AdsServiceImpl : public AdsService,
208210
void OnCreate();
209211

210212
void OnInitialize(const bool success);
213+
void SetupOnFirstInitialize();
211214

212215
void ShutdownBatAds();
213216
void OnShutdownBatAds(const bool success);
@@ -255,6 +258,10 @@ class AdsServiceImpl : public AdsService,
255258

256259
void RegisterResourceComponentsForLocale(const std::string& locale);
257260

261+
void PrefetchNewTabPageAd();
262+
263+
void OnPrefetchNewTabPageAd(bool success, const std::string& json);
264+
258265
void OnURLRequestStarted(
259266
const GURL& final_url,
260267
const network::mojom::URLResponseHead& response_head);
@@ -464,7 +471,7 @@ class AdsServiceImpl : public AdsService,
464471

465472
bool is_initialized_ = false;
466473

467-
bool deprecated_data_files_removed_ = false;
474+
bool is_setup_on_first_initialize_done_ = false;
468475

469476
bool is_upgrading_from_pre_brave_ads_build_;
470477

@@ -485,6 +492,8 @@ class AdsServiceImpl : public AdsService,
485492

486493
std::unique_ptr<ads::Database> database_;
487494

495+
absl::optional<std::string> prefetched_new_tab_page_ad_info_;
496+
488497
ui::IdleState last_idle_state_;
489498
int last_idle_time_;
490499

browser/ntp_background_images/android/ntp_background_images_bridge.cc

+4-3
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,6 @@ base::android::ScopedJavaLocalRef<jobject>
148148
NTPBackgroundImagesBridge::CreateBrandedWallpaper(base::Value* data) {
149149
JNIEnv* env = AttachCurrentThread();
150150

151-
const std::string wallpaper_id = base::GenerateGUID();
152-
view_counter_service_->BrandedWallpaperWillBeDisplayed(wallpaper_id);
153-
154151
auto* image_path =
155152
data->FindStringKey(ntp_background_images::kWallpaperImagePathKey);
156153
auto* logo_image_path =
@@ -172,6 +169,10 @@ NTPBackgroundImagesBridge::CreateBrandedWallpaper(base::Value* data) {
172169
auto* creative_instance_id =
173170
data->FindStringKey(ntp_background_images::kCreativeInstanceIDKey);
174171

172+
const std::string wallpaper_id = base::GenerateGUID();
173+
view_counter_service_->BrandedWallpaperWillBeDisplayed(wallpaper_id,
174+
creative_instance_id);
175+
175176
return Java_NTPBackgroundImagesBridge_createBrandedWallpaper(
176177
env, ConvertUTF8ToJavaString(env, *image_path), focal_point_x,
177178
focal_point_y, ConvertUTF8ToJavaString(env, *logo_image_path),

browser/ui/webui/new_tab_page/brave_new_tab_message_handler.cc

+6-3
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,7 @@ void BraveNewTabMessageHandler::HandleGetWallpaperData(
567567
return;
568568
}
569569

570-
auto data = service->GetCurrentWallpaperForDisplay();
570+
base::Value data = service->GetCurrentWallpaperForDisplay();
571571

572572
if (!data.is_dict()) {
573573
ResolveJavascriptCallback(args[0], std::move(wallpaper));
@@ -585,11 +585,14 @@ void BraveNewTabMessageHandler::HandleGetWallpaperData(
585585
return;
586586
}
587587

588-
constexpr char kBrandedWallpaperKey[] = "brandedWallpaper";
588+
const std::string* creative_instance_id =
589+
data.FindStringKey(ntp_background_images::kCreativeInstanceIDKey);
589590
const std::string wallpaper_id = base::GenerateGUID();
591+
service->BrandedWallpaperWillBeDisplayed(wallpaper_id, creative_instance_id);
592+
593+
constexpr char kBrandedWallpaperKey[] = "brandedWallpaper";
590594
data.SetStringKey(ntp_background_images::kWallpaperIDKey, wallpaper_id);
591595
wallpaper.SetKey(kBrandedWallpaperKey, std::move(data));
592-
service->BrandedWallpaperWillBeDisplayed(wallpaper_id);
593596
ResolveJavascriptCallback(args[0], std::move(wallpaper));
594597
}
595598

components/brave_ads/browser/ads_service.h

+2-4
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,6 @@
1919
#include "components/sessions/core/session_id.h"
2020
#include "url/gurl.h"
2121

22-
namespace ads {
23-
struct AdsHistoryInfo;
24-
}
25-
2622
namespace base {
2723
class DictionaryValue;
2824
class ListValue;
@@ -141,6 +137,8 @@ class AdsService : public KeyedService {
141137
const std::string& creative_instance_id,
142138
const ads::mojom::InlineContentAdEventType event_type) = 0;
143139

140+
virtual absl::optional<std::string> GetPrefetchedNewTabPageAd() = 0;
141+
144142
virtual void PurgeOrphanedAdEventsForType(
145143
const ads::mojom::AdType ad_type) = 0;
146144

components/brave_ads/common/features.cc

+3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ const base::Feature kAllowedToFallbackToCustomAdNotifications{
2323
const base::Feature kRequestAdsEnabledApi{"RequestAdsEnabledApi",
2424
base::FEATURE_DISABLED_BY_DEFAULT};
2525

26+
const base::Feature kNewTabPageAdFrequencyCap{
27+
"NewTabPageAdFrequencyCap", base::FEATURE_DISABLED_BY_DEFAULT};
28+
2629
namespace {
2730

2831
// Set to true to support multiple displays or false to only support the primary

components/brave_ads/common/features.h

+2
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ bool IsAllowedToFallbackToCustomAdNotificationsEnabled();
4141
extern const base::Feature kRequestAdsEnabledApi;
4242
bool IsRequestAdsEnabledApiEnabled();
4343

44+
extern const base::Feature kNewTabPageAdFrequencyCap;
45+
4446
} // namespace features
4547
} // namespace brave_ads
4648

components/ntp_background_images/browser/DEPS

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
include_rules = [
2-
"+bat/ads/pref_names.h",
3-
"+bat/ads/public",
2+
"+bat/ads",
43
"+content/public/browser",
54
"+content/public/common",
65
"+third_party/skia",

components/ntp_background_images/browser/ntp_sponsored_images_data.cc

+100-2
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@
1111
#include "base/logging.h"
1212
#include "base/notreached.h"
1313
#include "base/strings/stringprintf.h"
14+
#include "bat/ads/new_tab_page_ad_info.h"
1415
#include "brave/components/ntp_background_images/browser/url_constants.h"
1516
#include "content/public/common/url_constants.h"
1617

1718
/* Sample photo.json.
1819
{
1920
"schemaVersion": 1,
21+
"campaignId": "fb7ee174-5430-4fb9-8e97-29bf14e8d828",
2022
"logo": {
2123
"imageUrl": "logo.png",
2224
"alt": "Visit Brave Software",
@@ -196,6 +198,10 @@ Campaign NTPSponsoredImagesData::GetCampaignFromValue(
196198

197199
Campaign campaign;
198200

201+
if (const std::string* campaign_id = value.FindStringKey(kCampaignIdKey)) {
202+
campaign.campaign_id = *campaign_id;
203+
}
204+
199205
Logo default_logo;
200206
if (auto* logo = value.FindDictKey(kLogoKey)) {
201207
default_logo = GetLogoFromValue(installed_dir, url_prefix, logo);
@@ -287,11 +293,11 @@ base::Value NTPSponsoredImagesData::GetBackgroundAt(size_t campaign_index,
287293
DCHECK(campaign_index < campaigns.size() && background_index >= 0 &&
288294
background_index < campaigns[campaign_index].backgrounds.size());
289295

290-
base::Value data(base::Value::Type::DICTIONARY);
291296
const auto campaign = campaigns[campaign_index];
292297
if (!campaign.IsValid())
293-
return data;
298+
return base::Value();
294299

300+
base::Value data(base::Value::Type::DICTIONARY);
295301
data.SetStringKey(kThemeNameKey, theme_name);
296302
data.SetBoolKey(kIsSponsoredKey, !IsSuperReferral());
297303
data.SetBoolKey(kIsBackgroundKey, false);
@@ -324,6 +330,45 @@ base::Value NTPSponsoredImagesData::GetBackgroundAt(size_t campaign_index,
324330
return data;
325331
}
326332

333+
base::Value NTPSponsoredImagesData::GetBackgroundByAdInfo(
334+
const ads::NewTabPageAdInfo& ad_info) {
335+
// Find campaign
336+
size_t campaign_index = 0;
337+
for (; campaign_index != campaigns.size(); ++campaign_index) {
338+
if (campaigns[campaign_index].campaign_id == ad_info.campaign_id) {
339+
break;
340+
}
341+
}
342+
if (campaign_index == campaigns.size()) {
343+
LOG(ERROR) << "Ad campaign wasn't found in NTP sposored images data: "
344+
<< ad_info.campaign_id;
345+
return base::Value();
346+
}
347+
348+
const auto& sponsored_backgrounds = campaigns[campaign_index].backgrounds;
349+
size_t background_index = 0;
350+
for (; background_index != sponsored_backgrounds.size(); ++background_index) {
351+
if (sponsored_backgrounds[background_index].creative_instance_id ==
352+
ad_info.creative_instance_id) {
353+
break;
354+
}
355+
}
356+
if (background_index == sponsored_backgrounds.size()) {
357+
LOG(ERROR) << "Creative instance wasn't found in NTP sposored images data: "
358+
<< ad_info.creative_instance_id;
359+
return base::Value();
360+
}
361+
362+
if (!AdInfoMatchesSponsoredImage(ad_info, campaign_index, background_index)) {
363+
LOG(WARNING) << "Served creative info does not fully match with sponsored "
364+
"image metadata. Campaign id: "
365+
<< ad_info.campaign_id
366+
<< ". Creative instance id: " << ad_info.creative_instance_id;
367+
}
368+
369+
return GetBackgroundAt(campaign_index, background_index);
370+
}
371+
327372
void NTPSponsoredImagesData::PrintCampaignsParsingResult() const {
328373
VLOG(2) << __func__ << ": This is "
329374
<< (IsSuperReferral() ? " NTP SR Data" : " NTP SI Data");
@@ -339,4 +384,57 @@ void NTPSponsoredImagesData::PrintCampaignsParsingResult() const {
339384
}
340385
}
341386

387+
bool NTPSponsoredImagesData::AdInfoMatchesSponsoredImage(
388+
const ads::NewTabPageAdInfo& ad_info,
389+
size_t campaign_index,
390+
size_t background_index) const {
391+
DCHECK(campaign_index < campaigns.size() && background_index >= 0 &&
392+
background_index < campaigns[campaign_index].backgrounds.size());
393+
394+
const Campaign& campaign = campaigns[campaign_index];
395+
if (!campaign.IsValid()) {
396+
return false;
397+
}
398+
const SponsoredBackground& background =
399+
campaign.backgrounds[background_index];
400+
401+
if (ad_info.campaign_id != campaign.campaign_id) {
402+
return false;
403+
}
404+
405+
if (ad_info.creative_instance_id != background.creative_instance_id) {
406+
return false;
407+
}
408+
409+
if (ad_info.target_url != background.logo.destination_url) {
410+
return false;
411+
}
412+
413+
if (base::FilePath::FromUTF8Unsafe(ad_info.image_url).BaseName() !=
414+
background.logo.image_file.BaseName()) {
415+
return false;
416+
}
417+
418+
if (ad_info.alt != background.logo.alt_text) {
419+
return false;
420+
}
421+
422+
if (ad_info.company_name != background.logo.company_name) {
423+
return false;
424+
}
425+
426+
const auto it = std::find_if(
427+
ad_info.wallpapers.begin(), ad_info.wallpapers.end(),
428+
[&background](const auto& wallpaper_info) {
429+
if (base::FilePath::FromUTF8Unsafe(wallpaper_info.image_url)
430+
.BaseName() != background.image_file.BaseName()) {
431+
return false;
432+
}
433+
return wallpaper_info.focal_point.x == background.focal_point.x() &&
434+
wallpaper_info.focal_point.y == background.focal_point.y();
435+
});
436+
437+
return it != ad_info.wallpapers.end();
438+
}
439+
342440
} // namespace ntp_background_images

components/ntp_background_images/browser/ntp_sponsored_images_data.h

+10
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616
#include "ui/gfx/geometry/point.h"
1717
#include "ui/gfx/geometry/rect.h"
1818

19+
namespace ads {
20+
struct NewTabPageAdInfo;
21+
} // namespace ads
22+
1923
namespace ntp_background_images {
2024

2125
struct TopSite {
@@ -78,6 +82,7 @@ struct Campaign {
7882

7983
bool IsValid() const;
8084

85+
std::string campaign_id;
8186
std::vector<SponsoredBackground> backgrounds;
8287
};
8388

@@ -103,10 +108,15 @@ struct NTPSponsoredImagesData {
103108
const base::FilePath& installed_dir);
104109

105110
base::Value GetBackgroundAt(size_t campaign_index, size_t background_index);
111+
base::Value GetBackgroundByAdInfo(const ads::NewTabPageAdInfo& ad_info);
106112

107113
bool IsSuperReferral() const;
108114
void PrintCampaignsParsingResult() const;
109115

116+
bool AdInfoMatchesSponsoredImage(const ads::NewTabPageAdInfo& ad_info,
117+
size_t campaign_index,
118+
size_t background_index) const;
119+
110120
std::string url_prefix;
111121

112122
std::vector<Campaign> campaigns;

0 commit comments

Comments
 (0)