Skip to content

Commit

Permalink
[ads] RichNTT: Desktop
Browse files Browse the repository at this point in the history
  • Loading branch information
tmancey committed Feb 1, 2025
1 parent 1b4eac6 commit 03bbd97
Show file tree
Hide file tree
Showing 88 changed files with 1,937 additions and 1,098 deletions.
24 changes: 24 additions & 0 deletions browser/ntp_background/ntp_p3a_helper_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,11 @@ constexpr int kCountBuckets[] = {0, 1, 2, 3, 8, 12, 16};
constexpr char kCreativeViewEventKey[] = "views";
constexpr char kCreativeClickEventKey[] = "clicks";
constexpr char kCreativeLandEventKey[] = "lands";
constexpr char kCreativeInteractionEventKey[] = "interaction";
constexpr char kCreativeMediaPlayEventKey[] = "media_play";
constexpr char kCreativeMedia25EventKey[] = "media_25";
constexpr char kCreativeMedia50EventKey[] = "media_50";
constexpr char kCreativeMedia75EventKey[] = "media_75";
constexpr char kCreativeMedia100EventKey[] = "media_100";

constexpr char kCampaignViewedEventKey[] = "viewed";
Expand Down Expand Up @@ -205,6 +208,11 @@ void NTPP3AHelperImpl::RecordNewTabPageAdEvent(
break;
}

case brave_ads::mojom::NewTabPageAdEventType::kInteraction: {
UpdateMetricCount(creative_instance_id, kCreativeInteractionEventKey);
break;
}

