Skip to content

Commit

Permalink
Merge pull request #25786 from brave/issues/40785
Browse files Browse the repository at this point in the history
[ads] Add search result ad right button click handling
  • Loading branch information
aseren authored Oct 20, 2024
2 parents ec3c91e + 2f4d949 commit bbb6ebb
Show file tree
Hide file tree
Showing 31 changed files with 853 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 bbb6ebb

Please sign in to comment.