1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/search_engines/template_url_prepopulate_data.h"
6
7 #if defined(OS_POSIX) && !defined(OS_MACOSX)
8 #include <locale.h>
9 #endif
10
11 #include "base/logging.h"
12 #include "base/prefs/pref_service.h"
13 #include "base/stl_util.h"
14 #include "base/strings/string16.h"
15 #include "base/strings/string_piece.h"
16 #include "base/strings/string_util.h"
17 #include "base/strings/utf_string_conversions.h"
18 #include "chrome/browser/search_engines/template_url.h"
19 #include "chrome/common/pref_names.h"
20 #include "components/google/core/browser/google_util.h"
21 #include "components/pref_registry/pref_registry_syncable.h"
22 #include "components/search_engines/prepopulated_engines.h"
23 #include "content/public/browser/browser_thread.h"
24 #include "grit/generated_resources.h"
25 #include "grit/theme_resources.h"
26 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
27 #include "ui/base/l10n/l10n_util.h"
28 #include "url/gurl.h"
29
30 #if defined(OS_WIN)
31 #undef IN // On Windows, windef.h defines this, which screws up "India" cases.
32 #elif defined(OS_MACOSX)
33 #include "base/mac/scoped_cftyperef.h"
34 #endif
35
36 namespace TemplateURLPrepopulateData {
37
38
39 // Helpers --------------------------------------------------------------------
40
41 namespace {
42
43 // NOTE: You should probably not change the data in this file without changing
44 // |kCurrentDataVersion| in prepopulated_engines.json. See comments in
45 // GetDataVersion() below!
46
47 // Put the engines within each country in order with most interesting/important
48 // first. The default will be the first engine.
49
50 // Default (for countries with no better engine set)
51 const PrepopulatedEngine* engines_default[] =
52 { &google, &bing, &yahoo, };
53
54 // United Arab Emirates
55 const PrepopulatedEngine* engines_AE[] =
56 { &google, &yahoo_maktoob, &bing_ar_XA, &bing_en_XA, };
57
58 // Albania
59 const PrepopulatedEngine* engines_AL[] =
60 { &google, &yahoo, &bing_en_XA, &bing_ar_XA, };
61
62 // Argentina
63 const PrepopulatedEngine* engines_AR[] =
64 { &google, &bing_es_AR, &yahoo_ar, };
65
66 // Austria
67 const PrepopulatedEngine* engines_AT[] =
68 { &google, &bing_de_AT, &yahoo_at, };
69
70 // Australia
71 const PrepopulatedEngine* engines_AU[] =
72 { &google, &bing_en_AU, &yahoo_au, };
73
74 // Bosnia and Herzegovina
75 const PrepopulatedEngine* engines_BA[] =
76 { &google, &yahoo, &bing, };
77
78 // Belgium
79 const PrepopulatedEngine* engines_BE[] =
80 { &google, &bing_nl_BE, &bing_fr_BE, &yahoo, &yahoo_fr, };
81
82 // Bulgaria
83 const PrepopulatedEngine* engines_BG[] =
84 { &google, &bing, &ask, };
85
86 // Bahrain
87 const PrepopulatedEngine* engines_BH[] =
88 { &google, &yahoo_maktoob, &bing_en_XA, &bing_ar_XA, };
89
90 // Burundi
91 const PrepopulatedEngine* engines_BI[] =
92 { &google, &yahoo, &bing, };
93
94 // Brunei
95 const PrepopulatedEngine* engines_BN[] =
96 { &google, &yahoo_my, &bing, };
97
98 // Bolivia
99 const PrepopulatedEngine* engines_BO[] =
100 { &google, &bing_es_XL, &yahoo, };
101
102 // Brazil
103 const PrepopulatedEngine* engines_BR[] =
104 { &google, &ask_br, &bing_pt_BR, &yahoo_br, };
105
106 // Belarus
107 const PrepopulatedEngine* engines_BY[] =
108 { &google, &yahoo_ru, &bing_ru_RU, };
109
110 // Belize
111 const PrepopulatedEngine* engines_BZ[] =
112 { &google, &yahoo, &bing, };
113
114 // Canada
115 const PrepopulatedEngine* engines_CA[] =
116 { &google, &bing_en_CA, &bing_fr_CA, &ask, &yahoo_ca, &yahoo_qc, };
117
118 // Switzerland
119 const PrepopulatedEngine* engines_CH[] =
120 { &google, &bing_de_CH, &bing_fr_CH, &yahoo_ch, };
121
122 // Chile
123 const PrepopulatedEngine* engines_CL[] =
124 { &google, &bing_es_CL, &yahoo_cl, };
125
126 // China
127 const PrepopulatedEngine* engines_CN[] =
128 { &google, &baidu, &sogou, };
129
130 // Colombia
131 const PrepopulatedEngine* engines_CO[] =
132 { &google, &bing_es_XL, &yahoo_co, };
133
134 // Costa Rica
135 const PrepopulatedEngine* engines_CR[] =
136 { &google, &yahoo, &bing_es_XL, };
137
138 // Czech Republic
139 const PrepopulatedEngine* engines_CZ[] =
140 { &google, &seznam, &bing, };
141
142 // Germany
143 const PrepopulatedEngine* engines_DE[] =
144 { &google, &bing_de_DE, &yahoo_de };
145
146 // Denmark
147 const PrepopulatedEngine* engines_DK[] =
148 { &google, &bing_da_DK, &yahoo_dk, };
149
150 // Dominican Republic
151 const PrepopulatedEngine* engines_DO[] =
152 { &google, &yahoo, &bing_es_XL, };
153
154 // Algeria
155 const PrepopulatedEngine* engines_DZ[] =
156 { &google, &bing_ar_XA, &bing_en_XA, &yahoo_maktoob, };
157
158 // Ecuador
159 const PrepopulatedEngine* engines_EC[] =
160 { &google, &bing_es_XL, &yahoo, };
161
162 // Estonia
163 const PrepopulatedEngine* engines_EE[] =
164 { &google, &bing, &yahoo, };
165
166 // Egypt
167 const PrepopulatedEngine* engines_EG[] =
168 { &google, &yahoo_maktoob, &bing_ar_XA, &bing_en_XA, };
169
170 // Spain
171 const PrepopulatedEngine* engines_ES[] =
172 { &google, &bing_es_ES, &yahoo_es, };
173
174 // Faroe Islands
175 const PrepopulatedEngine* engines_FO[] =
176 { &google, &bing_da_DK, &ask, };
177
178 // Finland
179 const PrepopulatedEngine* engines_FI[] =
180 { &google, &bing_fi_FI, &yahoo_fi, };
181
182 // France
183 const PrepopulatedEngine* engines_FR[] =
184 { &google, &bing_fr_FR, &yahoo_fr, };
185
186 // United Kingdom
187 const PrepopulatedEngine* engines_GB[] =
188 { &google, &bing_en_GB, &yahoo_uk, &ask_uk, };
189
190 // Greece
191 const PrepopulatedEngine* engines_GR[] =
192 { &google, &bing, &yahoo_gr, };
193
194 // Guatemala
195 const PrepopulatedEngine* engines_GT[] =
196 { &google, &yahoo, &bing_es_XL, };
197
198 // Hong Kong
199 const PrepopulatedEngine* engines_HK[] =
200 { &google, &yahoo_hk, &baidu, &bing_zh_HK, };
201
202 // Honduras
203 const PrepopulatedEngine* engines_HN[] =
204 { &google, &yahoo, &bing_es_XL, };
205
206 // Croatia
207 const PrepopulatedEngine* engines_HR[] =
208 { &google, &bing, &yahoo, };
209
210 // Hungary
211 const PrepopulatedEngine* engines_HU[] =
212 { &google, &bing, &yahoo, };
213
214 // Indonesia
215 const PrepopulatedEngine* engines_ID[] =
216 { &google, &yahoo_id, &bing, };
217
218 // Ireland
219 const PrepopulatedEngine* engines_IE[] =
220 { &google, &bing_en_IE, &yahoo_uk, };
221
222 // Israel
223 const PrepopulatedEngine* engines_IL[] =
224 { &google, &yahoo, &bing, };
225
226 // India
227 const PrepopulatedEngine* engines_IN[] =
228 { &google, &bing_en_IN, &yahoo_in, };
229
230 // Iraq
231 const PrepopulatedEngine* engines_IQ[] =
232 { &google, &yahoo_maktoob, &bing_ar_XA, &bing_en_XA, };
233
234 // Iran
235 const PrepopulatedEngine* engines_IR[] =
236 { &google, &yahoo, &bing, };
237
238 // Iceland
239 const PrepopulatedEngine* engines_IS[] =
240 { &google, &bing, &yahoo, };
241
242 // Italy
243 const PrepopulatedEngine* engines_IT[] =
244 { &google, &virgilio, &bing_it_IT, };
245
246 // Jamaica
247 const PrepopulatedEngine* engines_JM[] =
248 { &google, &yahoo, &bing, };
249
250 // Jordan
251 const PrepopulatedEngine* engines_JO[] =
252 { &google, &yahoo_maktoob, &bing_ar_XA, &bing_en_XA, };
253
254 // Japan
255 const PrepopulatedEngine* engines_JP[] =
256 { &google, &yahoo_jp, &bing_ja_JP, };
257
258 // Kenya
259 const PrepopulatedEngine* engines_KE[] =
260 { &google, &yahoo, &bing, };
261
262 // Kuwait
263 const PrepopulatedEngine* engines_KW[] =
264 { &google, &yahoo_maktoob, &bing_ar_XA, &bing_en_XA, };
265
266 // South Korea
267 const PrepopulatedEngine* engines_KR[] =
268 { &google, &naver, &daum, };
269
270 // Kazakhstan
271 const PrepopulatedEngine* engines_KZ[] =
272 { &google, &bing, &yahoo, };
273
274 // Lebanon
275 const PrepopulatedEngine* engines_LB[] =
276 { &google, &yahoo_maktoob, &bing_ar_XA, &bing_en_XA, };
277
278 // Liechtenstein
279 const PrepopulatedEngine* engines_LI[] =
280 { &google, &bing_de_DE, &yahoo_de, };
281
282 // Lithuania
283 const PrepopulatedEngine* engines_LT[] =
284 { &google, &bing, &yandex_ru, };
285
286 // Luxembourg
287 const PrepopulatedEngine* engines_LU[] =
288 { &google, &bing_fr_FR, &yahoo_fr, };
289
290 // Latvia
291 const PrepopulatedEngine* engines_LV[] =
292 { &google, &yandex_ru, &bing, };
293
294 // Libya
295 const PrepopulatedEngine* engines_LY[] =
296 { &google, &yahoo_maktoob, &bing_ar_XA, &bing_en_XA, };
297
298 // Morocco
299 const PrepopulatedEngine* engines_MA[] =
300 { &google, &bing_ar_XA, &bing_en_XA, &yahoo_maktoob, };
301
302 // Monaco
303 const PrepopulatedEngine* engines_MC[] =
304 { &google, &yahoo_fr, &bing_fr_FR, };
305
306 // Moldova
307 const PrepopulatedEngine* engines_MD[] =
308 { &google, &bing, &yahoo, };
309
310 // Montenegro
311 const PrepopulatedEngine* engines_ME[] =
312 { &google, &bing, &yahoo, };
313
314 // Macedonia
315 const PrepopulatedEngine* engines_MK[] =
316 { &google, &yahoo, &bing, };
317
318 // Mexico
319 const PrepopulatedEngine* engines_MX[] =
320 { &google, &bing_es_MX, &yahoo_mx, };
321
322 // Malaysia
323 const PrepopulatedEngine* engines_MY[] =
324 { &google, &yahoo_my, &bing, };
325
326 // Nicaragua
327 const PrepopulatedEngine* engines_NI[] =
328 { &google, &yahoo, &bing_es_XL, };
329
330 // Netherlands
331 const PrepopulatedEngine* engines_NL[] =
332 { &google, &yahoo_nl, &vinden, };
333
334 // Norway
335 const PrepopulatedEngine* engines_NO[] =
336 { &google, &bing_nb_NO, &kvasir, };
337
338 // New Zealand
339 const PrepopulatedEngine* engines_NZ[] =
340 { &google, &bing_en_NZ, &yahoo_nz, };
341
342 // Oman
343 const PrepopulatedEngine* engines_OM[] =
344 { &google, &bing_ar_XA, &yahoo_maktoob, &bing_en_XA, };
345
346 // Panama
347 const PrepopulatedEngine* engines_PA[] =
348 { &google, &yahoo, &bing_es_XL, };
349
350 // Peru
351 const PrepopulatedEngine* engines_PE[] =
352 { &google, &bing_es_XL, &yahoo_pe, };
353
354 // Philippines
355 const PrepopulatedEngine* engines_PH[] =
356 { &google, &yahoo_ph, &bing_en_PH, };
357
358 // Pakistan
359 const PrepopulatedEngine* engines_PK[] =
360 { &google, &yahoo, &bing, };
361
362 // Puerto Rico
363 const PrepopulatedEngine* engines_PR[] =
364 { &google, &yahoo, &bing_es_XL, };
365
366 // Poland
367 const PrepopulatedEngine* engines_PL[] =
368 { &google, &onet, &bing_pl_PL, };
369
370 // Portugal
371 const PrepopulatedEngine* engines_PT[] =
372 { &google, &bing_pt_PT, &yahoo, };
373
374 // Paraguay
375 const PrepopulatedEngine* engines_PY[] =
376 { &google, &bing_es_XL, &yahoo, };
377
378 // Qatar
379 const PrepopulatedEngine* engines_QA[] =
380 { &google, &yahoo_maktoob, &bing_ar_XA, &bing_en_XA, };
381
382 // Romania
383 const PrepopulatedEngine* engines_RO[] =
384 { &google, &yahoo_ro, &bing, };
385
386 // Serbia
387 const PrepopulatedEngine* engines_RS[] =
388 { &google, &bing, &yahoo, };
389
390 // Russia
391 const PrepopulatedEngine* engines_RU[] =
392 { &google, &yandex_ru, &mail_ru, };
393
394 // Rwanda
395 const PrepopulatedEngine* engines_RW[] =
396 { &google, &bing, &yahoo, };
397
398 // Saudi Arabia
399 const PrepopulatedEngine* engines_SA[] =
400 { &google, &yahoo_maktoob, &bing_ar_XA, &bing_en_XA, };
401
402 // Sweden
403 const PrepopulatedEngine* engines_SE[] =
404 { &google, &bing_sv_SE, &yahoo_se, };
405
406 // Singapore
407 const PrepopulatedEngine* engines_SG[] =
408 { &google, &yahoo_sg, &bing_en_SG, };
409
410 // Slovenia
411 const PrepopulatedEngine* engines_SI[] =
412 { &google, &najdi, &ask, };
413
414 // Slovakia
415 const PrepopulatedEngine* engines_SK[] =
416 { &google, &bing, &yahoo, };
417
418 // El Salvador
419 const PrepopulatedEngine* engines_SV[] =
420 { &google, &yahoo, &bing_es_XL, };
421
422 // Syria
423 const PrepopulatedEngine* engines_SY[] =
424 { &google, &bing_ar_XA, &bing_en_XA, &yahoo_maktoob, };
425
426 // Thailand
427 const PrepopulatedEngine* engines_TH[] =
428 { &google, &yahoo_th, &bing, };
429
430 // Tunisia
431 const PrepopulatedEngine* engines_TN[] =
432 { &google, &bing_ar_XA, &bing_en_XA, &yahoo_maktoob, };
433
434 // Turkey
435 const PrepopulatedEngine* engines_TR[] =
436 { &google, &bing_tr_TR, &yahoo_tr, &yandex_tr, };
437
438 // Trinidad and Tobago
439 const PrepopulatedEngine* engines_TT[] =
440 { &google, &bing, &yahoo, };
441
442 // Taiwan
443 const PrepopulatedEngine* engines_TW[] =
444 { &google, &yahoo_tw, &bing_zh_TW, };
445
446 // Tanzania
447 const PrepopulatedEngine* engines_TZ[] =
448 { &google, &yahoo, &bing, };
449
450 // Ukraine
451 const PrepopulatedEngine* engines_UA[] =
452 { &google, &yandex_ua, &bing_ru_RU, };
453
454 // United States
455 const PrepopulatedEngine* engines_US[] =
456 { &google, &bing_en_US, &yahoo, &aol, &ask, };
457
458 // Uruguay
459 const PrepopulatedEngine* engines_UY[] =
460 { &google, &bing_es_XL, &yahoo, };
461
462 // Venezuela
463 const PrepopulatedEngine* engines_VE[] =
464 { &google, &bing_es_XL, &yahoo_ve, };
465
466 // Vietnam
467 const PrepopulatedEngine* engines_VN[] =
468 { &google, &yahoo_vn, &bing, };
469
470 // Yemen
471 const PrepopulatedEngine* engines_YE[] =
472 { &google, &bing_ar_XA, &bing_en_XA, &yahoo_maktoob, };
473
474 // South Africa
475 const PrepopulatedEngine* engines_ZA[] =
476 { &google, &bing, &yahoo, };
477
478 // Zimbabwe
479 const PrepopulatedEngine* engines_ZW[] =
480 { &google, &bing, &yahoo, &ask, };
481
482 // A list of all the engines that we know about.
483 const PrepopulatedEngine* kAllEngines[] = {
484 // Prepopulated engines:
485 &aol, &ask, &ask_br, &ask_uk, &baidu,
486 &bing, &bing_ar_XA, &bing_da_DK, &bing_de_AT, &bing_de_CH,
487 &bing_de_DE, &bing_en_AU, &bing_en_CA, &bing_en_GB, &bing_en_IE,
488 &bing_en_IN, &bing_en_NZ, &bing_en_PH, &bing_en_SG, &bing_en_US,
489 &bing_en_XA, &bing_es_AR, &bing_es_CL, &bing_es_ES, &bing_es_MX,
490 &bing_es_XL, &bing_fi_FI, &bing_fr_BE, &bing_fr_CA, &bing_fr_CH,
491 &bing_fr_FR, &bing_it_IT, &bing_ja_JP, &bing_lv_LV, &bing_nb_NO,
492 &bing_nl_BE, &bing_pl_PL, &bing_pt_BR, &bing_pt_PT, &bing_ru_RU,
493 &bing_sv_SE, &bing_tr_TR, &bing_zh_HK, &bing_zh_TW, &daum,
494 &google, &kvasir, &mail_ru, &najdi, &naver,
495 &onet, &seznam, &sogou, &vinden, &virgilio,
496 &yahoo, &yahoo_ar, &yahoo_at, &yahoo_au, &yahoo_br,
497 &yahoo_ca, &yahoo_ch, &yahoo_cl, &yahoo_co, &yahoo_de,
498 &yahoo_dk, &yahoo_es, &yahoo_fi, &yahoo_fr, &yahoo_gr,
499 &yahoo_hk, &yahoo_id, &yahoo_in, &yahoo_jp, &yahoo_maktoob,
500 &yahoo_mx, &yahoo_my, &yahoo_nl, &yahoo_nz, &yahoo_pe,
501 &yahoo_ph, &yahoo_qc, &yahoo_ro, &yahoo_ru, &yahoo_se,
502 &yahoo_sg, &yahoo_th, &yahoo_tr, &yahoo_tw, &yahoo_uk,
503 &yahoo_ve, &yahoo_vn, &yandex_ru, &yandex_tr, &yandex_ua,
504
505 // UMA-only engines:
506 &atlas_cz, &atlas_sk, &avg, &babylon, &conduit,
507 &delfi_lt, &delfi_lv, &delta, &funmoods, &goo,
508 &imesh, &iminent, &in, &incredibar, &libero,
509 &neti, &nigma, &ok, &rambler, &sapo,
510 &search_results, &searchnu, &snapdo, &softonic, &sweetim,
511 &terra_ar, &terra_es, &tut, &walla, &wp,
512 &zoznam,
513 };
514
515 // Please refer to ISO 3166-1 for information about the two-character country
516 // codes; http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 is useful. In the
517 // following (C++) code, we pack the two letters of the country code into an int
518 // value we call the CountryID.
519
520 const int kCountryIDUnknown = -1;
521
CountryCharsToCountryID(char c1,char c2)522 inline int CountryCharsToCountryID(char c1, char c2) {
523 return c1 << 8 | c2;
524 }
525
CountryCharsToCountryIDWithUpdate(char c1,char c2)526 int CountryCharsToCountryIDWithUpdate(char c1, char c2) {
527 // SPECIAL CASE: In 2003, Yugoslavia renamed itself to Serbia and Montenegro.
528 // Serbia and Montenegro dissolved their union in June 2006. Yugoslavia was
529 // ISO 'YU' and Serbia and Montenegro were ISO 'CS'. Serbia was subsequently
530 // issued 'RS' and Montenegro 'ME'. Windows XP and Mac OS X Leopard still use
531 // the value 'YU'. If we get a value of 'YU' or 'CS' we will map it to 'RS'.
532 if ((c1 == 'Y' && c2 == 'U') ||
533 (c1 == 'C' && c2 == 'S')) {
534 c1 = 'R';
535 c2 = 'S';
536 }
537
538 // SPECIAL CASE: Timor-Leste changed from 'TP' to 'TL' in 2002. Windows XP
539 // predates this; we therefore map this value.
540 if (c1 == 'T' && c2 == 'P')
541 c2 = 'L';
542
543 return CountryCharsToCountryID(c1, c2);
544 }
545
546 #if defined(OS_WIN)
547
548 // For reference, a list of GeoIDs can be found at
549 // http://msdn.microsoft.com/en-us/library/dd374073.aspx .
GeoIDToCountryID(GEOID geo_id)550 int GeoIDToCountryID(GEOID geo_id) {
551 const int kISOBufferSize = 3; // Two plus one for the terminator.
552 wchar_t isobuf[kISOBufferSize] = { 0 };
553 int retval = GetGeoInfo(geo_id, GEO_ISO2, isobuf, kISOBufferSize, 0);
554
555 if (retval == kISOBufferSize &&
556 !(isobuf[0] == L'X' && isobuf[1] == L'X'))
557 return CountryCharsToCountryIDWithUpdate(static_cast<char>(isobuf[0]),
558 static_cast<char>(isobuf[1]));
559
560 // Various locations have ISO codes that Windows does not return.
561 switch (geo_id) {
562 case 0x144: // Guernsey
563 return CountryCharsToCountryID('G', 'G');
564 case 0x148: // Jersey
565 return CountryCharsToCountryID('J', 'E');
566 case 0x3B16: // Isle of Man
567 return CountryCharsToCountryID('I', 'M');
568
569 // 'UM' (U.S. Minor Outlying Islands)
570 case 0x7F: // Johnston Atoll
571 case 0x102: // Wake Island
572 case 0x131: // Baker Island
573 case 0x146: // Howland Island
574 case 0x147: // Jarvis Island
575 case 0x149: // Kingman Reef
576 case 0x152: // Palmyra Atoll
577 case 0x52FA: // Midway Islands
578 return CountryCharsToCountryID('U', 'M');
579
580 // 'SH' (Saint Helena)
581 case 0x12F: // Ascension Island
582 case 0x15C: // Tristan da Cunha
583 return CountryCharsToCountryID('S', 'H');
584
585 // 'IO' (British Indian Ocean Territory)
586 case 0x13A: // Diego Garcia
587 return CountryCharsToCountryID('I', 'O');
588
589 // Other cases where there is no ISO country code; we assign countries that
590 // can serve as reasonable defaults.
591 case 0x154: // Rota Island
592 case 0x155: // Saipan
593 case 0x15A: // Tinian Island
594 return CountryCharsToCountryID('U', 'S');
595 case 0x134: // Channel Islands
596 return CountryCharsToCountryID('G', 'B');
597 case 0x143: // Guantanamo Bay
598 default:
599 return kCountryIDUnknown;
600 }
601 }
602
GetCurrentCountryID()603 int GetCurrentCountryID() {
604 GEOID geo_id = GetUserGeoID(GEOCLASS_NATION);
605
606 return GeoIDToCountryID(geo_id);
607 }
608
609 #elif defined(OS_MACOSX)
610
GetCurrentCountryID()611 int GetCurrentCountryID() {
612 base::ScopedCFTypeRef<CFLocaleRef> locale(CFLocaleCopyCurrent());
613 CFStringRef country = (CFStringRef)CFLocaleGetValue(locale.get(),
614 kCFLocaleCountryCode);
615 if (!country)
616 return kCountryIDUnknown;
617
618 UniChar isobuf[2];
619 CFRange char_range = CFRangeMake(0, 2);
620 CFStringGetCharacters(country, char_range, isobuf);
621
622 return CountryCharsToCountryIDWithUpdate(static_cast<char>(isobuf[0]),
623 static_cast<char>(isobuf[1]));
624 }
625
626 #elif defined(OS_ANDROID)
627
628 // Initialized by InitCountryCode().
629 int g_country_code_at_install = kCountryIDUnknown;
630
GetCurrentCountryID()631 int GetCurrentCountryID() {
632 return g_country_code_at_install;
633 }
634
635 #elif defined(OS_POSIX)
636
GetCurrentCountryID()637 int GetCurrentCountryID() {
638 const char* locale = setlocale(LC_MESSAGES, NULL);
639
640 if (!locale)
641 return kCountryIDUnknown;
642
643 // The format of a locale name is:
644 // language[_territory][.codeset][@modifier], where territory is an ISO 3166
645 // country code, which is what we want.
646 std::string locale_str(locale);
647 size_t begin = locale_str.find('_');
648 if (begin == std::string::npos || locale_str.size() - begin < 3)
649 return kCountryIDUnknown;
650
651 ++begin;
652 size_t end = locale_str.find_first_of(".@", begin);
653 if (end == std::string::npos)
654 end = locale_str.size();
655
656 // The territory part must contain exactly two characters.
657 if (end - begin == 2) {
658 return CountryCharsToCountryIDWithUpdate(
659 base::ToUpperASCII(locale_str[begin]),
660 base::ToUpperASCII(locale_str[begin + 1]));
661 }
662
663 return kCountryIDUnknown;
664 }
665
666 #endif // OS_*
667
GetCountryIDFromPrefs(PrefService * prefs)668 int GetCountryIDFromPrefs(PrefService* prefs) {
669 if (!prefs)
670 return GetCurrentCountryID();
671
672 // Cache first run Country ID value in prefs, and use it afterwards. This
673 // ensures that just because the user moves around, we won't automatically
674 // make major changes to their available search providers, which would feel
675 // surprising.
676 if (!prefs->HasPrefPath(prefs::kCountryIDAtInstall)) {
677 int new_country_id = GetCurrentCountryID();
678 #if defined(OS_WIN)
679 // Migrate the old platform-specific value if it's present.
680 if (prefs->HasPrefPath(prefs::kGeoIDAtInstall)) {
681 int geo_id = prefs->GetInteger(prefs::kGeoIDAtInstall);
682 prefs->ClearPref(prefs::kGeoIDAtInstall);
683 new_country_id = GeoIDToCountryID(geo_id);
684 }
685 #endif
686 prefs->SetInteger(prefs::kCountryIDAtInstall, new_country_id);
687 }
688 return prefs->GetInteger(prefs::kCountryIDAtInstall);
689 }
690
GetPrepopulationSetFromCountryID(PrefService * prefs,const PrepopulatedEngine *** engines,size_t * num_engines)691 void GetPrepopulationSetFromCountryID(PrefService* prefs,
692 const PrepopulatedEngine*** engines,
693 size_t* num_engines) {
694 // NOTE: This function should ALWAYS set its outparams.
695
696 // If you add a new country make sure to update the unit test for coverage.
697 switch (GetCountryIDFromPrefs(prefs)) {
698
699 #define CHAR_A 'A'
700 #define CHAR_B 'B'
701 #define CHAR_C 'C'
702 #define CHAR_D 'D'
703 #define CHAR_E 'E'
704 #define CHAR_F 'F'
705 #define CHAR_G 'G'
706 #define CHAR_H 'H'
707 #define CHAR_I 'I'
708 #define CHAR_J 'J'
709 #define CHAR_K 'K'
710 #define CHAR_L 'L'
711 #define CHAR_M 'M'
712 #define CHAR_N 'N'
713 #define CHAR_O 'O'
714 #define CHAR_P 'P'
715 #define CHAR_Q 'Q'
716 #define CHAR_R 'R'
717 #define CHAR_S 'S'
718 #define CHAR_T 'T'
719 #define CHAR_U 'U'
720 #define CHAR_V 'V'
721 #define CHAR_W 'W'
722 #define CHAR_X 'X'
723 #define CHAR_Y 'Y'
724 #define CHAR_Z 'Z'
725 #define CHAR(ch) CHAR_##ch
726 #define CODE_TO_ID(code1, code2)\
727 (CHAR(code1) << 8 | CHAR(code2))
728
729 #define UNHANDLED_COUNTRY(code1, code2)\
730 case CODE_TO_ID(code1, code2):
731 #define END_UNHANDLED_COUNTRIES(code1, code2)\
732 *engines = engines_##code1##code2;\
733 *num_engines = arraysize(engines_##code1##code2);\
734 return;
735 #define DECLARE_COUNTRY(code1, code2)\
736 UNHANDLED_COUNTRY(code1, code2)\
737 END_UNHANDLED_COUNTRIES(code1, code2)
738
739 // Countries with their own, dedicated engine set.
740 DECLARE_COUNTRY(A, E) // United Arab Emirates
741 DECLARE_COUNTRY(A, L) // Albania
742 DECLARE_COUNTRY(A, R) // Argentina
743 DECLARE_COUNTRY(A, T) // Austria
744 DECLARE_COUNTRY(A, U) // Australia
745 DECLARE_COUNTRY(B, A) // Bosnia and Herzegovina
746 DECLARE_COUNTRY(B, E) // Belgium
747 DECLARE_COUNTRY(B, G) // Bulgaria
748 DECLARE_COUNTRY(B, H) // Bahrain
749 DECLARE_COUNTRY(B, I) // Burundi
750 DECLARE_COUNTRY(B, N) // Brunei
751 DECLARE_COUNTRY(B, O) // Bolivia
752 DECLARE_COUNTRY(B, R) // Brazil
753 DECLARE_COUNTRY(B, Y) // Belarus
754 DECLARE_COUNTRY(B, Z) // Belize
755 DECLARE_COUNTRY(C, A) // Canada
756 DECLARE_COUNTRY(C, H) // Switzerland
757 DECLARE_COUNTRY(C, L) // Chile
758 DECLARE_COUNTRY(C, N) // China
759 DECLARE_COUNTRY(C, O) // Colombia
760 DECLARE_COUNTRY(C, R) // Costa Rica
761 DECLARE_COUNTRY(C, Z) // Czech Republic
762 DECLARE_COUNTRY(D, E) // Germany
763 DECLARE_COUNTRY(D, K) // Denmark
764 DECLARE_COUNTRY(D, O) // Dominican Republic
765 DECLARE_COUNTRY(D, Z) // Algeria
766 DECLARE_COUNTRY(E, C) // Ecuador
767 DECLARE_COUNTRY(E, E) // Estonia
768 DECLARE_COUNTRY(E, G) // Egypt
769 DECLARE_COUNTRY(E, S) // Spain
770 DECLARE_COUNTRY(F, I) // Finland
771 DECLARE_COUNTRY(F, O) // Faroe Islands
772 DECLARE_COUNTRY(F, R) // France
773 DECLARE_COUNTRY(G, B) // United Kingdom
774 DECLARE_COUNTRY(G, R) // Greece
775 DECLARE_COUNTRY(G, T) // Guatemala
776 DECLARE_COUNTRY(H, K) // Hong Kong
777 DECLARE_COUNTRY(H, N) // Honduras
778 DECLARE_COUNTRY(H, R) // Croatia
779 DECLARE_COUNTRY(H, U) // Hungary
780 DECLARE_COUNTRY(I, D) // Indonesia
781 DECLARE_COUNTRY(I, E) // Ireland
782 DECLARE_COUNTRY(I, L) // Israel
783 DECLARE_COUNTRY(I, N) // India
784 DECLARE_COUNTRY(I, Q) // Iraq
785 DECLARE_COUNTRY(I, R) // Iran
786 DECLARE_COUNTRY(I, S) // Iceland
787 DECLARE_COUNTRY(I, T) // Italy
788 DECLARE_COUNTRY(J, M) // Jamaica
789 DECLARE_COUNTRY(J, O) // Jordan
790 DECLARE_COUNTRY(J, P) // Japan
791 DECLARE_COUNTRY(K, E) // Kenya
792 DECLARE_COUNTRY(K, R) // South Korea
793 DECLARE_COUNTRY(K, W) // Kuwait
794 DECLARE_COUNTRY(K, Z) // Kazakhstan
795 DECLARE_COUNTRY(L, B) // Lebanon
796 DECLARE_COUNTRY(L, I) // Liechtenstein
797 DECLARE_COUNTRY(L, T) // Lithuania
798 DECLARE_COUNTRY(L, U) // Luxembourg
799 DECLARE_COUNTRY(L, V) // Latvia
800 DECLARE_COUNTRY(L, Y) // Libya
801 DECLARE_COUNTRY(M, A) // Morocco
802 DECLARE_COUNTRY(M, C) // Monaco
803 DECLARE_COUNTRY(M, D) // Moldova
804 DECLARE_COUNTRY(M, E) // Montenegro
805 DECLARE_COUNTRY(M, K) // Macedonia
806 DECLARE_COUNTRY(M, X) // Mexico
807 DECLARE_COUNTRY(M, Y) // Malaysia
808 DECLARE_COUNTRY(N, I) // Nicaragua
809 DECLARE_COUNTRY(N, L) // Netherlands
810 DECLARE_COUNTRY(N, O) // Norway
811 DECLARE_COUNTRY(N, Z) // New Zealand
812 DECLARE_COUNTRY(O, M) // Oman
813 DECLARE_COUNTRY(P, A) // Panama
814 DECLARE_COUNTRY(P, E) // Peru
815 DECLARE_COUNTRY(P, H) // Philippines
816 DECLARE_COUNTRY(P, K) // Pakistan
817 DECLARE_COUNTRY(P, L) // Poland
818 DECLARE_COUNTRY(P, R) // Puerto Rico
819 DECLARE_COUNTRY(P, T) // Portugal
820 DECLARE_COUNTRY(P, Y) // Paraguay
821 DECLARE_COUNTRY(Q, A) // Qatar
822 DECLARE_COUNTRY(R, O) // Romania
823 DECLARE_COUNTRY(R, S) // Serbia
824 DECLARE_COUNTRY(R, U) // Russia
825 DECLARE_COUNTRY(R, W) // Rwanda
826 DECLARE_COUNTRY(S, A) // Saudi Arabia
827 DECLARE_COUNTRY(S, E) // Sweden
828 DECLARE_COUNTRY(S, G) // Singapore
829 DECLARE_COUNTRY(S, I) // Slovenia
830 DECLARE_COUNTRY(S, K) // Slovakia
831 DECLARE_COUNTRY(S, V) // El Salvador
832 DECLARE_COUNTRY(S, Y) // Syria
833 DECLARE_COUNTRY(T, H) // Thailand
834 DECLARE_COUNTRY(T, N) // Tunisia
835 DECLARE_COUNTRY(T, R) // Turkey
836 DECLARE_COUNTRY(T, T) // Trinidad and Tobago
837 DECLARE_COUNTRY(T, W) // Taiwan
838 DECLARE_COUNTRY(T, Z) // Tanzania
839 DECLARE_COUNTRY(U, A) // Ukraine
840 DECLARE_COUNTRY(U, S) // United States
841 DECLARE_COUNTRY(U, Y) // Uruguay
842 DECLARE_COUNTRY(V, E) // Venezuela
843 DECLARE_COUNTRY(V, N) // Vietnam
844 DECLARE_COUNTRY(Y, E) // Yemen
845 DECLARE_COUNTRY(Z, A) // South Africa
846 DECLARE_COUNTRY(Z, W) // Zimbabwe
847
848 // Countries using the "Australia" engine set.
849 UNHANDLED_COUNTRY(C, C) // Cocos Islands
850 UNHANDLED_COUNTRY(C, X) // Christmas Island
851 UNHANDLED_COUNTRY(H, M) // Heard Island and McDonald Islands
852 UNHANDLED_COUNTRY(N, F) // Norfolk Island
853 END_UNHANDLED_COUNTRIES(A, U)
854
855 // Countries using the "China" engine set.
856 UNHANDLED_COUNTRY(M, O) // Macao
857 END_UNHANDLED_COUNTRIES(C, N)
858
859 // Countries using the "Denmark" engine set.
860 UNHANDLED_COUNTRY(G, L) // Greenland
861 END_UNHANDLED_COUNTRIES(D, K)
862
863 // Countries using the "Spain" engine set.
864 UNHANDLED_COUNTRY(A, D) // Andorra
865 END_UNHANDLED_COUNTRIES(E, S)
866
867 // Countries using the "Finland" engine set.
868 UNHANDLED_COUNTRY(A, X) // Aland Islands
869 END_UNHANDLED_COUNTRIES(F, I)
870
871 // Countries using the "France" engine set.
872 UNHANDLED_COUNTRY(B, F) // Burkina Faso
873 UNHANDLED_COUNTRY(B, J) // Benin
874 UNHANDLED_COUNTRY(C, D) // Congo - Kinshasa
875 UNHANDLED_COUNTRY(C, F) // Central African Republic
876 UNHANDLED_COUNTRY(C, G) // Congo - Brazzaville
877 UNHANDLED_COUNTRY(C, I) // Ivory Coast
878 UNHANDLED_COUNTRY(C, M) // Cameroon
879 UNHANDLED_COUNTRY(D, J) // Djibouti
880 UNHANDLED_COUNTRY(G, A) // Gabon
881 UNHANDLED_COUNTRY(G, F) // French Guiana
882 UNHANDLED_COUNTRY(G, N) // Guinea
883 UNHANDLED_COUNTRY(G, P) // Guadeloupe
884 UNHANDLED_COUNTRY(H, T) // Haiti
885 #if defined(OS_WIN)
886 UNHANDLED_COUNTRY(I, P) // Clipperton Island ('IP' is an WinXP-ism; ISO
887 // includes it with France)
888 #endif
889 UNHANDLED_COUNTRY(M, L) // Mali
890 UNHANDLED_COUNTRY(M, Q) // Martinique
891 UNHANDLED_COUNTRY(N, C) // New Caledonia
892 UNHANDLED_COUNTRY(N, E) // Niger
893 UNHANDLED_COUNTRY(P, F) // French Polynesia
894 UNHANDLED_COUNTRY(P, M) // Saint Pierre and Miquelon
895 UNHANDLED_COUNTRY(R, E) // Reunion
896 UNHANDLED_COUNTRY(S, N) // Senegal
897 UNHANDLED_COUNTRY(T, D) // Chad
898 UNHANDLED_COUNTRY(T, F) // French Southern Territories
899 UNHANDLED_COUNTRY(T, G) // Togo
900 UNHANDLED_COUNTRY(W, F) // Wallis and Futuna
901 UNHANDLED_COUNTRY(Y, T) // Mayotte
902 END_UNHANDLED_COUNTRIES(F, R)
903
904 // Countries using the "Greece" engine set.
905 UNHANDLED_COUNTRY(C, Y) // Cyprus
906 END_UNHANDLED_COUNTRIES(G, R)
907
908 // Countries using the "Italy" engine set.
909 UNHANDLED_COUNTRY(S, M) // San Marino
910 UNHANDLED_COUNTRY(V, A) // Vatican
911 END_UNHANDLED_COUNTRIES(I, T)
912
913 // Countries using the "Morocco" engine set.
914 UNHANDLED_COUNTRY(E, H) // Western Sahara
915 END_UNHANDLED_COUNTRIES(M, A)
916
917 // Countries using the "Netherlands" engine set.
918 UNHANDLED_COUNTRY(A, N) // Netherlands Antilles
919 UNHANDLED_COUNTRY(A, W) // Aruba
920 END_UNHANDLED_COUNTRIES(N, L)
921
922 // Countries using the "Norway" engine set.
923 UNHANDLED_COUNTRY(B, V) // Bouvet Island
924 UNHANDLED_COUNTRY(S, J) // Svalbard and Jan Mayen
925 END_UNHANDLED_COUNTRIES(N, O)
926
927 // Countries using the "New Zealand" engine set.
928 UNHANDLED_COUNTRY(C, K) // Cook Islands
929 UNHANDLED_COUNTRY(N, U) // Niue
930 UNHANDLED_COUNTRY(T, K) // Tokelau
931 END_UNHANDLED_COUNTRIES(N, Z)
932
933 // Countries using the "Portugal" engine set.
934 UNHANDLED_COUNTRY(C, V) // Cape Verde
935 UNHANDLED_COUNTRY(G, W) // Guinea-Bissau
936 UNHANDLED_COUNTRY(M, Z) // Mozambique
937 UNHANDLED_COUNTRY(S, T) // Sao Tome and Principe
938 UNHANDLED_COUNTRY(T, L) // Timor-Leste
939 END_UNHANDLED_COUNTRIES(P, T)
940
941 // Countries using the "Russia" engine set.
942 UNHANDLED_COUNTRY(A, M) // Armenia
943 UNHANDLED_COUNTRY(A, Z) // Azerbaijan
944 UNHANDLED_COUNTRY(K, G) // Kyrgyzstan
945 UNHANDLED_COUNTRY(T, J) // Tajikistan
946 UNHANDLED_COUNTRY(T, M) // Turkmenistan
947 UNHANDLED_COUNTRY(U, Z) // Uzbekistan
948 END_UNHANDLED_COUNTRIES(R, U)
949
950 // Countries using the "Saudi Arabia" engine set.
951 UNHANDLED_COUNTRY(M, R) // Mauritania
952 UNHANDLED_COUNTRY(P, S) // Palestinian Territory
953 UNHANDLED_COUNTRY(S, D) // Sudan
954 END_UNHANDLED_COUNTRIES(S, A)
955
956 // Countries using the "United Kingdom" engine set.
957 UNHANDLED_COUNTRY(B, M) // Bermuda
958 UNHANDLED_COUNTRY(F, K) // Falkland Islands
959 UNHANDLED_COUNTRY(G, G) // Guernsey
960 UNHANDLED_COUNTRY(G, I) // Gibraltar
961 UNHANDLED_COUNTRY(G, S) // South Georgia and the South Sandwich
962 // Islands
963 UNHANDLED_COUNTRY(I, M) // Isle of Man
964 UNHANDLED_COUNTRY(I, O) // British Indian Ocean Territory
965 UNHANDLED_COUNTRY(J, E) // Jersey
966 UNHANDLED_COUNTRY(K, Y) // Cayman Islands
967 UNHANDLED_COUNTRY(M, S) // Montserrat
968 UNHANDLED_COUNTRY(M, T) // Malta
969 UNHANDLED_COUNTRY(P, N) // Pitcairn Islands
970 UNHANDLED_COUNTRY(S, H) // Saint Helena, Ascension Island, and Tristan da
971 // Cunha
972 UNHANDLED_COUNTRY(T, C) // Turks and Caicos Islands
973 UNHANDLED_COUNTRY(V, G) // British Virgin Islands
974 END_UNHANDLED_COUNTRIES(G, B)
975
976 // Countries using the "United States" engine set.
977 UNHANDLED_COUNTRY(A, S) // American Samoa
978 UNHANDLED_COUNTRY(G, U) // Guam
979 UNHANDLED_COUNTRY(M, P) // Northern Mariana Islands
980 UNHANDLED_COUNTRY(U, M) // U.S. Minor Outlying Islands
981 UNHANDLED_COUNTRY(V, I) // U.S. Virgin Islands
982 END_UNHANDLED_COUNTRIES(U, S)
983
984 // Countries using the "default" engine set.
985 UNHANDLED_COUNTRY(A, F) // Afghanistan
986 UNHANDLED_COUNTRY(A, G) // Antigua and Barbuda
987 UNHANDLED_COUNTRY(A, I) // Anguilla
988 UNHANDLED_COUNTRY(A, O) // Angola
989 UNHANDLED_COUNTRY(A, Q) // Antarctica
990 UNHANDLED_COUNTRY(B, B) // Barbados
991 UNHANDLED_COUNTRY(B, D) // Bangladesh
992 UNHANDLED_COUNTRY(B, S) // Bahamas
993 UNHANDLED_COUNTRY(B, T) // Bhutan
994 UNHANDLED_COUNTRY(B, W) // Botswana
995 UNHANDLED_COUNTRY(C, U) // Cuba
996 UNHANDLED_COUNTRY(D, M) // Dominica
997 UNHANDLED_COUNTRY(E, R) // Eritrea
998 UNHANDLED_COUNTRY(E, T) // Ethiopia
999 UNHANDLED_COUNTRY(F, J) // Fiji
1000 UNHANDLED_COUNTRY(F, M) // Micronesia
1001 UNHANDLED_COUNTRY(G, D) // Grenada
1002 UNHANDLED_COUNTRY(G, E) // Georgia
1003 UNHANDLED_COUNTRY(G, H) // Ghana
1004 UNHANDLED_COUNTRY(G, M) // Gambia
1005 UNHANDLED_COUNTRY(G, Q) // Equatorial Guinea
1006 UNHANDLED_COUNTRY(G, Y) // Guyana
1007 UNHANDLED_COUNTRY(K, H) // Cambodia
1008 UNHANDLED_COUNTRY(K, I) // Kiribati
1009 UNHANDLED_COUNTRY(K, M) // Comoros
1010 UNHANDLED_COUNTRY(K, N) // Saint Kitts and Nevis
1011 UNHANDLED_COUNTRY(K, P) // North Korea
1012 UNHANDLED_COUNTRY(L, A) // Laos
1013 UNHANDLED_COUNTRY(L, C) // Saint Lucia
1014 UNHANDLED_COUNTRY(L, K) // Sri Lanka
1015 UNHANDLED_COUNTRY(L, R) // Liberia
1016 UNHANDLED_COUNTRY(L, S) // Lesotho
1017 UNHANDLED_COUNTRY(M, G) // Madagascar
1018 UNHANDLED_COUNTRY(M, H) // Marshall Islands
1019 UNHANDLED_COUNTRY(M, M) // Myanmar
1020 UNHANDLED_COUNTRY(M, N) // Mongolia
1021 UNHANDLED_COUNTRY(M, U) // Mauritius
1022 UNHANDLED_COUNTRY(M, V) // Maldives
1023 UNHANDLED_COUNTRY(M, W) // Malawi
1024 UNHANDLED_COUNTRY(N, A) // Namibia
1025 UNHANDLED_COUNTRY(N, G) // Nigeria
1026 UNHANDLED_COUNTRY(N, P) // Nepal
1027 UNHANDLED_COUNTRY(N, R) // Nauru
1028 UNHANDLED_COUNTRY(P, G) // Papua New Guinea
1029 UNHANDLED_COUNTRY(P, W) // Palau
1030 UNHANDLED_COUNTRY(S, B) // Solomon Islands
1031 UNHANDLED_COUNTRY(S, C) // Seychelles
1032 UNHANDLED_COUNTRY(S, L) // Sierra Leone
1033 UNHANDLED_COUNTRY(S, O) // Somalia
1034 UNHANDLED_COUNTRY(S, R) // Suriname
1035 UNHANDLED_COUNTRY(S, Z) // Swaziland
1036 UNHANDLED_COUNTRY(T, O) // Tonga
1037 UNHANDLED_COUNTRY(T, V) // Tuvalu
1038 UNHANDLED_COUNTRY(U, G) // Uganda
1039 UNHANDLED_COUNTRY(V, C) // Saint Vincent and the Grenadines
1040 UNHANDLED_COUNTRY(V, U) // Vanuatu
1041 UNHANDLED_COUNTRY(W, S) // Samoa
1042 UNHANDLED_COUNTRY(Z, M) // Zambia
1043 case kCountryIDUnknown:
1044 default: // Unhandled location
1045 END_UNHANDLED_COUNTRIES(def, ault)
1046 }
1047 }
1048
MakePrepopulatedTemplateURLData(const base::string16 & name,const base::string16 & keyword,const base::StringPiece & search_url,const base::StringPiece & suggest_url,const base::StringPiece & instant_url,const base::StringPiece & image_url,const base::StringPiece & new_tab_url,const base::StringPiece & contextual_search_url,const base::StringPiece & search_url_post_params,const base::StringPiece & suggest_url_post_params,const base::StringPiece & instant_url_post_params,const base::StringPiece & image_url_post_params,const base::StringPiece & favicon_url,const base::StringPiece & encoding,const base::ListValue & alternate_urls,const base::StringPiece & search_terms_replacement_key,int id)1049 scoped_ptr<TemplateURLData> MakePrepopulatedTemplateURLData(
1050 const base::string16& name,
1051 const base::string16& keyword,
1052 const base::StringPiece& search_url,
1053 const base::StringPiece& suggest_url,
1054 const base::StringPiece& instant_url,
1055 const base::StringPiece& image_url,
1056 const base::StringPiece& new_tab_url,
1057 const base::StringPiece& contextual_search_url,
1058 const base::StringPiece& search_url_post_params,
1059 const base::StringPiece& suggest_url_post_params,
1060 const base::StringPiece& instant_url_post_params,
1061 const base::StringPiece& image_url_post_params,
1062 const base::StringPiece& favicon_url,
1063 const base::StringPiece& encoding,
1064 const base::ListValue& alternate_urls,
1065 const base::StringPiece& search_terms_replacement_key,
1066 int id) {
1067 scoped_ptr<TemplateURLData> data(new TemplateURLData);
1068
1069 data->short_name = name;
1070 data->SetKeyword(keyword);
1071 data->SetURL(search_url.as_string());
1072 data->suggestions_url = suggest_url.as_string();
1073 data->instant_url = instant_url.as_string();
1074 data->image_url = image_url.as_string();
1075 data->new_tab_url = new_tab_url.as_string();
1076 data->contextual_search_url = contextual_search_url.as_string();
1077 data->search_url_post_params = search_url_post_params.as_string();
1078 data->suggestions_url_post_params = suggest_url_post_params.as_string();
1079 data->instant_url_post_params = instant_url_post_params.as_string();
1080 data->image_url_post_params = image_url_post_params.as_string();
1081 data->favicon_url = GURL(favicon_url.as_string());
1082 data->show_in_default_list = true;
1083 data->safe_for_autoreplace = true;
1084 data->input_encodings.push_back(encoding.as_string());
1085 data->date_created = base::Time();
1086 data->last_modified = base::Time();
1087 data->prepopulate_id = id;
1088 for (size_t i = 0; i < alternate_urls.GetSize(); ++i) {
1089 std::string alternate_url;
1090 alternate_urls.GetString(i, &alternate_url);
1091 DCHECK(!alternate_url.empty());
1092 data->alternate_urls.push_back(alternate_url);
1093 }
1094 data->search_terms_replacement_key = search_terms_replacement_key.as_string();
1095 return data.Pass();
1096 }
1097
GetPrepopulatedTemplateURLData(PrefService * prefs)1098 ScopedVector<TemplateURLData> GetPrepopulatedTemplateURLData(
1099 PrefService* prefs) {
1100 ScopedVector<TemplateURLData> t_urls;
1101 if (!prefs)
1102 return t_urls.Pass();
1103
1104 const base::ListValue* list = prefs->GetList(prefs::kSearchProviderOverrides);
1105 if (!list)
1106 return t_urls.Pass();
1107
1108 size_t num_engines = list->GetSize();
1109 for (size_t i = 0; i != num_engines; ++i) {
1110 const base::DictionaryValue* engine;
1111 base::string16 name;
1112 base::string16 keyword;
1113 std::string search_url;
1114 std::string favicon_url;
1115 std::string encoding;
1116 int id;
1117 // The following fields are required for each search engine configuration.
1118 if (list->GetDictionary(i, &engine) &&
1119 engine->GetString("name", &name) && !name.empty() &&
1120 engine->GetString("keyword", &keyword) && !keyword.empty() &&
1121 engine->GetString("search_url", &search_url) && !search_url.empty() &&
1122 engine->GetString("favicon_url", &favicon_url) &&
1123 !favicon_url.empty() &&
1124 engine->GetString("encoding", &encoding) && !encoding.empty() &&
1125 engine->GetInteger("id", &id)) {
1126 // These fields are optional.
1127 std::string suggest_url;
1128 std::string instant_url;
1129 std::string image_url;
1130 std::string new_tab_url;
1131 std::string contextual_search_url;
1132 std::string search_url_post_params;
1133 std::string suggest_url_post_params;
1134 std::string instant_url_post_params;
1135 std::string image_url_post_params;
1136 base::ListValue empty_list;
1137 const base::ListValue* alternate_urls = &empty_list;
1138 std::string search_terms_replacement_key;
1139 engine->GetString("suggest_url", &suggest_url);
1140 engine->GetString("instant_url", &instant_url);
1141 engine->GetString("image_url", &image_url);
1142 engine->GetString("new_tab_url", &new_tab_url);
1143 engine->GetString("contextual_search_url", &contextual_search_url);
1144 engine->GetString("search_url_post_params", &search_url_post_params);
1145 engine->GetString("suggest_url_post_params", &suggest_url_post_params);
1146 engine->GetString("instant_url_post_params", &instant_url_post_params);
1147 engine->GetString("image_url_post_params", &image_url_post_params);
1148 engine->GetList("alternate_urls", &alternate_urls);
1149 engine->GetString("search_terms_replacement_key",
1150 &search_terms_replacement_key);
1151 t_urls.push_back(MakePrepopulatedTemplateURLData(name, keyword,
1152 search_url, suggest_url, instant_url, image_url, new_tab_url,
1153 contextual_search_url, search_url_post_params,
1154 suggest_url_post_params, instant_url_post_params,
1155 image_url_post_params, favicon_url, encoding, *alternate_urls,
1156 search_terms_replacement_key, id).release());
1157 }
1158 }
1159 return t_urls.Pass();
1160 }
1161
1162 scoped_ptr<TemplateURLData>
MakePrepopulatedTemplateURLDataFromPrepopulateEngine(const PrepopulatedEngine & engine)1163 MakePrepopulatedTemplateURLDataFromPrepopulateEngine(
1164 const PrepopulatedEngine& engine) {
1165 base::ListValue alternate_urls;
1166 if (engine.alternate_urls) {
1167 for (size_t i = 0; i < engine.alternate_urls_size; ++i)
1168 alternate_urls.AppendString(std::string(engine.alternate_urls[i]));
1169 }
1170
1171 return MakePrepopulatedTemplateURLData(base::WideToUTF16(engine.name),
1172 base::WideToUTF16(engine.keyword),
1173 engine.search_url,
1174 engine.suggest_url,
1175 engine.instant_url,
1176 engine.image_url,
1177 engine.new_tab_url,
1178 engine.contextual_search_url,
1179 engine.search_url_post_params,
1180 engine.suggest_url_post_params,
1181 engine.instant_url_post_params,
1182 engine.image_url_post_params,
1183 engine.favicon_url,
1184 engine.encoding,
1185 alternate_urls,
1186 engine.search_terms_replacement_key,
1187 engine.id);
1188 }
1189
SameDomain(const GURL & given_url,const GURL & prepopulated_url)1190 bool SameDomain(const GURL& given_url, const GURL& prepopulated_url) {
1191 return prepopulated_url.is_valid() &&
1192 net::registry_controlled_domains::SameDomainOrHost(
1193 given_url, prepopulated_url,
1194 net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES);
1195 }
1196
1197 } // namespace
1198
1199
1200 // Global functions -----------------------------------------------------------
1201
1202 #if defined(OS_ANDROID)
InitCountryCode(const std::string & country_code)1203 void InitCountryCode(const std::string& country_code) {
1204 if (country_code.size() != 2) {
1205 DLOG(ERROR) << "Invalid country code: " << country_code;
1206 g_country_code_at_install = kCountryIDUnknown;
1207 } else {
1208 g_country_code_at_install =
1209 CountryCharsToCountryIDWithUpdate(country_code[0], country_code[1]);
1210 }
1211 }
1212 #endif
1213
RegisterProfilePrefs(user_prefs::PrefRegistrySyncable * registry)1214 void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
1215 registry->RegisterIntegerPref(
1216 prefs::kCountryIDAtInstall,
1217 kCountryIDUnknown,
1218 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
1219 registry->RegisterListPref(prefs::kSearchProviderOverrides,
1220 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
1221 registry->RegisterIntegerPref(
1222 prefs::kSearchProviderOverridesVersion,
1223 -1,
1224 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
1225 // Obsolete pref, for migration.
1226 registry->RegisterIntegerPref(
1227 prefs::kGeoIDAtInstall,
1228 -1,
1229 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
1230 }
1231
GetDataVersion(PrefService * prefs)1232 int GetDataVersion(PrefService* prefs) {
1233 // Allow tests to override the local version.
1234 return (prefs && prefs->HasPrefPath(prefs::kSearchProviderOverridesVersion)) ?
1235 prefs->GetInteger(prefs::kSearchProviderOverridesVersion) :
1236 kCurrentDataVersion;
1237 }
1238
GetPrepopulatedEngines(PrefService * prefs,size_t * default_search_provider_index)1239 ScopedVector<TemplateURLData> GetPrepopulatedEngines(
1240 PrefService* prefs,
1241 size_t* default_search_provider_index) {
1242 // If there is a set of search engines in the preferences file, it overrides
1243 // the built-in set.
1244 *default_search_provider_index = 0;
1245 ScopedVector<TemplateURLData> t_urls = GetPrepopulatedTemplateURLData(prefs);
1246 if (!t_urls.empty())
1247 return t_urls.Pass();
1248
1249 const PrepopulatedEngine** engines;
1250 size_t num_engines;
1251 GetPrepopulationSetFromCountryID(prefs, &engines, &num_engines);
1252 for (size_t i = 0; i != num_engines; ++i) {
1253 t_urls.push_back(MakePrepopulatedTemplateURLDataFromPrepopulateEngine(
1254 *engines[i]).release());
1255 }
1256 return t_urls.Pass();
1257 }
1258
ClearPrepopulatedEnginesInPrefs(PrefService * prefs)1259 void ClearPrepopulatedEnginesInPrefs(PrefService* prefs) {
1260 if (!prefs)
1261 return;
1262
1263 prefs->ClearPref(prefs::kSearchProviderOverrides);
1264 prefs->ClearPref(prefs::kSearchProviderOverridesVersion);
1265 }
1266
GetPrepopulatedDefaultSearch(PrefService * prefs)1267 scoped_ptr<TemplateURLData> GetPrepopulatedDefaultSearch(PrefService* prefs) {
1268 scoped_ptr<TemplateURLData> default_search_provider;
1269 size_t default_search_index;
1270 // This could be more efficient. We are loading all the URLs to only keep
1271 // the first one.
1272 ScopedVector<TemplateURLData> loaded_urls =
1273 GetPrepopulatedEngines(prefs, &default_search_index);
1274 if (default_search_index < loaded_urls.size()) {
1275 default_search_provider.reset(loaded_urls[default_search_index]);
1276 loaded_urls.weak_erase(loaded_urls.begin() + default_search_index);
1277 }
1278 return default_search_provider.Pass();
1279 }
1280
GetEngineType(const TemplateURL & url,const SearchTermsData & search_terms_data)1281 SearchEngineType GetEngineType(const TemplateURL& url,
1282 const SearchTermsData& search_terms_data) {
1283 // Restricted to UI thread because ReplaceSearchTerms() is so restricted.
1284 using content::BrowserThread;
1285 DCHECK(!BrowserThread::IsThreadInitialized(BrowserThread::UI) ||
1286 BrowserThread::CurrentlyOn(BrowserThread::UI));
1287
1288 // By calling ReplaceSearchTerms, we ensure that even TemplateURLs whose URLs
1289 // can't be directly inspected (e.g. due to containing {google:baseURL}) can
1290 // be converted to GURLs we can look at.
1291 GURL gurl(url.url_ref().ReplaceSearchTerms(TemplateURLRef::SearchTermsArgs(
1292 base::ASCIIToUTF16("x")), search_terms_data));
1293 return gurl.is_valid() ? GetEngineType(gurl) : SEARCH_ENGINE_OTHER;
1294 }
1295
GetEngineType(const GURL & url)1296 SearchEngineType GetEngineType(const GURL& url) {
1297 DCHECK(url.is_valid());
1298
1299 // Check using TLD+1s, in order to more aggressively match search engine types
1300 // for data imported from other browsers.
1301 //
1302 // First special-case Google, because the prepopulate URL for it will not
1303 // convert to a GURL and thus won't have an origin. Instead see if the
1304 // incoming URL's host is "[*.]google.<TLD>".
1305 if (google_util::IsGoogleHostname(url.host(),
1306 google_util::DISALLOW_SUBDOMAIN))
1307 return google.type;
1308
1309 // Now check the rest of the prepopulate data.
1310 for (size_t i = 0; i < arraysize(kAllEngines); ++i) {
1311 // First check the main search URL.
1312 if (SameDomain(url, GURL(kAllEngines[i]->search_url)))
1313 return kAllEngines[i]->type;
1314
1315 // Then check the alternate URLs.
1316 for (size_t j = 0; j < kAllEngines[i]->alternate_urls_size; ++j) {
1317 if (SameDomain(url, GURL(kAllEngines[i]->alternate_urls[j])))
1318 return kAllEngines[i]->type;
1319 }
1320 }
1321
1322 return SEARCH_ENGINE_OTHER;
1323 }
1324
1325 } // namespace TemplateURLPrepopulateData
1326