case brave_ads::mojom::NewTabPageAdEventType::kMediaPlay: {
UpdateMetricCount(creative_instance_id, kCreativeMediaPlayEventKey);
break;
Expand All @@ -215,6 +223,16 @@ void NTPP3AHelperImpl::RecordNewTabPageAdEvent(
break;
}

case brave_ads::mojom::NewTabPageAdEventType::kMedia50: {
UpdateMetricCount(creative_instance_id, kCreativeMedia50EventKey);
break;
}

case brave_ads::mojom::NewTabPageAdEventType::kMedia75: {
UpdateMetricCount(creative_instance_id, kCreativeMedia75EventKey);
break;
}

case brave_ads::mojom::NewTabPageAdEventType::kMedia100: {
UpdateMetricCount(creative_instance_id, kCreativeMedia100EventKey);
break;
Expand Down Expand Up @@ -369,10 +387,16 @@ void NTPP3AHelperImpl::CleanOldCampaignsAndCreatives() {
creative_instance_id, kCreativeViewEventKey));
p3a_service_->RemoveDynamicMetric(BuildCreativeHistogramName(
creative_instance_id, kCreativeLandEventKey));
p3a_service_->RemoveDynamicMetric(BuildCreativeHistogramName(
creative_instance_id, kCreativeInteractionEventKey));
p3a_service_->RemoveDynamicMetric(BuildCreativeHistogramName(
creative_instance_id, kCreativeMediaPlayEventKey));
p3a_service_->RemoveDynamicMetric(BuildCreativeHistogramName(
creative_instance_id, kCreativeMedia25EventKey));
p3a_service_->RemoveDynamicMetric(BuildCreativeHistogramName(
creative_instance_id, kCreativeMedia50EventKey));
p3a_service_->RemoveDynamicMetric(BuildCreativeHistogramName(
creative_instance_id, kCreativeMedia75EventKey));
p3a_service_->RemoveDynamicMetric(BuildCreativeHistogramName(
creative_instance_id, kCreativeMedia100EventKey));
it = creative_update->erase(it);
Expand Down
4 changes: 4 additions & 0 deletions 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 @@ -79,6 +80,9 @@ ViewCounterServiceFactory::BuildServiceInstanceForBrowserContext(
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
43 changes: 43 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,44 @@ 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* const wallpaper = args[0].GetIfDict();
if (!wallpaper) {
return;
}

const std::string* const placement_id =
wallpaper->FindStringByDottedPath(ntp_background_images::kWallpaperIDKey);
if (!placement_id) {
return;
}

const std::string* const creative_instance_id =
wallpaper->FindString(ntp_background_images::kCreativeInstanceIDKey);
if (!creative_instance_id) {
return;
}

const std::string* const ad_event_type = args[1].GetIfString();
if (!ad_event_type) {
return;
}

if (ntp_background_images::ViewCounterService* const service =
ViewCounterServiceFactory::GetForProfile(profile_)) {
service->MaybeTriggerSponsoredRichMediaAdEvent(
*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
9 changes: 9 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,11 @@ 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 + ";");
source->AddString("ntpSponsoredRichMediaUrl", kNTPSponsoredRichMediaUrl);
}

BraveNewTabUI::~BraveNewTabUI() = default;
Expand Down
10 changes: 7 additions & 3 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,9 +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/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 @@ -1062,10 +1060,16 @@ static_library("internal") {
"user_engagement/ad_events/new_tab_page_ads/new_tab_page_ad_event_handler.cc",
"user_engagement/ad_events/new_tab_page_ads/new_tab_page_ad_event_handler.h",
"user_engagement/ad_events/new_tab_page_ads/new_tab_page_ad_event_handler_delegate.h",
"user_engagement/ad_events/new_tab_page_ads/new_tab_page_ad_event_interaction.cc",
"user_engagement/ad_events/new_tab_page_ads/new_tab_page_ad_event_interaction.h",
"user_engagement/ad_events/new_tab_page_ads/new_tab_page_ad_event_media_100.cc",
"user_engagement/ad_events/new_tab_page_ads/new_tab_page_ad_event_media_100.h",
"user_engagement/ad_events/new_tab_page_ads/new_tab_page_ad_event_media_25.cc",
"user_engagement/ad_events/new_tab_page_ads/new_tab_page_ad_event_media_25.h",
"user_engagement/ad_events/new_tab_page_ads/new_tab_page_ad_event_media_50.cc",
"user_engagement/ad_events/new_tab_page_ads/new_tab_page_ad_event_media_50.h",
"user_engagement/ad_events/new_tab_page_ads/new_tab_page_ad_event_media_75.cc",
"user_engagement/ad_events/new_tab_page_ads/new_tab_page_ad_event_media_75.h",
"user_engagement/ad_events/new_tab_page_ads/new_tab_page_ad_event_media_play.cc",
"user_engagement/ad_events/new_tab_page_ads/new_tab_page_ad_event_media_play.h",
"user_engagement/ad_events/new_tab_page_ads/new_tab_page_ad_event_served.cc",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,11 @@ constexpr char kMarkAdAsInappropriateType[] = "flag";
constexpr char kLikedAdType[] = "upvote";
constexpr char kDislikedAdType[] = "downvote";
constexpr char kConversionType[] = "conversion";
constexpr char kInteractionType[] = "interaction";
constexpr char kMediaPlayType[] = "media_play";
constexpr char kMedia25Type[] = "media_25";
constexpr char kMedia50Type[] = "media_50";
constexpr char kMedia75Type[] = "media_75";
constexpr char kMedia100Type[] = "media_100";

constexpr auto kStringToMojomConfirmationTypeMap =
Expand All @@ -45,8 +48,11 @@ constexpr auto kStringToMojomConfirmationTypeMap =
{kLikedAdType, mojom::ConfirmationType::kLikedAd},
{kDislikedAdType, mojom::ConfirmationType::kDislikedAd},
{kConversionType, mojom::ConfirmationType::kConversion},
{kInteractionType, mojom::ConfirmationType::kInteraction},
{kMediaPlayType, mojom::ConfirmationType::kMediaPlay},
{kMedia25Type, mojom::ConfirmationType::kMedia25},
{kMedia50Type, mojom::ConfirmationType::kMedia50},
{kMedia75Type, mojom::ConfirmationType::kMedia75},
{kMedia100Type, mojom::ConfirmationType::kMedia100}});

constexpr auto kMojomConfirmationTypeToStringMap =
Expand All @@ -63,8 +69,11 @@ constexpr auto kMojomConfirmationTypeToStringMap =
{mojom::ConfirmationType::kLikedAd, kLikedAdType},
{mojom::ConfirmationType::kDislikedAd, kDislikedAdType},
{mojom::ConfirmationType::kConversion, kConversionType},
{mojom::ConfirmationType::kInteraction, kInteractionType},
{mojom::ConfirmationType::kMediaPlay, kMediaPlayType},
{mojom::ConfirmationType::kMedia25, kMedia25Type},
{mojom::ConfirmationType::kMedia50, kMedia50Type},
{mojom::ConfirmationType::kMedia75, kMedia75Type},
{mojom::ConfirmationType::kMedia100, kMedia100Type}});

} // namespace
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Included when redeeming an anonymous confirmation token:
| --- | --- | --- |
| creativeInstanceId | {"creativeInstanceId":"e4958d00-e35c-4134-a408-1fbcf274d5ae"} | An id that references the specific ad creative that the user engaged with. This will be the same for any user that engages with this ad. |
| transactionId | {"transactionId":"c14d370c-1178-4c73-8385-1cfa17200646"} | A unique id for the transaction, which is not linkable between confirmation token redemptions. |
| type | {"type":"view"} | Action or interaction that occurred within an advertisement, such as a user clicking the ad.<br><br>Supported types:<br><br>- view<br>- click<br>- landed<br>- conversion<br>- media_play[^1]<br>- media_25[^1]<br>- media_100[^1]<br>- upvote<br>- downvote<br>- flag<br>- bookmark &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |
| type | {"type":"view"} | Action or interaction that occurred within an advertisement, such as a user clicking the ad.<br><br>Supported types:<br><br>- view<br>- click<br>- landed<br>- conversion<br>- interaction[^1]<br>- media_play[^1]<br>- media_25[^1]<br>- media_50[^1]<br>- media_75[^1]<br>- media_100[^1]<br>- upvote<br>- downvote<br>- flag<br>- bookmark &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |
| confirmation token | {"blindedPaymentTokens": ["Ev5JE4/9TZI/5TqyN9JWfJ1To0HBwQw2rWeAPcdjX3Q="],<br> "publicKey": "RJ2i/o/pZkrH+i0aGEMY1G9FXtd7Q7gfRi3YdNRnDDk="} | See [security and privacy model for ad confirmations](https://github.com/brave/brave-browser/wiki/Security-and-privacy-model-for-ad-confirmations). |
| user data | {"buildChannel":"nightly",<br>"catalog":[{"id":"29e5c8bc0ba319069980bb390d8e8f9b58c05a20"}],<br>"conversion":[{"action":"view"}],<br>"createdAtTimestamp":"2020-11-18T12:00:00.000Z",<br>"httpResponseStatus":"500",<br>"platform":"windows",<br>"rotatingHash":"I6KM54gXOrWqRHyrD518LmhePLHpIk4KSgCKOl0e3sc=",<br>"segment":"sports",<br>"studies":[{"group":"GroupA","name":"BraveAds.FooStudy"},{"group":"GroupB","name":"BraveAds.BarStudy"}],<br>"versionNumber":"1.2.3.4"} | See [user data](../../user_data/README.md#brave-rewards-users). |

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,11 @@ std::unique_ptr<DepositInterface> DepositsFactory::Build(
case mojom::ConfirmationType::kLikedAd:
case mojom::ConfirmationType::kDislikedAd:
case mojom::ConfirmationType::kConversion:
case mojom::ConfirmationType::kInteraction:
case mojom::ConfirmationType::kMediaPlay:
case mojom::ConfirmationType::kMedia25:
case mojom::ConfirmationType::kMedia50:
case mojom::ConfirmationType::kMedia75:
case mojom::ConfirmationType::kMedia100: {
// Non-rewardable.
return std::make_unique<NonCashDeposit>();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
/* 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 char kServedImpressionType[] = "served";
constexpr char kViewedImpressionType[] = "view";
constexpr char kClickedType[] = "click";
constexpr char kInteractionType[] = "interaction";
constexpr char kMediaPlayType[] = "media_play";
constexpr char kMedia25Type[] = "media_25";
constexpr char kMedia50Type[] = "media_50";
constexpr char kMedia75Type[] = "media_75";
constexpr char kMedia100Type[] = "media_100";

constexpr auto kNewTabPageAdEventTypeMap =
base::MakeFixedFlatMap<std::string, mojom::NewTabPageAdEventType>({
{kServedImpressionType,
mojom::NewTabPageAdEventType::kServedImpression},
{kViewedImpressionType,
mojom::NewTabPageAdEventType::kViewedImpression},
{kClickedType, mojom::NewTabPageAdEventType::kClicked},
{kInteractionType, mojom::NewTabPageAdEventType::kInteraction},
{kMediaPlayType, mojom::NewTabPageAdEventType::kMediaPlay},
{kMedia25Type, mojom::NewTabPageAdEventType::kMedia25},
{kMedia50Type, mojom::NewTabPageAdEventType::kMedia50},
{kMedia75Type, mojom::NewTabPageAdEventType::kMedia75},
{kMedia100Type, 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;
}

std::string FromMojomNewTabPageAdEventType(
const brave_ads::mojom::NewTabPageAdEventType& event_type) {
switch (event_type) {
case brave_ads::mojom::NewTabPageAdEventType::kServedImpression:
return kServedImpressionType;
case brave_ads::mojom::NewTabPageAdEventType::kViewedImpression:
return kViewedImpressionType;
case brave_ads::mojom::NewTabPageAdEventType::kClicked:
return kClickedType;
case brave_ads::mojom::NewTabPageAdEventType::kInteraction:
return kInteractionType;
case brave_ads::mojom::NewTabPageAdEventType::kMediaPlay:
return kMediaPlayType;
case brave_ads::mojom::NewTabPageAdEventType::kMedia25:
return kMedia25Type;
case brave_ads::mojom::NewTabPageAdEventType::kMedia50:
return kMedia50Type;
case brave_ads::mojom::NewTabPageAdEventType::kMedia75:
return kMedia75Type;
case brave_ads::mojom::NewTabPageAdEventType::kMedia100:
return kMedia100Type;
}
}

} // namespace brave_ads
Loading

0 comments on commit 03bbd97

Please sign in to comment.