Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/search_engines/template_url_prepopulate_data.h" | 5 #include "components/search_engines/template_url_prepopulate_data.h" |
| 6 | 6 |
| 7 #if defined(OS_POSIX) && !defined(OS_MACOSX) | 7 #if defined(OS_POSIX) && !defined(OS_MACOSX) |
| 8 #include <locale.h> | 8 #include <locale.h> |
| 9 #endif | 9 #endif |
| 10 | 10 |
| (...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 529 } | 529 } |
| 530 | 530 |
| 531 // SPECIAL CASE: Timor-Leste changed from 'TP' to 'TL' in 2002. Windows XP | 531 // SPECIAL CASE: Timor-Leste changed from 'TP' to 'TL' in 2002. Windows XP |
| 532 // predates this; we therefore map this value. | 532 // predates this; we therefore map this value. |
| 533 if (c1 == 'T' && c2 == 'P') | 533 if (c1 == 'T' && c2 == 'P') |
| 534 c2 = 'L'; | 534 c2 = 'L'; |
| 535 | 535 |
| 536 return CountryCharsToCountryID(c1, c2); | 536 return CountryCharsToCountryID(c1, c2); |
| 537 } | 537 } |
| 538 | 538 |
| 539 #if defined(OS_WIN) | |
| 540 | |
| 541 // For reference, a list of GeoIDs can be found at | |
| 542 // http://msdn.microsoft.com/en-us/library/dd374073.aspx . | |
| 543 int GeoIDToCountryID(GEOID geo_id) { | |
| 544 const int kISOBufferSize = 3; // Two plus one for the terminator. | |
| 545 wchar_t isobuf[kISOBufferSize] = { 0 }; | |
| 546 int retval = GetGeoInfo(geo_id, GEO_ISO2, isobuf, kISOBufferSize, 0); | |
| 547 | |
| 548 if (retval == kISOBufferSize && | |
| 549 !(isobuf[0] == L'X' && isobuf[1] == L'X')) | |
| 550 return CountryCharsToCountryIDWithUpdate(static_cast<char>(isobuf[0]), | |
| 551 static_cast<char>(isobuf[1])); | |
| 552 | |
| 553 // Various locations have ISO codes that Windows does not return. | |
| 554 switch (geo_id) { | |
| 555 case 0x144: // Guernsey | |
| 556 return CountryCharsToCountryID('G', 'G'); | |
| 557 case 0x148: // Jersey | |
| 558 return CountryCharsToCountryID('J', 'E'); | |
| 559 case 0x3B16: // Isle of Man | |
| 560 return CountryCharsToCountryID('I', 'M'); | |
| 561 | |
| 562 // 'UM' (U.S. Minor Outlying Islands) | |
| 563 case 0x7F: // Johnston Atoll | |
| 564 case 0x102: // Wake Island | |
| 565 case 0x131: // Baker Island | |
| 566 case 0x146: // Howland Island | |
| 567 case 0x147: // Jarvis Island | |
| 568 case 0x149: // Kingman Reef | |
| 569 case 0x152: // Palmyra Atoll | |
| 570 case 0x52FA: // Midway Islands | |
| 571 return CountryCharsToCountryID('U', 'M'); | |
| 572 | |
| 573 // 'SH' (Saint Helena) | |
| 574 case 0x12F: // Ascension Island | |
| 575 case 0x15C: // Tristan da Cunha | |
| 576 return CountryCharsToCountryID('S', 'H'); | |
| 577 | |
| 578 // 'IO' (British Indian Ocean Territory) | |
| 579 case 0x13A: // Diego Garcia | |
| 580 return CountryCharsToCountryID('I', 'O'); | |
| 581 | |
| 582 // Other cases where there is no ISO country code; we assign countries that | |
| 583 // can serve as reasonable defaults. | |
| 584 case 0x154: // Rota Island | |
| 585 case 0x155: // Saipan | |
| 586 case 0x15A: // Tinian Island | |
| 587 return CountryCharsToCountryID('U', 'S'); | |
| 588 case 0x134: // Channel Islands | |
| 589 return CountryCharsToCountryID('G', 'B'); | |
| 590 case 0x143: // Guantanamo Bay | |
| 591 default: | |
| 592 return kCountryIDUnknown; | |
| 593 } | |
| 594 } | |
| 595 | |
| 596 int GetCurrentCountryID() { | |
| 597 GEOID geo_id = GetUserGeoID(GEOCLASS_NATION); | |
| 598 | |
| 599 return GeoIDToCountryID(geo_id); | |
| 600 } | |
| 601 | |
| 602 #elif defined(OS_MACOSX) | |
| 603 | |
| 604 int GetCurrentCountryID() { | |
| 605 base::ScopedCFTypeRef<CFLocaleRef> locale(CFLocaleCopyCurrent()); | |
| 606 CFStringRef country = (CFStringRef)CFLocaleGetValue(locale.get(), | |
| 607 kCFLocaleCountryCode); | |
| 608 if (!country) | |
| 609 return kCountryIDUnknown; | |
| 610 | |
| 611 UniChar isobuf[2]; | |
| 612 CFRange char_range = CFRangeMake(0, 2); | |
| 613 CFStringGetCharacters(country, char_range, isobuf); | |
| 614 | |
| 615 return CountryCharsToCountryIDWithUpdate(static_cast<char>(isobuf[0]), | |
| 616 static_cast<char>(isobuf[1])); | |
| 617 } | |
| 618 | |
| 619 #elif defined(OS_ANDROID) | |
| 620 | |
| 621 int GetCurrentCountryID() { | |
| 622 const std::string& country_code = base::android::GetDefaultCountryCode(); | |
| 623 return (country_code.size() == 2) ? | |
| 624 CountryCharsToCountryIDWithUpdate(country_code[0], country_code[1]) : | |
| 625 kCountryIDUnknown; | |
| 626 } | |
| 627 | |
| 628 #elif defined(OS_POSIX) | |
| 629 | |
| 630 int GetCurrentCountryID() { | |
| 631 const char* locale = setlocale(LC_MESSAGES, NULL); | |
| 632 | |
| 633 if (!locale) | |
| 634 return kCountryIDUnknown; | |
| 635 | |
| 636 // The format of a locale name is: | |
| 637 // language[_territory][.codeset][@modifier], where territory is an ISO 3166 | |
| 638 // country code, which is what we want. | |
| 639 std::string locale_str(locale); | |
| 640 size_t begin = locale_str.find('_'); | |
| 641 if (begin == std::string::npos || locale_str.size() - begin < 3) | |
| 642 return kCountryIDUnknown; | |
| 643 | |
| 644 ++begin; | |
| 645 size_t end = locale_str.find_first_of(".@", begin); | |
| 646 if (end == std::string::npos) | |
| 647 end = locale_str.size(); | |
| 648 | |
| 649 // The territory part must contain exactly two characters. | |
| 650 if (end - begin == 2) { | |
| 651 return CountryCharsToCountryIDWithUpdate( | |
| 652 base::ToUpperASCII(locale_str[begin]), | |
| 653 base::ToUpperASCII(locale_str[begin + 1])); | |
| 654 } | |
| 655 | |
| 656 return kCountryIDUnknown; | |
| 657 } | |
| 658 | |
| 659 #endif // OS_* | |
| 660 | |
| 661 int GetCountryIDFromPrefs(PrefService* prefs) { | 539 int GetCountryIDFromPrefs(PrefService* prefs) { |
| 662 if (!prefs) | 540 if (!prefs) |
| 663 return GetCurrentCountryID(); | 541 return GetCurrentCountryID(); |
| 664 | 542 |
| 665 // Cache first run Country ID value in prefs, and use it afterwards. This | 543 // Cache first run Country ID value in prefs, and use it afterwards. This |
| 666 // ensures that just because the user moves around, we won't automatically | 544 // ensures that just because the user moves around, we won't automatically |
| 667 // make major changes to their available search providers, which would feel | 545 // make major changes to their available search providers, which would feel |
| 668 // surprising. | 546 // surprising. |
| 669 if (!prefs->HasPrefPath(prefs::kCountryIDAtInstall)) { | 547 if (!prefs->HasPrefPath(prefs::kCountryIDAtInstall)) { |
| 670 prefs->SetInteger(prefs::kCountryIDAtInstall, GetCurrentCountryID()); | 548 prefs->SetInteger(prefs::kCountryIDAtInstall, GetCurrentCountryID()); |
| (...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1173 | 1051 |
| 1174 bool SameDomain(const GURL& given_url, const GURL& prepopulated_url) { | 1052 bool SameDomain(const GURL& given_url, const GURL& prepopulated_url) { |
| 1175 return prepopulated_url.is_valid() && | 1053 return prepopulated_url.is_valid() && |
| 1176 net::registry_controlled_domains::SameDomainOrHost( | 1054 net::registry_controlled_domains::SameDomainOrHost( |
| 1177 given_url, prepopulated_url, | 1055 given_url, prepopulated_url, |
| 1178 net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); | 1056 net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); |
| 1179 } | 1057 } |
| 1180 | 1058 |
| 1181 } // namespace | 1059 } // namespace |
| 1182 | 1060 |
| 1061 #if defined(OS_WIN) | |
| 1062 | |
| 1063 namespace { | |
| 1064 | |
| 1065 // For reference, a list of GeoIDs can be found at | |
| 1066 // http://msdn.microsoft.com/en-us/library/dd374073.aspx . | |
| 1067 int GeoIDToCountryID(GEOID geo_id) { | |
|
Peter Kasting
2015/05/18 18:31:34
Nit: Leave this function (still #if'd) where it us
sdefresne
2015/05/19 09:04:22
Done.
| |
| 1068 const int kISOBufferSize = 3; // Two plus one for the terminator. | |
| 1069 wchar_t isobuf[kISOBufferSize] = { 0 }; | |
| 1070 int retval = GetGeoInfo(geo_id, GEO_ISO2, isobuf, kISOBufferSize, 0); | |
| 1071 | |
| 1072 if (retval == kISOBufferSize && | |
| 1073 !(isobuf[0] == L'X' && isobuf[1] == L'X')) | |
| 1074 return CountryCharsToCountryIDWithUpdate(static_cast<char>(isobuf[0]), | |
| 1075 static_cast<char>(isobuf[1])); | |
| 1076 | |
| 1077 // Various locations have ISO codes that Windows does not return. | |
| 1078 switch (geo_id) { | |
| 1079 case 0x144: // Guernsey | |
| 1080 return CountryCharsToCountryID('G', 'G'); | |
| 1081 case 0x148: // Jersey | |
| 1082 return CountryCharsToCountryID('J', 'E'); | |
| 1083 case 0x3B16: // Isle of Man | |
| 1084 return CountryCharsToCountryID('I', 'M'); | |
| 1085 | |
| 1086 // 'UM' (U.S. Minor Outlying Islands) | |
| 1087 case 0x7F: // Johnston Atoll | |
| 1088 case 0x102: // Wake Island | |
| 1089 case 0x131: // Baker Island | |
| 1090 case 0x146: // Howland Island | |
| 1091 case 0x147: // Jarvis Island | |
| 1092 case 0x149: // Kingman Reef | |
| 1093 case 0x152: // Palmyra Atoll | |
| 1094 case 0x52FA: // Midway Islands | |
| 1095 return CountryCharsToCountryID('U', 'M'); | |
| 1096 | |
| 1097 // 'SH' (Saint Helena) | |
| 1098 case 0x12F: // Ascension Island | |
| 1099 case 0x15C: // Tristan da Cunha | |
| 1100 return CountryCharsToCountryID('S', 'H'); | |
| 1101 | |
| 1102 // 'IO' (British Indian Ocean Territory) | |
| 1103 case 0x13A: // Diego Garcia | |
| 1104 return CountryCharsToCountryID('I', 'O'); | |
| 1105 | |
| 1106 // Other cases where there is no ISO country code; we assign countries that | |
| 1107 // can serve as reasonable defaults. | |
| 1108 case 0x154: // Rota Island | |
| 1109 case 0x155: // Saipan | |
| 1110 case 0x15A: // Tinian Island | |
| 1111 return CountryCharsToCountryID('U', 'S'); | |
| 1112 case 0x134: // Channel Islands | |
| 1113 return CountryCharsToCountryID('G', 'B'); | |
| 1114 case 0x143: // Guantanamo Bay | |
| 1115 default: | |
| 1116 return kCountryIDUnknown; | |
| 1117 } | |
| 1118 } | |
| 1119 | |
| 1120 } // namespace | |
| 1121 | |
| 1122 int GetCurrentCountryID() { | |
| 1123 GEOID geo_id = GetUserGeoID(GEOCLASS_NATION); | |
| 1124 | |
| 1125 return GeoIDToCountryID(geo_id); | |
| 1126 } | |
| 1127 | |
| 1128 #elif defined(OS_MACOSX) | |
| 1129 | |
| 1130 int GetCurrentCountryID() { | |
| 1131 base::ScopedCFTypeRef<CFLocaleRef> locale(CFLocaleCopyCurrent()); | |
| 1132 CFStringRef country = (CFStringRef)CFLocaleGetValue(locale.get(), | |
| 1133 kCFLocaleCountryCode); | |
| 1134 if (!country) | |
| 1135 return kCountryIDUnknown; | |
| 1136 | |
| 1137 UniChar isobuf[2]; | |
| 1138 CFRange char_range = CFRangeMake(0, 2); | |
| 1139 CFStringGetCharacters(country, char_range, isobuf); | |
| 1140 | |
| 1141 return CountryCharsToCountryIDWithUpdate(static_cast<char>(isobuf[0]), | |
| 1142 static_cast<char>(isobuf[1])); | |
| 1143 } | |
| 1144 | |
| 1145 #elif defined(OS_ANDROID) | |
| 1146 | |
| 1147 int GetCurrentCountryID() { | |
| 1148 const std::string& country_code = base::android::GetDefaultCountryCode(); | |
| 1149 return (country_code.size() == 2) ? | |
| 1150 CountryCharsToCountryIDWithUpdate(country_code[0], country_code[1]) : | |
| 1151 kCountryIDUnknown; | |
| 1152 } | |
| 1153 | |
| 1154 #elif defined(OS_POSIX) | |
| 1155 | |
| 1156 int GetCurrentCountryID() { | |
| 1157 const char* locale = setlocale(LC_MESSAGES, NULL); | |
| 1158 | |
| 1159 if (!locale) | |
| 1160 return kCountryIDUnknown; | |
| 1161 | |
| 1162 // The format of a locale name is: | |
| 1163 // language[_territory][.codeset][@modifier], where territory is an ISO 3166 | |
| 1164 // country code, which is what we want. | |
| 1165 std::string locale_str(locale); | |
| 1166 size_t begin = locale_str.find('_'); | |
| 1167 if (begin == std::string::npos || locale_str.size() - begin < 3) | |
| 1168 return kCountryIDUnknown; | |
| 1169 | |
| 1170 ++begin; | |
| 1171 size_t end = locale_str.find_first_of(".@", begin); | |
| 1172 if (end == std::string::npos) | |
| 1173 end = locale_str.size(); | |
| 1174 | |
| 1175 // The territory part must contain exactly two characters. | |
| 1176 if (end - begin == 2) { | |
| 1177 return CountryCharsToCountryIDWithUpdate( | |
| 1178 base::ToUpperASCII(locale_str[begin]), | |
| 1179 base::ToUpperASCII(locale_str[begin + 1])); | |
| 1180 } | |
| 1181 | |
| 1182 return kCountryIDUnknown; | |
| 1183 } | |
| 1184 | |
| 1185 #endif // OS_* | |
| 1183 | 1186 |
| 1184 // Global functions ----------------------------------------------------------- | 1187 // Global functions ----------------------------------------------------------- |
| 1185 | 1188 |
| 1186 void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { | 1189 void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { |
| 1187 registry->RegisterIntegerPref(prefs::kCountryIDAtInstall, kCountryIDUnknown); | 1190 registry->RegisterIntegerPref(prefs::kCountryIDAtInstall, kCountryIDUnknown); |
| 1188 registry->RegisterListPref(prefs::kSearchProviderOverrides); | 1191 registry->RegisterListPref(prefs::kSearchProviderOverrides); |
| 1189 registry->RegisterIntegerPref(prefs::kSearchProviderOverridesVersion, -1); | 1192 registry->RegisterIntegerPref(prefs::kSearchProviderOverridesVersion, -1); |
| 1190 } | 1193 } |
| 1191 | 1194 |
| 1192 int GetDataVersion(PrefService* prefs) { | 1195 int GetDataVersion(PrefService* prefs) { |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1271 for (size_t j = 0; j < kAllEngines[i]->alternate_urls_size; ++j) { | 1274 for (size_t j = 0; j < kAllEngines[i]->alternate_urls_size; ++j) { |
| 1272 if (SameDomain(url, GURL(kAllEngines[i]->alternate_urls[j]))) | 1275 if (SameDomain(url, GURL(kAllEngines[i]->alternate_urls[j]))) |
| 1273 return kAllEngines[i]->type; | 1276 return kAllEngines[i]->type; |
| 1274 } | 1277 } |
| 1275 } | 1278 } |
| 1276 | 1279 |
| 1277 return SEARCH_ENGINE_OTHER; | 1280 return SEARCH_ENGINE_OTHER; |
| 1278 } | 1281 } |
| 1279 | 1282 |
| 1280 } // namespace TemplateURLPrepopulateData | 1283 } // namespace TemplateURLPrepopulateData |
| OLD | NEW |