From 8f09e19d0326cd2d6c259ce6a72b142c0a5dedb9 Mon Sep 17 00:00:00 2001 From: Aleksey Seren Date: Mon, 10 Oct 2022 17:17:39 -0500 Subject: [PATCH] Decouple subdivision targeting codes from Rewards. fix https://github.com/brave/brave-browser/issues/25249 --- browser/extensions/DEPS | 3 + browser/extensions/api/brave_rewards_api.cc | 23 ++-- .../brave_rewards_page/brave_rewards_page.ts | 86 ++------------ browser/ui/webui/DEPS | 1 + browser/ui/webui/brave_rewards_page_ui.cc | 25 ++-- common/extensions/api/brave_rewards.json | 17 ++- .../resources/page/components/adsBox.tsx | 37 +++++- .../resources/page/reducers/default_state.ts | 1 + .../page/reducers/rewards_reducer.ts | 1 + .../resources/page/stories/redux_state.ts | 1 + .../resources/shared/lib/ads_subdivisions.ts | 111 ------------------ components/definitions/rewards.d.ts | 6 + .../page/reducers/rewards_reducer_test.ts | 3 + vendor/bat-native-ads/BUILD.gn | 3 + .../include/bat/ads/supported_subdivisions.h | 22 ++++ .../base/locale/subdivision_code_util.cc | 10 ++ .../base/locale/subdivision_code_util.h | 3 + .../locale/subdivision_code_util_unittest.cc | 12 ++ .../internal/geographic/subdivision/README.md | 13 ++ .../subdivision/subdivision_targeting.cc | 20 ++-- .../subdivision/subdivision_targeting.h | 1 - .../supported_subdivision_codes.cc | 71 +++++++++++ .../subdivision/supported_subdivision_codes.h | 81 ++----------- .../src/bat/ads/supported_subdivisions.cc | 26 ++++ 24 files changed, 276 insertions(+), 301 deletions(-) create mode 100644 browser/extensions/DEPS delete mode 100644 components/brave_rewards/resources/shared/lib/ads_subdivisions.ts create mode 100644 vendor/bat-native-ads/include/bat/ads/supported_subdivisions.h create mode 100644 vendor/bat-native-ads/src/bat/ads/internal/geographic/subdivision/supported_subdivision_codes.cc create mode 100644 vendor/bat-native-ads/src/bat/ads/supported_subdivisions.cc diff --git a/browser/extensions/DEPS b/browser/extensions/DEPS new file mode 100644 index 00000000000..0c239f5751b --- /dev/null +++ b/browser/extensions/DEPS @@ -0,0 +1,3 @@ +include_rules = [ + "+bat/ads", +] diff --git a/browser/extensions/api/brave_rewards_api.cc b/browser/extensions/api/brave_rewards_api.cc index f7e88f62351..4bd390f9803 100644 --- a/browser/extensions/api/brave_rewards_api.cc +++ b/browser/extensions/api/brave_rewards_api.cc @@ -12,6 +12,7 @@ #include "base/bind.h" #include "base/strings/string_number_conversions.h" +#include "bat/ads/supported_subdivisions.h" #include "brave/browser/brave_ads/ads_service_factory.h" #include "brave/browser/brave_rewards/rewards_panel/rewards_panel_coordinator.h" #include "brave/browser/brave_rewards/rewards_service_factory.h" @@ -51,12 +52,6 @@ using brave_rewards::RewardsTabHelper; namespace { -const char kShouldAllowAdsSubdivisionTargeting[] = - "shouldAllowAdsSubdivisionTargeting"; -const char kAdsSubdivisionTargeting[] = "adsSubdivisionTargeting"; -const char kAutoDetectedAdsSubdivisionTargeting[] = - "automaticallyDetectedAdsSubdivisionTargeting"; - RewardsTabHelper* GetRewardsTabHelperForTabId( int tab_id, content::BrowserContext* browser_context) { @@ -1263,15 +1258,23 @@ ExtensionFunction::ResponseAction BraveRewardsGetAdsDataFunction::Run() { ads_data.Set( "adsPerHour", static_cast(ads_service->GetMaximumNotificationAdsPerHour())); - ads_data.Set(kAdsSubdivisionTargeting, + ads_data.Set("adsSubdivisionTargeting", ads_service->GetSubdivisionTargetingCode()); - ads_data.Set(kAutoDetectedAdsSubdivisionTargeting, + ads_data.Set("automaticallyDetectedAdsSubdivisionTargeting", ads_service->GetAutoDetectedSubdivisionTargetingCode()); - ads_data.Set(kShouldAllowAdsSubdivisionTargeting, + ads_data.Set("shouldAllowAdsSubdivisionTargeting", ads_service->ShouldAllowSubdivisionTargeting()); ads_data.Set("adsUIEnabled", true); - ads_data.Set("countryCode", brave_l10n::GetDefaultISOCountryCodeString()); + base::Value::List subdivisions; + const auto subdivision_infos = ads::GetSupportedSubdivisions(); + for (const auto& info : subdivision_infos) { + base::Value::Dict subdivision; + subdivision.Set("value", info.first); + subdivision.Set("name", info.second); + subdivisions.Append(std::move(subdivision)); + } + ads_data.Set("subdivisions", std::move(subdivisions)); return RespondNow(OneArgument(base::Value(std::move(ads_data)))); } diff --git a/browser/resources/settings/brave_rewards_page/brave_rewards_page.ts b/browser/resources/settings/brave_rewards_page/brave_rewards_page.ts index eb087aa7aca..aa109acab50 100644 --- a/browser/resources/settings/brave_rewards_page/brave_rewards_page.ts +++ b/browser/resources/settings/brave_rewards_page/brave_rewards_page.ts @@ -152,6 +152,7 @@ class SettingsBraveRewardsPage extends SettingsBraveRewardsPageBase { this.browserProxy_.getAdsData().then((adsData) => { this.shouldAllowAdsSubdivisionTargeting_ = adsData.shouldAllowAdsSubdivisionTargeting this.countryCode_ = adsData.countryCode + this.subdivisions_ = adsData.subdivisions }) } @@ -200,87 +201,14 @@ class SettingsBraveRewardsPage extends SettingsBraveRewardsPageBase { } adsSubdivisionTargetingCodes_() { - if (this.countryCode_ == 'US') { - return this.adsUSASubdivisionTargetingCodes_() + if (!this.subdivisions_ || !this.subdivisions_.length) { + return [] } - if (this.countryCode_ == 'CA') { - return this.adsCanadaSubdivisionTargetingCodes_() - } - - return [] - } - - adsUSASubdivisionTargetingCodes_() { - return [ - { name: loadTimeData.getString('braveRewardsAutoDetectedItem'), value: 'AUTO' }, - { name: loadTimeData.getString('braveRewardsDisabledItem'), value: 'DISABLED' }, - { name: 'Alabama', value: 'US-AL' }, - { name: 'Alaska', value: 'US-AK' }, - { name: 'Arizona', value: 'US-AZ' }, - { name: 'Arkansas', value: 'US-AR' }, - { name: 'California', value: 'US-CA' }, - { name: 'Colorado', value: 'US-CO' }, - { name: 'Connecticut', value: 'US-CT' }, - { name: 'Delaware', value: 'US-DE' }, - { name: 'Florida', value: 'US-FL' }, - { name: 'Georgia', value: 'US-GA' }, - { name: 'Hawaii', value: 'US-HI' }, - { name: 'Idaho', value: 'US-ID' }, - { name: 'Illinois', value: 'US-IL' }, - { name: 'Indiana', value: 'US-IN' }, - { name: 'Iowa', value: 'US-IA' }, - { name: 'Kansas', value: 'US-KS' }, - { name: 'Kentucky', value: 'US-KY' }, - { name: 'Louisiana', value: 'US-LA' }, - { name: 'Maine', value: 'US-ME' }, - { name: 'Maryland', value: 'US-MD' }, - { name: 'Massachusetts', value: 'US-MA' }, - { name: 'Michigan', value: 'US-MI' }, - { name: 'Minnesota', value: 'US-MN' }, - { name: 'Mississippi', value: 'US-MS' }, - { name: 'Missouri', value: 'US-MO' }, - { name: 'Montana', value: 'US-MT' }, - { name: 'Nebraska', value: 'US-NE' }, - { name: 'Nevada', value: 'US-NV' }, - { name: 'New Hampshire', value: 'US-NH' }, - { name: 'New Jersey', value: 'US-NJ' }, - { name: 'New Mexico', value: 'US-NM' }, - { name: 'New York', value: 'US-NY' }, - { name: 'North Carolina', value: 'US-NC' }, - { name: 'North Dakota', value: 'US-ND' }, - { name: 'Ohio', value: 'US-OH' }, - { name: 'Oklahoma', value: 'US-OK' }, - { name: 'Oregon', value: 'US-OR' }, - { name: 'Pennsylvania', value: 'US-PA' }, - { name: 'Rhode Island', value: 'US-RI' }, - { name: 'South Carolina', value: 'US-SC' }, - { name: 'South Dakota', value: 'US-SD' }, - { name: 'Tennessee', value: 'US-TN' }, - { name: 'Texas', value: 'US-TX' }, - { name: 'Utah', value: 'US-UT' }, - { name: 'Vermont', value: 'US-VT' }, - { name: 'Virginia', value: 'US-VA' }, - { name: 'Washington', value: 'US-WA' }, - { name: 'West Virginia', value: 'US-WV' }, - { name: 'Wisconsin', value: 'US-WI' }, - { name: 'Wyoming', value: 'US-WY' } - ] - } - - adsCanadaSubdivisionTargetingCodes_() { - return [ - { name: loadTimeData.getString('braveRewardsAutoDetectedItem'), value: 'AUTO' }, - { name: loadTimeData.getString('braveRewardsDisabledItem'), value: 'DISABLED' }, - { name: 'Alberta', value: 'CA-AB' }, - { name: 'British Columbia', value: 'CA-BC' }, - { name: 'Manitoba', value: 'CA-MB' }, - { name: 'New Brunswick', value: 'CA-NB' }, - { name: 'Nova Scotia', value: 'CA-NS' }, - { name: 'Ontario', value: 'CA-ON' }, - { name: 'Quebec', value: 'CA-QC' }, - { name: 'Saskatchewan', value: 'CA-SK' } - ] + let subdivisions = this.subdivisions_.map(val => ({ ...val })) + subdivisions.unshift({ name: loadTimeData.getString('braveRewardsDisabledItem'), value: 'DISABLED' }) + subdivisions.unshift({ name: loadTimeData.getString('braveRewardsAutoDetectedItem'), value: 'AUTO' }) + return subdivisions } } diff --git a/browser/ui/webui/DEPS b/browser/ui/webui/DEPS index d51b0198b89..556b5435622 100644 --- a/browser/ui/webui/DEPS +++ b/browser/ui/webui/DEPS @@ -1,5 +1,6 @@ include_rules = [ "+chrome/services/qrcode_generator/public/mojom", "+chrome/services/qrcode_generator/public/cpp", + "+bat/ads/supported_subdivisions.h", "+bat/ledger/mojom_structs.h", ] diff --git a/browser/ui/webui/brave_rewards_page_ui.cc b/browser/ui/webui/brave_rewards_page_ui.cc index c96bf8d5286..c88edca050f 100644 --- a/browser/ui/webui/brave_rewards_page_ui.cc +++ b/browser/ui/webui/brave_rewards_page_ui.cc @@ -18,6 +18,7 @@ #include "base/strings/string_number_conversions.h" #include "base/time/time.h" #include "bat/ads/pref_names.h" +#include "bat/ads/supported_subdivisions.h" #include "bat/ledger/mojom_structs.h" #include "brave/browser/brave_ads/ads_service_factory.h" #include "brave/browser/brave_rewards/rewards_service_factory.h" @@ -303,14 +304,11 @@ class RewardsDOMHandler namespace { -const int kDaysOfAdsHistory = 30; +constexpr int kDaysOfAdsHistory = 30; -const char kShouldAllowAdsSubdivisionTargeting[] = - "shouldAllowAdsSubdivisionTargeting"; -const char kAdsSubdivisionTargeting[] = "adsSubdivisionTargeting"; -const char kAutoDetectedSubdivisionTargeting[] = +constexpr char kAdsSubdivisionTargeting[] = "adsSubdivisionTargeting"; +constexpr char kAutoDetectedSubdivisionTargeting[] = "automaticallyDetectedAdsSubdivisionTargeting"; -const char kNeedsBrowserUpgradeToServeAds[] = "needsBrowserUpgradeToServeAds"; } // namespace @@ -1196,11 +1194,22 @@ void RewardsDOMHandler::GetAdsData(const base::Value::List& args) { ads_service_->GetSubdivisionTargetingCode()); ads_data.Set(kAutoDetectedSubdivisionTargeting, ads_service_->GetAutoDetectedSubdivisionTargetingCode()); - ads_data.Set(kShouldAllowAdsSubdivisionTargeting, + ads_data.Set("shouldAllowAdsSubdivisionTargeting", ads_service_->ShouldAllowSubdivisionTargeting()); ads_data.Set("adsUIEnabled", true); - ads_data.Set(kNeedsBrowserUpgradeToServeAds, + ads_data.Set("needsBrowserUpgradeToServeAds", ads_service_->NeedsBrowserUpgradeToServeAds()); + + base::Value::List subdivisions; + const auto supported_subdivisions = ads::GetSupportedSubdivisions(); + for (const auto& subdivision : supported_subdivisions) { + base::Value::Dict subdivision_dict; + subdivision_dict.Set("code", subdivision.first); + subdivision_dict.Set("name", subdivision.second); + subdivisions.Append(std::move(subdivision_dict)); + } + + ads_data.Set("subdivisions", std::move(subdivisions)); CallJavascriptFunction("brave_rewards.adsData", base::Value(std::move(ads_data))); } diff --git a/common/extensions/api/brave_rewards.json b/common/extensions/api/brave_rewards.json index 15f3c5a35e0..f3bbb53ab0a 100644 --- a/common/extensions/api/brave_rewards.json +++ b/common/extensions/api/brave_rewards.json @@ -1091,8 +1091,21 @@ "adsUIEnabled": { "type": "boolean" }, - "countryCode": { - "type": "string" + "subdivisions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "subdivision name" + }, + "value": { + "type": "string", + "description": "subdivision code" + } + } + } } } } diff --git a/components/brave_rewards/resources/page/components/adsBox.tsx b/components/brave_rewards/resources/page/components/adsBox.tsx index c6658a881d6..906cc19777e 100644 --- a/components/brave_rewards/resources/page/components/adsBox.tsx +++ b/components/brave_rewards/resources/page/components/adsBox.tsx @@ -21,7 +21,6 @@ import { Grid, Column, ControlWrapper } from 'brave-ui/components' import { AlertCircleIcon } from 'brave-ui/components/icons' import { LayoutKind } from '../lib/layout_context' -import { getAdsSubdivisions } from '../../shared/lib/ads_subdivisions' import { externalWalletProviderFromString } from '../../shared/lib/external_wallet' import { getProviderPayoutStatus } from '../../shared/lib/provider_payout_status' import { PaymentStatusView } from '../../shared/components/payment_status_view' @@ -151,10 +150,10 @@ class AdsBox extends React.Component { onChange={selectChangeHandler('adsSubdivisionTargeting')} > { - getAdsSubdivisions(this.props.rewardsData).map((subdivision) => { + this.getAdsSubdivisions().map((subdivision) => { return ( - ) }) @@ -260,6 +259,36 @@ class AdsBox extends React.Component { return groupedAdsHistory } + getAdsSubdivisions = (): Rewards.Subdivision[] => { + const { + adsSubdivisionTargeting, + automaticallyDetectedAdsSubdivisionTargeting, + subdivisions + } = this.props.rewardsData.adsData + + if (!subdivisions || !subdivisions.length) { + return [] + } + + let adsSubdivisionsList: Rewards.Subdivision[] = subdivisions.map(val => ({ ...val })) + + if (adsSubdivisionTargeting === 'DISABLED') { + adsSubdivisionsList.unshift({ code: 'DISABLED', name: getLocale('adsSubdivisionTargetingDisabled') }) + } else { + adsSubdivisionsList.unshift({ code: 'DISABLED', name: getLocale('adsSubdivisionTargetingDisable') }) + } + + const subdivisionMap = new Map(subdivisions.map(v => [v.code, v.name])) + const subdivision = subdivisionMap.get(automaticallyDetectedAdsSubdivisionTargeting) + if (subdivision && adsSubdivisionTargeting === 'AUTO') { + adsSubdivisionsList.unshift({ code: 'AUTO', name: getLocale('adsSubdivisionTargetingAutoDetectedAs', { adsSubdivisionTarget: subdivision }) }) + } else { + adsSubdivisionsList.unshift({ code: 'AUTO', name: getLocale('adsSubdivisionTargetingAutoDetect') }) + } + + return adsSubdivisionsList + } + getAdDetailRow = (adHistory: Rewards.AdHistory) => { let brand = adHistory.adContent.brand if (brand.length > 50) { diff --git a/components/brave_rewards/resources/page/reducers/default_state.ts b/components/brave_rewards/resources/page/reducers/default_state.ts index 77a43bcf0c2..b630a74855c 100644 --- a/components/brave_rewards/resources/page/reducers/default_state.ts +++ b/components/brave_rewards/resources/page/reducers/default_state.ts @@ -29,6 +29,7 @@ export function defaultState (): Rewards.State { adsSubdivisionTargeting: '', automaticallyDetectedAdsSubdivisionTargeting: '', shouldAllowAdsSubdivisionTargeting: true, + subdivisions: [], adsUIEnabled: false, adsIsSupported: false, needsBrowserUpgradeToServeAds: false, diff --git a/components/brave_rewards/resources/page/reducers/rewards_reducer.ts b/components/brave_rewards/resources/page/reducers/rewards_reducer.ts index 29c94cd457b..8209e883cf8 100644 --- a/components/brave_rewards/resources/page/reducers/rewards_reducer.ts +++ b/components/brave_rewards/resources/page/reducers/rewards_reducer.ts @@ -128,6 +128,7 @@ const rewardsReducer: Reducer = (state: Rewards.State state.adsData.adsSubdivisionTargeting = action.payload.adsData.adsSubdivisionTargeting state.adsData.automaticallyDetectedAdsSubdivisionTargeting = action.payload.adsData.automaticallyDetectedAdsSubdivisionTargeting state.adsData.shouldAllowAdsSubdivisionTargeting = action.payload.adsData.shouldAllowAdsSubdivisionTargeting + state.adsData.subdivisions = action.payload.adsData.subdivisions state.adsData.adsUIEnabled = action.payload.adsData.adsUIEnabled state.adsData.adsIsSupported = action.payload.adsData.adsIsSupported state.adsData.needsBrowserUpgradeToServeAds = action.payload.adsData.needsBrowserUpgradeToServeAds diff --git a/components/brave_rewards/resources/page/stories/redux_state.ts b/components/brave_rewards/resources/page/stories/redux_state.ts index e0d16540b15..8f5a642c99a 100644 --- a/components/brave_rewards/resources/page/stories/redux_state.ts +++ b/components/brave_rewards/resources/page/stories/redux_state.ts @@ -33,6 +33,7 @@ export const reduxState: Rewards.ApplicationState = { adsSubdivisionTargeting: '', automaticallyDetectedAdsSubdivisionTargeting: '', shouldAllowAdsSubdivisionTargeting: true, + subdivisions: [], adsUIEnabled: true, adsIsSupported: true, needsBrowserUpgradeToServeAds: false, diff --git a/components/brave_rewards/resources/shared/lib/ads_subdivisions.ts b/components/brave_rewards/resources/shared/lib/ads_subdivisions.ts deleted file mode 100644 index a230c599573..00000000000 --- a/components/brave_rewards/resources/shared/lib/ads_subdivisions.ts +++ /dev/null @@ -1,111 +0,0 @@ -/* 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 http://mozilla.org/MPL/2.0/. */ - -import { getLocale } from '../../../../common/locale' - -export function getAdsSubdivisions ( - rewardsData: Rewards.State -): Array<[string, string]> { - const { - currentCountryCode - } = rewardsData - - const { - adsSubdivisionTargeting, - automaticallyDetectedAdsSubdivisionTargeting - } = rewardsData.adsData - - let subdivisions: Array<[string, string]> = [] - if (currentCountryCode === 'US') { - subdivisions = getUnitedStatesSubdivisions() - } else if (currentCountryCode === 'CA') { - subdivisions = getCanadaSubdivisions() - } else { - return subdivisions - } - - if (adsSubdivisionTargeting === 'DISABLED') { - subdivisions.unshift(['DISABLED', getLocale('adsSubdivisionTargetingDisabled')]) - } else { - subdivisions.unshift(['DISABLED', getLocale('adsSubdivisionTargetingDisable')]) - } - - const subdivisionMap = new Map(subdivisions) - const subdivision = subdivisionMap.get(automaticallyDetectedAdsSubdivisionTargeting) - if (subdivision && adsSubdivisionTargeting === 'AUTO') { - subdivisions.unshift(['AUTO', getLocale('adsSubdivisionTargetingAutoDetectedAs', { adsSubdivisionTarget: subdivision })]) - } else { - subdivisions.unshift(['AUTO', getLocale('adsSubdivisionTargetingAutoDetect')]) - } - - return subdivisions -} - -function getUnitedStatesSubdivisions (): Array<[string, string]> { - return [ - ['US-AL', 'Alabama'], - ['US-AK', 'Alaska'], - ['US-AZ', 'Arizona'], - ['US-AR', 'Arkansas'], - ['US-CA', 'California'], - ['US-CO', 'Colorado'], - ['US-CT', 'Connecticut'], - ['US-DE', 'Delaware'], - ['US-FL', 'Florida'], - ['US-GA', 'Georgia'], - ['US-HI', 'Hawaii'], - ['US-ID', 'Idaho'], - ['US-IL', 'Illinois'], - ['US-IN', 'Indiana'], - ['US-IA', 'Iowa'], - ['US-KS', 'Kansas'], - ['US-KY', 'Kentucky'], - ['US-LA', 'Louisiana'], - ['US-ME', 'Maine'], - ['US-MD', 'Maryland'], - ['US-MA', 'Massachusetts'], - ['US-MI', 'Michigan'], - ['US-MN', 'Minnesota'], - ['US-MS', 'Mississippi'], - ['US-MO', 'Missouri'], - ['US-MT', 'Montana'], - ['US-NE', 'Nebraska'], - ['US-NV', 'Nevada'], - ['US-NH', 'New Hampshire'], - ['US-NJ', 'New Jersey'], - ['US-NM', 'New Mexico'], - ['US-NY', 'New York'], - ['US-NC', 'North Carolina'], - ['US-ND', 'North Dakota'], - ['US-OH', 'Ohio'], - ['US-OK', 'Oklahoma'], - ['US-OR', 'Oregon'], - ['US-PA', 'Pennsylvania'], - ['US-RI', 'Rhode Island'], - ['US-SC', 'South Carolina'], - ['US-SD', 'South Dakota'], - ['US-TN', 'Tennessee'], - ['US-TX', 'Texas'], - ['US-UT', 'Utah'], - ['US-VT', 'Vermont'], - ['US-VA', 'Virginia'], - ['US-WA', 'Washington'], - ['US-WV', 'West Virginia'], - ['US-WI', 'Wisconsin'], - ['US-WY', 'Wyoming'] - ] -} - -function getCanadaSubdivisions (): Array<[string, string]> { - return [ - ['CA-AB', 'Alberta'], - ['CA-BC', 'British Columbia'], - ['CA-MB', 'Manitoba'], - ['CA-NB', 'New Brunswick'], - ['CA-NS', 'Nova Scotia'], - ['CA-ON', 'Ontario'], - ['CA-QC', 'Quebec'], - ['CA-SK', 'Saskatchewan'] - ] -} diff --git a/components/definitions/rewards.d.ts b/components/definitions/rewards.d.ts index 6b3415ae456..c64310b1f9f 100644 --- a/components/definitions/rewards.d.ts +++ b/components/definitions/rewards.d.ts @@ -226,12 +226,18 @@ declare namespace Rewards { hint: string } + export interface Subdivision { + name: string + code: string + } + export interface AdsData { adsEnabled: boolean adsPerHour: number adsSubdivisionTargeting: string automaticallyDetectedAdsSubdivisionTargeting: string shouldAllowAdsSubdivisionTargeting: boolean + subdivisions: Subdivision[] adsUIEnabled: boolean adsIsSupported: boolean needsBrowserUpgradeToServeAds: boolean diff --git a/components/test/brave_rewards/page/reducers/rewards_reducer_test.ts b/components/test/brave_rewards/page/reducers/rewards_reducer_test.ts index 3f0a1b72508..c8227975f4a 100644 --- a/components/test/brave_rewards/page/reducers/rewards_reducer_test.ts +++ b/components/test/brave_rewards/page/reducers/rewards_reducer_test.ts @@ -95,6 +95,7 @@ describe('rewards reducer', () => { adsSubdivisionTargeting: 'US-CA', automaticallyDetectedAdsSubdivisionTargeting: 'US-FL', shouldAllowAdsSubdivisionTargeting: true, + subdivisions: [], isAdsSubdivisionTargetingRegion: true, adsUIEnabled: false, adsIsSupported: false, @@ -110,6 +111,7 @@ describe('rewards reducer', () => { adsSubdivisionTargeting: 'US-CA', automaticallyDetectedAdsSubdivisionTargeting: 'US-FL', shouldAllowAdsSubdivisionTargeting: true, + subdivisions: [], isAdsSubdivisionTargetingRegion: true, adsUIEnabled: true, adsIsSupported: true, @@ -129,6 +131,7 @@ describe('rewards reducer', () => { adsSubdivisionTargeting: 'US-CA', automaticallyDetectedAdsSubdivisionTargeting: 'US-FL', shouldAllowAdsSubdivisionTargeting: true, + subdivisions: [], adsUIEnabled: true, adsIsSupported: true } diff --git a/vendor/bat-native-ads/BUILD.gn b/vendor/bat-native-ads/BUILD.gn index 4c5db082867..1f479501a35 100644 --- a/vendor/bat-native-ads/BUILD.gn +++ b/vendor/bat-native-ads/BUILD.gn @@ -92,6 +92,7 @@ source_set("headers") { "include/bat/ads/pref_names.h", "include/bat/ads/promoted_content_ad_info.h", "include/bat/ads/promoted_content_ad_value_util.h", + "include/bat/ads/supported_subdivisions.h", "include/bat/ads/sys_info.h", ] @@ -856,6 +857,7 @@ source_set("ads") { "src/bat/ads/internal/geographic/subdivision/get_subdivision_url_request_builder.h", "src/bat/ads/internal/geographic/subdivision/subdivision_targeting.cc", "src/bat/ads/internal/geographic/subdivision/subdivision_targeting.h", + "src/bat/ads/internal/geographic/subdivision/supported_subdivision_codes.cc", "src/bat/ads/internal/geographic/subdivision/supported_subdivision_codes.h", "src/bat/ads/internal/history/ad_content_util.cc", "src/bat/ads/internal/history/ad_content_util.h", @@ -1165,6 +1167,7 @@ source_set("ads") { "src/bat/ads/pref_names.cc", "src/bat/ads/promoted_content_ad_info.cc", "src/bat/ads/promoted_content_ad_value_util.cc", + "src/bat/ads/supported_subdivisions.cc", "src/bat/ads/sys_info.cc", ] diff --git a/vendor/bat-native-ads/include/bat/ads/supported_subdivisions.h b/vendor/bat-native-ads/include/bat/ads/supported_subdivisions.h new file mode 100644 index 00000000000..7dcf514908c --- /dev/null +++ b/vendor/bat-native-ads/include/bat/ads/supported_subdivisions.h @@ -0,0 +1,22 @@ +/* Copyright (c) 2022 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 http://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVE_VENDOR_BAT_NATIVE_ADS_INCLUDE_BAT_ADS_SUPPORTED_SUBDIVISIONS_H_ +#define BRAVE_VENDOR_BAT_NATIVE_ADS_INCLUDE_BAT_ADS_SUPPORTED_SUBDIVISIONS_H_ + +#include "base/containers/flat_map.h" +#include "base/strings/string_piece_forward.h" +#include "bat/ads/export.h" + +namespace ads { + +using SupportedSubdivisions = + base::flat_map; + +ADS_EXPORT SupportedSubdivisions GetSupportedSubdivisions(); + +} // namespace ads + +#endif // BRAVE_VENDOR_BAT_NATIVE_ADS_INCLUDE_BAT_ADS_SUPPORTED_SUBDIVISIONS_H_ diff --git a/vendor/bat-native-ads/src/bat/ads/internal/base/locale/subdivision_code_util.cc b/vendor/bat-native-ads/src/bat/ads/internal/base/locale/subdivision_code_util.cc index c06478d1f6e..af0b3b80067 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/base/locale/subdivision_code_util.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/base/locale/subdivision_code_util.cc @@ -8,10 +8,20 @@ #include #include "base/check_op.h" +#include "base/containers/contains.h" #include "base/strings/string_split.h" +#include "bat/ads/internal/geographic/subdivision/supported_subdivision_codes.h" +#include "brave/components/l10n/common/locale_util.h" namespace ads::locale { +bool IsSupportedCountryCodeForSubdivisionTargeting( + const std::string& country_code) { + const auto& supported_subdivision_codes = + ::ads::geographic::GetSupportedSubdivisionCodes(); + return base::Contains(supported_subdivision_codes, country_code); +} + std::string GetCountryCode(const std::string& code) { const std::vector components = base::SplitString(code, "-", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/base/locale/subdivision_code_util.h b/vendor/bat-native-ads/src/bat/ads/internal/base/locale/subdivision_code_util.h index 1ec5fa304ac..90153032d5e 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/base/locale/subdivision_code_util.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/base/locale/subdivision_code_util.h @@ -10,6 +10,9 @@ namespace ads::locale { +bool IsSupportedCountryCodeForSubdivisionTargeting( + const std::string& country_code); + std::string GetCountryCode(const std::string& code); std::string GetSubdivisionCode(const std::string& code); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/base/locale/subdivision_code_util_unittest.cc b/vendor/bat-native-ads/src/bat/ads/internal/base/locale/subdivision_code_util_unittest.cc index 9fb96fca305..66ca82fd8bc 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/base/locale/subdivision_code_util_unittest.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/base/locale/subdivision_code_util_unittest.cc @@ -31,4 +31,16 @@ TEST(BatAdsSubdivisionCodeUtilTest, GetSubdivisionCode) { EXPECT_EQ("CA", subdivision_code); } +TEST(BatAdsSubdivisionCodeUtilTest, + IsSupportedCountryCodeForSubdivisionTargeting) { + // Arrange + + // Act + + // Assert + EXPECT_TRUE(locale::IsSupportedCountryCodeForSubdivisionTargeting("US")); + EXPECT_TRUE(locale::IsSupportedCountryCodeForSubdivisionTargeting("CA")); + EXPECT_FALSE(locale::IsSupportedCountryCodeForSubdivisionTargeting("ES")); +} + } // namespace ads diff --git a/vendor/bat-native-ads/src/bat/ads/internal/geographic/subdivision/README.md b/vendor/bat-native-ads/src/bat/ads/internal/geographic/subdivision/README.md index 7dbbba6adf5..a4ca9e7d8c1 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/geographic/subdivision/README.md +++ b/vendor/bat-native-ads/src/bat/ads/internal/geographic/subdivision/README.md @@ -61,4 +61,17 @@ See [ISO_3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) for a list of assigne | WI | Wisconsin | | WY | Wyoming | +### Canada + +| code | subdivision | +|---|---| +| AB | Alberta | +| BC | British Columbia | +| MB | Manitoba | +| NB | New Brunswick | +| NS | Nova Scotia | +| ON | Ontario | +| QC | Quebec | +| SK | Saskatchewan | + Please add to it! diff --git a/vendor/bat-native-ads/src/bat/ads/internal/geographic/subdivision/subdivision_targeting.cc b/vendor/bat-native-ads/src/bat/ads/internal/geographic/subdivision/subdivision_targeting.cc index 908b2fe2405..43b55c1f8f4 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/geographic/subdivision/subdivision_targeting.cc +++ b/vendor/bat-native-ads/src/bat/ads/internal/geographic/subdivision/subdivision_targeting.cc @@ -118,15 +118,10 @@ const std::string& SubdivisionTargeting::GetLazySubdivisionCode() const { return *subdivision_code_; } -bool SubdivisionTargeting::IsSupportedLocale(const std::string& locale) const { - const std::string country_code = brave_l10n::GetISOCountryCode(locale); - - const auto iter = kSupportedSubdivisionCodes.find(country_code); - return iter != kSupportedSubdivisionCodes.cend(); -} - void SubdivisionTargeting::MaybeAllowForLocale(const std::string& locale) { - if (!IsSupportedLocale(locale)) { + const std::string country_code = brave_l10n::GetISOCountryCode(locale); + if (!::ads::locale::IsSupportedCountryCodeForSubdivisionTargeting( + country_code)) { AdsClientHelper::GetInstance()->SetBooleanPref( prefs::kShouldAllowSubdivisionTargeting, false); return; @@ -138,7 +133,6 @@ void SubdivisionTargeting::MaybeAllowForLocale(const std::string& locale) { return; } - const std::string country_code = brave_l10n::GetISOCountryCode(locale); const std::string& subdivision_code = GetSubdivisionCode(); std::string subdivision_country_code; @@ -152,9 +146,7 @@ void SubdivisionTargeting::MaybeAllowForLocale(const std::string& locale) { return; } - const SupportedSubdivisionCodesSet& subdivision_codes = - kSupportedSubdivisionCodes.at(country_code); - if (subdivision_codes.find(subdivision_code) == subdivision_codes.cend()) { + if (!IsSupportedSubdivisionCode(country_code, subdivision_code)) { BLOG(1, "Unknown subdivision code " << subdivision_code << " for " << locale << " locale "); MaybeResetSubdivisionCodeToDisabled(); @@ -193,7 +185,9 @@ void SubdivisionTargeting::MaybeFetchForLocale(const std::string& locale) { return; } - if (!IsSupportedLocale(locale)) { + const std::string country_code = brave_l10n::GetISOCountryCode(locale); + if (!::ads::locale::IsSupportedCountryCodeForSubdivisionTargeting( + country_code)) { BLOG(1, "Ads subdivision targeting is not supported for " << locale << " locale"); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/geographic/subdivision/subdivision_targeting.h b/vendor/bat-native-ads/src/bat/ads/internal/geographic/subdivision/subdivision_targeting.h index 11ab94b6a62..9ac2c16c9af 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/geographic/subdivision/subdivision_targeting.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/geographic/subdivision/subdivision_targeting.h @@ -50,7 +50,6 @@ class SubdivisionTargeting final : public LocaleManagerObserver, const std::string& GetLazyAutoDetectedSubdivisionCode() const; const std::string& GetLazySubdivisionCode() const; - bool IsSupportedLocale(const std::string& locale) const; void MaybeAllowForLocale(const std::string& locale); void MaybeResetSubdivisionCodeToAutoDetect(); void MaybeResetSubdivisionCodeToDisabled(); diff --git a/vendor/bat-native-ads/src/bat/ads/internal/geographic/subdivision/supported_subdivision_codes.cc b/vendor/bat-native-ads/src/bat/ads/internal/geographic/subdivision/supported_subdivision_codes.cc new file mode 100644 index 00000000000..92a90b0a0e4 --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/internal/geographic/subdivision/supported_subdivision_codes.cc @@ -0,0 +1,71 @@ +/* Copyright (c) 2022 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 http://mozilla.org/MPL/2.0/. */ + +#include "bat/ads/internal/geographic/subdivision/supported_subdivision_codes.h" + +#include "base/no_destructor.h" +#include "base/strings/string_piece.h" +#include "brave/components/l10n/common/locale_util.h" + +namespace ads::geographic { + +const SupportedSubdivisionCodesMap& GetSupportedSubdivisionCodes() { + // Format: { ISO Country Code, { ISO country subdivision codes as defined + // in ISO 3166-2 https://en.wikipedia.org/wiki/ISO_3166-2, ... } } + static const base::NoDestructor + supported_subdivision_codes( + {{"US", + {// United States of America + {"US-AL", "Alabama"}, {"US-AK", "Alaska"}, + {"US-AZ", "Arizona"}, {"US-AR", "Arkansas"}, + {"US-CA", "California"}, {"US-CO", "Colorado"}, + {"US-CT", "Connecticut"}, {"US-DE", "Delaware"}, + {"US-FL", "Florida"}, {"US-GA", "Georgia"}, + {"US-HI", "Hawaii"}, {"US-ID", "Idaho"}, + {"US-IL", "Illinois"}, {"US-IN", "Indiana"}, + {"US-IA", "Iowa"}, {"US-KS", "Kansas"}, + {"US-KY", "Kentucky"}, {"US-LA", "Louisiana"}, + {"US-ME", "Maine"}, {"US-MD", "Maryland"}, + {"US-MA", "Massachusetts"}, {"US-MI", "Michigan"}, + {"US-MN", "Minnesota"}, {"US-MS", "Mississippi"}, + {"US-MO", "Missouri"}, {"US-MT", "Montana"}, + {"US-NE", "Nebraska"}, {"US-NV", "Nevada"}, + {"US-NH", "New Hampshire"}, {"US-NJ", "New Jersey"}, + {"US-NM", "New Mexico"}, {"US-NY", "New York"}, + {"US-NC", "North Carolina"}, {"US-ND", "North Dakota"}, + {"US-OH", "Ohio"}, {"US-OK", "Oklahoma"}, + {"US-OR", "Oregon"}, {"US-PA", "Pennsylvania"}, + {"US-RI", "Rhode Island"}, {"US-SC", "South Carolina"}, + {"US-SD", "South Dakota"}, {"US-TN", "Tennessee"}, + {"US-TX", "Texas"}, {"US-UT", "Utah"}, + {"US-VT", "Vermont"}, {"US-VA", "Virginia"}, + {"US-WA", "Washington"}, {"US-WV", "West Virginia"}, + {"US-WI", "Wisconsin"}, {"US-WY", "Wyoming"}}}, + {"CA", + {// Canada + {"CA-AB", "Alberta"}, + {"CA-BC", "British Columbia"}, + {"CA-MB", "Manitoba"}, + {"CA-NB", "New Brunswick"}, + {"CA-NS", "Nova Scotia"}, + {"CA-ON", "Ontario"}, + {"CA-QC", "Quebec"}, + {"CA-SK", "Saskatchewan"}}}}); + + return *supported_subdivision_codes; +} + +bool IsSupportedSubdivisionCode(const std::string& country_code, + const std::string& subdivision_code) { + const auto iter = GetSupportedSubdivisionCodes().find(country_code); + if (iter == GetSupportedSubdivisionCodes().cend()) { + return false; + } + + const auto& subdivisions = iter->second; + return subdivisions.find(subdivision_code) != subdivisions.cend(); +} + +} // namespace ads::geographic diff --git a/vendor/bat-native-ads/src/bat/ads/internal/geographic/subdivision/supported_subdivision_codes.h b/vendor/bat-native-ads/src/bat/ads/internal/geographic/subdivision/supported_subdivision_codes.h index d084c52f79f..f949470b534 100644 --- a/vendor/bat-native-ads/src/bat/ads/internal/geographic/subdivision/supported_subdivision_codes.h +++ b/vendor/bat-native-ads/src/bat/ads/internal/geographic/subdivision/supported_subdivision_codes.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2020 The Brave Authors. All rights reserved. +/* Copyright (c) 2022 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 http://mozilla.org/MPL/2.0/. */ @@ -9,83 +9,18 @@ #include #include "base/containers/flat_map.h" -#include "base/containers/flat_set.h" +#include "base/strings/string_piece_forward.h" +#include "bat/ads/supported_subdivisions.h" namespace ads::geographic { -using SupportedSubdivisionCodesSet = base::flat_set; using SupportedSubdivisionCodesMap = - base::flat_map; + base::flat_map; -const SupportedSubdivisionCodesMap kSupportedSubdivisionCodes = { - // Format: { ISO Country Code, { ISO country subdivision codes as defined - // in ISO 3166-2 https://en.wikipedia.org/wiki/ISO_3166-2, ... } } - {"US", - { - // United States of America - "US-AL", // Alabama - "US-AK", // Alaska - "US-AZ", // Arizona - "US-AR", // Arkansas - "US-CA", // California - "US-CO", // Colorado - "US-CT", // Connecticut - "US-DE", // Delaware - "US-FL", // Florida - "US-GA", // Georgia - "US-HI", // Hawaii - "US-ID", // Idaho - "US-IL", // Illinois - "US-IN", // Indiana - "US-IA", // Iowa - "US-KS", // Kansas - "US-KY", // Kentucky - "US-LA", // Louisiana - "US-ME", // Maine - "US-MD", // Maryland - "US-MA", // Massachusetts - "US-MI", // Michigan - "US-MN", // Minnesota - "US-MS", // Mississippi - "US-MO", // Missouri - "US-MT", // Montana - "US-NE", // Nebraska - "US-NV", // Nevada - "US-NH", // New Hampshire - "US-NJ", // New Jersey - "US-NM", // New Mexico - "US-NY", // New York - "US-NC", // North Carolina - "US-ND", // North Dakota - "US-OH", // Ohio - "US-OK", // Oklahoma - "US-OR", // Oregon - "US-PA", // Pennsylvania - "US-RI", // Rhode Island - "US-SC", // South Carolina - "US-SD", // South Dakota - "US-TN", // Tennessee - "US-TX", // Texas - "US-UT", // Utah - "US-VT", // Vermont - "US-VA", // Virginia - "US-WA", // Washington - "US-WV", // West Virginia - "US-WI", // Wisconsin - "US-WY", // Wyoming - }}, - {"CA", - { - // Canada - "CA-AB", // Alberta - "CA-BC", // British Columbia - "CA-MB", // Manitoba - "CA-NB", // New Brunswick - "CA-NS", // Nova Scotia - "CA-ON", // Ontario - "CA-QC", // Quebec - "CA-SK", // Saskatchewan - }}}; +const SupportedSubdivisionCodesMap& GetSupportedSubdivisionCodes(); + +bool IsSupportedSubdivisionCode(const std::string& country_code, + const std::string& subdivision_code); } // namespace ads::geographic diff --git a/vendor/bat-native-ads/src/bat/ads/supported_subdivisions.cc b/vendor/bat-native-ads/src/bat/ads/supported_subdivisions.cc new file mode 100644 index 00000000000..8c07e2e475b --- /dev/null +++ b/vendor/bat-native-ads/src/bat/ads/supported_subdivisions.cc @@ -0,0 +1,26 @@ +/* Copyright (c) 2022 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 http://mozilla.org/MPL/2.0/. */ + +#include "bat/ads/supported_subdivisions.h" + +#include "base/strings/string_piece.h" +#include "bat/ads/internal/geographic/subdivision/supported_subdivision_codes.h" +#include "brave/components/l10n/common/locale_util.h" + +namespace ads { + +SupportedSubdivisions GetSupportedSubdivisions() { + const std::string country_code = brave_l10n::GetDefaultISOCountryCodeString(); + + const auto& subdivision_codes = geographic::GetSupportedSubdivisionCodes(); + const auto iter = subdivision_codes.find(country_code); + if (iter == subdivision_codes.cend()) { + return {}; + } + + return iter->second; +} + +} // namespace ads