Skip to content

Commit

Permalink
[ads] Handle search result ad right click
Browse files Browse the repository at this point in the history
  • Loading branch information
aseren committed Oct 17, 2024
1 parent 2aed6e7 commit 6df501c
Show file tree
Hide file tree
Showing 31 changed files with 864 additions and 453 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@

#include "brave/browser/brave_ads/creatives/search_result_ad/creative_search_result_ad_tab_helper.h"

#include <string>
#include <utility>

#include "base/check.h"
#include "base/check_is_test.h"
#include "base/functional/bind.h"
Expand All @@ -13,6 +16,8 @@
#include "brave/browser/brave_ads/ads_service_factory.h"
#include "brave/components/brave_ads/browser/ads_service.h"
#include "brave/components/brave_ads/content/browser/creatives/search_result_ad/creative_search_result_ad_handler.h"
#include "brave/components/brave_ads/content/browser/creatives/search_result_ad/creative_search_result_ad_url_placement_id_extractor.h"
#include "brave/components/brave_ads/core/mojom/brave_ads.mojom.h"
#include "brave/components/brave_ads/core/public/ads_feature.h"
#include "brave/components/brave_rewards/common/pref_names.h"
#include "brave/components/brave_search/common/brave_search_utils.h"
Expand Down Expand Up @@ -98,13 +103,6 @@ bool CreativeSearchResultAdTabHelper::ShouldHandleCreativeAdEvents() const {
return profile->GetPrefs()->GetBoolean(brave_rewards::prefs::kEnabled);
}

void CreativeSearchResultAdTabHelper::MaybeTriggerCreativeAdClickedEvent(
const GURL& url) {
if (creative_search_result_ad_handler_) {
creative_search_result_ad_handler_->MaybeTriggerCreativeAdClickedEvent(url);
}
}

///////////////////////////////////////////////////////////////////////////////

AdsService* CreativeSearchResultAdTabHelper::GetAdsService() const {
Expand Down Expand Up @@ -157,14 +155,16 @@ void CreativeSearchResultAdTabHelper::
}

void CreativeSearchResultAdTabHelper::MaybeHandleCreativeAdViewedEvents(
const std::vector<std::string> placement_ids) {
for (const auto& placement_id : placement_ids) {
MaybeHandleCreativeAdViewedEvent(placement_id);
std::vector<mojom::CreativeSearchResultAdInfoPtr>
creative_search_result_ads) {
for (auto& creative_search_result_ad : creative_search_result_ads) {
MaybeHandleCreativeAdViewedEvent(std::move(creative_search_result_ad));
}
}

void CreativeSearchResultAdTabHelper::MaybeHandleCreativeAdViewedEvent(
const std::string& placement_id) {
mojom::CreativeSearchResultAdInfoPtr creative_search_result_ad) {
const std::string& placement_id = creative_search_result_ad->placement_id;
CHECK(!placement_id.empty());

// It is safe to pass `placement_id` directly to the JavaScript function as it
Expand All @@ -176,12 +176,13 @@ void CreativeSearchResultAdTabHelper::MaybeHandleCreativeAdViewedEvent(
base::UTF8ToUTF16(javascript),
base::BindOnce(&CreativeSearchResultAdTabHelper::
MaybeHandleCreativeAdViewedEventCallback,
weak_factory_.GetWeakPtr(), placement_id),
weak_factory_.GetWeakPtr(),
std::move(creative_search_result_ad)),
ISOLATED_WORLD_ID_BRAVE_INTERNAL);
}

