• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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/command_line.h"
12 #include "base/memory/scoped_vector.h"
13 #include "base/string16.h"
14 #include "base/string_util.h"
15 #include "base/stl_util-inl.h"
16 #include "base/utf_string_conversions.h"
17 #include "chrome/browser/prefs/pref_service.h"
18 #include "chrome/browser/search_engines/search_engine_type.h"
19 #include "chrome/browser/search_engines/search_terms_data.h"
20 #include "chrome/browser/search_engines/template_url.h"
21 #include "chrome/browser/search_engines/template_url_model.h"
22 #include "chrome/common/chrome_switches.h"
23 #include "chrome/common/pref_names.h"
24 #include "googleurl/src/gurl.h"
25 #include "grit/theme_resources.h"
26 
27 #if defined(OS_WIN)
28 #undef IN  // On Windows, windef.h defines this, which screws up "India" cases.
29 #elif defined(OS_MACOSX)
30 #include "base/mac/scoped_cftyperef.h"
31 #endif
32 
33 using base::Time;
34 
35 namespace {
36 
37 // NOTE: See comments in GetDataVersion() below!  You should probably not change
38 // the data in this file without changing the result of that function!
39 
40 // Engine definitions //////////////////////////////////////////////////////////
41 
42 struct PrepopulatedEngine {
43   const wchar_t* const name;
44   // If NULL, we'll autogenerate a keyword based on the search_url every time
45   // someone asks.  Only entries which need keywords to auto-track a dynamically
46   // generated search URL should use this.
47   // If the empty string, the engine has no keyword.
48   const wchar_t* const keyword;
49   const char* const favicon_url;  // If NULL, there is no favicon.
50   const wchar_t* const search_url;
51   const char* const encoding;
52   const wchar_t* const suggest_url;  // If NULL, this engine does not support
53                                      // suggestions.
54   const wchar_t* const instant_url;  // If NULL, this engine does not support
55                                      // instant.
56   // SEARCH_ENGINE_OTHER if no logo is available.
57   const SearchEngineType search_engine_type;
58   const int logo_id;  // Id for logo image in search engine dialog.
59   // Unique id for this prepopulate engine (corresponds to
60   // TemplateURL::prepopulate_id). This ID must be greater than zero and must
61   // remain the same for a particular site regardless of how the url changes;
62   // the ID is used when modifying engine data in subsequent versions, so that
63   // we can find the "old" entry to update even when the name or URL changes.
64   //
65   // This ID must be "unique" within one country's prepopulated data, but two
66   // entries can share an ID if they represent the "same" engine (e.g. Yahoo! US
67   // vs. Yahoo! UK) and will not appear in the same user-visible data set.  This
68   // facilitates changes like adding more specific per-country data in the
69   // future; in such a case the localized engines will transparently replace the
70   // previous, non-localized versions.  For engines where we need two instances
71   // to appear for one country (e.g. Bing Search U.S. English and Spanish), we
72   // must use two different unique IDs (and different keywords).
73   //
74   // The following unique IDs are available:
75   //    33, 34, 36, 39, 42, 43, 47, 48, 49, 50, 52, 53, 56, 58, 60, 61, 64, 65,
76   //    66, 70, 74, 78, 79, 80, 81, 84, 86, 88, 91, 92, 93, 94, 95, 96, 97, 98,
77   //    102+
78   //
79   // IDs > 1000 are reserved for distribution custom engines.
80   //
81   // NOTE: CHANGE THE ABOVE NUMBERS IF YOU ADD A NEW ENGINE; ID conflicts = bad!
82   const int id;
83 };
84 
85 const PrepopulatedEngine abcsok = {
86   L"ABC S\x00f8k",
87   L"abcsok.no",
88   "http://abcsok.no/favicon.ico",
89   L"http://abcsok.no/index.html?q={searchTerms}",
90   "UTF-8",
91   NULL,
92   NULL,
93   SEARCH_ENGINE_ABCSOK,
94   IDR_SEARCH_ENGINE_LOGO_ABCSOK,
95   72,
96 };
97 
98 const PrepopulatedEngine altavista = {
99   L"AltaVista",
100   L"altavista.com",
101   "http://www.altavista.com/favicon.ico",
102   L"http://www.altavista.com/web/results?q={searchTerms}",
103   "UTF-8",
104   NULL,
105   NULL,
106   SEARCH_ENGINE_ALTAVISTA,
107   IDR_SEARCH_ENGINE_LOGO_ALTAVISTA,
108   89,
109 };
110 
111 const PrepopulatedEngine altavista_ar = {
112   L"AltaVista",
113   L"ar.altavista.com",
114   "http://ar.altavista.com/favicon.ico",
115   L"http://ar.altavista.com/web/results?q={searchTerms}",
116   "UTF-8",
117   NULL,
118   NULL,
119   SEARCH_ENGINE_ALTAVISTA,
120   IDR_SEARCH_ENGINE_LOGO_ALTAVISTA,
121   89,
122 };
123 
124 const PrepopulatedEngine altavista_se = {
125   L"AltaVista",
126   L"se.altavista.com",
127   "http://se.altavista.com/favicon.ico",
128   L"http://se.altavista.com/web/results?q={searchTerms}",
129   "UTF-8",
130   NULL,
131   NULL,
132   SEARCH_ENGINE_ALTAVISTA,
133   IDR_SEARCH_ENGINE_LOGO_ALTAVISTA,
134   89,
135 };
136 
137 const PrepopulatedEngine aol = {
138   L"AOL",
139   L"aol.com",
140   "http://search.aol.com/favicon.ico",
141   L"http://search.aol.com/aol/search?query={searchTerms}",
142   "UTF-8",
143   NULL,
144   NULL,
145   SEARCH_ENGINE_OTHER,
146   IDR_SEARCH_ENGINE_LOGO_AOL,
147   35,
148 };
149 
150 const PrepopulatedEngine araby = {
151   L"\x0639\x0631\x0628\x064a",
152   L"araby.com",
153   "http://araby.com/favicon.ico",
154   L"http://araby.com/?q={searchTerms}",
155   "UTF-8",
156   NULL,
157   NULL,
158   SEARCH_ENGINE_OTHER,
159   kNoSearchEngineLogo,
160   12,
161 };
162 
163 const PrepopulatedEngine ask = {
164   L"Ask",
165   L"ask.com",
166   "http://www.ask.com/favicon.ico",
167   L"http://www.ask.com/web?q={searchTerms}",
168   "UTF-8",
169   L"http://ss.ask.com/query?q={searchTerms}&li=ff",
170   NULL,
171   SEARCH_ENGINE_ASK,
172   IDR_SEARCH_ENGINE_LOGO_ASK,
173   4,
174 };
175 
176 const PrepopulatedEngine ask_de = {
177   L"Ask.com Deutschland",
178   L"de.ask.com",
179   "http://de.ask.com/favicon.ico",
180   L"http://de.ask.com/web?q={searchTerms}",
181   "UTF-8",
182   L"http://ss.de.ask.com/query?q={searchTerms}&li=ff",
183   NULL,
184   SEARCH_ENGINE_ASK,
185   IDR_SEARCH_ENGINE_LOGO_ASK,
186   4,
187 };
188 
189 const PrepopulatedEngine ask_es = {
190   L"Ask.com Espa" L"\x00f1" L"a",
191   L"es.ask.com",
192   "http://es.ask.com/favicon.ico",
193   L"http://es.ask.com/web?q={searchTerms}",
194   "UTF-8",
195   L"http://ss.es.ask.com/query?q={searchTerms}&li=ff",
196   NULL,
197   SEARCH_ENGINE_ASK,
198   IDR_SEARCH_ENGINE_LOGO_ASK,
199   4,
200 };
201 
202 const PrepopulatedEngine ask_it = {
203   L"Ask.com Italia",
204   L"it.ask.com",
205   "http://it.ask.com/favicon.ico",
206   L"http://it.ask.com/web?q={searchTerms}",
207   "UTF-8",
208   L"http://ss.it.ask.com/query?q={searchTerms}&li=ff",
209   NULL,
210   SEARCH_ENGINE_ASK,
211   IDR_SEARCH_ENGINE_LOGO_ASK,
212   4,
213 };
214 
215 const PrepopulatedEngine ask_nl = {
216   L"Ask.com Nederland",
217   L"nl.ask.com",
218   "http://nl.ask.com/favicon.ico",
219   L"http://nl.ask.com/web?q={searchTerms}",
220   "UTF-8",
221   L"http://ss.nl.ask.com/query?q={searchTerms}&li=ff",
222   NULL,
223   SEARCH_ENGINE_ASK,
224   IDR_SEARCH_ENGINE_LOGO_ASK,
225   4,
226 };
227 
228 const PrepopulatedEngine ask_uk = {
229   L"Ask Jeeves",
230   L"uk.ask.com",
231   "http://uk.ask.com/favicon.ico",
232   L"http://uk.ask.com/web?q={searchTerms}",
233   "UTF-8",
234   L"http://ss.uk.ask.com/query?q={searchTerms}&li=ff",
235   NULL,
236   SEARCH_ENGINE_ASK,
237   IDR_SEARCH_ENGINE_LOGO_ASK,
238   4,
239 };
240 
241 const PrepopulatedEngine atlas_cz = {
242   L"Atlas",
243   L"atlas.cz",
244   "http://img.atlas.cz/favicon.ico",
245   L"http://search.atlas.cz/?q={searchTerms}",
246   "windows-1250",
247   NULL,
248   NULL,
249   SEARCH_ENGINE_OTHER,
250   kNoSearchEngineLogo,
251   27,
252 };
253 
254 const PrepopulatedEngine atlas_sk = {
255   L"ATLAS.SK",
256   L"atlas.sk",
257   "http://www.atlas.sk/images/favicon.ico",
258   L"http://hladaj.atlas.sk/fulltext/?phrase={searchTerms}",
259   "UTF-8",
260   NULL,
261   NULL,
262   SEARCH_ENGINE_OTHER,
263   kNoSearchEngineLogo,
264   27,
265 };
266 
267 const PrepopulatedEngine baidu = {
268   L"\x767e\x5ea6",
269   L"baidu.com",
270   "http://www.baidu.com/favicon.ico",
271   L"http://www.baidu.com/s?wd={searchTerms}",
272   "GB2312",
273   NULL,
274   NULL,
275   SEARCH_ENGINE_BAIDU,
276   IDR_SEARCH_ENGINE_LOGO_BAIDU,
277   21,
278 };
279 
280 const PrepopulatedEngine bing = {
281   L"Bing",
282   L"bing.com",
283   "http://www.bing.com/s/wlflag.ico",
284   L"http://www.bing.com/search?q={searchTerms}",
285   "UTF-8",
286   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
287   NULL,
288   SEARCH_ENGINE_BING,
289   IDR_SEARCH_ENGINE_LOGO_BING,
290   3,
291 };
292 
293 const PrepopulatedEngine bing_ar_XA = {
294   L"Bing",
295   L"",  // bing.com is taken by bing_en_XA.
296   "http://www.bing.com/s/wlflag.ico",
297   L"http://www.bing.com/search?setmkt=ar-XA&q={searchTerms}",
298   "UTF-8",
299   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
300   NULL,
301   SEARCH_ENGINE_BING,
302   IDR_SEARCH_ENGINE_LOGO_BING,
303   7,  // Can't be 3 as this has to appear in the Arabian countries' lists
304       // alongside bing_en_XA.
305 };
306 
307 const PrepopulatedEngine bing_bg_BG = {
308   L"Bing",
309   L"bing.com",
310   "http://www.bing.com/s/wlflag.ico",
311   L"http://www.bing.com/search?setmkt=bg-BG&q={searchTerms}",
312   "UTF-8",
313   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
314   NULL,
315   SEARCH_ENGINE_BING,
316   IDR_SEARCH_ENGINE_LOGO_BING,
317   3,
318 };
319 
320 const PrepopulatedEngine bing_cs_CZ = {
321   L"Bing",
322   L"bing.com",
323   "http://www.bing.com/s/wlflag.ico",
324   L"http://www.bing.com/search?setmkt=cs-CZ&q={searchTerms}",
325   "UTF-8",
326   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
327   NULL,
328   SEARCH_ENGINE_BING,
329   IDR_SEARCH_ENGINE_LOGO_BING,
330   3,
331 };
332 
333 const PrepopulatedEngine bing_da_DK = {
334   L"Bing",
335   L"bing.com",
336   "http://www.bing.com/s/wlflag.ico",
337   L"http://www.bing.com/search?setmkt=da-DK&q={searchTerms}",
338   "UTF-8",
339   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
340   NULL,
341   SEARCH_ENGINE_BING,
342   IDR_SEARCH_ENGINE_LOGO_BING,
343   3,
344 };
345 
346 const PrepopulatedEngine bing_de_AT = {
347   L"Bing",
348   L"bing.com",
349   "http://www.bing.com/s/wlflag.ico",
350   L"http://www.bing.com/search?setmkt=de-AT&q={searchTerms}",
351   "UTF-8",
352   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
353   NULL,
354   SEARCH_ENGINE_BING,
355   IDR_SEARCH_ENGINE_LOGO_BING,
356   3,
357 };
358 
359 const PrepopulatedEngine bing_de_CH = {
360   L"Bing",
361   L"bing.com",
362   "http://www.bing.com/s/wlflag.ico",
363   L"http://www.bing.com/search?setmkt=de-CH&q={searchTerms}",
364   "UTF-8",
365   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
366   NULL,
367   SEARCH_ENGINE_BING,
368   IDR_SEARCH_ENGINE_LOGO_BING,
369   3,
370 };
371 
372 const PrepopulatedEngine bing_de_DE = {
373   L"Bing",
374   L"bing.com",
375   "http://www.bing.com/s/wlflag.ico",
376   L"http://www.bing.com/search?setmkt=de-DE&q={searchTerms}",
377   "UTF-8",
378   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
379   NULL,
380   SEARCH_ENGINE_BING,
381   IDR_SEARCH_ENGINE_LOGO_BING,
382   3,
383 };
384 
385 const PrepopulatedEngine bing_el_GR = {
386   L"Bing",
387   L"bing.com",
388   "http://www.bing.com/s/wlflag.ico",
389   L"http://www.bing.com/search?setmkt=el-GR&q={searchTerms}",
390   "UTF-8",
391   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
392   NULL,
393   SEARCH_ENGINE_BING,
394   IDR_SEARCH_ENGINE_LOGO_BING,
395   3,
396 };
397 
398 const PrepopulatedEngine bing_en_AU = {
399   L"Bing",
400   L"bing.com",
401   "http://www.bing.com/s/wlflag.ico",
402   L"http://www.bing.com/search?setmkt=en-AU&q={searchTerms}",
403   "UTF-8",
404   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
405   NULL,
406   SEARCH_ENGINE_BING,
407   IDR_SEARCH_ENGINE_LOGO_BING,
408   3,
409 };
410 
411 const PrepopulatedEngine bing_en_CA = {
412   L"Bing",
413   L"bing.com",
414   "http://www.bing.com/s/wlflag.ico",
415   L"http://www.bing.com/search?setmkt=en-CA&q={searchTerms}",
416   "UTF-8",
417   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
418   NULL,
419   SEARCH_ENGINE_BING,
420   IDR_SEARCH_ENGINE_LOGO_BING,
421   3,
422 };
423 
424 const PrepopulatedEngine bing_en_GB = {
425   L"Bing",
426   L"bing.com",
427   "http://www.bing.com/s/wlflag.ico",
428   L"http://www.bing.com/search?setmkt=en-GB&q={searchTerms}",
429   "UTF-8",
430   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
431   NULL,
432   SEARCH_ENGINE_BING,
433   IDR_SEARCH_ENGINE_LOGO_BING,
434   3,
435 };
436 
437 const PrepopulatedEngine bing_en_ID = {
438   L"Bing",
439   L"bing.com",
440   "http://www.bing.com/s/wlflag.ico",
441   L"http://www.bing.com/search?setmkt=en-ID&q={searchTerms}",
442   "UTF-8",
443   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
444   NULL,
445   SEARCH_ENGINE_BING,
446   IDR_SEARCH_ENGINE_LOGO_BING,
447   3,
448 };
449 
450 const PrepopulatedEngine bing_en_IE = {
451   L"Bing",
452   L"bing.com",
453   "http://www.bing.com/s/wlflag.ico",
454   L"http://www.bing.com/search?setmkt=en-IE&q={searchTerms}",
455   "UTF-8",
456   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
457   NULL,
458   SEARCH_ENGINE_BING,
459   IDR_SEARCH_ENGINE_LOGO_BING,
460   3,
461 };
462 
463 const PrepopulatedEngine bing_en_IN = {
464   L"Bing",
465   L"bing.com",
466   "http://www.bing.com/s/wlflag.ico",
467   L"http://www.bing.com/search?setmkt=en-IN&q={searchTerms}",
468   "UTF-8",
469   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
470   NULL,
471   SEARCH_ENGINE_BING,
472   IDR_SEARCH_ENGINE_LOGO_BING,
473   3,
474 };
475 
476 const PrepopulatedEngine bing_en_MY = {
477   L"Bing",
478   L"bing.com",
479   "http://www.bing.com/s/wlflag.ico",
480   L"http://www.bing.com/search?setmkt=en-MY&q={searchTerms}",
481   "UTF-8",
482   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
483   NULL,
484   SEARCH_ENGINE_BING,
485   IDR_SEARCH_ENGINE_LOGO_BING,
486   3,
487 };
488 
489 const PrepopulatedEngine bing_en_NZ = {
490   L"Bing",
491   L"bing.com",
492   "http://www.bing.com/s/wlflag.ico",
493   L"http://www.bing.com/search?setmkt=en-NZ&q={searchTerms}",
494   "UTF-8",
495   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
496   NULL,
497   SEARCH_ENGINE_BING,
498   IDR_SEARCH_ENGINE_LOGO_BING,
499   3,
500 };
501 
502 const PrepopulatedEngine bing_en_PH = {
503   L"Bing",
504   L"bing.com",
505   "http://www.bing.com/s/wlflag.ico",
506   L"http://www.bing.com/search?setmkt=en-PH&q={searchTerms}",
507   "UTF-8",
508   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
509   NULL,
510   SEARCH_ENGINE_BING,
511   IDR_SEARCH_ENGINE_LOGO_BING,
512   3,
513 };
514 
515 const PrepopulatedEngine bing_en_SG = {
516   L"Bing",
517   L"bing.com",
518   "http://www.bing.com/s/wlflag.ico",
519   L"http://www.bing.com/search?setmkt=en-SG&q={searchTerms}",
520   "UTF-8",
521   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
522   NULL,
523   SEARCH_ENGINE_BING,
524   IDR_SEARCH_ENGINE_LOGO_BING,
525   3,
526 };
527 
528 const PrepopulatedEngine bing_en_US = {
529   L"Bing",
530   L"bing.com",
531   "http://www.bing.com/s/wlflag.ico",
532   L"http://www.bing.com/search?setmkt=en-US&q={searchTerms}",
533   "UTF-8",
534   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
535   NULL,
536   SEARCH_ENGINE_BING,
537   IDR_SEARCH_ENGINE_LOGO_BING,
538   3,
539 };
540 
541 const PrepopulatedEngine bing_en_XA = {
542   L"Bing",
543   L"bing.com",
544   "http://www.bing.com/s/wlflag.ico",
545   L"http://www.bing.com/search?setmkt=en-XA&q={searchTerms}",
546   "UTF-8",
547   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
548   NULL,
549   SEARCH_ENGINE_BING,
550   IDR_SEARCH_ENGINE_LOGO_BING,
551   3,
552 };
553 
554 const PrepopulatedEngine bing_en_ZA = {
555   L"Bing",
556   L"bing.com",
557   "http://www.bing.com/s/wlflag.ico",
558   L"http://www.bing.com/search?setmkt=en-ZA&q={searchTerms}",
559   "UTF-8",
560   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
561   NULL,
562   SEARCH_ENGINE_BING,
563   IDR_SEARCH_ENGINE_LOGO_BING,
564   3,
565 };
566 
567 const PrepopulatedEngine bing_es_AR = {
568   L"Bing",
569   L"bing.com",
570   "http://www.bing.com/s/wlflag.ico",
571   L"http://www.bing.com/search?setmkt=es-AR&q={searchTerms}",
572   "UTF-8",
573   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
574   NULL,
575   SEARCH_ENGINE_BING,
576   IDR_SEARCH_ENGINE_LOGO_BING,
577   3,
578 };
579 
580 const PrepopulatedEngine bing_es_CL = {
581   L"Bing",
582   L"bing.com",
583   "http://www.bing.com/s/wlflag.ico",
584   L"http://www.bing.com/search?setmkt=es-CL&q={searchTerms}",
585   "UTF-8",
586   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
587   NULL,
588   SEARCH_ENGINE_BING,
589   IDR_SEARCH_ENGINE_LOGO_BING,
590   3,
591 };
592 
593 const PrepopulatedEngine bing_es_ES = {
594   L"Bing",
595   L"bing.com",
596   "http://www.bing.com/s/wlflag.ico",
597   L"http://www.bing.com/search?setmkt=es-ES&q={searchTerms}",
598   "UTF-8",
599   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
600   NULL,
601   SEARCH_ENGINE_BING,
602   IDR_SEARCH_ENGINE_LOGO_BING,
603   3,
604 };
605 
606 const PrepopulatedEngine bing_es_MX = {
607   L"Bing",
608   L"bing.com",
609   "http://www.bing.com/s/wlflag.ico",
610   L"http://www.bing.com/search?setmkt=es-MX&q={searchTerms}",
611   "UTF-8",
612   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
613   NULL,
614   SEARCH_ENGINE_BING,
615   IDR_SEARCH_ENGINE_LOGO_BING,
616   3,
617 };
618 
619 const PrepopulatedEngine bing_es_XL = {
620   L"Bing",
621   L"bing.com",
622   "http://www.bing.com/s/wlflag.ico",
623   L"http://www.bing.com/search?setmkt=es-XL&q={searchTerms}",
624   "UTF-8",
625   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
626   NULL,
627   SEARCH_ENGINE_BING,
628   IDR_SEARCH_ENGINE_LOGO_BING,
629   3,
630 };
631 
632 const PrepopulatedEngine bing_et_EE = {
633   L"Bing",
634   L"bing.com",
635   "http://www.bing.com/s/wlflag.ico",
636   L"http://www.bing.com/search?setmkt=et-EE&q={searchTerms}",
637   "UTF-8",
638   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
639   NULL,
640   SEARCH_ENGINE_BING,
641   IDR_SEARCH_ENGINE_LOGO_BING,
642   3,
643 };
644 
645 const PrepopulatedEngine bing_fi_FI = {
646   L"Bing",
647   L"bing.com",
648   "http://www.bing.com/s/wlflag.ico",
649   L"http://www.bing.com/search?setmkt=fi-FI&q={searchTerms}",
650   "UTF-8",
651   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
652   NULL,
653   SEARCH_ENGINE_BING,
654   IDR_SEARCH_ENGINE_LOGO_BING,
655   3,
656 };
657 
658 const PrepopulatedEngine bing_fr_BE = {
659   L"Bing",
660   L"",  // bing.com is taken by bing_nl_BE.
661   "http://www.bing.com/s/wlflag.ico",
662   L"http://www.bing.com/search?setmkt=fr-BE&q={searchTerms}",
663   "UTF-8",
664   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
665   NULL,
666   SEARCH_ENGINE_BING,
667   IDR_SEARCH_ENGINE_LOGO_BING,
668   7,
669 };
670 
671 const PrepopulatedEngine bing_fr_CA = {
672   L"Bing",
673   L"",  // bing.com is taken by bing_en_CA.
674   "http://www.bing.com/s/wlflag.ico",
675   L"http://www.bing.com/search?setmkt=fr-CA&q={searchTerms}",
676   "UTF-8",
677   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
678   NULL,
679   SEARCH_ENGINE_BING,
680   IDR_SEARCH_ENGINE_LOGO_BING,
681   7,
682 };
683 
684 const PrepopulatedEngine bing_fr_CH = {
685   L"Bing",
686   L"",  // bing.com is taken by bing_de_CH.
687   "http://www.bing.com/s/wlflag.ico",
688   L"http://www.bing.com/search?setmkt=fr-CH&q={searchTerms}",
689   "UTF-8",
690   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
691   NULL,
692   SEARCH_ENGINE_BING,
693   IDR_SEARCH_ENGINE_LOGO_BING,
694   7,
695 };
696 
697 const PrepopulatedEngine bing_fr_FR = {
698   L"Bing",
699   L"bing.com",
700   "http://www.bing.com/s/wlflag.ico",
701   L"http://www.bing.com/search?setmkt=fr-FR&q={searchTerms}",
702   "UTF-8",
703   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
704   NULL,
705   SEARCH_ENGINE_BING,
706   IDR_SEARCH_ENGINE_LOGO_BING,
707   3,
708 };
709 
710 const PrepopulatedEngine bing_he_IL = {
711   L"Bing",
712   L"bing.com",
713   "http://www.bing.com/s/wlflag.ico",
714   L"http://www.bing.com/search?setmkt=he-IL&q={searchTerms}",
715   "UTF-8",
716   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
717   NULL,
718   SEARCH_ENGINE_BING,
719   IDR_SEARCH_ENGINE_LOGO_BING,
720   3,
721 };
722 
723 const PrepopulatedEngine bing_hr_HR = {
724   L"Bing",
725   L"bing.com",
726   "http://www.bing.com/s/wlflag.ico",
727   L"http://www.bing.com/search?setmkt=hr-HR&q={searchTerms}",
728   "UTF-8",
729   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
730   NULL,
731   SEARCH_ENGINE_BING,
732   IDR_SEARCH_ENGINE_LOGO_BING,
733   3,
734 };
735 
736 const PrepopulatedEngine bing_hu_HU = {
737   L"Bing",
738   L"bing.com",
739   "http://www.bing.com/s/wlflag.ico",
740   L"http://www.bing.com/search?setmkt=hu-HU&q={searchTerms}",
741   "UTF-8",
742   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
743   NULL,
744   SEARCH_ENGINE_BING,
745   IDR_SEARCH_ENGINE_LOGO_BING,
746   3,
747 };
748 
749 const PrepopulatedEngine bing_it_IT = {
750   L"Bing",
751   L"bing.com",
752   "http://www.bing.com/s/wlflag.ico",
753   L"http://www.bing.com/search?setmkt=it-IT&q={searchTerms}",
754   "UTF-8",
755   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
756   NULL,
757   SEARCH_ENGINE_BING,
758   IDR_SEARCH_ENGINE_LOGO_BING,
759   3,
760 };
761 
762 const PrepopulatedEngine bing_ja_JP = {
763   L"Bing",
764   L"bing.com",
765   "http://www.bing.com/s/wlflag.ico",
766   L"http://www.bing.com/search?setmkt=ja-JP&q={searchTerms}",
767   "UTF-8",
768   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
769   NULL,
770   SEARCH_ENGINE_BING,
771   IDR_SEARCH_ENGINE_LOGO_BING,
772   3,
773 };
774 
775 const PrepopulatedEngine bing_ko_KR = {
776   L"Bing",
777   L"bing.com",
778   "http://www.bing.com/s/wlflag.ico",
779   L"http://www.bing.com/search?setmkt=ko-KR&q={searchTerms}",
780   "UTF-8",
781   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
782   NULL,
783   SEARCH_ENGINE_BING,
784   IDR_SEARCH_ENGINE_LOGO_BING,
785   3,
786 };
787 
788 const PrepopulatedEngine bing_lt_LT = {
789   L"Bing",
790   L"bing.com",
791   "http://www.bing.com/s/wlflag.ico",
792   L"http://www.bing.com/search?setmkt=lt-LT&q={searchTerms}",
793   "UTF-8",
794   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
795   NULL,
796   SEARCH_ENGINE_BING,
797   IDR_SEARCH_ENGINE_LOGO_BING,
798   3,
799 };
800 
801 const PrepopulatedEngine bing_lv_LV = {
802   L"Bing",
803   L"bing.com",
804   "http://www.bing.com/s/wlflag.ico",
805   L"http://www.bing.com/search?setmkt=lv-LV&q={searchTerms}",
806   "UTF-8",
807   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
808   NULL,
809   SEARCH_ENGINE_BING,
810   IDR_SEARCH_ENGINE_LOGO_BING,
811   3,
812 };
813 
814 const PrepopulatedEngine bing_nb_NO = {
815   L"Bing",
816   L"bing.com",
817   "http://www.bing.com/s/wlflag.ico",
818   L"http://www.bing.com/search?setmkt=nb-NO&q={searchTerms}",
819   "UTF-8",
820   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
821   NULL,
822   SEARCH_ENGINE_BING,
823   IDR_SEARCH_ENGINE_LOGO_BING,
824   3,
825 };
826 
827 const PrepopulatedEngine bing_nl_BE = {
828   L"Bing",
829   L"bing.com",
830   "http://www.bing.com/s/wlflag.ico",
831   L"http://www.bing.com/search?setmkt=nl-BE&q={searchTerms}",
832   "UTF-8",
833   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
834   NULL,
835   SEARCH_ENGINE_BING,
836   IDR_SEARCH_ENGINE_LOGO_BING,
837   3,
838 };
839 
840 const PrepopulatedEngine bing_nl_NL = {
841   L"Bing",
842   L"bing.com",
843   "http://www.bing.com/s/wlflag.ico",
844   L"http://www.bing.com/search?setmkt=nl-NL&q={searchTerms}",
845   "UTF-8",
846   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
847   NULL,
848   SEARCH_ENGINE_BING,
849   IDR_SEARCH_ENGINE_LOGO_BING,
850   3,
851 };
852 
853 const PrepopulatedEngine bing_pl_PL = {
854   L"Bing",
855   L"bing.com",
856   "http://www.bing.com/s/wlflag.ico",
857   L"http://www.bing.com/search?setmkt=pl-PL&q={searchTerms}",
858   "UTF-8",
859   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
860   NULL,
861   SEARCH_ENGINE_BING,
862   IDR_SEARCH_ENGINE_LOGO_BING,
863   3,
864 };
865 
866 const PrepopulatedEngine bing_pt_BR = {
867   L"Bing",
868   L"bing.com",
869   "http://www.bing.com/s/wlflag.ico",
870   L"http://www.bing.com/search?setmkt=pt-BR&q={searchTerms}",
871   "UTF-8",
872   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
873   NULL,
874   SEARCH_ENGINE_BING,
875   IDR_SEARCH_ENGINE_LOGO_BING,
876   3,
877 };
878 
879 const PrepopulatedEngine bing_pt_PT = {
880   L"Bing",
881   L"bing.com",
882   "http://www.bing.com/s/wlflag.ico",
883   L"http://www.bing.com/search?setmkt=pt-PT&q={searchTerms}",
884   "UTF-8",
885   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
886   NULL,
887   SEARCH_ENGINE_BING,
888   IDR_SEARCH_ENGINE_LOGO_BING,
889   3,
890 };
891 
892 const PrepopulatedEngine bing_ro_RO = {
893   L"Bing",
894   L"bing.com",
895   "http://www.bing.com/s/wlflag.ico",
896   L"http://www.bing.com/search?setmkt=ro-RO&q={searchTerms}",
897   "UTF-8",
898   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
899   NULL,
900   SEARCH_ENGINE_BING,
901   IDR_SEARCH_ENGINE_LOGO_BING,
902   3,
903 };
904 
905 const PrepopulatedEngine bing_ru_RU = {
906   L"Bing",
907   L"bing.com",
908   "http://www.bing.com/s/wlflag.ico",
909   L"http://www.bing.com/search?setmkt=ru-RU&q={searchTerms}",
910   "UTF-8",
911   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
912   NULL,
913   SEARCH_ENGINE_BING,
914   IDR_SEARCH_ENGINE_LOGO_BING,
915   3,
916 };
917 
918 const PrepopulatedEngine bing_sl_SI = {
919   L"Bing",
920   L"bing.com",
921   "http://www.bing.com/s/wlflag.ico",
922   L"http://www.bing.com/search?setmkt=sl-SI&q={searchTerms}",
923   "UTF-8",
924   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
925   NULL,
926   SEARCH_ENGINE_BING,
927   IDR_SEARCH_ENGINE_LOGO_BING,
928   3,
929 };
930 
931 const PrepopulatedEngine bing_sk_SK = {
932   L"Bing",
933   L"bing.com",
934   "http://www.bing.com/s/wlflag.ico",
935   L"http://www.bing.com/search?setmkt=sk-SK&q={searchTerms}",
936   "UTF-8",
937   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
938   NULL,
939   SEARCH_ENGINE_BING,
940   IDR_SEARCH_ENGINE_LOGO_BING,
941   3,
942 };
943 
944 const PrepopulatedEngine bing_sv_SE = {
945   L"Bing",
946   L"bing.com",
947   "http://www.bing.com/s/wlflag.ico",
948   L"http://www.bing.com/search?setmkt=sv-SE&q={searchTerms}",
949   "UTF-8",
950   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
951   NULL,
952   SEARCH_ENGINE_BING,
953   IDR_SEARCH_ENGINE_LOGO_BING,
954   3,
955 };
956 
957 const PrepopulatedEngine bing_th_TH = {
958   L"Bing",
959   L"bing.com",
960   "http://www.bing.com/s/wlflag.ico",
961   L"http://www.bing.com/search?setmkt=th-TH&q={searchTerms}",
962   "UTF-8",
963   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
964   NULL,
965   SEARCH_ENGINE_BING,
966   IDR_SEARCH_ENGINE_LOGO_BING,
967   3,
968 };
969 
970 const PrepopulatedEngine bing_tr_TR = {
971   L"Bing",
972   L"bing.com",
973   "http://www.bing.com/s/wlflag.ico",
974   L"http://www.bing.com/search?setmkt=tr-TR&q={searchTerms}",
975   "UTF-8",
976   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
977   NULL,
978   SEARCH_ENGINE_BING,
979   IDR_SEARCH_ENGINE_LOGO_BING,
980   3,
981 };
982 
983 const PrepopulatedEngine bing_uk_UA = {
984   L"Bing",
985   L"bing.com",
986   "http://www.bing.com/s/wlflag.ico",
987   L"http://www.bing.com/search?setmkt=uk-UA&q={searchTerms}",
988   "UTF-8",
989   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
990   NULL,
991   SEARCH_ENGINE_BING,
992   IDR_SEARCH_ENGINE_LOGO_BING,
993   3,
994 };
995 
996 const PrepopulatedEngine bing_zh_CN = {
997   L"Bing",
998   L"bing.com",
999   "http://www.bing.com/s/wlflag.ico",
1000   L"http://www.bing.com/search?setmkt=zh-CN&q={searchTerms}",
1001   "UTF-8",
1002   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
1003   NULL,
1004   SEARCH_ENGINE_BING,
1005   IDR_SEARCH_ENGINE_LOGO_BING,
1006   3,
1007 };
1008 
1009 const PrepopulatedEngine bing_zh_HK = {
1010   L"Bing",
1011   L"bing.com",
1012   "http://www.bing.com/s/wlflag.ico",
1013   L"http://www.bing.com/search?setmkt=zh-HK&q={searchTerms}",
1014   "UTF-8",
1015   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
1016   NULL,
1017   SEARCH_ENGINE_BING,
1018   IDR_SEARCH_ENGINE_LOGO_BING,
1019   3,
1020 };
1021 
1022 const PrepopulatedEngine bing_zh_TW = {
1023   L"Bing",
1024   L"bing.com",
1025   "http://www.bing.com/s/wlflag.ico",
1026   L"http://www.bing.com/search?setmkt=zh-TW&q={searchTerms}",
1027   "UTF-8",
1028   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
1029   NULL,
1030   SEARCH_ENGINE_BING,
1031   IDR_SEARCH_ENGINE_LOGO_BING,
1032   3,
1033 };
1034 
1035 const PrepopulatedEngine centrum_cz = {
1036   L"Centrum.cz",
1037   L"centrum.cz",
1038   "http://img.centrum.cz/6/vy2/o/favicon.ico",
1039   L"http://search.centrum.cz/index.php?charset={inputEncoding}&q={searchTerms}",
1040   "UTF-8",
1041   NULL,
1042   NULL,
1043   SEARCH_ENGINE_CENTRUM,
1044   IDR_SEARCH_ENGINE_LOGO_CENTRUM,
1045   26,
1046 };
1047 
1048 const PrepopulatedEngine centrum_sk = {
1049   L"Centrum.sk",
1050   L"centrum.sk",
1051   "http://img.centrum.sk/4/favicon.ico",
1052   L"http://search.centrum.sk/index.php?charset={inputEncoding}&q={searchTerms}",
1053   "UTF-8",
1054   NULL,
1055   NULL,
1056   SEARCH_ENGINE_CENTRUM,
1057   IDR_SEARCH_ENGINE_LOGO_CENTRUM,
1058   26,
1059 };
1060 
1061 const PrepopulatedEngine daum = {
1062   L"Daum",
1063   L"daum.net",
1064   "http://search.daum.net/favicon.ico",
1065   L"http://search.daum.net/search?q={searchTerms}",
1066   "EUC-KR",
1067   L"http://sug.search.daum.net/search_nsuggest?mod=fxjson&q={searchTerms}",
1068   NULL,
1069   SEARCH_ENGINE_DAUM,
1070   IDR_SEARCH_ENGINE_LOGO_DAUM,
1071   68,
1072 };
1073 
1074 const PrepopulatedEngine delfi_lt = {
1075   L"DELFI",
1076   L"delfi.lt",
1077   "http://search.delfi.lt/img/favicon.png",
1078   L"http://search.delfi.lt/search.php?q={searchTerms}",
1079   "UTF-8",
1080   NULL,
1081   NULL,
1082   SEARCH_ENGINE_DELFI,
1083   IDR_SEARCH_ENGINE_LOGO_DELFI,
1084   45,
1085 };
1086 
1087 const PrepopulatedEngine delfi_lv = {
1088   L"DELFI",
1089   L"delfi.lv",
1090   "http://smart.delfi.lv/img/smart_search.png",
1091   L"http://smart.delfi.lv/i.php?enc={inputEncoding}&q={searchTerms}",
1092   "UTF-8",
1093   NULL,
1094   NULL,
1095   SEARCH_ENGINE_DELFI,
1096   IDR_SEARCH_ENGINE_LOGO_DELFI,
1097   45,
1098 };
1099 
1100 const PrepopulatedEngine diri = {
1101   L"diri",
1102   L"diri.bg",
1103   "http://i.dir.bg/diri/images/favicon.ico",
1104   L"http://diri.bg/search.php?textfield={searchTerms}",
1105   "windows-1251",
1106   NULL,
1107   NULL,
1108   SEARCH_ENGINE_DIRI,
1109   IDR_SEARCH_ENGINE_LOGO_DIRI,
1110   32,
1111 };
1112 
1113 const PrepopulatedEngine eniro_fi = {
1114   L"Eniro",
1115   L"eniro.fi",
1116   "http://eniro.fi/favicon.ico",
1117   L"http://eniro.fi/query?search_word={searchTerms}&what=web_local",
1118   "ISO-8859-1",
1119   NULL,
1120   NULL,
1121   SEARCH_ENGINE_OTHER,
1122   kNoSearchEngineLogo,
1123   29,
1124 };
1125 
1126 const PrepopulatedEngine eniro_se = {
1127   L"Eniro",
1128   L"eniro.se",
1129   "http://eniro.se/favicon.ico",
1130   L"http://eniro.se/query?search_word={searchTerms}&what=web_local",
1131   "ISO-8859-1",
1132   NULL,
1133   NULL,
1134   SEARCH_ENGINE_OTHER,
1135   kNoSearchEngineLogo,
1136   29,
1137 };
1138 
1139 const PrepopulatedEngine fonecta_02_fi = {
1140   L"Fonecta 02.fi",
1141   L"www.fi",
1142   "http://www.02.fi/img/favicon.ico",
1143   L"http://www.02.fi/haku/{searchTerms}",
1144   "UTF-8",
1145   NULL,
1146   NULL,
1147   SEARCH_ENGINE_OTHER,
1148   kNoSearchEngineLogo,
1149   46,
1150 };
1151 
1152 const PrepopulatedEngine go = {
1153   L"GO.com",
1154   L"go.com",
1155   "http://search.yahoo.com/favicon.ico",
1156   L"http://search.yahoo.com/search?ei={inputEncoding}&p={searchTerms}&"
1157       L"fr=hsusgo1",
1158   "ISO-8859-1",
1159   NULL,
1160   NULL,
1161   SEARCH_ENGINE_OTHER,
1162   kNoSearchEngineLogo,
1163   40,
1164 };
1165 
1166 const PrepopulatedEngine goo = {
1167   L"goo",
1168   L"search.goo.ne.jp",
1169   "http://goo.ne.jp/favicon.ico",
1170   L"http://search.goo.ne.jp/web.jsp?MT={searchTerms}&IE={inputEncoding}",
1171   "UTF-8",
1172   NULL,
1173   NULL,
1174   SEARCH_ENGINE_GOO,
1175   IDR_SEARCH_ENGINE_LOGO_GOO,
1176   23,
1177 };
1178 
1179 const PrepopulatedEngine google = {
1180   L"Google",
1181   NULL,
1182   "http://www.google.com/favicon.ico",
1183   L"{google:baseURL}search?{google:RLZ}{google:acceptedSuggestion}"
1184       L"{google:originalQueryForSuggestion}sourceid=chrome&ie={inputEncoding}&"
1185       L"q={searchTerms}",
1186   "UTF-8",
1187   L"{google:baseSuggestURL}search?client=chrome&hl={language}&q={searchTerms}",
1188   L"{google:baseURL}webhp?{google:RLZ}sourceid=chrome-instant"
1189       L"&ie={inputEncoding}&ion=1{searchTerms}&nord=1",
1190   SEARCH_ENGINE_GOOGLE,
1191   IDR_SEARCH_ENGINE_LOGO_GOOGLE,
1192   1,
1193 };
1194 
1195 const PrepopulatedEngine guruji = {
1196   L"guruji",
1197   L"guruji.com",
1198   "http://guruji.com/favicon.ico",
1199   L"http://guruji.com/search?q={searchTerms}",
1200   "UTF-8",
1201   NULL,
1202   NULL,
1203   SEARCH_ENGINE_OTHER,
1204   kNoSearchEngineLogo,
1205   38,
1206 };
1207 
1208 const PrepopulatedEngine hispavista = {
1209   L"hispavista",
1210   L"hispavista.com",
1211   "http://buscar.hispavista.com/favicon.ico",
1212   L"http://buscar.hispavista.com/?cadena={searchTerms}",
1213   "iso-8859-1",
1214   NULL,
1215   NULL,
1216   SEARCH_ENGINE_OTHER,
1217   kNoSearchEngineLogo,
1218   18,
1219 };
1220 
1221 const PrepopulatedEngine in = {
1222   L"in.gr",
1223   L"in.gr",
1224   "http://www.in.gr/favicon.ico",
1225   L"http://find.in.gr/?qs={searchTerms}",
1226   "ISO-8859-7",
1227   NULL,
1228   NULL,
1229   SEARCH_ENGINE_IN,
1230   IDR_SEARCH_ENGINE_LOGO_IN,
1231   54,
1232 };
1233 
1234 const PrepopulatedEngine jabse = {
1235   L"Jabse",
1236   L"jabse.com",
1237   "http://www.jabse.com/favicon.ico",
1238   L"http://www.jabse.com/searchmachine.php?query={searchTerms}",
1239   "UTF-8",
1240   NULL,
1241   NULL,
1242   SEARCH_ENGINE_OTHER,
1243   kNoSearchEngineLogo,
1244   19,
1245 };
1246 
1247 const PrepopulatedEngine jubii = {
1248   L"Jubii",
1249   L"jubii.dk",
1250   "http://search.jubii.dk/favicon_jubii.ico",
1251   L"http://search.jubii.dk/cgi-bin/pursuit?query={searchTerms}",
1252   "ISO-8859-1",
1253   NULL,
1254   NULL,
1255   SEARCH_ENGINE_OTHER,
1256   kNoSearchEngineLogo,
1257   28,
1258 };
1259 
1260 const PrepopulatedEngine kvasir = {
1261   L"Kvasir",
1262   L"kvasir.no",
1263   "http://www.kvasir.no/img/favicon.ico",
1264   L"http://www.kvasir.no/nettsok/searchResult.html?searchExpr={searchTerms}",
1265   "ISO-8859-1",
1266   NULL,
1267   NULL,
1268   SEARCH_ENGINE_OTHER,
1269   kNoSearchEngineLogo,
1270   73,
1271 };
1272 
1273 const PrepopulatedEngine latne = {
1274   L"LATNE",
1275   L"latne.lv",
1276   "http://latne.lv/favicon.ico",
1277   L"http://latne.lv/siets.php?q={searchTerms}",
1278   "UTF-8",
1279   NULL,
1280   NULL,
1281   SEARCH_ENGINE_OTHER,
1282   kNoSearchEngineLogo,
1283   71,
1284 };
1285 
1286 const PrepopulatedEngine leit = {
1287   L"leit.is",
1288   L"leit.is",
1289   "http://leit.is/leit.ico",
1290   L"http://leit.is/query.aspx?qt={searchTerms}",
1291   "ISO-8859-1",
1292   NULL,
1293   NULL,
1294   SEARCH_ENGINE_OTHER,
1295   kNoSearchEngineLogo,
1296   59,
1297 };
1298 
1299 const PrepopulatedEngine libero = {
1300   L"Libero",
1301   L"libero.it",
1302   "http://arianna.libero.it/favicon.ico",
1303   L"http://arianna.libero.it/search/abin/integrata.cgi?query={searchTerms}",
1304   "ISO-8859-1",
1305   NULL,
1306   NULL,
1307   SEARCH_ENGINE_OTHER,
1308   kNoSearchEngineLogo,
1309   63,
1310 };
1311 
1312 const PrepopulatedEngine mail_ru = {
1313   L"@MAIL.RU",
1314   L"mail.ru",
1315   "http://img.go.mail.ru/favicon.ico",
1316   L"http://go.mail.ru/search?q={searchTerms}",
1317   "windows-1251",
1318   NULL,
1319   NULL,
1320   SEARCH_ENGINE_MAILRU,
1321   IDR_SEARCH_ENGINE_LOGO_MAILRU,
1322   83,
1323 };
1324 
1325 const PrepopulatedEngine maktoob = {
1326   L"\x0645\x0643\x062a\x0648\x0628",
1327   L"maktoob.com",
1328   "http://www.maktoob.com/favicon.ico",
1329   L"http://www.maktoob.com/searchResult.php?q={searchTerms}",
1330   "UTF-8",
1331   NULL,
1332   NULL,
1333   SEARCH_ENGINE_OTHER,
1334   kNoSearchEngineLogo,
1335   13,
1336 };
1337 
1338 const PrepopulatedEngine masrawy = {
1339   L"\x0645\x0635\x0631\x0627\x0648\x064a",
1340   L"masrawy.com",
1341   "http://www.masrawy.com/new/images/masrawy.ico",
1342   L"http://masrawy.com/new/search.aspx?sr={searchTerms}",
1343   "windows-1256",
1344   NULL,
1345   NULL,
1346   SEARCH_ENGINE_OTHER,
1347   kNoSearchEngineLogo,
1348   14,
1349 };
1350 
1351 const PrepopulatedEngine mynet = {
1352   L"MYNET",
1353   L"mynet.com",
1354   "http://img.mynet.com/mynetfavori.ico",
1355   L"http://arama.mynet.com/search.aspx?q={searchTerms}&pg=q",
1356   "windows-1254",
1357   NULL,
1358   NULL,
1359   SEARCH_ENGINE_OTHER,
1360   kNoSearchEngineLogo,
1361   101,
1362 };
1363 
1364 const PrepopulatedEngine najdi = {
1365   L"Najdi.si",
1366   L"najdi.si",
1367   "http://www.najdi.si/master/favicon.ico",
1368   L"http://www.najdi.si/search.jsp?q={searchTerms}",
1369   "UTF-8",
1370   NULL,
1371   NULL,
1372   SEARCH_ENGINE_NAJDI,
1373   IDR_SEARCH_ENGINE_LOGO_NAJDI,
1374   87,
1375 };
1376 
1377 const PrepopulatedEngine nate = {
1378   L"\xb124\xc774\xd2b8\xb2f7\xcef4",
1379   L"nate.com",
1380   "http://nate.search.empas.com/favicon.ico",
1381   L"http://nate.search.empas.com/search/all.html?q={searchTerms}",
1382   "EUC-KR",
1383   NULL,
1384   NULL,
1385   SEARCH_ENGINE_OTHER,
1386   kNoSearchEngineLogo,
1387   69,
1388 };
1389 
1390 const PrepopulatedEngine naver = {
1391   L"\xb124\xc774\xbc84",
1392   L"naver.com",
1393   "http://search.naver.com/favicon.ico",
1394   L"http://search.naver.com/search.naver?ie={inputEncoding}"
1395       L"&query={searchTerms}",
1396   "UTF-8",
1397   L"http://ac.search.naver.com/autocompl?m=s&ie={inputEncoding}&oe=utf-8&"
1398       L"q={searchTerms}",
1399   NULL,
1400   SEARCH_ENGINE_NAVER,
1401   IDR_SEARCH_ENGINE_LOGO_NAVER,
1402   67,
1403 };
1404 
1405 const PrepopulatedEngine neti = {
1406   L"NETI",
1407   L"neti.ee",
1408   "http://www.neti.ee/favicon.ico",
1409   L"http://www.neti.ee/cgi-bin/otsing?query={searchTerms}",
1410   "ISO-8859-1",
1411   NULL,
1412   NULL,
1413   SEARCH_ENGINE_NETI,
1414   IDR_SEARCH_ENGINE_LOGO_NETI,
1415   44,
1416 };
1417 
1418 const PrepopulatedEngine netsprint = {
1419   L"NetSprint",
1420   L"netsprint.pl",
1421   "http://netsprint.pl/favicon.ico",
1422   L"http://www.netsprint.pl/serwis/search?q={searchTerms}",
1423   "UTF-8",
1424   NULL,
1425   NULL,
1426   SEARCH_ENGINE_NETSPRINT,
1427   IDR_SEARCH_ENGINE_LOGO_NETSPRINT,
1428   30,
1429 };
1430 
1431 const PrepopulatedEngine nur_kz = {
1432   L"NUR.KZ",
1433   L"nur.kz",
1434   "http://www.nur.kz/favicon_kz.ico",
1435   L"http://search.nur.kz/?encoding={inputEncoding}&query={searchTerms}",
1436   "UTF-8",
1437   NULL,
1438   NULL,
1439   SEARCH_ENGINE_OTHER,
1440   kNoSearchEngineLogo,
1441   20,
1442 };
1443 
1444 const PrepopulatedEngine ok = {
1445   L"OK.hu",
1446   L"ok.hu",
1447   "http://ok.hu/gfx/favicon.ico",
1448   L"http://ok.hu/katalogus?q={searchTerms}",
1449   "ISO-8859-2",
1450   NULL,
1451   NULL,
1452   SEARCH_ENGINE_OK,
1453   IDR_SEARCH_ENGINE_LOGO_OK,
1454   6,
1455 };
1456 
1457 const PrepopulatedEngine onet = {
1458   L"Onet.pl",
1459   L"onet.pl",
1460   "http://szukaj.onet.pl/favicon.ico",
1461   L"http://szukaj.onet.pl/query.html?qt={searchTerms}",
1462   "ISO-8859-2",
1463   NULL,
1464   NULL,
1465   SEARCH_ENGINE_OTHER,
1466   kNoSearchEngineLogo,
1467   75,
1468 };
1469 
1470 const PrepopulatedEngine pogodak_ba = {
1471   L"Pogodak!",
1472   L"pogodak.ba",
1473   "http://www.pogodak.ba/favicon.ico",
1474   L"http://www.pogodak.ba/search.jsp?q={searchTerms}",
1475   "UTF-8",
1476   NULL,
1477   NULL,
1478   SEARCH_ENGINE_POGODAK,
1479   IDR_SEARCH_ENGINE_LOGO_POGODAK,
1480   24,
1481 };
1482 
1483 const PrepopulatedEngine pogodak_hr = {
1484   L"Pogodak!",
1485   L"pogodak.hr",
1486   "http://www.pogodak.hr/favicon.ico",
1487   L"http://www.pogodak.hr/search.jsp?q={searchTerms}",
1488   "UTF-8",
1489   NULL,
1490   NULL,
1491   SEARCH_ENGINE_POGODAK,
1492   IDR_SEARCH_ENGINE_LOGO_POGODAK,
1493   24,
1494 };
1495 
1496 const PrepopulatedEngine pogodak_rs = {
1497   L"Pogodak!",
1498   L"pogodak.rs",
1499   "http://www.pogodak.rs/favicon.ico",
1500   L"http://www.pogodak.rs/search.jsp?q={searchTerms}",
1501   "UTF-8",
1502   NULL,
1503   NULL,
1504   SEARCH_ENGINE_POGODAK,
1505   IDR_SEARCH_ENGINE_LOGO_POGODAK,
1506   24,
1507 };
1508 
1509 const PrepopulatedEngine pogodok = {
1510   L"\x041f\x043e\x0433\x043e\x0434\x043e\x043a!",
1511   L"pogodok.com.mk",
1512   "http://www.pogodok.com.mk/favicon.ico",
1513   L"http://www.pogodok.com.mk/search.jsp?q={searchTerms}",
1514   "UTF-8",
1515   NULL,
1516   NULL,
1517   SEARCH_ENGINE_POGODOK_MK,
1518   IDR_SEARCH_ENGINE_LOGO_POGODOK_MK,
1519   24,  // Really the same engine as Pogodak, just has a small name change.
1520 };
1521 
1522 const PrepopulatedEngine rambler = {
1523   L"Rambler",
1524   L"rambler.ru",
1525   "http://www.rambler.ru/favicon.ico",
1526   L"http://www.rambler.ru/srch?words={searchTerms}",
1527   "windows-1251",
1528   NULL,
1529   NULL,
1530   SEARCH_ENGINE_RAMBLER,
1531   IDR_SEARCH_ENGINE_LOGO_RAMBLER,
1532   16,
1533 };
1534 
1535 const PrepopulatedEngine rediff = {
1536   L"Rediff",
1537   L"rediff.com",
1538   "http://search1.rediff.com/favicon.ico",
1539   L"http://search1.rediff.com/dirsrch/default.asp?MT={searchTerms}",
1540   "UTF-8",
1541   NULL,
1542   NULL,
1543   SEARCH_ENGINE_OTHER,
1544   kNoSearchEngineLogo,
1545   37,
1546 };
1547 
1548 const PrepopulatedEngine rednano = {
1549   L"Rednano",
1550   L"rednano.sg",
1551   "http://rednano.sg/favicon.ico",
1552   L"http://rednano.sg/sfe/lwi.action?querystring={searchTerms}",
1553   "UTF-8",
1554   NULL,
1555   NULL,
1556   SEARCH_ENGINE_OTHER,
1557   kNoSearchEngineLogo,
1558   41,
1559 };
1560 
1561 const PrepopulatedEngine sanook = {
1562   L"\x0e2a\x0e19\x0e38\x0e01!",
1563   L"sanook.com",
1564   "http://search.sanook.com/favicon.ico",
1565   L"http://search.sanook.com/search.php?q={searchTerms}",
1566   "UTF-8",
1567   NULL,
1568   NULL,
1569   SEARCH_ENGINE_SANOOK,
1570   IDR_SEARCH_ENGINE_LOGO_SANOOK,
1571   100,
1572 };
1573 
1574 const PrepopulatedEngine sapo = {
1575   L"SAPO",
1576   L"sapo.pt",
1577   "http://imgs.sapo.pt/images/sapo.ico",
1578   L"http://pesquisa.sapo.pt/?q={searchTerms}",
1579   "UTF-8",
1580   L"http://pesquisa.sapo.pt/livesapo?q={searchTerms}",
1581   NULL,
1582   SEARCH_ENGINE_SAPO,
1583   IDR_SEARCH_ENGINE_LOGO_SAPO,
1584   77,
1585 };
1586 
1587 const PrepopulatedEngine search_de_CH = {
1588   L"search.ch",
1589   L"search.ch",
1590   "http://www.search.ch/favicon.ico",
1591   L"http://www.search.ch/index.de.html?q={searchTerms}",
1592   "ISO-8859-1",
1593   NULL,
1594   NULL,
1595   SEARCH_ENGINE_OTHER,
1596   kNoSearchEngineLogo,
1597   51,
1598 };
1599 
1600 const PrepopulatedEngine search_fr_CH = {
1601   L"search.ch",
1602   L"",  // search.ch is taken by search_de_CH.
1603   "http://www.search.ch/favicon.ico",
1604   L"http://www.search.ch/index.fr.html?q={searchTerms}",
1605   "ISO-8859-1",
1606   NULL,
1607   NULL,
1608   SEARCH_ENGINE_OTHER,
1609   kNoSearchEngineLogo,
1610   22,
1611 };
1612 
1613 const PrepopulatedEngine seznam = {
1614   L"Seznam",
1615   L"seznam.cz",
1616   "http://1.im.cz/szn/img/favicon.ico",
1617   L"http://search.seznam.cz/?q={searchTerms}",
1618   "UTF-8",
1619   L"http:///suggest.fulltext.seznam.cz/?dict=fulltext_ff&phrase={searchTerms}&"
1620       L"encoding={inputEncoding}&response_encoding=utf-8",
1621   NULL,
1622   SEARCH_ENGINE_SEZNAM,
1623   IDR_SEARCH_ENGINE_LOGO_SEZNAM,
1624   25,
1625 };
1626 
1627 const PrepopulatedEngine spray = {
1628   L"Spray",
1629   L"spray.se",
1630   "http://www.eniro.se/favicon.ico",
1631   L"http://www.eniro.se/query?ax=spray&search_word={searchTerms}&what=web",
1632   "ISO-8859-1",
1633   NULL,
1634   NULL,
1635   SEARCH_ENGINE_OTHER,
1636   kNoSearchEngineLogo,
1637   99,
1638 };
1639 
1640 const PrepopulatedEngine terra_ar = {
1641   L"Terra Argentina",
1642   L"terra.com.ar",
1643   "http://buscar.terra.com.ar/favicon.ico",
1644   L"http://buscar.terra.com.ar/Default.aspx?query={searchTerms}&source=Search",
1645   "ISO-8859-1",
1646   NULL,
1647   NULL,
1648   SEARCH_ENGINE_OTHER,
1649   kNoSearchEngineLogo,
1650   90,
1651 };
1652 
1653 const PrepopulatedEngine terra_es = {
1654   L"Terra",
1655   L"terra.es",
1656   "http://buscador.terra.es/favicon.ico",
1657   L"http://buscador.terra.es/Default.aspx?query={searchTerms}&source=Search",
1658   "ISO-8859-1",
1659   NULL,
1660   NULL,
1661   SEARCH_ENGINE_OTHER,
1662   kNoSearchEngineLogo,
1663   90,
1664 };
1665 
1666 const PrepopulatedEngine tut = {
1667   L"TUT.BY",
1668   L"tut.by",
1669   "http://www.tut.by/favicon.ico",
1670   L"http://search.tut.by/?query={searchTerms}",
1671   "windows-1251",
1672   NULL,
1673   NULL,
1674   SEARCH_ENGINE_TUT,
1675   IDR_SEARCH_ENGINE_LOGO_TUT,
1676   17,
1677 };
1678 
1679 const PrepopulatedEngine uol = {
1680   L"UOL Busca",
1681   L"busca.uol.com.br",
1682   "http://busca.uol.com.br/favicon.ico",
1683   L"http://busca.uol.com.br/www/index.html?q={searchTerms}",
1684   "ISO-8859-1",
1685   NULL,
1686   NULL,
1687   SEARCH_ENGINE_OTHER,
1688   kNoSearchEngineLogo,
1689   82,
1690 };
1691 
1692 const PrepopulatedEngine virgilio = {
1693   L"Virgilio",
1694   L"virgilio.it",
1695   "http://ricerca.alice.it/favicon.ico",
1696   L"http://ricerca.alice.it/ricerca?qs={searchTerms}",
1697   "ISO-8859-1",
1698   NULL,
1699   NULL,
1700   SEARCH_ENGINE_VIRGILIO,
1701   IDR_SEARCH_ENGINE_LOGO_VIRGILIO,
1702   62,
1703 };
1704 
1705 const PrepopulatedEngine walla = {
1706   L"\x05d5\x05d5\x05d0\x05dc\x05d4!",
1707   L"walla.co.il",
1708   "http://www.walla.co.il/favicon.ico",
1709   L"http://search.walla.co.il/?e=hew&q={searchTerms}",
1710   "windows-1255",
1711   NULL,
1712   NULL,
1713   SEARCH_ENGINE_WALLA,
1714   IDR_SEARCH_ENGINE_LOGO_WALLA,
1715   55,
1716 };
1717 
1718 const PrepopulatedEngine wp = {
1719   L"Wirtualna Polska",
1720   L"wp.pl",
1721   "http://szukaj.wp.pl/favicon.ico",
1722   L"http://szukaj.wp.pl/szukaj.html?szukaj={searchTerms}",
1723   "ISO-8859-2",
1724   NULL,
1725   NULL,
1726   SEARCH_ENGINE_OTHER,
1727   kNoSearchEngineLogo,
1728   76,
1729 };
1730 
1731 const PrepopulatedEngine yahoo = {
1732   L"Yahoo!",
1733   L"yahoo.com",
1734   "http://search.yahoo.com/favicon.ico",
1735   L"http://search.yahoo.com/search?ei={inputEncoding}&fr=crmas&p={searchTerms}",
1736   "UTF-8",
1737   L"http://ff.search.yahoo.com/gossip?output=fxjson&command={searchTerms}",
1738   NULL,
1739   SEARCH_ENGINE_YAHOO,
1740   IDR_SEARCH_ENGINE_LOGO_YAHOO,
1741   2,
1742 };
1743 
1744 // For regional Yahoo variants without region-specific suggestion service,
1745 // suggestion is disabled. For some of them, we might consider
1746 // using a fallback (e.g. de for at/ch, ca or fr for qc, en for nl, no, hk).
1747 const PrepopulatedEngine yahoo_ar = {
1748   L"Yahoo! Argentina",
1749   L"ar.yahoo.com",
1750   "http://ar.search.yahoo.com/favicon.ico",
1751   L"http://ar.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
1752       L"p={searchTerms}",
1753   "UTF-8",
1754   L"http://ar-sayt.ff.search.yahoo.com/gossip-ar-sayt?output=fxjson&"
1755       L"command={searchTerms}",
1756   NULL,
1757   SEARCH_ENGINE_YAHOO,
1758   IDR_SEARCH_ENGINE_LOGO_YAHOO,
1759   2,
1760 };
1761 
1762 const PrepopulatedEngine yahoo_at = {
1763   L"Yahoo! Suche",
1764   L"at.yahoo.com",
1765   "http://at.search.yahoo.com/favicon.ico",
1766   L"http://at.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
1767       L"p={searchTerms}",
1768   "UTF-8",
1769   NULL,
1770   NULL,
1771   SEARCH_ENGINE_YAHOO,
1772   IDR_SEARCH_ENGINE_LOGO_YAHOO,
1773   2,
1774 };
1775 
1776 const PrepopulatedEngine yahoo_au = {
1777   L"Yahoo!7",
1778   L"au.yahoo.com",
1779   "http://au.search.yahoo.com/favicon.ico",
1780   L"http://au.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
1781       L"p={searchTerms}",
1782   "UTF-8",
1783   L"http://aue-sayt.ff.search.yahoo.com/gossip-au-sayt?output=fxjson&"
1784       L"command={searchTerms}",
1785   NULL,
1786   SEARCH_ENGINE_YAHOO,
1787   IDR_SEARCH_ENGINE_LOGO_YAHOO,
1788   2,
1789 };
1790 
1791 const PrepopulatedEngine yahoo_br = {
1792   L"Yahoo! Brasil",
1793   L"br.yahoo.com",
1794   "http://br.search.yahoo.com/favicon.ico",
1795   L"http://br.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
1796       L"p={searchTerms}",
1797   "UTF-8",
1798   L"http://br-sayt.ff.search.yahoo.com/gossip-br-sayt?output=fxjson&"
1799       L"command={searchTerms}",
1800   NULL,
1801   SEARCH_ENGINE_YAHOO,
1802   IDR_SEARCH_ENGINE_LOGO_YAHOO,
1803   2,
1804 };
1805 
1806 const PrepopulatedEngine yahoo_ca = {
1807   L"Yahoo! Canada",
1808   L"ca.yahoo.com",
1809   "http://ca.search.yahoo.com/favicon.ico",
1810   L"http://ca.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
1811       L"p={searchTerms}",
1812   "UTF-8",
1813   L"http://gossip.ca.yahoo.com/gossip-ca-sayt?output=fxjsonp&"
1814       L"command={searchTerms}",
1815   NULL,
1816   SEARCH_ENGINE_YAHOO,
1817   IDR_SEARCH_ENGINE_LOGO_YAHOO,
1818   2,
1819 };
1820 
1821 const PrepopulatedEngine yahoo_ch = {
1822   L"Yahoo! Suche",
1823   L"ch.yahoo.com",
1824   "http://ch.search.yahoo.com/favicon.ico",
1825   L"http://ch.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
1826       L"p={searchTerms}",
1827   "UTF-8",
1828   NULL,
1829   NULL,
1830   SEARCH_ENGINE_YAHOO,
1831   IDR_SEARCH_ENGINE_LOGO_YAHOO,
1832   2,
1833 };
1834 
1835 const PrepopulatedEngine yahoo_cl = {
1836   L"Yahoo! Chile",
1837   L"cl.yahoo.com",
1838   "http://cl.search.yahoo.com/favicon.ico",
1839   L"http://cl.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
1840       L"p={searchTerms}",
1841   "UTF-8",
1842   L"http://gossip.telemundo.yahoo.com/gossip-e1-sayt?output=fxjson&"
1843       L"command={searchTerms}",
1844   NULL,
1845   SEARCH_ENGINE_YAHOO,
1846   IDR_SEARCH_ENGINE_LOGO_YAHOO,
1847   2,
1848 };
1849 
1850 const PrepopulatedEngine yahoo_cn = {
1851   L"\x4e2d\x56fd\x96c5\x864e",
1852   L"cn.yahoo.com",
1853   "http://search.cn.yahoo.com/favicon.ico",
1854   L"http://search.cn.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
1855       L"p={searchTerms}",
1856   "GB2312",
1857   // http://cn.yahoo.com/cnsuggestion/suggestion.inc.php?of=fxjson&query=
1858   // returns in a proprietary format ('|' delimeted word list).
1859   NULL,
1860   NULL,
1861   SEARCH_ENGINE_YAHOO,
1862   IDR_SEARCH_ENGINE_LOGO_YAHOO,
1863   2,
1864 };
1865 
1866 const PrepopulatedEngine yahoo_co = {
1867   L"Yahoo! Colombia",
1868   L"co.yahoo.com",
1869   "http://co.search.yahoo.com/favicon.ico",
1870   L"http://co.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
1871       L"p={searchTerms}",
1872   "UTF-8",
1873   L"http://gossip.telemundo.yahoo.com/gossip-e1-sayt?output=fxjson&"
1874       L"command={searchTerms}",
1875   NULL,
1876   SEARCH_ENGINE_YAHOO,
1877   IDR_SEARCH_ENGINE_LOGO_YAHOO,
1878   2,
1879 };
1880 
1881 const PrepopulatedEngine yahoo_de = {
1882   L"Yahoo! Deutschland",
1883   L"de.yahoo.com",
1884   "http://de.search.yahoo.com/favicon.ico",
1885   L"http://de.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
1886       L"p={searchTerms}",
1887   "UTF-8",
1888   L"http://de-sayt.ff.search.yahoo.com/gossip-de-sayt?output=fxjson&"
1889       L"command={searchTerms}",
1890   NULL,
1891   SEARCH_ENGINE_YAHOO,
1892   IDR_SEARCH_ENGINE_LOGO_YAHOO,
1893   2,
1894 };
1895 
1896 const PrepopulatedEngine yahoo_dk = {
1897   L"Yahoo! Danmark",
1898   L"dk.yahoo.com",
1899   "http://dk.search.yahoo.com/favicon.ico",
1900   L"http://dk.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
1901       L"p={searchTerms}",
1902   "UTF-8",
1903   NULL,
1904   NULL,
1905   SEARCH_ENGINE_YAHOO,
1906   IDR_SEARCH_ENGINE_LOGO_YAHOO,
1907   2,
1908 };
1909 
1910 const PrepopulatedEngine yahoo_es = {
1911   L"Yahoo! Espa" L"\x00f1" L"a",
1912   L"es.yahoo.com",
1913   "http://es.search.yahoo.com/favicon.ico",
1914   L"http://es.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
1915       L"p={searchTerms}",
1916   "UTF-8",
1917   L"http://es-sayt.ff.search.yahoo.com/gossip-es-sayt?output=fxjson&"
1918       L"command={searchTerms}",
1919   NULL,
1920   SEARCH_ENGINE_YAHOO,
1921   IDR_SEARCH_ENGINE_LOGO_YAHOO,
1922   2,
1923 };
1924 
1925 const PrepopulatedEngine yahoo_fi = {
1926   L"Yahoo!-haku",
1927   L"fi.yahoo.com",
1928   "http://fi.search.yahoo.com/favicon.ico",
1929   L"http://fi.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
1930       L"p={searchTerms}",
1931   "UTF-8",
1932   NULL,
1933   NULL,
1934   SEARCH_ENGINE_YAHOO,
1935   IDR_SEARCH_ENGINE_LOGO_YAHOO,
1936   2,
1937 };
1938 
1939 const PrepopulatedEngine yahoo_fr = {
1940   L"Yahoo! France",
1941   L"fr.yahoo.com",
1942   "http://fr.search.yahoo.com/favicon.ico",
1943   L"http://fr.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
1944       L"p={searchTerms}",
1945   "UTF-8",
1946   L"http://fr-sayt.ff.search.yahoo.com/gossip-fr-sayt?output=fxjson&"
1947       L"command={searchTerms}",
1948   NULL,
1949   SEARCH_ENGINE_YAHOO,
1950   IDR_SEARCH_ENGINE_LOGO_YAHOO,
1951   2,
1952 };
1953 
1954 const PrepopulatedEngine yahoo_hk = {
1955   L"Yahoo! Hong Kong",
1956   L"hk.yahoo.com",
1957   "http://hk.search.yahoo.com/favicon.ico",
1958   L"http://hk.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
1959       L"p={searchTerms}",
1960   "UTF-8",
1961   // http://history.hk.search.yahoo.com/ac/ac_msearch.php?query={searchTerms}
1962   // returns a JSON with key-value pairs. Setting parameters (ot, of, output)
1963   // to fxjson, json, or js doesn't help.
1964   NULL,
1965   NULL,
1966   SEARCH_ENGINE_YAHOO,
1967   IDR_SEARCH_ENGINE_LOGO_YAHOO,
1968   2,
1969 };
1970 
1971 const PrepopulatedEngine yahoo_id = {
1972   L"Yahoo! Indonesia",
1973   L"id.yahoo.com",
1974   "http://id.search.yahoo.com/favicon.ico",
1975   L"http://id.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
1976       L"p={searchTerms}",
1977   "UTF-8",
1978   L"http://id-sayt.ff.search.yahoo.com/gossip-id-sayt?output=fxjson&"
1979       L"command={searchTerms}",
1980   NULL,
1981   SEARCH_ENGINE_YAHOO,
1982   IDR_SEARCH_ENGINE_LOGO_YAHOO,
1983   2,
1984 };
1985 
1986 const PrepopulatedEngine yahoo_in = {
1987   L"Yahoo! India",
1988   L"in.yahoo.com",
1989   "http://in.search.yahoo.com/favicon.ico",
1990   L"http://in.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
1991       L"p={searchTerms}",
1992   "UTF-8",
1993   L"http://in-sayt.ff.search.yahoo.com/gossip-in-sayt?output=fxjson&"
1994       L"command={searchTerms}",
1995   NULL,
1996   SEARCH_ENGINE_YAHOO,
1997   IDR_SEARCH_ENGINE_LOGO_YAHOO,
1998   2,
1999 };
2000 
2001 const PrepopulatedEngine yahoo_it = {
2002   L"Yahoo! Italia",
2003   L"it.yahoo.com",
2004   "http://it.search.yahoo.com/favicon.ico",
2005   L"http://it.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
2006       L"p={searchTerms}",
2007   "UTF-8",
2008   L"http://it-sayt.ff.search.yahoo.com/gossip-it-sayt?output=fxjson&"
2009       L"command={searchTerms}",
2010   NULL,
2011   SEARCH_ENGINE_YAHOO,
2012   IDR_SEARCH_ENGINE_LOGO_YAHOO,
2013   2,
2014 };
2015 
2016 const PrepopulatedEngine yahoo_jp = {
2017   L"Yahoo! JAPAN",
2018   L"yahoo.co.jp",
2019   "http://search.yahoo.co.jp/favicon.ico",
2020   L"http://search.yahoo.co.jp/search?ei={inputEncoding}&fr=crmas&"
2021       L"p={searchTerms}",
2022   "UTF-8",
2023   NULL,
2024   NULL,
2025   SEARCH_ENGINE_YAHOOJP,
2026   IDR_SEARCH_ENGINE_LOGO_YAHOOJP,
2027   2,
2028 };
2029 
2030 const PrepopulatedEngine yahoo_kr = {
2031   L"\xc57c\xd6c4! \xcf54\xb9ac\xc544",
2032   L"kr.yahoo.com",
2033   "http://kr.search.yahoo.com/favicon.ico",
2034   L"http://kr.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
2035       L"p={searchTerms}",
2036   "UTF-8",
2037   L"http://kr.atc.search.yahoo.com/atcx.php?property=main&ot=fxjson&"
2038      L"ei=utf8&eo=utf8&command={searchTerms}",
2039   NULL,
2040   SEARCH_ENGINE_YAHOO,
2041   IDR_SEARCH_ENGINE_LOGO_YAHOO,
2042   2,
2043 };
2044 
2045 const PrepopulatedEngine yahoo_malaysia = {
2046   L"Yahoo! Malaysia",
2047   L"malaysia.yahoo.com",
2048   "http://malaysia.search.yahoo.com/favicon.ico",
2049   L"http://malaysia.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
2050       L"p={searchTerms}",
2051   "UTF-8",
2052   L"http://my-sayt.ff.search.yahoo.com/gossip-my-sayt?output=fxjson&"
2053       L"command={searchTerms}",
2054   NULL,
2055   SEARCH_ENGINE_YAHOO,
2056   IDR_SEARCH_ENGINE_LOGO_YAHOO,
2057   2,
2058 };
2059 
2060 const PrepopulatedEngine yahoo_mx = {
2061   L"Yahoo! M\x00e9xico",
2062   L"mx.yahoo.com",
2063   "http://mx.search.yahoo.com/favicon.ico",
2064   L"http://mx.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
2065       L"p={searchTerms}",
2066   "UTF-8",
2067   L"http://gossip.mx.yahoo.com/gossip-mx-sayt?output=fxjsonp&"
2068       L"command={searchTerms}",
2069   NULL,
2070   SEARCH_ENGINE_YAHOO,
2071   IDR_SEARCH_ENGINE_LOGO_YAHOO,
2072   2,
2073 };
2074 
2075 const PrepopulatedEngine yahoo_nl = {
2076   L"Yahoo! Nederland",
2077   L"nl.yahoo.com",
2078   "http://nl.search.yahoo.com/favicon.ico",
2079   L"http://nl.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
2080       L"p={searchTerms}",
2081   "UTF-8",
2082   NULL,
2083   NULL,
2084   SEARCH_ENGINE_YAHOO,
2085   IDR_SEARCH_ENGINE_LOGO_YAHOO,
2086   2,
2087 };
2088 
2089 const PrepopulatedEngine yahoo_no = {
2090   L"Yahoo! Norge",
2091   L"no.yahoo.com",
2092   "http://no.search.yahoo.com/favicon.ico",
2093   L"http://no.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
2094       L"p={searchTerms}",
2095   "UTF-8",
2096   NULL,
2097   NULL,
2098   SEARCH_ENGINE_YAHOO,
2099   IDR_SEARCH_ENGINE_LOGO_YAHOO,
2100   2,
2101 };
2102 
2103 const PrepopulatedEngine yahoo_nz = {
2104   L"Yahoo!Xtra",
2105   L"nz.yahoo.com",
2106   "http://nz.search.yahoo.com/favicon.ico",
2107   L"http://nz.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
2108       L"p={searchTerms}",
2109   "UTF-8",
2110   L"http://aue-sayt.ff.search.yahoo.com/gossip-nz-sayt?output=fxjson&"
2111       L"command={searchTerms}",
2112   NULL,
2113   SEARCH_ENGINE_YAHOO,
2114   IDR_SEARCH_ENGINE_LOGO_YAHOO,
2115   2,
2116 };
2117 
2118 const PrepopulatedEngine yahoo_pe = {
2119   L"Yahoo! Per\x00fa",
2120   L"pe.yahoo.com",
2121   "http://pe.search.yahoo.com/favicon.ico",
2122   L"http://pe.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
2123       L"p={searchTerms}",
2124   "UTF-8",
2125   L"http://gossip.telemundo.yahoo.com/gossip-e1-sayt?output=fxjson&"
2126       L"command={searchTerms}",
2127   NULL,
2128   SEARCH_ENGINE_YAHOO,
2129   IDR_SEARCH_ENGINE_LOGO_YAHOO,
2130   2,
2131 };
2132 
2133 const PrepopulatedEngine yahoo_ph = {
2134   L"Yahoo! Philippines",
2135   L"ph.yahoo.com",
2136   "http://ph.search.yahoo.com/favicon.ico",
2137   L"http://ph.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
2138       L"p={searchTerms}",
2139   "UTF-8",
2140   L"http://ph-sayt.ff.search.yahoo.com/gossip-ph-sayt?output=fxjson&"
2141       L"command={searchTerms}",
2142   NULL,
2143   SEARCH_ENGINE_YAHOO,
2144   IDR_SEARCH_ENGINE_LOGO_YAHOO,
2145   2,
2146 };
2147 
2148 const PrepopulatedEngine yahoo_qc = {
2149   L"Yahoo! Qu" L"\x00e9" L"bec",
2150   L"qc.yahoo.com",
2151   "http://qc.search.yahoo.com/favicon.ico",
2152   L"http://qc.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
2153       L"p={searchTerms}",
2154   "UTF-8",
2155   NULL,
2156   NULL,
2157   SEARCH_ENGINE_YAHOOQC,
2158   IDR_SEARCH_ENGINE_LOGO_YAHOOQC,
2159   5,  // Can't be 2 as this has to appear in the Canada list alongside yahoo_ca.
2160 };
2161 
2162 const PrepopulatedEngine yahoo_ru = {
2163   L"Yahoo! \x043f\x043e-\x0440\x0443\x0441\x0441\x043a\x0438",
2164   L"ru.yahoo.com",
2165   "http://ru.search.yahoo.com/favicon.ico",
2166   L"http://ru.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
2167       L"p={searchTerms}",
2168   "UTF-8",
2169   NULL,
2170   NULL,
2171   SEARCH_ENGINE_YAHOO,
2172   IDR_SEARCH_ENGINE_LOGO_YAHOO,
2173   2,
2174 };
2175 
2176 const PrepopulatedEngine yahoo_se = {
2177   L"Yahoo! Sverige",
2178   L"se.yahoo.com",
2179   "http://se.search.yahoo.com/favicon.ico",
2180   L"http://se.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
2181       L"p={searchTerms}",
2182   "UTF-8",
2183   NULL,
2184   NULL,
2185   SEARCH_ENGINE_YAHOO,
2186   IDR_SEARCH_ENGINE_LOGO_YAHOO,
2187   2,
2188 };
2189 
2190 const PrepopulatedEngine yahoo_sg = {
2191   L"Yahoo! Singapore",
2192   L"sg.yahoo.com",
2193   "http://sg.search.yahoo.com/favicon.ico",
2194   L"http://sg.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
2195       L"p={searchTerms}",
2196   "UTF-8",
2197   L"http://sg-sayt.ff.search.yahoo.com/gossip-sg-sayt?output=fxjson&"
2198       L"command={searchTerms}",
2199   NULL,
2200   SEARCH_ENGINE_YAHOO,
2201   IDR_SEARCH_ENGINE_LOGO_YAHOO,
2202   2,
2203 };
2204 
2205 const PrepopulatedEngine yahoo_th = {
2206   L"Yahoo! \x0e1b\x0e23\x0e30\x0e40\x0e17\x0e28\x0e44\x0e17\x0e22",
2207   L"th.yahoo.com",
2208   "http://th.search.yahoo.com/favicon.ico",
2209   L"http://th.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
2210       L"p={searchTerms}",
2211   "UTF-8",
2212   L"http://th-sayt.ff.search.yahoo.com/gossip-th-sayt?output=fxjson&"
2213       L"command={searchTerms}",
2214   NULL,
2215   SEARCH_ENGINE_YAHOO,
2216   IDR_SEARCH_ENGINE_LOGO_YAHOO,
2217   2,
2218 };
2219 
2220 const PrepopulatedEngine yahoo_tw = {
2221   L"Yahoo!\x5947\x6469",
2222   L"tw.yahoo.com",
2223   "http://tw.search.yahoo.com/favicon.ico",
2224   L"http://tw.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
2225       L"p={searchTerms}",
2226   "UTF-8",
2227   // "http://tw.yahoo.com/ac/ac_search.php?eo=utf8&of=js&prop=web&query="
2228   // returns a JSON file prepended with 'fxsearch=('.
2229   NULL,
2230   NULL,
2231   SEARCH_ENGINE_YAHOO,
2232   IDR_SEARCH_ENGINE_LOGO_YAHOO,
2233   2,
2234 };
2235 
2236 const PrepopulatedEngine yahoo_uk = {
2237   L"Yahoo! UK & Ireland",
2238   L"uk.yahoo.com",
2239   "http://uk.search.yahoo.com/favicon.ico",
2240   L"http://uk.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
2241       L"p={searchTerms}",
2242   "UTF-8",
2243   L"http://uk-sayt.ff.search.yahoo.com/gossip-uk-sayt?output=fxjson&"
2244       L"command={searchTerms}",
2245   NULL,
2246   SEARCH_ENGINE_YAHOO,
2247   IDR_SEARCH_ENGINE_LOGO_YAHOO,
2248   2,
2249 };
2250 
2251 const PrepopulatedEngine yahoo_ve = {
2252   L"Yahoo! Venezuela",
2253   L"ve.yahoo.com",
2254   "http://ve.search.yahoo.com/favicon.ico",
2255   L"http://ve.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
2256       L"p={searchTerms}",
2257   "UTF-8",
2258   L"http://gossip.telemundo.yahoo.com/gossip-e1-sayt?output=fxjson&"
2259       L"command={searchTerms}",
2260   NULL,
2261   SEARCH_ENGINE_YAHOO,
2262   IDR_SEARCH_ENGINE_LOGO_YAHOO,
2263   2,
2264 };
2265 
2266 const PrepopulatedEngine yahoo_vn = {
2267   L"Yahoo! Vi\x1ec7t Nam",
2268   L"vn.yahoo.com",
2269   "http://vn.search.yahoo.com/favicon.ico",
2270   L"http://vn.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
2271       L"p={searchTerms}",
2272   "UTF-8",
2273   L"http://vn-sayt.ff.search.yahoo.com/gossip-vn-sayt?output=fxjson&"
2274       L"command={searchTerms}",
2275   NULL,
2276   SEARCH_ENGINE_YAHOO,
2277   IDR_SEARCH_ENGINE_LOGO_YAHOO,
2278   2,
2279 };
2280 
2281 const PrepopulatedEngine yamli = {
2282   L"Yamli",
2283   L"yamli.com",
2284   "http://www.yamli.com/favicon.ico",
2285   L"http://www.yamli.com/#q={searchTerms}",
2286   "UTF-8",
2287   NULL,
2288   NULL,
2289   SEARCH_ENGINE_OTHER,
2290   kNoSearchEngineLogo,
2291   11,
2292 };
2293 
2294 const PrepopulatedEngine yandex_ru = {
2295   L"\x042f\x043d\x0434\x0435\x043a\x0441",
2296   L"yandex.ru",
2297   "http://yandex.ru/favicon.ico",
2298   L"http://yandex.ru/yandsearch?text={searchTerms}",
2299   "UTF-8",
2300   L"http://suggest.yandex.net/suggest-ff.cgi?part={searchTerms}",
2301   NULL,
2302   SEARCH_ENGINE_YANDEX,
2303   IDR_SEARCH_ENGINE_LOGO_YANDEX,
2304   15,
2305 };
2306 
2307 const PrepopulatedEngine yandex_ua = {
2308   L"\x042f\x043d\x0434\x0435\x043a\x0441",
2309   L"yandex.ua",
2310   "http://yandex.ua/favicon.ico",
2311   L"http://yandex.ua/yandsearch?text={searchTerms}",
2312   "UTF-8",
2313   L"http://suggest.yandex.net/suggest-ff.cgi?part={searchTerms}",
2314   NULL,
2315   SEARCH_ENGINE_YANDEX,
2316   IDR_SEARCH_ENGINE_LOGO_YANDEX,
2317   15,
2318 };
2319 
2320 const PrepopulatedEngine zoznam = {
2321   L"Zoznam",
2322   L"zoznam.sk",
2323   "http://zoznam.sk/favicon.ico",
2324   L"http://zoznam.sk/hladaj.fcgi?s={searchTerms}",
2325   "windows-1250",
2326   NULL,
2327   NULL,
2328   SEARCH_ENGINE_ZOZNAM,
2329   IDR_SEARCH_ENGINE_LOGO_ZOZNAM,
2330   85,
2331 };
2332 
2333 // Lists of engines per country ////////////////////////////////////////////////
2334 
2335 // Put these in order with most interesting/important first.  The default will
2336 // be the first engine.
2337 
2338 // Default (for countries with no better engine set)
2339 const PrepopulatedEngine* engines_default[] =
2340     { &google, &yahoo, &bing, };
2341 
2342 // United Arab Emirates
2343 const PrepopulatedEngine* engines_AE[] =
2344     { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &araby, &maktoob, };
2345 
2346 // Albania
2347 const PrepopulatedEngine* engines_AL[] =
2348     { &google, &yahoo, &bing_en_XA, };
2349 
2350 // Argentina
2351 const PrepopulatedEngine* engines_AR[] =
2352     { &google, &yahoo_ar, &bing_es_AR, &terra_ar, &altavista_ar, };
2353 
2354 // Austria
2355 const PrepopulatedEngine* engines_AT[] =
2356     { &google, &yahoo_at, &bing_de_AT, };
2357 
2358 // Australia
2359 const PrepopulatedEngine* engines_AU[] =
2360     { &google, &bing_en_AU, &yahoo_au, };
2361 
2362 // Bosnia and Herzegovina
2363 const PrepopulatedEngine* engines_BA[] =
2364     { &google, &pogodak_ba, &yahoo, &bing, };
2365 
2366 // Belgium
2367 const PrepopulatedEngine* engines_BE[] =
2368     { &google, &bing_nl_BE, &yahoo, &bing_fr_BE, };
2369 
2370 // Bulgaria
2371 const PrepopulatedEngine* engines_BG[] =
2372     { &google, &bing_bg_BG, &yahoo, &diri, &jabse, };
2373 
2374 // Bahrain
2375 const PrepopulatedEngine* engines_BH[] =
2376     { &google, &yahoo, &bing_en_XA, &bing_ar_XA, };
2377 
2378 // Burundi
2379 const PrepopulatedEngine* engines_BI[] =
2380     { &google, &yahoo, &bing, };
2381 
2382 // Brunei
2383 const PrepopulatedEngine* engines_BN[] =
2384     { &google, &yahoo_malaysia, &bing_en_MY, };
2385 
2386 // Bolivia
2387 const PrepopulatedEngine* engines_BO[] =
2388     { &google, &altavista, &bing_es_XL, &yahoo, };
2389 
2390 // Brazil
2391 const PrepopulatedEngine* engines_BR[] =
2392     { &google, &bing_pt_BR, &yahoo_br, &uol, };
2393 
2394 // Belarus
2395 const PrepopulatedEngine* engines_BY[] =
2396     { &google, &tut, &yandex_ru, &rambler, &yahoo, };
2397 
2398 // Belize
2399 const PrepopulatedEngine* engines_BZ[] =
2400     { &google, &yahoo, &bing, &aol, };
2401 
2402 // Canada
2403 const PrepopulatedEngine* engines_CA[] =
2404     { &google, &yahoo_ca, &yahoo_qc, &bing_en_CA, &bing_fr_CA, };
2405 
2406 // Switzerland
2407 const PrepopulatedEngine* engines_CH[] =
2408     { &google, &yahoo_ch, &bing_de_CH, &bing_fr_CH, &search_de_CH,
2409       &search_fr_CH, };
2410 
2411 // Chile
2412 const PrepopulatedEngine* engines_CL[] =
2413     { &google, &yahoo_cl, &bing_es_CL, };
2414 
2415 // China
2416 const PrepopulatedEngine* engines_CN[] =
2417     { &google, &baidu, &yahoo_cn, &bing_zh_CN, };
2418 
2419 // Colombia
2420 const PrepopulatedEngine* engines_CO[] =
2421     { &google, &bing_es_XL, &yahoo_co, };
2422 
2423 // Costa Rica
2424 const PrepopulatedEngine* engines_CR[] =
2425     { &google, &bing_es_XL, &yahoo, };
2426 
2427 // Czech Republic
2428 const PrepopulatedEngine* engines_CZ[] =
2429     { &google, &seznam, &bing_cs_CZ, &centrum_cz, &atlas_cz, };
2430 
2431 // Germany
2432 const PrepopulatedEngine* engines_DE[] =
2433     { &google, &ask_de, &bing_de_DE, &yahoo_de };
2434 
2435 // Denmark
2436 const PrepopulatedEngine* engines_DK[] =
2437     { &google, &bing_da_DK, &yahoo_dk, };
2438 
2439 // Dominican Republic
2440 const PrepopulatedEngine* engines_DO[] =
2441     { &google, &bing_es_XL, &yahoo, };
2442 
2443 // Algeria
2444 const PrepopulatedEngine* engines_DZ[] =
2445     { &google, &bing_en_XA, &yahoo, &bing_ar_XA, &maktoob, };
2446 
2447 // Ecuador
2448 const PrepopulatedEngine* engines_EC[] =
2449     { &google, &bing_es_XL, &yahoo, };
2450 
2451 // Estonia
2452 const PrepopulatedEngine* engines_EE[] =
2453     { &google, &bing_et_EE, &neti, &yahoo, };
2454 
2455 // Egypt
2456 const PrepopulatedEngine* engines_EG[] =
2457     { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &masrawy, };
2458 
2459 // Spain
2460 const PrepopulatedEngine* engines_ES[] =
2461     { &google, &ask_es, &bing_es_ES, &yahoo_es, &terra_es, &hispavista, };
2462 
2463 // Faroe Islands
2464 const PrepopulatedEngine* engines_FO[] =
2465     { &google, &bing_da_DK, &yahoo_dk, &jubii };
2466 
2467 // Finland
2468 const PrepopulatedEngine* engines_FI[] =
2469     { &google, &bing_fi_FI, &yahoo_fi, &eniro_fi, &fonecta_02_fi, };
2470 
2471 // France
2472 const PrepopulatedEngine* engines_FR[] =
2473     { &google, &yahoo_fr, &bing_fr_FR, };
2474 
2475 // United Kingdom
2476 const PrepopulatedEngine* engines_GB[] =
2477     { &google, &ask_uk, &yahoo_uk, &bing_en_GB, };
2478 
2479 // Greece
2480 const PrepopulatedEngine* engines_GR[] =
2481     { &google, &yahoo, &in, &bing_el_GR };
2482 
2483 // Guatemala
2484 const PrepopulatedEngine* engines_GT[] =
2485     { &google, &bing_es_XL, &yahoo, &ask_es, };
2486 
2487 // Hong Kong
2488 const PrepopulatedEngine* engines_HK[] =
2489     { &google, &yahoo_hk, &bing_zh_HK, &baidu, };
2490 
2491 // Honduras
2492 const PrepopulatedEngine* engines_HN[] =
2493     { &google, &bing_es_XL, &yahoo, &ask_es, };
2494 
2495 // Croatia
2496 const PrepopulatedEngine* engines_HR[] =
2497     { &google, &yahoo, &pogodak_hr, &bing_hr_HR, };
2498 
2499 // Hungary
2500 const PrepopulatedEngine* engines_HU[] =
2501     { &google, &ok, &bing_hu_HU, };
2502 
2503 // Indonesia
2504 const PrepopulatedEngine* engines_ID[] =
2505     { &google, &yahoo_id, &bing_en_ID, };
2506 
2507 // Ireland
2508 const PrepopulatedEngine* engines_IE[] =
2509     { &google, &yahoo_uk, &bing_en_IE, };
2510 
2511 // Israel
2512 const PrepopulatedEngine* engines_IL[] =
2513     { &google, &walla, &bing_he_IL, };
2514 
2515 // India
2516 const PrepopulatedEngine* engines_IN[] =
2517     { &google, &yahoo_in, &bing_en_IN, &rediff, &guruji, };
2518 
2519 // Iraq
2520 const PrepopulatedEngine* engines_IQ[] =
2521     { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &maktoob, &ask, };
2522 
2523 // Iran
2524 const PrepopulatedEngine* engines_IR[] =
2525     { &google, &yahoo, };
2526 
2527 // Iceland
2528 const PrepopulatedEngine* engines_IS[] =
2529     { &google, &yahoo, &bing, &leit, };
2530 
2531 // Italy
2532 const PrepopulatedEngine* engines_IT[] =
2533     { &google, &ask_it, &virgilio, &bing_it_IT, &yahoo_it, &libero, };
2534 
2535 // Jamaica
2536 const PrepopulatedEngine* engines_JM[] =
2537     { &google, &yahoo, &bing, &go, };
2538 
2539 // Jordan
2540 const PrepopulatedEngine* engines_JO[] =
2541     { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &maktoob, &araby, };
2542 
2543 // Japan
2544 const PrepopulatedEngine* engines_JP[] =
2545     { &google, &yahoo_jp, &bing_ja_JP, &goo, };
2546 
2547 // Kenya
2548 const PrepopulatedEngine* engines_KE[] =
2549     { &google, &yahoo, &bing, };
2550 
2551 // Kuwait
2552 const PrepopulatedEngine* engines_KW[] =
2553     { &google, &bing_en_XA, &yahoo, &bing_ar_XA, &maktoob, &araby, };
2554 
2555 // South Korea
2556 const PrepopulatedEngine* engines_KR[] =
2557     { &google, &naver, &daum, &yahoo_kr, &nate, };
2558 
2559 // Kazakhstan
2560 const PrepopulatedEngine* engines_KZ[] =
2561     { &google, &rambler, &yandex_ru, &nur_kz, };
2562 
2563 // Lebanon
2564 const PrepopulatedEngine* engines_LB[] =
2565     { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &maktoob, &araby, };
2566 
2567 // Liechtenstein
2568 const PrepopulatedEngine* engines_LI[] =
2569     { &google, &bing_de_DE, &yahoo_de, };
2570 
2571 // Lithuania
2572 const PrepopulatedEngine* engines_LT[] =
2573     { &google, &delfi_lt, &yahoo, &bing_lt_LT, };
2574 
2575 // Luxembourg
2576 const PrepopulatedEngine* engines_LU[] =
2577     { &google, &bing_fr_FR, &yahoo_fr, };
2578 
2579 // Latvia
2580 const PrepopulatedEngine* engines_LV[] =
2581     { &google, &bing, &yandex_ru, &yahoo, &latne, };
2582 
2583 // Libya
2584 const PrepopulatedEngine* engines_LY[] =
2585     { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &maktoob, &ask, };
2586 
2587 // Morocco
2588 const PrepopulatedEngine* engines_MA[] =
2589     { &google, &bing_en_XA, &yahoo, &bing_ar_XA, };
2590 
2591 // Monaco
2592 const PrepopulatedEngine* engines_MC[] =
2593     { &google, &bing_fr_FR, &yahoo_fr, };
2594 
2595 // Moldova
2596 const PrepopulatedEngine* engines_MD[] =
2597     { &google, &yandex_ru, &yahoo, &bing, };
2598 
2599 // Montenegro
2600 const PrepopulatedEngine* engines_ME[] =
2601     { &google, &yahoo, &bing };
2602 
2603 // Macedonia
2604 const PrepopulatedEngine* engines_MK[] =
2605     { &google, &pogodok, &yahoo, &bing, };
2606 
2607 // Mexico
2608 const PrepopulatedEngine* engines_MX[] =
2609     { &google, &bing_es_MX, &yahoo_mx, };
2610 
2611 // Malaysia
2612 const PrepopulatedEngine* engines_MY[] =
2613     { &google, &yahoo_malaysia, &bing_en_MY, };
2614 
2615 // Nicaragua
2616 const PrepopulatedEngine* engines_NI[] =
2617     { &google, &bing_es_XL, &yahoo, &ask_es, };
2618 
2619 // Netherlands
2620 const PrepopulatedEngine* engines_NL[] =
2621     { &google, &bing_nl_NL, &yahoo_nl, &ask_nl, };
2622 
2623 // Norway
2624 const PrepopulatedEngine* engines_NO[] =
2625     { &google, &bing_nb_NO, &abcsok, &yahoo_no, &kvasir, };
2626 
2627 // New Zealand
2628 const PrepopulatedEngine* engines_NZ[] =
2629     { &google, &yahoo_nz, &bing_en_NZ, };
2630 
2631 // Oman
2632 const PrepopulatedEngine* engines_OM[] =
2633     { &google, &yahoo, &bing_en_XA, &bing_ar_XA, };
2634 
2635 // Panama
2636 const PrepopulatedEngine* engines_PA[] =
2637     { &google, &bing_es_XL, &yahoo, &ask_es, };
2638 
2639 // Peru
2640 const PrepopulatedEngine* engines_PE[] =
2641     { &google, &bing_es_XL, &yahoo_pe, };
2642 
2643 // Philippines
2644 const PrepopulatedEngine* engines_PH[] =
2645     { &google, &yahoo_ph, &bing_en_PH, };
2646 
2647 // Pakistan
2648 const PrepopulatedEngine* engines_PK[] =
2649     { &google, &yahoo, &bing, };
2650 
2651 // Puerto Rico
2652 const PrepopulatedEngine* engines_PR[] =
2653     { &google, &bing_es_XL, &yahoo, &ask_es, };
2654 
2655 // Poland
2656 const PrepopulatedEngine* engines_PL[] =
2657     { &google, &bing_pl_PL, &netsprint, &yahoo_uk, &onet, &wp,  };
2658 
2659 // Portugal
2660 const PrepopulatedEngine* engines_PT[] =
2661     { &google, &sapo, &bing_pt_PT, &yahoo, };
2662 
2663 // Paraguay
2664 const PrepopulatedEngine* engines_PY[] =
2665     { &google, &bing_es_XL, &yahoo, };
2666 
2667 // Qatar
2668 const PrepopulatedEngine* engines_QA[] =
2669     { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &maktoob, &araby };
2670 
2671 // Romania
2672 const PrepopulatedEngine* engines_RO[] =
2673     { &google, &yahoo_uk, &bing_ro_RO, };
2674 
2675 // Serbia
2676 const PrepopulatedEngine* engines_RS[] =
2677     { &google, &pogodak_rs, &bing, };
2678 
2679 // Russia
2680 const PrepopulatedEngine* engines_RU[] =
2681     { &google, &yandex_ru, &mail_ru, &tut, &rambler, &bing_ru_RU, };
2682 
2683 // Rwanda
2684 const PrepopulatedEngine* engines_RW[] =
2685     { &google, &yahoo, &bing, };
2686 
2687 // Saudi Arabia
2688 const PrepopulatedEngine* engines_SA[] =
2689     { &google, &yahoo, &bing_en_XA, &bing_ar_XA, };
2690 
2691 // Sweden
2692 const PrepopulatedEngine* engines_SE[] =
2693     { &google, &bing_sv_SE, &yahoo_se, &altavista_se, &spray, &eniro_se };
2694 
2695 // Singapore
2696 const PrepopulatedEngine* engines_SG[] =
2697     { &google, &yahoo_sg, &bing_en_SG, &rednano, };
2698 
2699 // Slovenia
2700 const PrepopulatedEngine* engines_SI[] =
2701     { &google, &najdi, &yahoo, &bing_sl_SI, };
2702 
2703 // Slovakia
2704 const PrepopulatedEngine* engines_SK[] =
2705     { &google, &zoznam, &bing_sk_SK, &atlas_sk, &centrum_sk };
2706 
2707 // El Salvador
2708 const PrepopulatedEngine* engines_SV[] =
2709     { &google, &bing_es_XL, &yahoo, };
2710 
2711 // Syria
2712 const PrepopulatedEngine* engines_SY[] =
2713     { &google, &bing_en_XA, &yahoo, &bing_ar_XA, &maktoob, &yamli, };
2714 
2715 // Thailand
2716 const PrepopulatedEngine* engines_TH[] =
2717     { &google, &sanook, &yahoo_th, &bing_th_TH, };
2718 
2719 // Tunisia
2720 const PrepopulatedEngine* engines_TN[] =
2721     { &google, &bing_en_XA, &yahoo, &bing_ar_XA, &maktoob, &yamli };
2722 
2723 // Turkey
2724 const PrepopulatedEngine* engines_TR[] =
2725     { &google, &bing_tr_TR, &yahoo, &mynet, };
2726 
2727 // Trinidad and Tobago
2728 const PrepopulatedEngine* engines_TT[] =
2729     { &google, &bing, &yahoo, &aol, };
2730 
2731 // Taiwan
2732 const PrepopulatedEngine* engines_TW[] =
2733     { &google, &yahoo_tw, &bing_zh_TW, };
2734 
2735 // Tanzania
2736 const PrepopulatedEngine* engines_TZ[] =
2737     { &google, &yahoo, &bing, };
2738 
2739 // Ukraine
2740 const PrepopulatedEngine* engines_UA[] =
2741     { &google, &yandex_ua, &mail_ru, &rambler, };
2742 
2743 // United States
2744 const PrepopulatedEngine* engines_US[] =
2745     { &google, &yahoo, &bing_en_US, };
2746 
2747 // Uruguay
2748 const PrepopulatedEngine* engines_UY[] =
2749     { &google, &bing_es_XL, &yahoo, };
2750 
2751 // Venezuela
2752 const PrepopulatedEngine* engines_VE[] =
2753     { &google, &bing_es_XL, &yahoo_ve, };
2754 
2755 // Vietnam
2756 const PrepopulatedEngine* engines_VN[] =
2757     { &google, &yahoo_vn, };
2758 
2759 // Yemen
2760 const PrepopulatedEngine* engines_YE[] =
2761     { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &maktoob, &araby, };
2762 
2763 // South Africa
2764 const PrepopulatedEngine* engines_ZA[] =
2765     { &google, &yahoo, &bing_en_ZA, };
2766 
2767 // Zimbabwe
2768 const PrepopulatedEngine* engines_ZW[] =
2769     { &google, &yahoo, &bing, };
2770 
2771 
2772 // A list of all the engines that we know about.
2773 const PrepopulatedEngine* kAllEngines[] =
2774     { &abcsok, &altavista, &altavista_ar, &altavista_se, &aol, &araby, &ask,
2775       &ask_de, &ask_es, &ask_it, &ask_nl, &ask_uk, &atlas_cz, &atlas_sk, &baidu,
2776       &bing, &bing_ar_XA, &bing_bg_BG, &bing_cs_CZ, &bing_da_DK, &bing_de_AT,
2777       &bing_de_CH, &bing_de_DE, &bing_el_GR, &bing_en_AU, &bing_en_CA,
2778       &bing_en_GB, &bing_en_ID, &bing_en_IE, &bing_en_IN, &bing_en_MY,
2779       &bing_en_NZ, &bing_en_PH, &bing_en_SG, &bing_en_US, &bing_en_XA,
2780       &bing_en_ZA, &bing_es_AR, &bing_es_CL, &bing_es_ES, &bing_es_MX,
2781       &bing_es_XL, &bing_et_EE, &bing_fi_FI, &bing_fr_BE, &bing_fr_CA,
2782       &bing_fr_CH, &bing_fr_FR, &bing_he_IL, &bing_hr_HR, &bing_hu_HU,
2783       &bing_it_IT, &bing_ja_JP, &bing_ko_KR, &bing_lt_LT, &bing_lv_LV,
2784       &bing_nb_NO, &bing_nl_BE, &bing_nl_NL, &bing_pl_PL, &bing_pt_BR,
2785       &bing_pt_PT, &bing_ro_RO, &bing_ru_RU, &bing_sl_SI, &bing_sk_SK,
2786       &bing_sv_SE, &bing_th_TH, &bing_tr_TR, &bing_uk_UA, &bing_zh_CN,
2787       &bing_zh_HK, &bing_zh_TW, &centrum_cz, &centrum_sk, &daum, &delfi_lt,
2788       &delfi_lv, &diri, &eniro_fi, &eniro_se, &fonecta_02_fi, &go, &goo,
2789       &google, &guruji, &hispavista, &in, &jabse, &jubii, &kvasir, &latne,
2790       &leit, &libero, &mail_ru, &maktoob, &masrawy, &mynet, &najdi, &nate,
2791       &naver, &neti, &netsprint, &nur_kz, &ok, &onet, &pogodak_ba, &pogodak_hr,
2792       &pogodak_rs, &pogodok, &rambler, &rediff, &rednano, &sanook, &sapo,
2793       &search_de_CH, &search_fr_CH, &seznam, &spray, &terra_ar, &terra_es, &tut,
2794       &uol, &virgilio, &walla, &wp, &yahoo, &yahoo_ar, &yahoo_at, &yahoo_au,
2795       &yahoo_br, &yahoo_ca, &yahoo_ch, &yahoo_cl, &yahoo_cn, &yahoo_co,
2796       &yahoo_de, &yahoo_dk, &yahoo_es, &yahoo_fi, &yahoo_fr, &yahoo_hk,
2797       &yahoo_id, &yahoo_in, &yahoo_it, &yahoo_jp, &yahoo_kr, &yahoo_malaysia,
2798       &yahoo_mx, &yahoo_nl, &yahoo_no, &yahoo_nz, &yahoo_pe, &yahoo_ph,
2799       &yahoo_qc, &yahoo_ru, &yahoo_se, &yahoo_sg, &yahoo_th, &yahoo_tw,
2800       &yahoo_uk, &yahoo_ve, &yahoo_vn, &yamli, &yandex_ru, &yandex_ua,
2801       &zoznam };
2802 
2803 
2804 // Geographic mappings /////////////////////////////////////////////////////////
2805 
2806 // Please refer to ISO 3166-1 for information about the two-character country
2807 // codes; http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 is useful. In the
2808 // following (C++) code, we pack the two letters of the country code into an int
2809 // value we call the CountryID.
2810 
2811 const int kCountryIDUnknown = -1;
2812 
CountryCharsToCountryID(char c1,char c2)2813 inline int CountryCharsToCountryID(char c1, char c2) {
2814   return c1 << 8 | c2;
2815 }
2816 
CountryCharsToCountryIDWithUpdate(char c1,char c2)2817 int CountryCharsToCountryIDWithUpdate(char c1, char c2) {
2818   // SPECIAL CASE: In 2003, Yugoslavia renamed itself to Serbia and Montenegro.
2819   // Serbia and Montenegro dissolved their union in June 2006. Yugoslavia was
2820   // ISO 'YU' and Serbia and Montenegro were ISO 'CS'. Serbia was subsequently
2821   // issued 'RS' and Montenegro 'ME'. Windows XP and Mac OS X Leopard still use
2822   // the value 'YU'. If we get a value of 'YU' or 'CS' we will map it to 'RS'.
2823   if ((c1 == 'Y' && c2 == 'U') ||
2824       (c1 == 'C' && c2 == 'S')) {
2825     c1 = 'R';
2826     c2 = 'S';
2827   }
2828 
2829   // SPECIAL CASE: Timor-Leste changed from 'TP' to 'TL' in 2002. Windows XP
2830   // predates this; we therefore map this value.
2831   if (c1 == 'T' && c2 == 'P')
2832     c2 = 'L';
2833 
2834   return CountryCharsToCountryID(c1, c2);
2835 }
2836 
2837 #if defined(OS_WIN)
2838 
2839 // For reference, a list of GeoIDs can be found at
2840 // http://msdn.microsoft.com/en-us/library/dd374073.aspx .
GeoIDToCountryID(GEOID geo_id)2841 int GeoIDToCountryID(GEOID geo_id) {
2842   const int kISOBufferSize = 3;  // Two plus one for the terminator.
2843   wchar_t isobuf[kISOBufferSize] = { 0 };
2844   int retval = GetGeoInfo(geo_id, GEO_ISO2, isobuf, kISOBufferSize, 0);
2845 
2846   if (retval == kISOBufferSize &&
2847       !(isobuf[0] == L'X' && isobuf[1] == L'X'))
2848     return CountryCharsToCountryIDWithUpdate(static_cast<char>(isobuf[0]),
2849                                              static_cast<char>(isobuf[1]));
2850 
2851   // Various locations have ISO codes that Windows does not return.
2852   switch (geo_id) {
2853     case 0x144:   // Guernsey
2854       return CountryCharsToCountryID('G', 'G');
2855     case 0x148:   // Jersey
2856       return CountryCharsToCountryID('J', 'E');
2857     case 0x3B16:  // Isle of Man
2858       return CountryCharsToCountryID('I', 'M');
2859 
2860     // 'UM' (U.S. Minor Outlying Islands)
2861     case 0x7F:    // Johnston Atoll
2862     case 0x102:   // Wake Island
2863     case 0x131:   // Baker Island
2864     case 0x146:   // Howland Island
2865     case 0x147:   // Jarvis Island
2866     case 0x149:   // Kingman Reef
2867     case 0x152:   // Palmyra Atoll
2868     case 0x52FA:  // Midway Islands
2869       return CountryCharsToCountryID('U', 'M');
2870 
2871     // 'SH' (Saint Helena)
2872     case 0x12F:  // Ascension Island
2873     case 0x15C:  // Tristan da Cunha
2874       return CountryCharsToCountryID('S', 'H');
2875 
2876     // 'IO' (British Indian Ocean Territory)
2877     case 0x13A:  // Diego Garcia
2878       return CountryCharsToCountryID('I', 'O');
2879 
2880     // Other cases where there is no ISO country code; we assign countries that
2881     // can serve as reasonable defaults.
2882     case 0x154:  // Rota Island
2883     case 0x155:  // Saipan
2884     case 0x15A:  // Tinian Island
2885       return CountryCharsToCountryID('U', 'S');
2886     case 0x134:  // Channel Islands
2887       return CountryCharsToCountryID('G', 'B');
2888     case 0x143:  // Guantanamo Bay
2889     default:
2890       return kCountryIDUnknown;
2891   }
2892 }
2893 
GetCurrentCountryID()2894 int GetCurrentCountryID() {
2895   GEOID geo_id = GetUserGeoID(GEOCLASS_NATION);
2896 
2897   return GeoIDToCountryID(geo_id);
2898 }
2899 
2900 #elif defined(OS_MACOSX)
2901 
GetCurrentCountryID()2902 int GetCurrentCountryID() {
2903   base::mac::ScopedCFTypeRef<CFLocaleRef> locale(CFLocaleCopyCurrent());
2904   CFStringRef country = (CFStringRef)CFLocaleGetValue(locale.get(),
2905                                                       kCFLocaleCountryCode);
2906   if (!country)
2907     return kCountryIDUnknown;
2908 
2909   UniChar isobuf[2];
2910   CFRange char_range = CFRangeMake(0, 2);
2911   CFStringGetCharacters(country, char_range, isobuf);
2912 
2913   return CountryCharsToCountryIDWithUpdate(static_cast<char>(isobuf[0]),
2914                                            static_cast<char>(isobuf[1]));
2915 }
2916 
2917 #elif defined(OS_POSIX)
2918 
GetCurrentCountryID()2919 int GetCurrentCountryID() {
2920   const char* locale = setlocale(LC_MESSAGES, NULL);
2921 
2922   if (!locale)
2923     return kCountryIDUnknown;
2924 
2925   // The format of a locale name is:
2926   // language[_territory][.codeset][@modifier], where territory is an ISO 3166
2927   // country code, which is what we want.
2928   std::string locale_str(locale);
2929   size_t begin = locale_str.find('_');
2930   if (begin == std::string::npos || locale_str.size() - begin < 3)
2931     return kCountryIDUnknown;
2932 
2933   ++begin;
2934   size_t end = locale_str.find_first_of(".@", begin);
2935   if (end == std::string::npos)
2936     end = locale_str.size();
2937 
2938   // The territory part must contain exactly two characters.
2939   if (end - begin == 2) {
2940     return CountryCharsToCountryIDWithUpdate(
2941         base::ToUpperASCII(locale_str[begin]),
2942         base::ToUpperASCII(locale_str[begin + 1]));
2943   }
2944 
2945   return kCountryIDUnknown;
2946 }
2947 
2948 #endif  // OS_*
2949 
GetCountryIDFromPrefs(PrefService * prefs)2950 int GetCountryIDFromPrefs(PrefService* prefs) {
2951   // See if the user overrode the country on the command line.
2952   const std::string country(
2953       CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
2954           switches::kCountry));
2955   if (country.length() == 2)
2956     return CountryCharsToCountryIDWithUpdate(country[0], country[1]);
2957 
2958   // Cache first run Country ID value in prefs, and use it afterwards.  This
2959   // ensures that just because the user moves around, we won't automatically
2960   // make major changes to their available search providers, which would feel
2961   // surprising.
2962   if (!prefs)
2963     return GetCurrentCountryID();
2964 
2965   int new_country_id = GetCurrentCountryID();
2966 #if defined(OS_WIN)
2967   // Migrate the old platform-specific value if it's present.
2968   if (prefs->HasPrefPath(prefs::kGeoIDAtInstall)) {
2969     int geo_id = prefs->GetInteger(prefs::kGeoIDAtInstall);
2970     prefs->ClearPref(prefs::kGeoIDAtInstall);
2971     new_country_id = GeoIDToCountryID(geo_id);
2972   }
2973 #endif
2974 
2975   if (!prefs->HasPrefPath(prefs::kCountryIDAtInstall))
2976     prefs->SetInteger(prefs::kCountryIDAtInstall, new_country_id);
2977 
2978   return prefs->GetInteger(prefs::kCountryIDAtInstall);
2979 }
2980 
GetPrepopulationSetFromCountryID(PrefService * prefs,const PrepopulatedEngine *** engines,size_t * num_engines)2981 void GetPrepopulationSetFromCountryID(PrefService* prefs,
2982                                       const PrepopulatedEngine*** engines,
2983                                       size_t* num_engines) {
2984   // NOTE: This function should ALWAYS set its outparams.
2985 
2986   // If you add a new country make sure to update the unit test for coverage.
2987   switch (GetCountryIDFromPrefs(prefs)) {
2988 
2989 #define CHAR_A 'A'
2990 #define CHAR_B 'B'
2991 #define CHAR_C 'C'
2992 #define CHAR_D 'D'
2993 #define CHAR_E 'E'
2994 #define CHAR_F 'F'
2995 #define CHAR_G 'G'
2996 #define CHAR_H 'H'
2997 #define CHAR_I 'I'
2998 #define CHAR_J 'J'
2999 #define CHAR_K 'K'
3000 #define CHAR_L 'L'
3001 #define CHAR_M 'M'
3002 #define CHAR_N 'N'
3003 #define CHAR_O 'O'
3004 #define CHAR_P 'P'
3005 #define CHAR_Q 'Q'
3006 #define CHAR_R 'R'
3007 #define CHAR_S 'S'
3008 #define CHAR_T 'T'
3009 #define CHAR_U 'U'
3010 #define CHAR_V 'V'
3011 #define CHAR_W 'W'
3012 #define CHAR_X 'X'
3013 #define CHAR_Y 'Y'
3014 #define CHAR_Z 'Z'
3015 #define CHAR(ch) CHAR_##ch
3016 #define CODE_TO_ID(code1, code2)\
3017     (CHAR(code1) << 8 | CHAR(code2))
3018 
3019 #define UNHANDLED_COUNTRY(code1, code2)\
3020     case CODE_TO_ID(code1, code2):
3021 #define END_UNHANDLED_COUNTRIES(code1, code2)\
3022       *engines = engines_##code1##code2;\
3023       *num_engines = arraysize(engines_##code1##code2);\
3024       return;
3025 #define DECLARE_COUNTRY(code1, code2)\
3026     UNHANDLED_COUNTRY(code1, code2)\
3027     END_UNHANDLED_COUNTRIES(code1, code2)
3028 
3029     // Countries with their own, dedicated engine set.
3030     DECLARE_COUNTRY(A, E)  // United Arab Emirates
3031     DECLARE_COUNTRY(A, L)  // Albania
3032     DECLARE_COUNTRY(A, R)  // Argentina
3033     DECLARE_COUNTRY(A, T)  // Austria
3034     DECLARE_COUNTRY(A, U)  // Australia
3035     DECLARE_COUNTRY(B, A)  // Bosnia and Herzegovina
3036     DECLARE_COUNTRY(B, E)  // Belgium
3037     DECLARE_COUNTRY(B, G)  // Bulgaria
3038     DECLARE_COUNTRY(B, H)  // Bahrain
3039     DECLARE_COUNTRY(B, I)  // Burundi
3040     DECLARE_COUNTRY(B, N)  // Brunei
3041     DECLARE_COUNTRY(B, O)  // Bolivia
3042     DECLARE_COUNTRY(B, R)  // Brazil
3043     DECLARE_COUNTRY(B, Y)  // Belarus
3044     DECLARE_COUNTRY(B, Z)  // Belize
3045     DECLARE_COUNTRY(C, A)  // Canada
3046     DECLARE_COUNTRY(C, H)  // Switzerland
3047     DECLARE_COUNTRY(C, L)  // Chile
3048     DECLARE_COUNTRY(C, N)  // China
3049     DECLARE_COUNTRY(C, O)  // Colombia
3050     DECLARE_COUNTRY(C, R)  // Costa Rica
3051     DECLARE_COUNTRY(C, Z)  // Czech Republic
3052     DECLARE_COUNTRY(D, E)  // Germany
3053     DECLARE_COUNTRY(D, K)  // Denmark
3054     DECLARE_COUNTRY(D, O)  // Dominican Republic
3055     DECLARE_COUNTRY(D, Z)  // Algeria
3056     DECLARE_COUNTRY(E, C)  // Ecuador
3057     DECLARE_COUNTRY(E, E)  // Estonia
3058     DECLARE_COUNTRY(E, G)  // Egypt
3059     DECLARE_COUNTRY(E, S)  // Spain
3060     DECLARE_COUNTRY(F, I)  // Finland
3061     DECLARE_COUNTRY(F, O)  // Faroe Islands
3062     DECLARE_COUNTRY(F, R)  // France
3063     DECLARE_COUNTRY(G, B)  // United Kingdom
3064     DECLARE_COUNTRY(G, R)  // Greece
3065     DECLARE_COUNTRY(G, T)  // Guatemala
3066     DECLARE_COUNTRY(H, K)  // Hong Kong
3067     DECLARE_COUNTRY(H, N)  // Honduras
3068     DECLARE_COUNTRY(H, R)  // Croatia
3069     DECLARE_COUNTRY(H, U)  // Hungary
3070     DECLARE_COUNTRY(I, D)  // Indonesia
3071     DECLARE_COUNTRY(I, E)  // Ireland
3072     DECLARE_COUNTRY(I, L)  // Israel
3073     DECLARE_COUNTRY(I, N)  // India
3074     DECLARE_COUNTRY(I, Q)  // Iraq
3075     DECLARE_COUNTRY(I, R)  // Iran
3076     DECLARE_COUNTRY(I, S)  // Iceland
3077     DECLARE_COUNTRY(I, T)  // Italy
3078     DECLARE_COUNTRY(J, M)  // Jamaica
3079     DECLARE_COUNTRY(J, O)  // Jordan
3080     DECLARE_COUNTRY(J, P)  // Japan
3081     DECLARE_COUNTRY(K, E)  // Kenya
3082     DECLARE_COUNTRY(K, R)  // South Korea
3083     DECLARE_COUNTRY(K, W)  // Kuwait
3084     DECLARE_COUNTRY(K, Z)  // Kazakhstan
3085     DECLARE_COUNTRY(L, B)  // Lebanon
3086     DECLARE_COUNTRY(L, I)  // Liechtenstein
3087     DECLARE_COUNTRY(L, T)  // Lithuania
3088     DECLARE_COUNTRY(L, U)  // Luxembourg
3089     DECLARE_COUNTRY(L, V)  // Latvia
3090     DECLARE_COUNTRY(L, Y)  // Libya
3091     DECLARE_COUNTRY(M, A)  // Morocco
3092     DECLARE_COUNTRY(M, C)  // Monaco
3093     DECLARE_COUNTRY(M, D)  // Moldova
3094     DECLARE_COUNTRY(M, E)  // Montenegro
3095     DECLARE_COUNTRY(M, K)  // Macedonia
3096     DECLARE_COUNTRY(M, X)  // Mexico
3097     DECLARE_COUNTRY(M, Y)  // Malaysia
3098     DECLARE_COUNTRY(N, I)  // Nicaragua
3099     DECLARE_COUNTRY(N, L)  // Netherlands
3100     DECLARE_COUNTRY(N, O)  // Norway
3101     DECLARE_COUNTRY(N, Z)  // New Zealand
3102     DECLARE_COUNTRY(O, M)  // Oman
3103     DECLARE_COUNTRY(P, A)  // Panama
3104     DECLARE_COUNTRY(P, E)  // Peru
3105     DECLARE_COUNTRY(P, H)  // Philippines
3106     DECLARE_COUNTRY(P, K)  // Pakistan
3107     DECLARE_COUNTRY(P, L)  // Poland
3108     DECLARE_COUNTRY(P, R)  // Puerto Rico
3109     DECLARE_COUNTRY(P, T)  // Portugal
3110     DECLARE_COUNTRY(P, Y)  // Paraguay
3111     DECLARE_COUNTRY(Q, A)  // Qatar
3112     DECLARE_COUNTRY(R, O)  // Romania
3113     DECLARE_COUNTRY(R, S)  // Serbia
3114     DECLARE_COUNTRY(R, U)  // Russia
3115     DECLARE_COUNTRY(R, W)  // Rwanda
3116     DECLARE_COUNTRY(S, A)  // Saudi Arabia
3117     DECLARE_COUNTRY(S, E)  // Sweden
3118     DECLARE_COUNTRY(S, G)  // Singapore
3119     DECLARE_COUNTRY(S, I)  // Slovenia
3120     DECLARE_COUNTRY(S, K)  // Slovakia
3121     DECLARE_COUNTRY(S, V)  // El Salvador
3122     DECLARE_COUNTRY(S, Y)  // Syria
3123     DECLARE_COUNTRY(T, H)  // Thailand
3124     DECLARE_COUNTRY(T, N)  // Tunisia
3125     DECLARE_COUNTRY(T, R)  // Turkey
3126     DECLARE_COUNTRY(T, T)  // Trinidad and Tobago
3127     DECLARE_COUNTRY(T, W)  // Taiwan
3128     DECLARE_COUNTRY(T, Z)  // Tanzania
3129     DECLARE_COUNTRY(U, A)  // Ukraine
3130     DECLARE_COUNTRY(U, S)  // United States
3131     DECLARE_COUNTRY(U, Y)  // Uruguay
3132     DECLARE_COUNTRY(V, E)  // Venezuela
3133     DECLARE_COUNTRY(V, N)  // Vietnam
3134     DECLARE_COUNTRY(Y, E)  // Yemen
3135     DECLARE_COUNTRY(Z, A)  // South Africa
3136     DECLARE_COUNTRY(Z, W)  // Zimbabwe
3137 
3138     // Countries using the "Australia" engine set.
3139     UNHANDLED_COUNTRY(C, C)  // Cocos Islands
3140     UNHANDLED_COUNTRY(C, X)  // Christmas Island
3141     UNHANDLED_COUNTRY(H, M)  // Heard Island and McDonald Islands
3142     UNHANDLED_COUNTRY(N, F)  // Norfolk Island
3143     END_UNHANDLED_COUNTRIES(A, U)
3144 
3145     // Countries using the "China" engine set.
3146     UNHANDLED_COUNTRY(M, O)  // Macao
3147     END_UNHANDLED_COUNTRIES(C, N)
3148 
3149     // Countries using the "Denmark" engine set.
3150     UNHANDLED_COUNTRY(G, L)  // Greenland
3151     END_UNHANDLED_COUNTRIES(D, K)
3152 
3153     // Countries using the "Spain" engine set.
3154     UNHANDLED_COUNTRY(A, D)  // Andorra
3155     END_UNHANDLED_COUNTRIES(E, S)
3156 
3157     // Countries using the "Finland" engine set.
3158     UNHANDLED_COUNTRY(A, X)  // Aland Islands
3159     END_UNHANDLED_COUNTRIES(F, I)
3160 
3161     // Countries using the "France" engine set.
3162     UNHANDLED_COUNTRY(B, F)  // Burkina Faso
3163     UNHANDLED_COUNTRY(B, J)  // Benin
3164     UNHANDLED_COUNTRY(C, D)  // Congo - Kinshasa
3165     UNHANDLED_COUNTRY(C, F)  // Central African Republic
3166     UNHANDLED_COUNTRY(C, G)  // Congo - Brazzaville
3167     UNHANDLED_COUNTRY(C, I)  // Ivory Coast
3168     UNHANDLED_COUNTRY(C, M)  // Cameroon
3169     UNHANDLED_COUNTRY(D, J)  // Djibouti
3170     UNHANDLED_COUNTRY(G, A)  // Gabon
3171     UNHANDLED_COUNTRY(G, F)  // French Guiana
3172     UNHANDLED_COUNTRY(G, N)  // Guinea
3173     UNHANDLED_COUNTRY(G, P)  // Guadeloupe
3174     UNHANDLED_COUNTRY(H, T)  // Haiti
3175 #if defined(OS_WIN)
3176     UNHANDLED_COUNTRY(I, P)  // Clipperton Island ('IP' is an WinXP-ism; ISO
3177                              //                    includes it with France)
3178 #endif
3179     UNHANDLED_COUNTRY(M, L)  // Mali
3180     UNHANDLED_COUNTRY(M, Q)  // Martinique
3181     UNHANDLED_COUNTRY(N, C)  // New Caledonia
3182     UNHANDLED_COUNTRY(N, E)  // Niger
3183     UNHANDLED_COUNTRY(P, F)  // French Polynesia
3184     UNHANDLED_COUNTRY(P, M)  // Saint Pierre and Miquelon
3185     UNHANDLED_COUNTRY(R, E)  // Reunion
3186     UNHANDLED_COUNTRY(S, N)  // Senegal
3187     UNHANDLED_COUNTRY(T, D)  // Chad
3188     UNHANDLED_COUNTRY(T, F)  // French Southern Territories
3189     UNHANDLED_COUNTRY(T, G)  // Togo
3190     UNHANDLED_COUNTRY(W, F)  // Wallis and Futuna
3191     UNHANDLED_COUNTRY(Y, T)  // Mayotte
3192     END_UNHANDLED_COUNTRIES(F, R)
3193 
3194     // Countries using the "Greece" engine set.
3195     UNHANDLED_COUNTRY(C, Y)  // Cyprus
3196     END_UNHANDLED_COUNTRIES(G, R)
3197 
3198     // Countries using the "Italy" engine set.
3199     UNHANDLED_COUNTRY(S, M)  // San Marino
3200     UNHANDLED_COUNTRY(V, A)  // Vatican
3201     END_UNHANDLED_COUNTRIES(I, T)
3202 
3203     // Countries using the "Morocco" engine set.
3204     UNHANDLED_COUNTRY(E, H)  // Western Sahara
3205     END_UNHANDLED_COUNTRIES(M, A)
3206 
3207     // Countries using the "Netherlands" engine set.
3208     UNHANDLED_COUNTRY(A, N)  // Netherlands Antilles
3209     UNHANDLED_COUNTRY(A, W)  // Aruba
3210     END_UNHANDLED_COUNTRIES(N, L)
3211 
3212     // Countries using the "Norway" engine set.
3213     UNHANDLED_COUNTRY(B, V)  // Bouvet Island
3214     UNHANDLED_COUNTRY(S, J)  // Svalbard and Jan Mayen
3215     END_UNHANDLED_COUNTRIES(N, O)
3216 
3217     // Countries using the "New Zealand" engine set.
3218     UNHANDLED_COUNTRY(C, K)  // Cook Islands
3219     UNHANDLED_COUNTRY(N, U)  // Niue
3220     UNHANDLED_COUNTRY(T, K)  // Tokelau
3221     END_UNHANDLED_COUNTRIES(N, Z)
3222 
3223     // Countries using the "Portugal" engine set.
3224     UNHANDLED_COUNTRY(C, V)  // Cape Verde
3225     UNHANDLED_COUNTRY(G, W)  // Guinea-Bissau
3226     UNHANDLED_COUNTRY(M, Z)  // Mozambique
3227     UNHANDLED_COUNTRY(S, T)  // Sao Tome and Principe
3228     UNHANDLED_COUNTRY(T, L)  // Timor-Leste
3229     END_UNHANDLED_COUNTRIES(P, T)
3230 
3231     // Countries using the "Russia" engine set.
3232     UNHANDLED_COUNTRY(A, M)  // Armenia
3233     UNHANDLED_COUNTRY(A, Z)  // Azerbaijan
3234     UNHANDLED_COUNTRY(K, G)  // Kyrgyzstan
3235     UNHANDLED_COUNTRY(T, J)  // Tajikistan
3236     UNHANDLED_COUNTRY(T, M)  // Turkmenistan
3237     UNHANDLED_COUNTRY(U, Z)  // Uzbekistan
3238     END_UNHANDLED_COUNTRIES(R, U)
3239 
3240     // Countries using the "Saudi Arabia" engine set.
3241     UNHANDLED_COUNTRY(M, R)  // Mauritania
3242     UNHANDLED_COUNTRY(P, S)  // Palestinian Territory
3243     UNHANDLED_COUNTRY(S, D)  // Sudan
3244     END_UNHANDLED_COUNTRIES(S, A)
3245 
3246     // Countries using the "United Kingdom" engine set.
3247     UNHANDLED_COUNTRY(B, M)  // Bermuda
3248     UNHANDLED_COUNTRY(F, K)  // Falkland Islands
3249     UNHANDLED_COUNTRY(G, G)  // Guernsey
3250     UNHANDLED_COUNTRY(G, I)  // Gibraltar
3251     UNHANDLED_COUNTRY(G, S)  // South Georgia and the South Sandwich
3252                              //   Islands
3253     UNHANDLED_COUNTRY(I, M)  // Isle of Man
3254     UNHANDLED_COUNTRY(I, O)  // British Indian Ocean Territory
3255     UNHANDLED_COUNTRY(J, E)  // Jersey
3256     UNHANDLED_COUNTRY(K, Y)  // Cayman Islands
3257     UNHANDLED_COUNTRY(M, S)  // Montserrat
3258     UNHANDLED_COUNTRY(M, T)  // Malta
3259     UNHANDLED_COUNTRY(P, N)  // Pitcairn Islands
3260     UNHANDLED_COUNTRY(S, H)  // Saint Helena, Ascension Island, and Tristan da
3261                              //   Cunha
3262     UNHANDLED_COUNTRY(T, C)  // Turks and Caicos Islands
3263     UNHANDLED_COUNTRY(V, G)  // British Virgin Islands
3264     END_UNHANDLED_COUNTRIES(G, B)
3265 
3266     // Countries using the "United States" engine set.
3267     UNHANDLED_COUNTRY(A, S)  // American Samoa
3268     UNHANDLED_COUNTRY(G, U)  // Guam
3269     UNHANDLED_COUNTRY(M, P)  // Northern Mariana Islands
3270     UNHANDLED_COUNTRY(U, M)  // U.S. Minor Outlying Islands
3271     UNHANDLED_COUNTRY(V, I)  // U.S. Virgin Islands
3272     END_UNHANDLED_COUNTRIES(U, S)
3273 
3274     // Countries using the "default" engine set.
3275     UNHANDLED_COUNTRY(A, F)  // Afghanistan
3276     UNHANDLED_COUNTRY(A, G)  // Antigua and Barbuda
3277     UNHANDLED_COUNTRY(A, I)  // Anguilla
3278     UNHANDLED_COUNTRY(A, O)  // Angola
3279     UNHANDLED_COUNTRY(A, Q)  // Antarctica
3280     UNHANDLED_COUNTRY(B, B)  // Barbados
3281     UNHANDLED_COUNTRY(B, D)  // Bangladesh
3282     UNHANDLED_COUNTRY(B, S)  // Bahamas
3283     UNHANDLED_COUNTRY(B, T)  // Bhutan
3284     UNHANDLED_COUNTRY(B, W)  // Botswana
3285     UNHANDLED_COUNTRY(C, U)  // Cuba
3286     UNHANDLED_COUNTRY(D, M)  // Dominica
3287     UNHANDLED_COUNTRY(E, R)  // Eritrea
3288     UNHANDLED_COUNTRY(E, T)  // Ethiopia
3289     UNHANDLED_COUNTRY(F, J)  // Fiji
3290     UNHANDLED_COUNTRY(F, M)  // Micronesia
3291     UNHANDLED_COUNTRY(G, D)  // Grenada
3292     UNHANDLED_COUNTRY(G, E)  // Georgia
3293     UNHANDLED_COUNTRY(G, H)  // Ghana
3294     UNHANDLED_COUNTRY(G, M)  // Gambia
3295     UNHANDLED_COUNTRY(G, Q)  // Equatorial Guinea
3296     UNHANDLED_COUNTRY(G, Y)  // Guyana
3297     UNHANDLED_COUNTRY(K, H)  // Cambodia
3298     UNHANDLED_COUNTRY(K, I)  // Kiribati
3299     UNHANDLED_COUNTRY(K, M)  // Comoros
3300     UNHANDLED_COUNTRY(K, N)  // Saint Kitts and Nevis
3301     UNHANDLED_COUNTRY(K, P)  // North Korea
3302     UNHANDLED_COUNTRY(L, A)  // Laos
3303     UNHANDLED_COUNTRY(L, C)  // Saint Lucia
3304     UNHANDLED_COUNTRY(L, K)  // Sri Lanka
3305     UNHANDLED_COUNTRY(L, R)  // Liberia
3306     UNHANDLED_COUNTRY(L, S)  // Lesotho
3307     UNHANDLED_COUNTRY(M, G)  // Madagascar
3308     UNHANDLED_COUNTRY(M, H)  // Marshall Islands
3309     UNHANDLED_COUNTRY(M, M)  // Myanmar
3310     UNHANDLED_COUNTRY(M, N)  // Mongolia
3311     UNHANDLED_COUNTRY(M, U)  // Mauritius
3312     UNHANDLED_COUNTRY(M, V)  // Maldives
3313     UNHANDLED_COUNTRY(M, W)  // Malawi
3314     UNHANDLED_COUNTRY(N, A)  // Namibia
3315     UNHANDLED_COUNTRY(N, G)  // Nigeria
3316     UNHANDLED_COUNTRY(N, P)  // Nepal
3317     UNHANDLED_COUNTRY(N, R)  // Nauru
3318     UNHANDLED_COUNTRY(P, G)  // Papua New Guinea
3319     UNHANDLED_COUNTRY(P, W)  // Palau
3320     UNHANDLED_COUNTRY(S, B)  // Solomon Islands
3321     UNHANDLED_COUNTRY(S, C)  // Seychelles
3322     UNHANDLED_COUNTRY(S, L)  // Sierra Leone
3323     UNHANDLED_COUNTRY(S, O)  // Somalia
3324     UNHANDLED_COUNTRY(S, R)  // Suriname
3325     UNHANDLED_COUNTRY(S, Z)  // Swaziland
3326     UNHANDLED_COUNTRY(T, O)  // Tonga
3327     UNHANDLED_COUNTRY(T, V)  // Tuvalu
3328     UNHANDLED_COUNTRY(U, G)  // Uganda
3329     UNHANDLED_COUNTRY(V, C)  // Saint Vincent and the Grenadines
3330     UNHANDLED_COUNTRY(V, U)  // Vanuatu
3331     UNHANDLED_COUNTRY(W, S)  // Samoa
3332     UNHANDLED_COUNTRY(Z, M)  // Zambia
3333     case kCountryIDUnknown:
3334     default:                // Unhandled location
3335     END_UNHANDLED_COUNTRIES(def, ault)
3336   }
3337 }
3338 
3339 }  // namespace
3340 
3341 namespace TemplateURLPrepopulateData {
3342 
RegisterUserPrefs(PrefService * prefs)3343 void RegisterUserPrefs(PrefService* prefs) {
3344   prefs->RegisterIntegerPref(prefs::kCountryIDAtInstall, kCountryIDUnknown);
3345   prefs->RegisterListPref(prefs::kSearchProviderOverrides);
3346   prefs->RegisterIntegerPref(prefs::kSearchProviderOverridesVersion, -1);
3347   // Obsolete pref, for migration.
3348   prefs->RegisterIntegerPref(prefs::kGeoIDAtInstall, -1);
3349 }
3350 
GetDataVersion(PrefService * prefs)3351 int GetDataVersion(PrefService* prefs) {
3352   // Increment this if you change the above data in ways that mean users with
3353   // existing data should get a new version.
3354   const int kCurrentDataVersion = 33;
3355   if (!prefs)
3356     return kCurrentDataVersion;
3357   // If a version number exist in the preferences file, it overrides the
3358   // version of the built-in data.
3359   int version =
3360     prefs->GetInteger(prefs::kSearchProviderOverridesVersion);
3361   return (version >= 0) ? version : kCurrentDataVersion;
3362 }
3363 
MakePrepopulatedTemplateURL(const wchar_t * name,const wchar_t * keyword,const wchar_t * search_url,const char * favicon_url,const wchar_t * suggest_url,const wchar_t * instant_url,const char * encoding,SearchEngineType search_engine_type,int logo_id,int id)3364 TemplateURL* MakePrepopulatedTemplateURL(const wchar_t* name,
3365                                          const wchar_t* keyword,
3366                                          const wchar_t* search_url,
3367                                          const char* favicon_url,
3368                                          const wchar_t* suggest_url,
3369                                          const wchar_t* instant_url,
3370                                          const char* encoding,
3371                                          SearchEngineType search_engine_type,
3372                                          int logo_id,
3373                                          int id) {
3374   TemplateURL* new_turl = new TemplateURL();
3375   new_turl->SetURL(WideToUTF8(search_url), 0, 0);
3376   if (favicon_url)
3377     new_turl->SetFaviconURL(GURL(favicon_url));
3378   if (suggest_url)
3379     new_turl->SetSuggestionsURL(WideToUTF8(suggest_url), 0, 0);
3380   if (instant_url)
3381     new_turl->SetInstantURL(WideToUTF8(instant_url), 0, 0);
3382   new_turl->set_short_name(WideToUTF16Hack(name));
3383   if (keyword == NULL)
3384     new_turl->set_autogenerate_keyword(true);
3385   else
3386     new_turl->set_keyword(WideToUTF16Hack(keyword));
3387   new_turl->set_show_in_default_list(true);
3388   new_turl->set_safe_for_autoreplace(true);
3389   new_turl->set_date_created(Time());
3390   std::vector<std::string> turl_encodings;
3391   turl_encodings.push_back(encoding);
3392   new_turl->set_input_encodings(turl_encodings);
3393   new_turl->set_search_engine_type(search_engine_type);
3394   new_turl->set_logo_id(logo_id);
3395   new_turl->set_prepopulate_id(id);
3396   return new_turl;
3397 }
3398 
GetPrepopulatedTemplateFromPrefs(PrefService * prefs,std::vector<TemplateURL * > * t_urls)3399 void GetPrepopulatedTemplateFromPrefs(PrefService* prefs,
3400                                       std::vector<TemplateURL*>* t_urls) {
3401   if (!prefs)
3402     return;
3403 
3404   const ListValue* list =
3405       prefs->GetList(prefs::kSearchProviderOverrides);
3406   if (!list)
3407     return;
3408 
3409   string16 name;
3410   string16 keyword;
3411   std::string search_url;
3412   std::string suggest_url;
3413   std::string instant_url;
3414   std::string favicon_url;
3415   std::string encoding;
3416   int search_engine_type;
3417   int logo_id;
3418   int id;
3419 
3420   size_t num_engines = list->GetSize();
3421   for (size_t i = 0; i != num_engines; ++i) {
3422     Value* val;
3423     DictionaryValue* engine;
3424     list->GetDictionary(i, &engine);
3425     if (engine->Get("name", &val) && val->GetAsString(&name) &&
3426         engine->Get("keyword", &val) && val->GetAsString(&keyword) &&
3427         engine->Get("search_url", &val) && val->GetAsString(&search_url) &&
3428         engine->Get("suggest_url", &val) && val->GetAsString(&suggest_url) &&
3429         engine->Get("instant_url", &val) && val->GetAsString(&instant_url) &&
3430         engine->Get("favicon_url", &val) && val->GetAsString(&favicon_url) &&
3431         engine->Get("encoding", &val) && val->GetAsString(&encoding) &&
3432         engine->Get("search_engine_type", &val) && val->GetAsInteger(
3433             &search_engine_type) &&
3434         engine->Get("logo_id", &val) && val->GetAsInteger(&logo_id) &&
3435         engine->Get("id", &val) && val->GetAsInteger(&id)) {
3436       // These next fields are not allowed to be empty.
3437       if (search_url.empty() || favicon_url.empty() || encoding.empty())
3438         return;
3439     } else {
3440       // Got a parsing error. No big deal.
3441       continue;
3442     }
3443     // TODO(viettrungluu): convert |MakePrepopulatedTemplateURL()| and get rid
3444     // of conversions.
3445     t_urls->push_back(MakePrepopulatedTemplateURL(
3446         UTF16ToWideHack(name).c_str(),
3447         UTF16ToWideHack(keyword).c_str(),
3448         UTF8ToWide(search_url).c_str(),
3449         favicon_url.c_str(),
3450         UTF8ToWide(suggest_url).c_str(),
3451         UTF8ToWide(instant_url).c_str(),
3452         encoding.c_str(),
3453         static_cast<SearchEngineType>(search_engine_type),
3454         logo_id,
3455         id));
3456   }
3457 }
3458 
3459 // The caller owns the returned TemplateURL.
MakePrepopulateTemplateURLFromPrepopulateEngine(const PrepopulatedEngine & engine)3460 TemplateURL* MakePrepopulateTemplateURLFromPrepopulateEngine(
3461     const PrepopulatedEngine& engine) {
3462   return MakePrepopulatedTemplateURL(engine.name,
3463                                      engine.keyword,
3464                                      engine.search_url,
3465                                      engine.favicon_url,
3466                                      engine.suggest_url,
3467                                      engine.instant_url,
3468                                      engine.encoding,
3469                                      engine.search_engine_type,
3470                                      engine.logo_id,
3471                                      engine.id);
3472 }
3473 
GetPrepopulatedEngines(PrefService * prefs,std::vector<TemplateURL * > * t_urls,size_t * default_search_provider_index)3474 void GetPrepopulatedEngines(PrefService* prefs,
3475                             std::vector<TemplateURL*>* t_urls,
3476                             size_t* default_search_provider_index) {
3477   // If there is a set of search engines in the preferences file, it overrides
3478   // the built-in set.
3479   *default_search_provider_index = 0;
3480   GetPrepopulatedTemplateFromPrefs(prefs, t_urls);
3481   if (!t_urls->empty())
3482     return;
3483 
3484   const PrepopulatedEngine** engines;
3485   size_t num_engines;
3486   GetPrepopulationSetFromCountryID(prefs, &engines, &num_engines);
3487   for (size_t i = 0; i != num_engines; ++i) {
3488     t_urls->push_back(
3489         MakePrepopulateTemplateURLFromPrepopulateEngine(*engines[i]));
3490   }
3491 }
3492 
GetPrepopulatedDefaultSearch(PrefService * prefs)3493 TemplateURL* GetPrepopulatedDefaultSearch(PrefService* prefs) {
3494   TemplateURL* default_search_provider = NULL;
3495   ScopedVector<TemplateURL> loaded_urls;
3496   size_t default_search_index;
3497   // This could be more efficient.  We are loading all the URLs to only keep
3498   // the first one.
3499   GetPrepopulatedEngines(prefs, &loaded_urls.get(), &default_search_index);
3500   if (default_search_index < loaded_urls.size()) {
3501     default_search_provider = loaded_urls[default_search_index];
3502     loaded_urls.weak_erase(loaded_urls.begin() + default_search_index);
3503   }
3504   return default_search_provider;
3505 }
3506 
3507 // Helper function for the templated function GetOriginForSearchURL.
ToUTF8(const std::string & str)3508 static const std::string& ToUTF8(const std::string& str) {
3509   return str;
3510 }
3511 
3512 // Helper function for the templated function GetOriginForSearchURL.
ToUTF8(const wchar_t * str)3513 static std::string ToUTF8(const wchar_t* str) {
3514   return WideToUTF8(str);
3515 }
3516 
3517 template<typename STR>
GetOriginForSearchURL(const STR & url_string)3518 static GURL GetOriginForSearchURL(const STR& url_string) {
3519   // It is much faster to parse the url without generating the search URL, so
3520   // try that first.  If it fails, fallback to the slow method.
3521   std::string url_utf8_string(ToUTF8(url_string));
3522   GURL url(url_utf8_string);
3523   if (!url.is_valid()) {
3524     TemplateURL turl;
3525     turl.SetURL(url_utf8_string, 0, 0);
3526 
3527     UIThreadSearchTermsData search_terms_data;
3528     url = TemplateURLModel::GenerateSearchURLUsingTermsData(
3529         &turl, search_terms_data);
3530   }
3531   return url.GetOrigin();
3532 }
3533 
GetEngineForOrigin(PrefService * prefs,const GURL & url_to_find)3534 TemplateURL* GetEngineForOrigin(PrefService* prefs, const GURL& url_to_find) {
3535   GURL origin_to_find = url_to_find.GetOrigin();
3536 
3537   // Let's first try to find the url in the defaults. (In case the name
3538   // of logo is different for the current locale versus others.)
3539   ScopedVector<TemplateURL> loaded_urls;
3540   size_t default_search_index;
3541   GetPrepopulatedEngines(prefs, &loaded_urls.get(), &default_search_index);
3542 
3543   UIThreadSearchTermsData search_terms_data;
3544   for (std::vector<TemplateURL*>::iterator i = loaded_urls->begin();
3545        i != loaded_urls->end(); ++i) {
3546     TemplateURL* template_url = *i;
3547     GURL engine_origin(GetOriginForSearchURL((*i)->url()->url()));
3548     if (origin_to_find == engine_origin) {
3549       loaded_urls.weak_erase(i);
3550       return template_url;
3551     }
3552   }
3553 
3554   // Let's try all of known engines now.
3555   for (size_t i = 0; i < arraysize(kAllEngines); ++i) {
3556     GURL engine_origin(GetOriginForSearchURL(kAllEngines[i]->search_url));
3557     if (origin_to_find == engine_origin)
3558       return MakePrepopulateTemplateURLFromPrepopulateEngine(*kAllEngines[i]);
3559   }
3560   return NULL;
3561 }
3562 
GetSearchEngineLogo(const GURL & url_to_find)3563 int GetSearchEngineLogo(const GURL& url_to_find) {
3564   GURL origin_to_find = url_to_find.GetOrigin();
3565   for (size_t i = 0; i < arraysize(kAllEngines); ++i) {
3566     std::string url_utf8_string(ToUTF8(kAllEngines[i]->search_url));
3567     GURL url(url_utf8_string);
3568     if (origin_to_find == url.GetOrigin())
3569       return kAllEngines[i]->logo_id;
3570   }
3571   return kNoSearchEngineLogo;
3572 }
3573 
3574 }  // namespace TemplateURLPrepopulateData
3575