Skip to content

Commit

Permalink
[ads] RichNTT: Desktop
Browse files Browse the repository at this point in the history
  • Loading branch information
tmancey committed Jan 27, 2025
1 parent 90db237 commit 57011f8
Show file tree
Hide file tree
Showing 129 changed files with 1,989 additions and 1,973 deletions.
7 changes: 6 additions & 1 deletion browser/ntp_background/view_counter_service_factory.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "brave/components/ntp_background_images/browser/ntp_background_images_service.h"
#include "brave/components/ntp_background_images/browser/ntp_background_images_source.h"
#include "brave/components/ntp_background_images/browser/ntp_sponsored_images_source.h"
#include "brave/components/ntp_background_images/browser/ntp_sponsored_rich_media_source.h"
#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"
Expand Down Expand Up @@ -71,14 +72,18 @@ ViewCounterServiceFactory::BuildServiceInstanceForBrowserContext(
g_brave_browser_process->ntp_background_images_service()) {
Profile* profile = Profile::FromBrowserContext(browser_context);
bool is_supported_locale = false;
auto* ads_service = brave_ads::AdsServiceFactory::GetForProfile(profile);
brave_ads::AdsService* ads_service =
brave_ads::AdsServiceFactory::GetForProfile(profile);
if (ads_service) {
is_supported_locale = brave_ads::IsSupportedRegion();
}
content::URLDataSource::Add(
browser_context, std::make_unique<NTPBackgroundImagesSource>(service));
content::URLDataSource::Add(
browser_context, std::make_unique<NTPSponsoredImagesSource>(service));
content::URLDataSource::Add(
browser_context,
std::make_unique<NTPSponsoredRichMediaSource>(service));

std::unique_ptr<NTPP3AHelperImpl> ntp_p3a_helper;
if (g_brave_browser_process->p3a_service() != nullptr) {
Expand Down
33 changes: 33 additions & 0 deletions browser/ui/webui/new_tab_page/brave_new_tab_message_handler.cc
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,11 @@ void BraveNewTabMessageHandler::RegisterMessages() {
base::BindRepeating(
&BraveNewTabMessageHandler::HandleBrandedWallpaperLogoClicked,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
"triggerSponsoredRichMediaAdEvent",
base::BindRepeating(
&BraveNewTabMessageHandler::HandleTriggerSponsoredRichMediaAdEvent,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
"getWallpaperData",
base::BindRepeating(&BraveNewTabMessageHandler::HandleGetWallpaperData,
Expand Down Expand Up @@ -475,6 +480,34 @@ void BraveNewTabMessageHandler::HandleBrandedWallpaperLogoClicked(
}
}

void BraveNewTabMessageHandler::HandleTriggerSponsoredRichMediaAdEvent(
const base::Value::List& args) {
AllowJavascript();
if (args.size() != 2) {
LOG(ERROR) << "Invalid input";
return;
}

const base::Value::Dict* wallpaper = args[0].GetIfDict();
if (!wallpaper) {
return;
}
const std::string* placement_id =
wallpaper->FindStringByDottedPath(ntp_background_images::kWallpaperIDKey);
const std::string* creative_instance_id =
wallpaper->FindString(ntp_background_images::kCreativeInstanceIDKey);
const std::string* ad_event_type = args[1].GetIfString();
if (!placement_id || !creative_instance_id || !ad_event_type) {
return;
}

if (ntp_background_images::ViewCounterService* service =
ViewCounterServiceFactory::GetForProfile(profile_)) {
service->TriggerSponsoredRichMediaAdEvent(
*placement_id, *creative_instance_id, *ad_event_type);
}
}

void BraveNewTabMessageHandler::HandleGetWallpaperData(
const base::Value::List& args) {
AllowJavascript();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ class BraveNewTabMessageHandler : public content::WebUIMessageHandler,
void HandleSaveNewTabPagePref(const base::Value::List& args);
void HandleRegisterNewTabPageView(const base::Value::List& args);
void HandleBrandedWallpaperLogoClicked(const base::Value::List& args);
void HandleTriggerSponsoredRichMediaAdEvent(const base::Value::List& args);
void HandleGetWallpaperData(const base::Value::List& args);
void HandleCustomizeClicked(const base::Value::List& args);

Expand Down
8 changes: 8 additions & 0 deletions browser/ui/webui/new_tab_page/brave_new_tab_ui.cc
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include "brave/components/brave_new_tab/resources/grit/brave_new_tab_generated_map.h"
#include "brave/components/brave_news/browser/brave_news_controller.h"
#include "brave/components/brave_news/common/features.h"
#include "brave/components/constants/webui_url_constants.h"
#include "brave/components/l10n/common/localization_util.h"
#include "brave/components/misc_metrics/new_tab_metrics.h"
#include "brave/components/ntp_background_images/browser/ntp_custom_images_source.h"
Expand All @@ -36,6 +37,7 @@
#include "content/public/browser/url_data_source.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui_data_source.h"
#include "content/public/common/url_constants.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "ui/webui/resources/cr_components/searchbox/searchbox.mojom.h"

Expand Down Expand Up @@ -76,6 +78,8 @@ BraveNewTabUI::BraveNewTabUI(content::WebUI* web_ui, const std::string& name)
content::WebUIDataSource* source = CreateAndAddWebUIDataSource(
web_ui, name, kBraveNewTabGenerated, IDR_BRAVE_NEW_TAB_HTML);

web_ui->AddRequestableScheme(content::kChromeUIUntrustedScheme);

AddBackgroundColorToSource(source, web_contents);

// Lottie animations tick on a worker thread and requires the document CSP to
Expand Down Expand Up @@ -127,6 +131,10 @@ BraveNewTabUI::BraveNewTabUI(content::WebUI* web_ui, const std::string& name)
std::make_unique<NTPCustomImagesSource>(
ntp_custom_background_images_service));
}

source->OverrideContentSecurityPolicy(
network::mojom::CSPDirectiveName::FrameSrc,
std::string("frame-src ") + kNTPSponsoredRichMediaUrl + ";");
}

BraveNewTabUI::~BraveNewTabUI() = default;
Expand Down
11 changes: 11 additions & 0 deletions components/brave_ads/browser/ads_service_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1283,6 +1283,17 @@ void AdsServiceImpl::OnFailedToPrefetchNewTabPageAd(
/*intentional*/ base::DoNothing());
}

void AdsServiceImpl::ParseAndSaveCreativeNewTabPageAds(
const std::string& json,
ParseAndSaveCreativeNewTabPageAdsCallback callback) {
if (!bat_ads_associated_remote_.is_bound()) {
return std::move(callback).Run(/*success*/ false);
}

bat_ads_associated_remote_->ParseAndSaveCreativeNewTabPageAds(
json, std::move(callback));
}

void AdsServiceImpl::TriggerNewTabPageAdEvent(
const std::string& placement_id,
const std::string& creative_instance_id,
Expand Down
3 changes: 3 additions & 0 deletions components/brave_ads/browser/ads_service_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,9 @@ class AdsServiceImpl final : public AdsService,
void OnFailedToPrefetchNewTabPageAd(
const std::string& placement_id,
const std::string& creative_instance_id) override;
void ParseAndSaveCreativeNewTabPageAds(
const std::string& json,
ParseAndSaveCreativeNewTabPageAdsCallback callback) override;
void TriggerNewTabPageAdEvent(
const std::string& placement_id,
const std::string& creative_instance_id,
Expand Down
3 changes: 3 additions & 0 deletions components/brave_ads/browser/ads_service_mock.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@ class AdsServiceMock : public AdsService {
MOCK_METHOD(void,
OnFailedToPrefetchNewTabPageAd,
(const std::string&, const std::string&));
MOCK_METHOD(void,
ParseAndSaveCreativeNewTabPageAds,
(const std::string&, ParseAndSaveCreativeNewTabPageAdsCallback));

MOCK_METHOD(void,
TriggerPromotedContentAdEvent,
Expand Down
6 changes: 6 additions & 0 deletions components/brave_ads/core/browser/service/ads_service.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,12 @@ class AdsService : public KeyedService {
const std::string& placement_id,
const std::string& creative_instance_id) = 0;

// 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 std::string& json,
ParseAndSaveCreativeNewTabPageAdsCallback callback) = 0;

// Called when a user views or interacts with a new tab page ad to trigger a
// `mojom_ad_event_type` event for the specified `placement_id` and
// `creative_instance_id`. `placement_id` should be a 128-bit random GUID in
Expand Down
22 changes: 3 additions & 19 deletions components/brave_ads/core/internal/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,7 @@ static_library("internal") {
"ad_units/inline_content_ad/inline_content_ad_handler.h",
"ad_units/inline_content_ad/inline_content_ad_info.cc",
"ad_units/inline_content_ad/inline_content_ad_value_util.cc",
"ad_units/new_tab_page_ad/new_tab_page_ad_event_type_util.cc",
"ad_units/new_tab_page_ad/new_tab_page_ad_feature.cc",
"ad_units/new_tab_page_ad/new_tab_page_ad_feature.h",
"ad_units/new_tab_page_ad/new_tab_page_ad_handler.cc",
Expand Down Expand Up @@ -335,12 +336,6 @@ static_library("internal") {
"catalog/campaign/creative_set/creative/inline_content_ad/catalog_creative_inline_content_ad_info.h",
"catalog/campaign/creative_set/creative/inline_content_ad/catalog_inline_content_ad_payload_info.cc",
"catalog/campaign/creative_set/creative/inline_content_ad/catalog_inline_content_ad_payload_info.h",
"catalog/campaign/creative_set/creative/new_tab_page_ad/catalog_creative_new_tab_page_ad_info.h",
"catalog/campaign/creative_set/creative/new_tab_page_ad/catalog_new_tab_page_ad_payload_info.cc",
"catalog/campaign/creative_set/creative/new_tab_page_ad/catalog_new_tab_page_ad_payload_info.h",
"catalog/campaign/creative_set/creative/new_tab_page_ad/catalog_new_tab_page_ad_wallpaper_focal_point_info.h",
"catalog/campaign/creative_set/creative/new_tab_page_ad/catalog_new_tab_page_ad_wallpaper_info.cc",
"catalog/campaign/creative_set/creative/new_tab_page_ad/catalog_new_tab_page_ad_wallpaper_info.h",
"catalog/campaign/creative_set/creative/notification_ad/catalog_creative_notification_ad_info.h",
"catalog/campaign/creative_set/creative/notification_ad/catalog_notification_ad_payload_info.h",
"catalog/campaign/creative_set/creative/promoted_content_ad/catalog_creative_promoted_content_ad_info.h",
Expand Down Expand Up @@ -524,21 +519,17 @@ static_library("internal") {
"creatives/creative_ad_util.h",
"creatives/creative_ads_database_table.cc",
"creatives/creative_ads_database_table.h",
"creatives/creative_ads_database_util.cc",
"creatives/creative_ads_database_util.h",
"creatives/creative_ads_database_table_util.cc",
"creatives/creative_ads_database_table_util.h",
"creatives/creative_daypart_info.h",
"creatives/creatives_builder.cc",
"creatives/creatives_builder.h",
"creatives/creatives_info.cc",
"creatives/creatives_info.h",
"creatives/dayparts_database_table.cc",
"creatives/dayparts_database_table.h",
"creatives/dayparts_database_util.cc",
"creatives/dayparts_database_util.h",
"creatives/geo_targets_database_table.cc",
"creatives/geo_targets_database_table.h",
"creatives/geo_targets_database_util.cc",
"creatives/geo_targets_database_util.h",
"creatives/inline_content_ads/creative_inline_content_ad_info.cc",
"creatives/inline_content_ads/creative_inline_content_ad_info.h",
"creatives/inline_content_ads/creative_inline_content_ads_database_table.cc",
Expand All @@ -549,11 +540,6 @@ 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_focal_point_info.h",
"creatives/new_tab_page_ads/creative_new_tab_page_ad_wallpaper_info.cc",
"creatives/new_tab_page_ads/creative_new_tab_page_ad_wallpaper_info.h",
"creatives/new_tab_page_ads/creative_new_tab_page_ad_wallpapers_database_table.cc",
"creatives/new_tab_page_ads/creative_new_tab_page_ad_wallpapers_database_table.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 All @@ -580,8 +566,6 @@ static_library("internal") {
"creatives/promoted_content_ads/promoted_content_ad_builder.h",
"creatives/segments_database_table.cc",
"creatives/segments_database_table.h",
"creatives/segments_database_util.cc",
"creatives/segments_database_util.h",
"database/database.cc",
"database/database.h",
"database/database_maintenance.cc",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/* Copyright (c) 2025 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at https://mozilla.org/MPL/2.0/. */

#include "brave/components/brave_ads/core/public/ad_units/new_tab_page_ad/new_tab_page_ad_event_type_util.h"

#include "base/containers/fixed_flat_map.h"
#include "brave/components/brave_ads/core/mojom/brave_ads.mojom.h"

namespace brave_ads {

namespace {

constexpr auto kNewTabPageAdEventTypeMap =
base::MakeFixedFlatMap<std::string, mojom::NewTabPageAdEventType>({
{"served", mojom::NewTabPageAdEventType::kServedImpression},
{"view", mojom::NewTabPageAdEventType::kViewedImpression},
{"click", mojom::NewTabPageAdEventType::kClicked},
{"media_play", mojom::NewTabPageAdEventType::kMediaPlay},
{"media_25", mojom::NewTabPageAdEventType::kMedia25},
{"media_100", brave_ads::mojom::NewTabPageAdEventType::kMedia100},
});

} // namespace

std::optional<brave_ads::mojom::NewTabPageAdEventType>
ToMojomNewTabPageAdEventType(const std::string& event_type) {
const auto iter = kNewTabPageAdEventTypeMap.find(event_type);
if (iter == kNewTabPageAdEventTypeMap.cend()) {
return std::nullopt;
}

return iter->second;
}

} // namespace brave_ads
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/* Copyright (c) 2025 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at https://mozilla.org/MPL/2.0/. */

#include "brave/components/brave_ads/core/public/ad_units/new_tab_page_ad/new_tab_page_ad_event_type_util.h"

#include "brave/components/brave_ads/core/mojom/brave_ads.mojom.h"
#include "testing/gtest/include/gtest/gtest.h"

// npm run test -- brave_unit_tests --filter=BraveAds*

namespace brave_ads {

TEST(BraveAdsNewTabPageAdEventTypeUtilTest, ToMojomNewTabPageAdEventType) {
// Act & Assert
EXPECT_EQ(ToMojomNewTabPageAdEventType("served"),
mojom::NewTabPageAdEventType::kServedImpression);

EXPECT_EQ(ToMojomNewTabPageAdEventType("view"),
mojom::NewTabPageAdEventType::kViewedImpression);

EXPECT_EQ(ToMojomNewTabPageAdEventType("click"),
mojom::NewTabPageAdEventType::kClicked);

EXPECT_EQ(ToMojomNewTabPageAdEventType("media_play"),
mojom::NewTabPageAdEventType::kMediaPlay);

EXPECT_EQ(ToMojomNewTabPageAdEventType("media_25"),
mojom::NewTabPageAdEventType::kMedia25);

EXPECT_EQ(ToMojomNewTabPageAdEventType("media_100"),
mojom::NewTabPageAdEventType::kMedia100);

EXPECT_EQ(ToMojomNewTabPageAdEventType(""), std::nullopt);

EXPECT_EQ(ToMojomNewTabPageAdEventType("foobar"), std::nullopt);
}

} // namespace brave_ads
Original file line number Diff line number Diff line change
Expand Up @@ -160,14 +160,8 @@ void NewTabPageAdHandler::OnDidServeNewTabPageAd(const NewTabPageAdInfo& ad) {
<< " advertiserId: " << ad.advertiser_id << "\n"
<< " segment: " << ad.segment << "\n"
<< " companyName: " << ad.company_name << "\n"
<< " imageUrl: " << ad.image_url << "\n"
<< " alt: " << ad.alt << "\n"
<< " targetUrl: " << ad.target_url << "\n"
<< " wallpaper:\n"
<< " imageUrl: " << ad.wallpapers[0].image_url << "\n"
<< " focalPoint:\n"
<< " x: " << ad.wallpapers[0].focal_point.x << "\n"
<< " y: " << ad.wallpapers[0].focal_point.y);
<< " targetUrl: " << ad.target_url);
}

void NewTabPageAdHandler::OnDidFireNewTabPageAdServedEvent(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,7 @@ NewTabPageAdInfo& NewTabPageAdInfo::operator=(
NewTabPageAdInfo::~NewTabPageAdInfo() = default;

bool NewTabPageAdInfo::IsValid() const {
return AdInfo::IsValid() && !company_name.empty() && image_url.is_valid() &&
!alt.empty() && !wallpapers.empty();
return AdInfo::IsValid() && !company_name.empty() && !alt.empty();
}

} // namespace brave_ads
Loading

0 comments on commit 57011f8

Please sign in to comment.