diff --git a/chromium_src/components/search_engines/brave_template_url_prepopulate_data_unittest.cc b/chromium_src/components/search_engines/brave_template_url_prepopulate_data_unittest.cc index 4425036adf98..0691a05e40a7 100644 --- a/chromium_src/components/search_engines/brave_template_url_prepopulate_data_unittest.cc +++ b/chromium_src/components/search_engines/brave_template_url_prepopulate_data_unittest.cc @@ -63,6 +63,15 @@ class BraveTemplateURLPrepopulateDataTest : public testing::Test { TemplateURLPrepopulateData::RegisterProfilePrefs(prefs_.registry()); } + void CheckForCountry(char digit1, char digit2, const std::string& expected) { + prefs_.SetInteger(kCountryIDAtInstall, digit1 << 8 | digit2); + size_t default_index; + std::vector> t_urls = + TemplateURLPrepopulateData::GetPrepopulatedEngines(&prefs_, + &default_index); + EXPECT_EQ(ASCIIToUTF16(expected), t_urls[default_index]->short_name()); + } + protected: sync_preferences::TestingPrefServiceSyncable prefs_; }; @@ -139,28 +148,29 @@ TEST_F(BraveTemplateURLPrepopulateDataTest, ProvidersFromPrepopulated) { } // Verifies default search provider for locale -TEST_F(BraveTemplateURLPrepopulateDataTest, DefaultSearchProvidersForLocale) { - // Use United States. - prefs_.SetInteger(kCountryIDAtInstall, 'U' << 8 | 'S'); - size_t default_index; - std::vector> t_urls = - TemplateURLPrepopulateData::GetPrepopulatedEngines(&prefs_, - &default_index); - EXPECT_EQ(ASCIIToUTF16("Google"), t_urls[default_index]->short_name()); +TEST_F(BraveTemplateURLPrepopulateDataTest, DefaultSearchProvidersForUSA) { + CheckForCountry('U', 'S', "Google"); +} + +TEST_F(BraveTemplateURLPrepopulateDataTest, DefaultSearchProvidersForGermany) { + CheckForCountry('D', 'E', "DuckDuckGo"); +} - t_urls.clear(); +TEST_F(BraveTemplateURLPrepopulateDataTest, DefaultSearchProvidersForFrance) { + CheckForCountry('F', 'R', "Qwant"); +} - // Use Germany. - prefs_.SetInteger(kCountryIDAtInstall, 'D' << 8 | 'E'); - t_urls = TemplateURLPrepopulateData::GetPrepopulatedEngines(&prefs_, - &default_index); - EXPECT_EQ(ASCIIToUTF16("Qwant"), t_urls[default_index]->short_name()); +TEST_F(BraveTemplateURLPrepopulateDataTest, + DefaultSearchProvidersForAustralia) { + CheckForCountry('A', 'U', "DuckDuckGo"); +} - t_urls.clear(); +TEST_F(BraveTemplateURLPrepopulateDataTest, + DefaultSearchProvidersForNewZealand) { + CheckForCountry('N', 'Z', "DuckDuckGo"); +} - // Use France. - prefs_.SetInteger(kCountryIDAtInstall, 'F' << 8 | 'R'); - t_urls = TemplateURLPrepopulateData::GetPrepopulatedEngines(&prefs_, - &default_index); - EXPECT_EQ(ASCIIToUTF16("Qwant"), t_urls[default_index]->short_name()); +TEST_F(BraveTemplateURLPrepopulateDataTest, + DefaultSearchProvidersForIreland) { + CheckForCountry('I', 'E', "DuckDuckGo"); } diff --git a/chromium_src/components/search_engines/brave_template_url_service_util_unittest.cc b/chromium_src/components/search_engines/brave_template_url_service_util_unittest.cc index 50c53409bbd7..46f0fd30335d 100644 --- a/chromium_src/components/search_engines/brave_template_url_service_util_unittest.cc +++ b/chromium_src/components/search_engines/brave_template_url_service_util_unittest.cc @@ -9,6 +9,7 @@ #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" +#include "brave/components/search_engines/brave_prepopulated_engines.h" #include "components/search_engines/search_engines_pref_names.h" #include "components/search_engines/search_terms_data.h" #include "components/search_engines/template_url.h" @@ -45,15 +46,47 @@ class BraveTemplateURLServiceUtilTest : public testing::Test { sync_preferences::TestingPrefServiceSyncable prefs_; }; -TEST_F(BraveTemplateURLServiceUtilTest, GetSearchProvidersUsingKeywordResult) { +void TestDefaultOrder(const TemplateURL::OwnedTemplateURLVector& template_urls, + const std::vector& keywords) { + EXPECT_EQ(template_urls.size(), keywords.size()); + + for (size_t i = 0; i < template_urls.size(); i++) { + EXPECT_EQ(template_urls[i]->keyword(), base::ASCIIToUTF16(keywords[i])); + } +} + +std::vector GetSampleTemplateData() { std::vector local_turls; + // Create a sets of TURLs in order different from prepopulated TURLs. - local_turls.push_back(*CreatePrepopulateTemplateURLData(511, ":sp", 1)); + local_turls.push_back(*CreatePrepopulateTemplateURLData( + TemplateURLPrepopulateData::PREPOPULATED_ENGINE_ID_STARTPAGE, ":sp", 1)); local_turls.push_back(*CreatePrepopulateTemplateURLData(15, ":ya", 2)); - local_turls.push_back(*CreatePrepopulateTemplateURLData(3, ":b", 3)); - local_turls.push_back(*CreatePrepopulateTemplateURLData(507, ":q", 4)); - local_turls.push_back(*CreatePrepopulateTemplateURLData(501, ":d", 5)); - local_turls.push_back(*CreatePrepopulateTemplateURLData(1, ":g", 6)); + local_turls.push_back(*CreatePrepopulateTemplateURLData( + TemplateURLPrepopulateData::PREPOPULATED_ENGINE_ID_BING, ":b", 3)); + local_turls.push_back(*CreatePrepopulateTemplateURLData( + TemplateURLPrepopulateData::PREPOPULATED_ENGINE_ID_QWANT, ":q", 4)); + local_turls.push_back(*CreatePrepopulateTemplateURLData( + TemplateURLPrepopulateData::PREPOPULATED_ENGINE_ID_DUCKDUCKGO, ":d", 5)); + local_turls.push_back(*CreatePrepopulateTemplateURLData( + TemplateURLPrepopulateData::PREPOPULATED_ENGINE_ID_GOOGLE, ":g", 6)); + + return local_turls; +} + +WDKeywordsResult InitKeywordResult( + sync_preferences::TestingPrefServiceSyncable* prefs, + const std::vector& local_turls) { + WDKeywordsResult kwResult; + kwResult.builtin_keyword_version = + TemplateURLPrepopulateData::GetDataVersion(prefs); + kwResult.default_search_provider_id = 2; + kwResult.keywords = local_turls; + return kwResult; +} + +TEST_F(BraveTemplateURLServiceUtilTest, GetSearchProvidersUsingKeywordResult) { + std::vector local_turls = GetSampleTemplateData(); std::unique_ptr default_turl = std::make_unique(local_turls.back()); @@ -62,12 +95,8 @@ TEST_F(BraveTemplateURLServiceUtilTest, GetSearchProvidersUsingKeywordResult) { local_turls.push_back(*CreatePrepopulateTemplateURLData(1004, "random2", 8)); // Prepare call arguments - WDKeywordsResult kwResult; - kwResult.builtin_keyword_version = - TemplateURLPrepopulateData::GetDataVersion(&prefs_); - kwResult.default_search_provider_id = 2; - kwResult.keywords = local_turls; - WDResult result(KEYWORDS_RESULT, kwResult); + WDResult result(KEYWORDS_RESULT, + InitKeywordResult(&prefs_, local_turls)); TemplateURL::OwnedTemplateURLVector template_urls; int new_resource_keyword_version = 0; @@ -76,38 +105,35 @@ TEST_F(BraveTemplateURLServiceUtilTest, GetSearchProvidersUsingKeywordResult) { default_turl.get(), SearchTermsData(), &new_resource_keyword_version, nullptr); - // Verify count. + // Verify count and order. EXPECT_EQ(local_turls.size(), template_urls.size()); - // Verify order. - EXPECT_EQ(template_urls[0]->keyword(), base::ASCIIToUTF16(":g")); - EXPECT_EQ(template_urls[1]->keyword(), base::ASCIIToUTF16(":d")); - EXPECT_EQ(template_urls[2]->keyword(), base::ASCIIToUTF16(":q")); - EXPECT_EQ(template_urls[3]->keyword(), base::ASCIIToUTF16(":b")); - EXPECT_EQ(template_urls[4]->keyword(), base::ASCIIToUTF16(":sp")); - EXPECT_EQ(template_urls[5]->keyword(), base::ASCIIToUTF16(":ya")); - EXPECT_EQ(template_urls[6]->keyword(), base::ASCIIToUTF16("random1")); - EXPECT_EQ(template_urls[7]->keyword(), base::ASCIIToUTF16("random2")); - - // Reset - template_urls.clear(); - new_resource_keyword_version = 0; + TestDefaultOrder(template_urls, {":g", ":d", ":q", ":b", ":sp", ":ya", + "random1", "random2"}); +} + +TEST_F(BraveTemplateURLServiceUtilTest, + GetSearchProvidersUsingKeywordResultGermany) { + std::vector local_turls = GetSampleTemplateData(); + std::unique_ptr default_turl = + std::make_unique(local_turls.back()); + + // Germany specific query param + local_turls[4].prepopulate_id = + TemplateURLPrepopulateData::PREPOPULATED_ENGINE_ID_DUCKDUCKGO_DE; + + // Prepare call arguments + WDResult result(KEYWORDS_RESULT, + InitKeywordResult(&prefs_, local_turls)); + TemplateURL::OwnedTemplateURLVector template_urls; + int new_resource_keyword_version = 0; // Check Germany. prefs_.SetInteger(kCountryIDAtInstall, 'D' << 8 | 'E'); - GetSearchProvidersUsingKeywordResult(result, nullptr, &prefs_, &template_urls, default_turl.get(), SearchTermsData(), &new_resource_keyword_version, nullptr); - // Verify count. + // Verify count and order. EXPECT_EQ(local_turls.size(), template_urls.size()); - // Verify order. - EXPECT_EQ(template_urls[0]->keyword(), base::ASCIIToUTF16(":q")); - EXPECT_EQ(template_urls[1]->keyword(), base::ASCIIToUTF16(":g")); - EXPECT_EQ(template_urls[2]->keyword(), base::ASCIIToUTF16(":d")); - EXPECT_EQ(template_urls[3]->keyword(), base::ASCIIToUTF16(":b")); - EXPECT_EQ(template_urls[4]->keyword(), base::ASCIIToUTF16(":sp")); - EXPECT_EQ(template_urls[5]->keyword(), base::ASCIIToUTF16(":ya")); - EXPECT_EQ(template_urls[6]->keyword(), base::ASCIIToUTF16("random1")); - EXPECT_EQ(template_urls[7]->keyword(), base::ASCIIToUTF16("random2")); + TestDefaultOrder(template_urls, {":d", ":q", ":g", ":b", ":sp", ":ya"}); } diff --git a/chromium_src/components/search_engines/template_url_prepopulate_data.cc b/chromium_src/components/search_engines/template_url_prepopulate_data.cc index 0e15d64d79bb..cb7e283a16bf 100644 --- a/chromium_src/components/search_engines/template_url_prepopulate_data.cc +++ b/chromium_src/components/search_engines/template_url_prepopulate_data.cc @@ -32,12 +32,14 @@ namespace TemplateURLPrepopulateData { namespace { -// Maps Brave engine id to PrepopulatedEngine. +// Maps BravePrepopulatedEngineID to Chromium's PrepopulatedEngine. const std::map brave_engines_map = { {PREPOPULATED_ENGINE_ID_GOOGLE, &google}, {PREPOPULATED_ENGINE_ID_BING, &bing}, {PREPOPULATED_ENGINE_ID_DUCKDUCKGO, &duckduckgo}, + {PREPOPULATED_ENGINE_ID_DUCKDUCKGO_DE, &duckduckgo_de}, + {PREPOPULATED_ENGINE_ID_DUCKDUCKGO_AU_NZ_IE, &duckduckgo_au_nz_ie}, #if defined(OS_ANDROID) {PREPOPULATED_ENGINE_ID_DUCKDUCKGO_LITE, &duckduckgo_lite}, #endif @@ -45,22 +47,8 @@ const std::map {PREPOPULATED_ENGINE_ID_STARTPAGE, &startpage}, }; -// Engine ID to use as the default engine. -const BravePrepopulatedEngineID kDefaultEngineID = - PREPOPULATED_ENGINE_ID_GOOGLE; - -// A map to keep track of default engines for countries that don't use the -// regular default engine. -const std::map - default_engine_by_country_id_map = { - {country_codes::CountryCharsToCountryID('D', 'E'), - PREPOPULATED_ENGINE_ID_QWANT}, - {country_codes::CountryCharsToCountryID('F', 'R'), - PREPOPULATED_ENGINE_ID_QWANT} -}; - // Default order in which engines will appear in the UI. -const BravePrepopulatedEngineID brave_engines_default[] = { +std::vector brave_engines_default = { PREPOPULATED_ENGINE_ID_GOOGLE, PREPOPULATED_ENGINE_ID_DUCKDUCKGO, #if defined(OS_ANDROID) @@ -71,20 +59,20 @@ const BravePrepopulatedEngineID brave_engines_default[] = { PREPOPULATED_ENGINE_ID_STARTPAGE, }; -// Germany - Qwant appears on top. -const BravePrepopulatedEngineID brave_engines_DE[] = { - PREPOPULATED_ENGINE_ID_QWANT, - PREPOPULATED_ENGINE_ID_GOOGLE, - PREPOPULATED_ENGINE_ID_DUCKDUCKGO, +// Germany - DDG appears on top. +std::vector brave_engines_DE = { + PREPOPULATED_ENGINE_ID_DUCKDUCKGO_DE, #if defined(OS_ANDROID) PREPOPULATED_ENGINE_ID_DUCKDUCKGO_LITE, #endif + PREPOPULATED_ENGINE_ID_QWANT, + PREPOPULATED_ENGINE_ID_GOOGLE, PREPOPULATED_ENGINE_ID_BING, PREPOPULATED_ENGINE_ID_STARTPAGE, }; // France - Qwant appears on top. -const BravePrepopulatedEngineID brave_engines_FR[] = { +std::vector brave_engines_FR = { PREPOPULATED_ENGINE_ID_QWANT, PREPOPULATED_ENGINE_ID_GOOGLE, PREPOPULATED_ENGINE_ID_DUCKDUCKGO, @@ -95,24 +83,46 @@ const BravePrepopulatedEngineID brave_engines_FR[] = { PREPOPULATED_ENGINE_ID_STARTPAGE, }; +// Australia / NZ / IE - DDG appears on top. +std::vector brave_engines_AU_NZ_IE = { + PREPOPULATED_ENGINE_ID_DUCKDUCKGO_AU_NZ_IE, +#if defined(OS_ANDROID) + PREPOPULATED_ENGINE_ID_DUCKDUCKGO_LITE, +#endif + PREPOPULATED_ENGINE_ID_GOOGLE, + PREPOPULATED_ENGINE_ID_QWANT, + PREPOPULATED_ENGINE_ID_BING, + PREPOPULATED_ENGINE_ID_STARTPAGE}; + +// A map to keep track of default engines for countries that don't use the +// regular default engine. +const std::map> + default_engines_by_country_id_map = { + {country_codes::CountryCharsToCountryID('D', 'E'), brave_engines_DE}, + {country_codes::CountryCharsToCountryID('F', 'R'), brave_engines_FR}, + {country_codes::CountryCharsToCountryID('A', 'U'), + brave_engines_AU_NZ_IE}, + {country_codes::CountryCharsToCountryID('N', 'Z'), + brave_engines_AU_NZ_IE}, + {country_codes::CountryCharsToCountryID('I', 'E'), + brave_engines_AU_NZ_IE}}; + // Builds a vector of PrepulatedEngine objects from the given array of // |engine_ids|. Fills in the default engine index for the given |country_id|, // if asked. std::vector GetEnginesFromEngineIDs( - const BravePrepopulatedEngineID engine_ids[], - size_t num_ids, + const std::vector& engine_ids, int country_id, BravePrepopulatedEngineID default_engine_id, size_t* default_search_provider_index = nullptr) { - DCHECK(engine_ids); - DCHECK(num_ids); std::vector engines; - for (size_t i = 0; i < num_ids; ++i) { - const PrepopulatedEngine* engine = brave_engines_map.at(engine_ids[i]); + for (size_t i = 0; i < engine_ids.size(); ++i) { + const PrepopulatedEngine* engine = brave_engines_map.at(engine_ids.at(i)); DCHECK(engine); if (engine) { engines.push_back(engine); - if (default_search_provider_index && default_engine_id == engine_ids[i]) + if (default_search_provider_index && + default_engine_id == engine_ids.at(i)) *default_search_provider_index = i; } } @@ -140,34 +150,26 @@ std::vector> GetBravePrepopulatedEnginesForCountryID( int country_id, size_t* default_search_provider_index = nullptr) { - const BravePrepopulatedEngineID* brave_engines; - size_t num_brave_engines; + std::vector brave_engines; + // Check for exceptions from the default list of engines - if (country_codes::CountryCharsToCountryID('D', 'E') == country_id) { - brave_engines = brave_engines_DE; - num_brave_engines = base::size(brave_engines_DE); - } else if (country_codes::CountryCharsToCountryID('F', 'R') == country_id) { - brave_engines = brave_engines_FR; - num_brave_engines = base::size(brave_engines_FR); + const auto& it = default_engines_by_country_id_map.find(country_id); + if (it != default_engines_by_country_id_map.end()) { + brave_engines = it->second; } else { brave_engines = brave_engines_default; - num_brave_engines = base::size(brave_engines_default); } - DCHECK(brave_engines); - DCHECK(num_brave_engines); + DCHECK_GT(brave_engines.size(), 0); - // Check for an exception to the default engine - BravePrepopulatedEngineID default_id = kDefaultEngineID; - const auto& it = default_engine_by_country_id_map.find(country_id); - if (it != default_engine_by_country_id_map.end()) - default_id = it->second; + // Default engine is the first in the list + BravePrepopulatedEngineID default_id = brave_engines.front(); // Build a vector PrepopulatedEngines from BravePrepopulatedEngineIDs and // also get the default engine index std::vector engines = - GetEnginesFromEngineIDs(brave_engines, num_brave_engines, country_id, + GetEnginesFromEngineIDs(brave_engines, country_id, default_id, default_search_provider_index); - DCHECK(engines.size() == num_brave_engines); + DCHECK(engines.size() == brave_engines.size()); std::vector> t_urls; for (const PrepopulatedEngine* engine : engines) { diff --git a/components/search_engines/brave_prepopulated_engines.cc b/components/search_engines/brave_prepopulated_engines.cc index afc0d561901a..6e9a99ca810c 100644 --- a/components/search_engines/brave_prepopulated_engines.cc +++ b/components/search_engines/brave_prepopulated_engines.cc @@ -12,7 +12,7 @@ namespace TemplateURLPrepopulateData { // IMPORTANT! Make sure to bump this value if you make changes to the // engines below or add/remove engines. -const int kBraveCurrentDataVersion = 4; +const int kBraveCurrentDataVersion = 5; const PrepopulatedEngine duckduckgo = { L"DuckDuckGo", @@ -35,6 +35,48 @@ const PrepopulatedEngine duckduckgo = { PREPOPULATED_ENGINE_ID_DUCKDUCKGO, }; +const PrepopulatedEngine duckduckgo_de = { + L"DuckDuckGo", + L":d", + "https://duckduckgo.com/favicon.ico", + "https://duckduckgo.com/?q={searchTerms}&t=bravened", + "UTF-8", + "https://ac.duckduckgo.com/ac/?q={searchTerms}&type=list", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + SEARCH_ENGINE_OTHER, + PREPOPULATED_ENGINE_ID_DUCKDUCKGO_DE, +}; + +const PrepopulatedEngine duckduckgo_au_nz_ie = { + L"DuckDuckGo", + L":d", + "https://duckduckgo.com/favicon.ico", + "https://duckduckgo.com/?q={searchTerms}&t=braveed", + "UTF-8", + "https://ac.duckduckgo.com/ac/?q={searchTerms}&type=list", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + SEARCH_ENGINE_OTHER, + PREPOPULATED_ENGINE_ID_DUCKDUCKGO_AU_NZ_IE, +}; + #if defined(OS_ANDROID) const PrepopulatedEngine duckduckgo_lite = { L"DuckDuckGo Lite", diff --git a/components/search_engines/brave_prepopulated_engines.h b/components/search_engines/brave_prepopulated_engines.h index 24281f9fddea..5bc4372e4134 100644 --- a/components/search_engines/brave_prepopulated_engines.h +++ b/components/search_engines/brave_prepopulated_engines.h @@ -49,6 +49,8 @@ enum BravePrepopulatedEngineID : unsigned int { PREPOPULATED_ENGINE_ID_WIKIPEDIA, // No longer in defaults (2/2019). PREPOPULATED_ENGINE_ID_WOLFRAMALPHA, // No longer in defaults (2/2019). PREPOPULATED_ENGINE_ID_YOUTUBE, // No longer in defaults (2/2019). + PREPOPULATED_ENGINE_ID_DUCKDUCKGO_DE, + PREPOPULATED_ENGINE_ID_DUCKDUCKGO_AU_NZ_IE, }; extern const PrepopulatedEngine duckduckgo;