void CreativeSearchResultAdTabHelper::MaybeHandleCreativeAdViewedEventCallback(
const std::string& placement_id,
mojom::CreativeSearchResultAdInfoPtr creative_search_result_ad,
const base::Value value) {
const bool is_visible = value.is_bool() && value.GetBool();
if (!is_visible) {
Expand All @@ -191,53 +192,58 @@ void CreativeSearchResultAdTabHelper::MaybeHandleCreativeAdViewedEventCallback(

if (creative_search_result_ad_handler_) {
creative_search_result_ad_handler_->MaybeTriggerCreativeAdViewedEvent(
placement_id);
std::move(creative_search_result_ad));
}
}

void CreativeSearchResultAdTabHelper::MaybeHandleCreativeAdClickedEvent(
content::NavigationHandle* const navigation_handle) {
CHECK(navigation_handle);

if (!ShouldHandleCreativeAdEvents()) {
const GURL& url) {
AdsService* ads_service = GetAdsService();
if (!ads_service) {
return;
}

const auto& initiator_origin = navigation_handle->GetInitiatorOrigin();
if (!navigation_handle->IsInPrimaryMainFrame() ||
!ui::PageTransitionCoreTypeIs(navigation_handle->GetPageTransition(),
ui::PAGE_TRANSITION_LINK) ||
!initiator_origin ||
!brave_search::IsAllowedHost(initiator_origin->GetURL())) {
if (!ShouldHandleCreativeAdEvents()) {
return;
}

content::WebContents* web_contents = navigation_handle->GetWebContents();
if (!web_contents) {
const std::optional<std::string> placement_id =
MaybeExtractCreativeAdPlacementIdFromUrl(url);
if (!placement_id || placement_id->empty()) {
// The URL does not contain a placement id.
return;
}

if (content::WebContents* original_opener_web_contents =
web_contents->GetFirstWebContentsInLiveOriginalOpenerChain()) {
web_contents = original_opener_web_contents;
}
ads_service->MaybeGetSearchResultAd(
*placement_id,
base::BindOnce(&CreativeSearchResultAdTabHelper::
MaybeHandleCreativeAdClickedEventCallback,
weak_factory_.GetWeakPtr()));
}

CreativeSearchResultAdTabHelper* const creative_search_result_ad_tab_helper =
CreativeSearchResultAdTabHelper::FromWebContents(web_contents);
if (!creative_search_result_ad_tab_helper) {
void CreativeSearchResultAdTabHelper::MaybeHandleCreativeAdClickedEventCallback(
mojom::CreativeSearchResultAdInfoPtr creative_search_result_ad) {
if (!creative_search_result_ad) {
return;
}

CHECK(!navigation_handle->GetRedirectChain().empty());
const GURL url = navigation_handle->GetRedirectChain().back();
AdsService* ads_service = GetAdsService();
if (!ads_service) {
return;
}

creative_search_result_ad_tab_helper->MaybeTriggerCreativeAdClickedEvent(url);
ads_service->TriggerSearchResultAdEvent(
std::move(creative_search_result_ad),
mojom::SearchResultAdEventType::kClicked, base::DoNothing());
}

void CreativeSearchResultAdTabHelper::DidStartNavigation(
content::NavigationHandle* navigation_handle) {
if (navigation_handle->IsInPrimaryMainFrame()) {
MaybeHandleCreativeAdClickedEvent(navigation_handle);
CHECK(!navigation_handle->GetRedirectChain().empty());
const GURL url = navigation_handle->GetRedirectChain().back();

MaybeHandleCreativeAdClickedEvent(url);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
#define BRAVE_BROWSER_BRAVE_ADS_CREATIVES_SEARCH_RESULT_AD_CREATIVE_SEARCH_RESULT_AD_TAB_HELPER_H_

#include <memory>
#include <string>
#include <vector>

#include "base/memory/weak_ptr.h"
#include "brave/components/brave_ads/core/mojom/brave_ads.mojom-forward.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_user_data.h"

Expand Down Expand Up @@ -39,8 +39,6 @@ class CreativeSearchResultAdTabHelper

bool ShouldHandleCreativeAdEvents() const;

void MaybeTriggerCreativeAdClickedEvent(const GURL& url);

private:
friend class content::WebContentsUserData<CreativeSearchResultAdTabHelper>;

Expand All @@ -52,13 +50,17 @@ class CreativeSearchResultAdTabHelper
void MaybeExtractCreativeAdPlacementIdsFromWebPageAndHandleViewedEvents();

void MaybeHandleCreativeAdViewedEvents(
std::vector<std::string> placement_ids);
void MaybeHandleCreativeAdViewedEvent(const std::string& placement_id);
void MaybeHandleCreativeAdViewedEventCallback(const std::string& placement_id,
const base::Value value);

void MaybeHandleCreativeAdClickedEvent(
content::NavigationHandle* navigation_handle);
std::vector<mojom::CreativeSearchResultAdInfoPtr>
creative_search_result_ads);
void MaybeHandleCreativeAdViewedEvent(
mojom::CreativeSearchResultAdInfoPtr creative_search_result_ad);
void MaybeHandleCreativeAdViewedEventCallback(
mojom::CreativeSearchResultAdInfoPtr creative_search_result_ad,
const base::Value value);

void MaybeHandleCreativeAdClickedEvent(const GURL& url);
void MaybeHandleCreativeAdClickedEventCallback(
mojom::CreativeSearchResultAdInfoPtr creative_search_result_ad);

// content::WebContentsObserver:
void DidStartNavigation(
Expand Down
Loading

0 comments on commit 6df501c

Please sign in to comment.