Home | History | Annotate | Download | only in autofill
      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/autofill/autofill_country.h"
      6 
      7 #include <stddef.h>
      8 #include <stdint.h>
      9 #include <map>
     10 #include <utility>
     11 
     12 #include "base/logging.h"
     13 #include "base/memory/scoped_ptr.h"
     14 #include "base/memory/singleton.h"
     15 #include "base/stl_util-inl.h"
     16 #include "base/string_util.h"
     17 #include "base/utf_string_conversions.h"
     18 #ifndef ANDROID
     19 #include "chrome/browser/browser_process.h"
     20 #endif
     21 #include "grit/generated_resources.h"
     22 #include "ui/base/l10n/l10n_util.h"
     23 #include "unicode/coll.h"
     24 #include "unicode/locid.h"
     25 #include "unicode/ucol.h"
     26 #include "unicode/uloc.h"
     27 #include "unicode/unistr.h"
     28 #include "unicode/urename.h"
     29 #include "unicode/utypes.h"
     30 
     31 namespace {
     32 
     33 struct CountryData {
     34   std::string country_code;
     35   int postal_code_label_id;
     36   int state_label_id;
     37 };
     38 
     39 // The maximum capacity needed to store a locale up to the country code.
     40 const size_t kLocaleCapacity =
     41     ULOC_LANG_CAPACITY + ULOC_SCRIPT_CAPACITY + ULOC_COUNTRY_CAPACITY + 1;
     42 
     43 // Maps country codes to localized label string identifiers.
     44 const CountryData kCountryData[] = {
     45   {"AD", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PARISH},
     46   {"AE", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_EMIRATE},
     47   {"AF", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     48   {"AG", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     49   {"AI", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     50   {"AL", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     51   {"AM", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     52   {"AN", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     53   {"AO", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     54   {"AQ", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     55   {"AR", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_STATE},
     56   {"AS", IDS_AUTOFILL_DIALOG_ZIP_CODE,    IDS_AUTOFILL_DIALOG_STATE},
     57   {"AT", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     58   {"AU", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_STATE},
     59   {"AW", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     60   {"AX", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     61   {"AZ", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     62   {"BA", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     63   {"BB", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PARISH},
     64   {"BD", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     65   {"BE", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     66   {"BF", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     67   {"BG", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     68   {"BH", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     69   {"BI", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     70   {"BJ", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     71   {"BL", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     72   {"BM", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     73   {"BN", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     74   {"BO", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     75   {"BR", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_STATE},
     76   {"BS", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_ISLAND},
     77   {"BT", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     78   {"BV", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     79   {"BW", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     80   {"BY", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     81   {"BZ", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     82   {"CA", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     83   {"CC", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     84   {"CD", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     85   {"CF", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     86   {"CG", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     87   {"CH", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     88   {"CI", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     89   {"CK", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     90   {"CL", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_STATE},
     91   {"CM", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     92   {"CN", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     93   {"CO", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     94   {"CR", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     95   {"CV", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_ISLAND},
     96   {"CX", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     97   {"CY", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     98   {"CZ", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
     99   {"DE", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    100   {"DJ", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    101   {"DK", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    102   {"DM", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    103   {"DO", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    104   {"DZ", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    105   {"EC", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    106   {"EE", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    107   {"EG", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    108   {"EH", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    109   {"ER", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    110   {"ES", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    111   {"ET", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    112   {"FI", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    113   {"FJ", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    114   {"FK", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    115   {"FM", IDS_AUTOFILL_DIALOG_ZIP_CODE,    IDS_AUTOFILL_DIALOG_STATE},
    116   {"FO", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    117   {"FR", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    118   {"GA", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    119   {"GB", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_COUNTY},
    120   {"GD", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    121   {"GE", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    122   {"GF", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    123   {"GG", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    124   {"GH", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    125   {"GI", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    126   {"GL", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    127   {"GM", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    128   {"GN", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    129   {"GP", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    130   {"GQ", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    131   {"GR", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    132   {"GS", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    133   {"GT", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    134   {"GU", IDS_AUTOFILL_DIALOG_ZIP_CODE,    IDS_AUTOFILL_DIALOG_STATE},
    135   {"GW", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    136   {"GY", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    137   {"HK", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_AREA},
    138   {"HM", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    139   {"HN", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    140   {"HR", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    141   {"HT", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    142   {"HU", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    143   {"ID", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    144   {"IE", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_COUNTY},
    145   {"IL", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    146   {"IM", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    147   {"IN", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_STATE},
    148   {"IO", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    149   {"IQ", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    150   {"IS", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    151   {"IT", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    152   {"JE", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    153   {"JM", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PARISH},
    154   {"JO", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    155   {"JP", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PREFECTURE},
    156   {"KE", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    157   {"KG", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    158   {"KH", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    159   {"KI", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_ISLAND},
    160   {"KM", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    161   {"KN", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_ISLAND},
    162   {"KP", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    163   {"KR", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    164   {"KW", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    165   {"KY", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_ISLAND},
    166   {"KZ", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    167   {"LA", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    168   {"LB", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    169   {"LC", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    170   {"LI", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    171   {"LK", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    172   {"LR", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    173   {"LS", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    174   {"LT", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    175   {"LU", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    176   {"LV", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    177   {"LY", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    178   {"MA", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    179   {"MC", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    180   {"MD", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    181   {"ME", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    182   {"MF", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    183   {"MG", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    184   {"MH", IDS_AUTOFILL_DIALOG_ZIP_CODE,    IDS_AUTOFILL_DIALOG_STATE},
    185   {"MK", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    186   {"ML", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    187   {"MN", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    188   {"MO", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    189   {"MP", IDS_AUTOFILL_DIALOG_ZIP_CODE,    IDS_AUTOFILL_DIALOG_STATE},
    190   {"MQ", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    191   {"MR", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    192   {"MS", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    193   {"MT", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    194   {"MU", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    195   {"MV", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    196   {"MW", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    197   {"MX", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_STATE},
    198   {"MY", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_STATE},
    199   {"MZ", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    200   {"NA", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    201   {"NC", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    202   {"NE", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    203   {"NF", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    204   {"NG", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_STATE},
    205   {"NI", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_DEPARTMENT},
    206   {"NL", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    207   {"NO", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    208   {"NP", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    209   {"NR", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_DISTRICT},
    210   {"NU", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    211   {"NZ", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    212   {"OM", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    213   {"PA", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    214   {"PE", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    215   {"PF", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_ISLAND},
    216   {"PG", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    217   {"PH", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    218   {"PK", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    219   {"PL", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    220   {"PM", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    221   {"PN", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    222   {"PR", IDS_AUTOFILL_DIALOG_ZIP_CODE,    IDS_AUTOFILL_DIALOG_PROVINCE},
    223   {"PS", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    224   {"PT", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    225   {"PW", IDS_AUTOFILL_DIALOG_ZIP_CODE,    IDS_AUTOFILL_DIALOG_STATE},
    226   {"PY", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    227   {"QA", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    228   {"RE", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    229   {"RO", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    230   {"RS", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    231   {"RU", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    232   {"RW", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    233   {"SA", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    234   {"SB", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    235   {"SC", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_ISLAND},
    236   {"SE", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    237   {"SG", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    238   {"SH", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    239   {"SI", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    240   {"SJ", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    241   {"SK", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    242   {"SL", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    243   {"SM", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    244   {"SN", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    245   {"SO", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    246   {"SR", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    247   {"ST", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    248   {"SV", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    249   {"SZ", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    250   {"TC", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    251   {"TD", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    252   {"TF", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    253   {"TG", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    254   {"TH", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    255   {"TJ", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    256   {"TK", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    257   {"TL", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    258   {"TM", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    259   {"TN", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    260   {"TO", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    261   {"TR", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    262   {"TT", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    263   {"TV", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_ISLAND},
    264   {"TW", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_COUNTY},
    265   {"TZ", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    266   {"UA", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    267   {"UG", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    268   {"UM", IDS_AUTOFILL_DIALOG_ZIP_CODE,    IDS_AUTOFILL_DIALOG_STATE},
    269   {"US", IDS_AUTOFILL_DIALOG_ZIP_CODE,    IDS_AUTOFILL_DIALOG_STATE},
    270   {"UY", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    271   {"UZ", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    272   {"VA", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    273   {"VC", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    274   {"VE", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    275   {"VG", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    276   {"VI", IDS_AUTOFILL_DIALOG_ZIP_CODE,    IDS_AUTOFILL_DIALOG_STATE},
    277   {"VN", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    278   {"VU", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    279   {"WF", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    280   {"WS", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    281   {"YE", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    282   {"YT", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    283   {"ZA", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    284   {"ZM", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    285   {"ZW", IDS_AUTOFILL_DIALOG_POSTAL_CODE, IDS_AUTOFILL_DIALOG_PROVINCE},
    286 };
    287 
    288 // A singleton class that encapsulates a map from country codes to country data.
    289 class CountryDataMap {
    290  public:
    291   // A const iterator over the wrapped map data.
    292   typedef std::map<std::string, CountryData>::const_iterator Iterator;
    293 
    294   static CountryDataMap* GetInstance();
    295   static const Iterator Begin();
    296   static const Iterator End();
    297   static const Iterator Find(const std::string& country_code);
    298 
    299  private:
    300   CountryDataMap();
    301   friend struct DefaultSingletonTraits<CountryDataMap>;
    302 
    303   std::map<std::string, CountryData> country_data_;
    304 
    305   DISALLOW_COPY_AND_ASSIGN(CountryDataMap);
    306 };
    307 
    308 // static
    309 CountryDataMap* CountryDataMap::GetInstance() {
    310   return Singleton<CountryDataMap>::get();
    311 }
    312 
    313 CountryDataMap::CountryDataMap() {
    314   // Add all the countries we have explicit data for.
    315   for (size_t i = 0; i < arraysize(kCountryData); ++i) {
    316     const CountryData& data = kCountryData[i];
    317     country_data_.insert(std::make_pair(data.country_code, data));
    318   }
    319 
    320   // Add any other countries that ICU knows about, falling back to default data
    321   // values.
    322   for (const char* const* country_pointer = icu::Locale::getISOCountries();
    323        *country_pointer;
    324        ++country_pointer) {
    325     std::string country_code = *country_pointer;
    326     if (!country_data_.count(country_code)) {
    327       CountryData data = {
    328         country_code,
    329         IDS_AUTOFILL_DIALOG_POSTAL_CODE,
    330         IDS_AUTOFILL_DIALOG_PROVINCE
    331       };
    332       country_data_.insert(std::make_pair(country_code, data));
    333     }
    334   }
    335 }
    336 
    337 const CountryDataMap::Iterator CountryDataMap::Begin() {
    338   return GetInstance()->country_data_.begin();
    339 }
    340 
    341 const CountryDataMap::Iterator CountryDataMap::End() {
    342   return GetInstance()->country_data_.end();
    343 }
    344 
    345 const CountryDataMap::Iterator CountryDataMap::Find(
    346     const std::string& country_code) {
    347   return GetInstance()->country_data_.find(country_code);
    348 }
    349 
    350 // A singleton class that encapsulates mappings from country names to their
    351 // corresponding country codes.
    352 class CountryNames {
    353  public:
    354   static CountryNames* GetInstance();
    355 
    356   // Returns the country code corresponding to |country|, which should be a
    357   // country code or country name localized to |locale|.
    358   const std::string GetCountryCode(const string16& country,
    359                                    const std::string& locale);
    360 
    361  private:
    362   CountryNames();
    363   ~CountryNames();
    364   friend struct DefaultSingletonTraits<CountryNames>;
    365 
    366   // Populates |locales_to_localized_names_| with the mapping of country names
    367   // localized to |locale| to their corresponding country codes.
    368   void AddLocalizedNamesForLocale(const std::string& locale);
    369 
    370   // Interprets |country_name| as a full country name localized to the given
    371   // |locale| and returns the corresponding country code stored in
    372   // |locales_to_localized_names_|, or an empty string if there is none.
    373   const std::string GetCountryCodeForLocalizedName(const string16& country_name,
    374                                                    const std::string& locale);
    375 
    376   // Returns an ICU collator -- i.e. string comparator -- appropriate for the
    377   // given |locale|.
    378   icu::Collator* GetCollatorForLocale(const std::string& locale);
    379 
    380   // Returns the ICU sort key corresponding to |str| for the given |collator|.
    381   // Uses |buffer| as temporary storage, and might resize |buffer| as a side-
    382   // effect. |buffer_size| should specify the |buffer|'s size, and is updated if
    383   // the |buffer| is resized.
    384   const std::string GetSortKey(const icu::Collator& collator,
    385                                const icu::UnicodeString& str,
    386                                scoped_array<uint8_t>* buffer,
    387                                int32_t* buffer_size) const;
    388 
    389 
    390   // Maps from common country names, including 2- and 3-letter country codes,
    391   // to the corresponding 2-letter country codes. The keys are uppercase ASCII
    392   // strings.
    393   std::map<std::string, std::string> common_names_;
    394 
    395   // The outer map keys are ICU locale identifiers.
    396   // The inner maps map from localized country names to their corresponding
    397   // country codes. The inner map keys are ICU collation sort keys corresponding
    398   // to the target localized country name.
    399   std::map<std::string, std::map<std::string, std::string> >
    400       locales_to_localized_names_;
    401 
    402   // Maps ICU locale names to their corresponding collators.
    403   std::map<std::string, icu::Collator*> collators_;
    404 
    405   DISALLOW_COPY_AND_ASSIGN(CountryNames);
    406 };
    407 
    408 // static
    409 CountryNames* CountryNames::GetInstance() {
    410   return Singleton<CountryNames>::get();
    411 }
    412 
    413 CountryNames::CountryNames() {
    414   // Add 2- and 3-letter ISO country codes.
    415   for (CountryDataMap::Iterator it = CountryDataMap::Begin();
    416        it != CountryDataMap::End();
    417        ++it) {
    418     const std::string& country_code = it->first;
    419     std::string iso3_country_code =
    420     icu::Locale(NULL, country_code.c_str()).getISO3Country();
    421 
    422     common_names_.insert(std::make_pair(country_code, country_code));
    423     common_names_.insert(std::make_pair(iso3_country_code, country_code));
    424   }
    425 
    426   // Add a few other common synonyms.
    427   common_names_.insert(std::make_pair("UNITED STATES OF AMERICA", "US"));
    428   common_names_.insert(std::make_pair("GREAT BRITAIN", "GB"));
    429   common_names_.insert(std::make_pair("UK", "GB"));
    430   common_names_.insert(std::make_pair("BRASIL", "BR"));
    431   common_names_.insert(std::make_pair("DEUTSCHLAND", "DE"));
    432 }
    433 
    434 CountryNames::~CountryNames() {
    435   STLDeleteContainerPairSecondPointers(collators_.begin(),
    436                                        collators_.end());
    437 }
    438 
    439 const std::string CountryNames::GetCountryCode(const string16& country,
    440                                                const std::string& locale) {
    441   // First, check common country names, including 2- and 3-letter country codes.
    442   std::string country_utf8 = UTF16ToUTF8(StringToUpperASCII(country));
    443   std::map<std::string, std::string>::const_iterator result =
    444       common_names_.find(country_utf8);
    445   if (result != common_names_.end())
    446     return result->second;
    447 
    448   // Next, check country names localized to |locale|.
    449   std::string country_code = GetCountryCodeForLocalizedName(country, locale);
    450   if (!country_code.empty())
    451     return country_code;
    452 
    453   // Finally, check country names localized to US English.
    454   return GetCountryCodeForLocalizedName(country, "en_US");
    455 }
    456 
    457 void CountryNames::AddLocalizedNamesForLocale(const std::string& locale) {
    458   // Nothing to do if we've previously added the localized names for the given
    459   // |locale|.
    460   if (locales_to_localized_names_.count(locale))
    461     return;
    462 
    463   std::map<std::string, std::string> localized_names;
    464 
    465   icu::Locale icu_locale(locale.c_str());
    466   const icu::Collator* collator = GetCollatorForLocale(locale);
    467 
    468   int32_t buffer_size = 1000;
    469   scoped_array<uint8_t> buffer(new uint8_t[buffer_size]);
    470 
    471   for (CountryDataMap::Iterator it = CountryDataMap::Begin();
    472        it != CountryDataMap::End();
    473        ++it) {
    474     const std::string& country_code = it->first;
    475 
    476     icu::Locale country_locale(NULL, country_code.c_str());
    477     icu::UnicodeString country_name;
    478     country_locale.getDisplayName(icu_locale, country_name);
    479     std::string sort_key = GetSortKey(*collator,
    480                                       country_name,
    481                                       &buffer,
    482                                       &buffer_size);
    483 
    484     localized_names.insert(std::make_pair(sort_key, country_code));
    485   }
    486 
    487   locales_to_localized_names_.insert(std::make_pair(locale, localized_names));
    488 }
    489 
    490 const std::string CountryNames::GetCountryCodeForLocalizedName(
    491     const string16& country_name,
    492     const std::string& locale) {
    493   AddLocalizedNamesForLocale(locale);
    494 
    495   icu::Collator* collator = GetCollatorForLocale(locale);
    496 
    497   // As recommended[1] by ICU, initialize the buffer size to four times the
    498   // source string length.
    499   // [1] http://userguide.icu-project.org/collation/api#TOC-Examples
    500   int32_t buffer_size = country_name.size() * 4;
    501   scoped_array<uint8_t> buffer(new uint8_t[buffer_size]);
    502   std::string sort_key = GetSortKey(*collator,
    503                                     country_name.c_str(),
    504                                     &buffer,
    505                                     &buffer_size);
    506 
    507   const std::map<std::string, std::string>& localized_names =
    508       locales_to_localized_names_[locale];
    509   std::map<std::string, std::string>::const_iterator result =
    510       localized_names.find(sort_key);
    511 
    512   if (result != localized_names.end())
    513     return result->second;
    514 
    515   return std::string();
    516 }
    517 
    518 icu::Collator* CountryNames::GetCollatorForLocale(const std::string& locale) {
    519   if (!collators_.count(locale)) {
    520     icu::Locale icu_locale(locale.c_str());
    521     UErrorCode ignored = U_ZERO_ERROR;
    522     icu::Collator* collator(icu::Collator::createInstance(icu_locale, ignored));
    523 
    524     // Compare case-insensitively and ignoring punctuation.
    525     ignored = U_ZERO_ERROR;
    526     collator->setAttribute(UCOL_STRENGTH, UCOL_SECONDARY, ignored);
    527     ignored = U_ZERO_ERROR;
    528     collator->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, ignored);
    529 
    530     collators_.insert(std::make_pair(locale, collator));
    531   }
    532 
    533   return collators_[locale];
    534 }
    535 
    536 const std::string CountryNames::GetSortKey(const icu::Collator& collator,
    537                                            const icu::UnicodeString& str,
    538                                            scoped_array<uint8_t>* buffer,
    539                                            int32_t* buffer_size) const {
    540   DCHECK(buffer);
    541   DCHECK(buffer_size);
    542 
    543   int32_t expected_size = collator.getSortKey(str, buffer->get(), *buffer_size);
    544   if (expected_size > *buffer_size) {
    545     // If there wasn't enough space, grow the buffer and try again.
    546     *buffer_size = expected_size;
    547     buffer->reset(new uint8_t[*buffer_size]);
    548     DCHECK(buffer->get());
    549 
    550     expected_size = collator.getSortKey(str, buffer->get(), *buffer_size);
    551     DCHECK_EQ(*buffer_size, expected_size);
    552   }
    553 
    554   return std::string(reinterpret_cast<const char*>(buffer->get()));
    555 }
    556 
    557 // Returns the country name corresponding to |country_code|, localized to the
    558 // |display_locale|.
    559 string16 GetDisplayName(const std::string& country_code,
    560                         const icu::Locale& display_locale) {
    561   icu::Locale country_locale(NULL, country_code.c_str());
    562   icu::UnicodeString name;
    563   country_locale.getDisplayName(display_locale, name);
    564 
    565   DCHECK_GT(name.length(), 0);
    566   return string16(name.getBuffer(), name.length());
    567 }
    568 
    569 }  // namespace
    570 
    571 AutofillCountry::AutofillCountry(const std::string& country_code,
    572                                  const std::string& locale) {
    573   const CountryDataMap::Iterator result = CountryDataMap::Find(country_code);
    574   DCHECK(result != CountryDataMap::End());
    575   const CountryData& data = result->second;
    576 
    577   country_code_ = country_code;
    578   name_ = GetDisplayName(country_code, icu::Locale(locale.c_str()));
    579   postal_code_label_ = l10n_util::GetStringUTF16(data.postal_code_label_id);
    580   state_label_ = l10n_util::GetStringUTF16(data.state_label_id);
    581 }
    582 
    583 AutofillCountry::~AutofillCountry() {
    584 }
    585 
    586 // static
    587 void AutofillCountry::GetAvailableCountries(
    588     std::vector<std::string>* country_codes) {
    589   DCHECK(country_codes);
    590 
    591   for (CountryDataMap::Iterator it = CountryDataMap::Begin();
    592        it != CountryDataMap::End();
    593        ++it) {
    594     country_codes->push_back(it->first);
    595   }
    596 }
    597 
    598 // static
    599 const std::string AutofillCountry::CountryCodeForLocale(
    600     const std::string& locale) {
    601   // Add likely subtags to the locale. In particular, add any likely country
    602   // subtags -- e.g. for locales like "ru" that only include the language.
    603   std::string likely_locale;
    604   UErrorCode error_ignored = U_ZERO_ERROR;
    605   uloc_addLikelySubtags(locale.c_str(),
    606                         WriteInto(&likely_locale, kLocaleCapacity),
    607                         kLocaleCapacity,
    608                         &error_ignored);
    609 
    610   // Extract the country code.
    611   std::string country_code = icu::Locale(likely_locale.c_str()).getCountry();
    612 
    613   // TODO(isherman): Return an empty string and update the clients instead.
    614   // Default to the United States if we have no better guess.
    615   if (CountryDataMap::Find(country_code) == CountryDataMap::End())
    616     return "US";
    617 
    618   return country_code;
    619 }
    620 
    621 // static
    622 const std::string AutofillCountry::GetCountryCode(const string16& country,
    623                                                   const std::string& locale) {
    624   return CountryNames::GetInstance()->GetCountryCode(country, locale);
    625 }
    626 
    627 // static
    628 const std::string AutofillCountry::ApplicationLocale() {
    629 #ifdef ANDROID
    630   return l10n_util::GetApplicationLocale();
    631 #else
    632   return g_browser_process->GetApplicationLocale();
    633 #endif
    634 }
    635 
    636 AutofillCountry::AutofillCountry(const std::string& country_code,
    637                                  const string16& name,
    638                                  const string16& postal_code_label,
    639                                  const string16& state_label)
    640     : country_code_(country_code),
    641       name_(name),
    642       postal_code_label_(postal_code_label),
    643       state_label_(state_label) {
    644 }
    645