Home | History | Annotate | Download | only in browser
      1 // Copyright 2013 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 "components/autofill/core/browser/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.h"
     16 #include "base/strings/string_util.h"
     17 #include "base/strings/utf_string_conversions.h"
     18 #include "grit/components_strings.h"
     19 #include "third_party/icu/source/common/unicode/locid.h"
     20 #include "third_party/icu/source/common/unicode/uloc.h"
     21 #include "third_party/icu/source/common/unicode/unistr.h"
     22 #include "third_party/icu/source/common/unicode/urename.h"
     23 #include "third_party/icu/source/common/unicode/utypes.h"
     24 #include "third_party/icu/source/i18n/unicode/coll.h"
     25 #include "third_party/icu/source/i18n/unicode/ucol.h"
     26 #include "ui/base/l10n/l10n_util.h"
     27 
     28 namespace autofill {
     29 namespace {
     30 
     31 // The maximum capacity needed to store a locale up to the country code.
     32 const size_t kLocaleCapacity =
     33     ULOC_LANG_CAPACITY + ULOC_SCRIPT_CAPACITY + ULOC_COUNTRY_CAPACITY + 1;
     34 
     35 struct CountryData {
     36   int postal_code_label_id;
     37   int state_label_id;
     38   AddressRequiredFields address_required_fields;
     39 };
     40 
     41 struct StaticCountryData {
     42   char country_code[3];
     43   CountryData country_data;
     44 };
     45 
     46 // Maps country codes to localized label string identifiers.
     47 const StaticCountryData kCountryData[] = {
     48   { "AD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
     49             IDS_AUTOFILL_FIELD_LABEL_PARISH,
     50             ADDRESS_REQUIRES_STATE } },
     51   { "AE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
     52             IDS_AUTOFILL_FIELD_LABEL_EMIRATE,
     53             ADDRESS_REQUIRES_STATE } },
     54   { "AF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
     55             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
     56             ADDRESS_REQUIREMENTS_UNKNOWN } },
     57   { "AG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
     58             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
     59             ADDRESS_REQUIRES_ADDRESS_LINE_1_ONLY } },
     60   { "AI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
     61             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
     62             ADDRESS_REQUIREMENTS_UNKNOWN } },
     63   { "AL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
     64             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
     65             ADDRESS_REQUIREMENTS_UNKNOWN } },
     66   { "AM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
     67             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
     68             ADDRESS_REQUIREMENTS_UNKNOWN } },
     69   { "AN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
     70             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
     71             ADDRESS_REQUIREMENTS_UNKNOWN } },
     72   { "AO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
     73             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
     74             ADDRESS_REQUIREMENTS_UNKNOWN } },
     75   { "AQ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
     76             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
     77             ADDRESS_REQUIREMENTS_UNKNOWN } },
     78   { "AR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
     79             IDS_AUTOFILL_FIELD_LABEL_STATE,
     80             ADDRESS_REQUIREMENTS_UNKNOWN } },
     81   { "AS", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
     82             IDS_AUTOFILL_FIELD_LABEL_STATE,
     83             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
     84   { "AT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
     85             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
     86             ADDRESS_REQUIRES_CITY_ZIP } },
     87   { "AU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
     88             IDS_AUTOFILL_FIELD_LABEL_STATE,
     89             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
     90   { "AW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
     91             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
     92             ADDRESS_REQUIREMENTS_UNKNOWN } },
     93   { "AX", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
     94             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
     95             ADDRESS_REQUIRES_CITY_ZIP } },
     96   { "AZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
     97             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
     98             ADDRESS_REQUIREMENTS_UNKNOWN } },
     99   { "BA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    100             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    101             ADDRESS_REQUIREMENTS_UNKNOWN } },
    102   { "BB", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    103             IDS_AUTOFILL_FIELD_LABEL_PARISH,
    104             ADDRESS_REQUIREMENTS_UNKNOWN } },
    105   { "BD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    106             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    107             ADDRESS_REQUIREMENTS_UNKNOWN } },
    108   { "BE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    109             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    110             ADDRESS_REQUIRES_CITY_ZIP } },
    111   { "BF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    112             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    113             ADDRESS_REQUIREMENTS_UNKNOWN } },
    114   { "BG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    115             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    116             ADDRESS_REQUIREMENTS_UNKNOWN } },
    117   { "BH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    118             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    119             ADDRESS_REQUIREMENTS_UNKNOWN } },
    120   { "BI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    121             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    122             ADDRESS_REQUIREMENTS_UNKNOWN } },
    123   { "BJ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    124             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    125             ADDRESS_REQUIREMENTS_UNKNOWN } },
    126   { "BL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    127             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    128             ADDRESS_REQUIRES_CITY_ZIP } },
    129   { "BM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    130             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    131             ADDRESS_REQUIREMENTS_UNKNOWN } },
    132   { "BN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    133             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    134             ADDRESS_REQUIREMENTS_UNKNOWN } },
    135   { "BO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    136             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    137             ADDRESS_REQUIREMENTS_UNKNOWN } },
    138   { "BR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    139             IDS_AUTOFILL_FIELD_LABEL_STATE,
    140             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
    141   { "BS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    142             IDS_AUTOFILL_FIELD_LABEL_ISLAND,
    143             ADDRESS_REQUIREMENTS_UNKNOWN } },
    144   { "BT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    145             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    146             ADDRESS_REQUIREMENTS_UNKNOWN } },
    147   { "BV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    148             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    149             ADDRESS_REQUIREMENTS_UNKNOWN } },
    150   { "BW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    151             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    152             ADDRESS_REQUIREMENTS_UNKNOWN } },
    153   { "BY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    154             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    155             ADDRESS_REQUIREMENTS_UNKNOWN } },
    156   { "BZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    157             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    158             ADDRESS_REQUIREMENTS_UNKNOWN } },
    159   { "CA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    160             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    161             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
    162   { "CC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    163             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    164             ADDRESS_REQUIREMENTS_UNKNOWN } },
    165   { "CD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    166             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    167             ADDRESS_REQUIREMENTS_UNKNOWN } },
    168   { "CF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    169             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    170             ADDRESS_REQUIREMENTS_UNKNOWN } },
    171   { "CG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    172             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    173             ADDRESS_REQUIREMENTS_UNKNOWN } },
    174   { "CH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    175             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    176             ADDRESS_REQUIRES_CITY_ZIP } },
    177   { "CI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    178             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    179             ADDRESS_REQUIREMENTS_UNKNOWN } },
    180   { "CK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    181             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    182             ADDRESS_REQUIREMENTS_UNKNOWN } },
    183   { "CL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    184             IDS_AUTOFILL_FIELD_LABEL_STATE,
    185             ADDRESS_REQUIREMENTS_UNKNOWN } },
    186   { "CM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    187             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    188             ADDRESS_REQUIREMENTS_UNKNOWN } },
    189   { "CN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    190             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    191             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
    192   { "CO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    193             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    194             ADDRESS_REQUIREMENTS_UNKNOWN } },
    195   { "CR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    196             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    197             ADDRESS_REQUIREMENTS_UNKNOWN } },
    198   { "CS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    199             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    200             ADDRESS_REQUIREMENTS_UNKNOWN } },
    201   { "CV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    202             IDS_AUTOFILL_FIELD_LABEL_ISLAND,
    203             ADDRESS_REQUIREMENTS_UNKNOWN } },
    204   { "CX", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    205             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    206             ADDRESS_REQUIREMENTS_UNKNOWN } },
    207   { "CY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    208             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    209             ADDRESS_REQUIREMENTS_UNKNOWN } },
    210   { "CZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    211             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    212             ADDRESS_REQUIREMENTS_UNKNOWN } },
    213   { "DE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    214             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    215             ADDRESS_REQUIRES_CITY_ZIP } },
    216   { "DJ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    217             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    218             ADDRESS_REQUIREMENTS_UNKNOWN } },
    219   { "DK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    220             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    221             ADDRESS_REQUIRES_CITY_ZIP } },
    222   { "DM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    223             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    224             ADDRESS_REQUIREMENTS_UNKNOWN } },
    225   { "DO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    226             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    227             ADDRESS_REQUIREMENTS_UNKNOWN } },
    228   { "DZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    229             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    230             ADDRESS_REQUIREMENTS_UNKNOWN } },
    231   { "EC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    232             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    233             ADDRESS_REQUIREMENTS_UNKNOWN } },
    234   { "EE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    235             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    236             ADDRESS_REQUIREMENTS_UNKNOWN } },
    237   { "EG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    238             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    239             ADDRESS_REQUIREMENTS_UNKNOWN } },
    240   { "EH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    241             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    242             ADDRESS_REQUIREMENTS_UNKNOWN } },
    243   { "ER", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    244             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    245             ADDRESS_REQUIREMENTS_UNKNOWN } },
    246   { "ES", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    247             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    248             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
    249   { "ET", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    250             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    251             ADDRESS_REQUIREMENTS_UNKNOWN } },
    252   { "FI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    253             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    254             ADDRESS_REQUIRES_CITY_ZIP } },
    255   { "FJ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    256             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    257             ADDRESS_REQUIREMENTS_UNKNOWN } },
    258   { "FK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    259             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    260             ADDRESS_REQUIRES_CITY_ZIP } },
    261   { "FM", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
    262             IDS_AUTOFILL_FIELD_LABEL_STATE,
    263             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
    264   { "FO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    265             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    266             ADDRESS_REQUIREMENTS_UNKNOWN } },
    267   { "FR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    268             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    269             ADDRESS_REQUIRES_CITY_ZIP } },
    270   { "GA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    271             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    272             ADDRESS_REQUIREMENTS_UNKNOWN } },
    273   { "GB", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    274             IDS_AUTOFILL_FIELD_LABEL_COUNTY,
    275             ADDRESS_REQUIRES_CITY_ZIP } },
    276   { "GD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    277             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    278             ADDRESS_REQUIREMENTS_UNKNOWN } },
    279   { "GE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    280             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    281             ADDRESS_REQUIREMENTS_UNKNOWN } },
    282   { "GF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    283             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    284             ADDRESS_REQUIRES_CITY_ZIP } },
    285   { "GG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    286             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    287             ADDRESS_REQUIRES_CITY_ZIP } },
    288   { "GH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    289             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    290             ADDRESS_REQUIREMENTS_UNKNOWN } },
    291   { "GI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    292             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    293             ADDRESS_REQUIRES_ADDRESS_LINE_1_ONLY } },
    294   { "GL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    295             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    296             ADDRESS_REQUIRES_CITY_ZIP } },
    297   { "GM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    298             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    299             ADDRESS_REQUIREMENTS_UNKNOWN } },
    300   { "GN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    301             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    302             ADDRESS_REQUIREMENTS_UNKNOWN } },
    303   { "GP", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    304             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    305             ADDRESS_REQUIRES_CITY_ZIP } },
    306   { "GQ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    307             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    308             ADDRESS_REQUIREMENTS_UNKNOWN } },
    309   { "GR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    310             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    311             ADDRESS_REQUIRES_CITY_ZIP } },
    312   { "GS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    313             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    314             ADDRESS_REQUIRES_CITY_ZIP } },
    315   { "GT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    316             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    317             ADDRESS_REQUIREMENTS_UNKNOWN } },
    318   { "GU", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
    319             IDS_AUTOFILL_FIELD_LABEL_STATE,
    320             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
    321   { "GW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    322             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    323             ADDRESS_REQUIREMENTS_UNKNOWN } },
    324   { "GY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    325             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    326             ADDRESS_REQUIREMENTS_UNKNOWN } },
    327   { "HK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    328             IDS_AUTOFILL_FIELD_LABEL_AREA,
    329             ADDRESS_REQUIRES_STATE } },
    330   { "HM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    331             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    332             ADDRESS_REQUIREMENTS_UNKNOWN } },
    333   { "HN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    334             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    335             ADDRESS_REQUIRES_CITY_STATE } },
    336   { "HR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    337             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    338             ADDRESS_REQUIREMENTS_UNKNOWN } },
    339   { "HT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    340             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    341             ADDRESS_REQUIREMENTS_UNKNOWN } },
    342   { "HU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    343             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    344             ADDRESS_REQUIREMENTS_UNKNOWN } },
    345   { "ID", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    346             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    347             ADDRESS_REQUIREMENTS_UNKNOWN } },
    348   { "IE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    349             IDS_AUTOFILL_FIELD_LABEL_COUNTY,
    350             ADDRESS_REQUIREMENTS_UNKNOWN } },
    351   { "IL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    352             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    353             ADDRESS_REQUIREMENTS_UNKNOWN } },
    354   { "IM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    355             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    356             ADDRESS_REQUIRES_CITY_ZIP } },
    357   { "IN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    358             IDS_AUTOFILL_FIELD_LABEL_STATE,
    359             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
    360   { "IO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    361             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    362             ADDRESS_REQUIRES_CITY_ZIP } },
    363   { "IQ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    364             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    365             ADDRESS_REQUIRES_CITY_STATE } },
    366   { "IS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    367             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    368             ADDRESS_REQUIREMENTS_UNKNOWN } },
    369   { "IT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    370             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    371             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
    372   { "JE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    373             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    374             ADDRESS_REQUIRES_CITY_ZIP } },
    375   { "JM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    376             IDS_AUTOFILL_FIELD_LABEL_PARISH,
    377             ADDRESS_REQUIRES_CITY_STATE } },
    378   { "JO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    379             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    380             ADDRESS_REQUIREMENTS_UNKNOWN } },
    381   { "JP", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    382             IDS_AUTOFILL_FIELD_LABEL_PREFECTURE,
    383             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
    384   { "KE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    385             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    386             ADDRESS_REQUIREMENTS_UNKNOWN } },
    387   { "KG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    388             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    389             ADDRESS_REQUIREMENTS_UNKNOWN } },
    390   { "KH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    391             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    392             ADDRESS_REQUIREMENTS_UNKNOWN } },
    393   { "KI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    394             IDS_AUTOFILL_FIELD_LABEL_ISLAND,
    395             ADDRESS_REQUIREMENTS_UNKNOWN } },
    396   { "KM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    397             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    398             ADDRESS_REQUIREMENTS_UNKNOWN } },
    399   { "KN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    400             IDS_AUTOFILL_FIELD_LABEL_ISLAND,
    401             ADDRESS_REQUIRES_CITY_STATE } },
    402   { "KP", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    403             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    404             ADDRESS_REQUIREMENTS_UNKNOWN } },
    405   { "KR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    406             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    407             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
    408   { "KW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    409             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    410             ADDRESS_REQUIREMENTS_UNKNOWN } },
    411   { "KY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    412             IDS_AUTOFILL_FIELD_LABEL_ISLAND,
    413             ADDRESS_REQUIRES_STATE } },
    414   { "KZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    415             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    416             ADDRESS_REQUIREMENTS_UNKNOWN } },
    417   { "LA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    418             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    419             ADDRESS_REQUIREMENTS_UNKNOWN } },
    420   { "LB", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    421             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    422             ADDRESS_REQUIREMENTS_UNKNOWN } },
    423   { "LC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    424             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    425             ADDRESS_REQUIREMENTS_UNKNOWN } },
    426   { "LI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    427             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    428             ADDRESS_REQUIRES_CITY_ZIP } },
    429   { "LK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    430             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    431             ADDRESS_REQUIREMENTS_UNKNOWN } },
    432   { "LR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    433             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    434             ADDRESS_REQUIREMENTS_UNKNOWN } },
    435   { "LS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    436             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    437             ADDRESS_REQUIREMENTS_UNKNOWN } },
    438   { "LT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    439             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    440             ADDRESS_REQUIREMENTS_UNKNOWN } },
    441   { "LU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    442             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    443             ADDRESS_REQUIRES_CITY_ZIP } },
    444   { "LV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    445             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    446             ADDRESS_REQUIREMENTS_UNKNOWN } },
    447   { "LY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    448             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    449             ADDRESS_REQUIREMENTS_UNKNOWN } },
    450   { "MA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    451             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    452             ADDRESS_REQUIREMENTS_UNKNOWN } },
    453   { "MC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    454             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    455             ADDRESS_REQUIREMENTS_UNKNOWN } },
    456   { "MD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    457             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    458             ADDRESS_REQUIREMENTS_UNKNOWN } },
    459   { "ME", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    460             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    461             ADDRESS_REQUIREMENTS_UNKNOWN } },
    462   { "MF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    463             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    464             ADDRESS_REQUIRES_CITY_ZIP } },
    465   { "MG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    466             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    467             ADDRESS_REQUIREMENTS_UNKNOWN } },
    468   { "MH", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
    469             IDS_AUTOFILL_FIELD_LABEL_STATE,
    470             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
    471   { "MK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    472             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    473             ADDRESS_REQUIREMENTS_UNKNOWN } },
    474   { "ML", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    475             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    476             ADDRESS_REQUIREMENTS_UNKNOWN } },
    477   { "MN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    478             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    479             ADDRESS_REQUIREMENTS_UNKNOWN } },
    480   { "MO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    481             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    482             ADDRESS_REQUIRES_ADDRESS_LINE_1_ONLY } },
    483   { "MP", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
    484             IDS_AUTOFILL_FIELD_LABEL_STATE,
    485             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
    486   { "MQ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    487             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    488             ADDRESS_REQUIRES_CITY_ZIP } },
    489   { "MR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    490             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    491             ADDRESS_REQUIREMENTS_UNKNOWN } },
    492   { "MS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    493             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    494             ADDRESS_REQUIREMENTS_UNKNOWN } },
    495   { "MT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    496             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    497             ADDRESS_REQUIREMENTS_UNKNOWN } },
    498   { "MU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    499             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    500             ADDRESS_REQUIREMENTS_UNKNOWN } },
    501   { "MV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    502             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    503             ADDRESS_REQUIREMENTS_UNKNOWN } },
    504   { "MW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    505             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    506             ADDRESS_REQUIREMENTS_UNKNOWN } },
    507   { "MX", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    508             IDS_AUTOFILL_FIELD_LABEL_STATE,
    509             ADDRESS_REQUIRES_CITY_ZIP } },
    510   { "MY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    511             IDS_AUTOFILL_FIELD_LABEL_STATE,
    512             ADDRESS_REQUIRES_CITY_ZIP } },
    513   { "MZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    514             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    515             ADDRESS_REQUIREMENTS_UNKNOWN } },
    516   { "NA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    517             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    518             ADDRESS_REQUIREMENTS_UNKNOWN } },
    519   { "NC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    520             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    521             ADDRESS_REQUIRES_CITY_ZIP } },
    522   { "NE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    523             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    524             ADDRESS_REQUIREMENTS_UNKNOWN } },
    525   { "NF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    526             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    527             ADDRESS_REQUIREMENTS_UNKNOWN } },
    528   { "NG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    529             IDS_AUTOFILL_FIELD_LABEL_STATE,
    530             ADDRESS_REQUIREMENTS_UNKNOWN } },
    531   { "NI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    532             IDS_AUTOFILL_FIELD_LABEL_DEPARTMENT,
    533             ADDRESS_REQUIREMENTS_UNKNOWN } },
    534   { "NL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    535             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    536             ADDRESS_REQUIRES_CITY_ZIP } },
    537   { "NO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    538             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    539             ADDRESS_REQUIRES_CITY_ZIP } },
    540   { "NP", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    541             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    542             ADDRESS_REQUIREMENTS_UNKNOWN } },
    543   { "NR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    544             IDS_AUTOFILL_FIELD_LABEL_DISTRICT,
    545             ADDRESS_REQUIRES_STATE } },
    546   { "NU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    547             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    548             ADDRESS_REQUIREMENTS_UNKNOWN } },
    549   { "NZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    550             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    551             ADDRESS_REQUIRES_CITY_ZIP } },
    552   { "OM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    553             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    554             ADDRESS_REQUIREMENTS_UNKNOWN } },
    555   { "PA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    556             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    557             ADDRESS_REQUIREMENTS_UNKNOWN } },
    558   { "PE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    559             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    560             ADDRESS_REQUIREMENTS_UNKNOWN } },
    561   { "PF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    562             IDS_AUTOFILL_FIELD_LABEL_ISLAND,
    563             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
    564   { "PG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    565             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    566             ADDRESS_REQUIRES_CITY_STATE } },
    567   { "PH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    568             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    569             ADDRESS_REQUIRES_CITY } },
    570   { "PK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    571             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    572             ADDRESS_REQUIREMENTS_UNKNOWN } },
    573   { "PL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    574             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    575             ADDRESS_REQUIRES_CITY_ZIP } },
    576   { "PM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    577             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    578             ADDRESS_REQUIRES_CITY_ZIP } },
    579   { "PN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    580             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    581             ADDRESS_REQUIRES_CITY_ZIP } },
    582   { "PR", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
    583             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    584             ADDRESS_REQUIRES_CITY_ZIP } },
    585   { "PS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    586             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    587             ADDRESS_REQUIREMENTS_UNKNOWN } },
    588   { "PT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    589             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    590             ADDRESS_REQUIRES_CITY_ZIP } },
    591   { "PW", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
    592             IDS_AUTOFILL_FIELD_LABEL_STATE,
    593             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
    594   { "PY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    595             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    596             ADDRESS_REQUIREMENTS_UNKNOWN } },
    597   { "QA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    598             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    599             ADDRESS_REQUIREMENTS_UNKNOWN } },
    600   { "RE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    601             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    602             ADDRESS_REQUIRES_CITY_ZIP } },
    603   { "RO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    604             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    605             ADDRESS_REQUIREMENTS_UNKNOWN } },
    606   { "RS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    607             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    608             ADDRESS_REQUIREMENTS_UNKNOWN } },
    609   { "RU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    610             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    611             ADDRESS_REQUIRES_CITY_ZIP } },
    612   { "RW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    613             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    614             ADDRESS_REQUIREMENTS_UNKNOWN } },
    615   { "SA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    616             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    617             ADDRESS_REQUIREMENTS_UNKNOWN } },
    618   { "SB", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    619             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    620             ADDRESS_REQUIREMENTS_UNKNOWN } },
    621   { "SC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    622             IDS_AUTOFILL_FIELD_LABEL_ISLAND,
    623             ADDRESS_REQUIREMENTS_UNKNOWN } },
    624   { "SE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    625             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    626             ADDRESS_REQUIRES_CITY_ZIP } },
    627   { "SG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    628             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    629             ADDRESS_REQUIRES_ZIP } },
    630   { "SH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    631             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    632             ADDRESS_REQUIRES_CITY_ZIP } },
    633   { "SI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    634             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    635             ADDRESS_REQUIREMENTS_UNKNOWN } },
    636   { "SJ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    637             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    638             ADDRESS_REQUIRES_CITY_ZIP } },
    639   { "SK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    640             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    641             ADDRESS_REQUIREMENTS_UNKNOWN } },
    642   { "SL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    643             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    644             ADDRESS_REQUIREMENTS_UNKNOWN } },
    645   { "SM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    646             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    647             ADDRESS_REQUIRES_ZIP } },
    648   { "SN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    649             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    650             ADDRESS_REQUIREMENTS_UNKNOWN } },
    651   { "SO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    652             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    653             ADDRESS_REQUIRES_CITY_STATE } },
    654   { "SR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    655             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    656             ADDRESS_REQUIREMENTS_UNKNOWN } },
    657   { "ST", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    658             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    659             ADDRESS_REQUIREMENTS_UNKNOWN } },
    660   { "SV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    661             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    662             ADDRESS_REQUIRES_CITY_STATE } },
    663   { "SZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    664             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    665             ADDRESS_REQUIREMENTS_UNKNOWN } },
    666   { "TC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    667             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    668             ADDRESS_REQUIRES_CITY_ZIP } },
    669   { "TD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    670             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    671             ADDRESS_REQUIREMENTS_UNKNOWN } },
    672   { "TF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    673             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    674             ADDRESS_REQUIREMENTS_UNKNOWN } },
    675   { "TG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    676             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    677             ADDRESS_REQUIREMENTS_UNKNOWN } },
    678   { "TH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    679             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    680             ADDRESS_REQUIREMENTS_UNKNOWN } },
    681   { "TJ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    682             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    683             ADDRESS_REQUIREMENTS_UNKNOWN } },
    684   { "TK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    685             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    686             ADDRESS_REQUIREMENTS_UNKNOWN } },
    687   { "TL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    688             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    689             ADDRESS_REQUIREMENTS_UNKNOWN } },
    690   { "TM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    691             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    692             ADDRESS_REQUIREMENTS_UNKNOWN } },
    693   { "TN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    694             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    695             ADDRESS_REQUIREMENTS_UNKNOWN } },
    696   { "TO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    697             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    698             ADDRESS_REQUIREMENTS_UNKNOWN } },
    699   { "TR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    700             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    701             ADDRESS_REQUIRES_CITY_ZIP } },
    702   { "TT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    703             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    704             ADDRESS_REQUIREMENTS_UNKNOWN } },
    705   { "TV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    706             IDS_AUTOFILL_FIELD_LABEL_ISLAND,
    707             ADDRESS_REQUIREMENTS_UNKNOWN } },
    708   { "TW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    709             IDS_AUTOFILL_FIELD_LABEL_COUNTY,
    710             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
    711   { "TZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    712             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    713             ADDRESS_REQUIREMENTS_UNKNOWN } },
    714   { "UA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    715             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    716             ADDRESS_REQUIREMENTS_UNKNOWN } },
    717   { "UG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    718             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    719             ADDRESS_REQUIREMENTS_UNKNOWN } },
    720   { "UM", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
    721             IDS_AUTOFILL_FIELD_LABEL_STATE,
    722             ADDRESS_REQUIRES_CITY_STATE } },
    723   { "US", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
    724             IDS_AUTOFILL_FIELD_LABEL_STATE,
    725             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
    726   { "UY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    727             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    728             ADDRESS_REQUIREMENTS_UNKNOWN } },
    729   { "UZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    730             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    731             ADDRESS_REQUIREMENTS_UNKNOWN } },
    732   { "VA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    733             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    734             ADDRESS_REQUIREMENTS_UNKNOWN } },
    735   { "VC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    736             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    737             ADDRESS_REQUIREMENTS_UNKNOWN } },
    738   { "VE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    739             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    740             ADDRESS_REQUIRES_CITY_STATE } },
    741   { "VG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    742             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    743             ADDRESS_REQUIRES_ADDRESS_LINE_1_ONLY } },
    744   { "VI", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
    745             IDS_AUTOFILL_FIELD_LABEL_STATE,
    746             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
    747   { "VN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    748             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    749             ADDRESS_REQUIRES_CITY } },
    750   { "VU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    751             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    752             ADDRESS_REQUIREMENTS_UNKNOWN } },
    753   { "WF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    754             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    755             ADDRESS_REQUIRES_CITY_ZIP } },
    756   { "WS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    757             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    758             ADDRESS_REQUIREMENTS_UNKNOWN } },
    759   { "YE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    760             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    761             ADDRESS_REQUIRES_CITY } },
    762   { "YT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    763             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    764             ADDRESS_REQUIRES_CITY_ZIP } },
    765   { "ZA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    766             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    767             ADDRESS_REQUIRES_CITY_ZIP } },
    768   { "ZM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    769             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    770             ADDRESS_REQUIRES_CITY } },
    771   { "ZW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    772             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    773             ADDRESS_REQUIREMENTS_UNKNOWN } },
    774 };
    775 
    776 // A singleton class that encapsulates a map from country codes to country data.
    777 class CountryDataMap {
    778  public:
    779   // A const iterator over the wrapped map data.
    780   typedef std::map<std::string, CountryData>::const_iterator Iterator;
    781 
    782   static CountryDataMap* GetInstance();
    783   static const Iterator Begin();
    784   static const Iterator End();
    785   static const Iterator Find(const std::string& country_code);
    786 
    787  private:
    788   CountryDataMap();
    789   friend struct DefaultSingletonTraits<CountryDataMap>;
    790 
    791   std::map<std::string, CountryData> country_data_;
    792 
    793   DISALLOW_COPY_AND_ASSIGN(CountryDataMap);
    794 };
    795 
    796 // static
    797 CountryDataMap* CountryDataMap::GetInstance() {
    798   return Singleton<CountryDataMap>::get();
    799 }
    800 
    801 CountryDataMap::CountryDataMap() {
    802   // Add all the countries we have explicit data for.
    803   for (size_t i = 0; i < arraysize(kCountryData); ++i) {
    804     const StaticCountryData& static_data = kCountryData[i];
    805     country_data_.insert(std::make_pair(static_data.country_code,
    806                                         static_data.country_data));
    807   }
    808 
    809   // Add any other countries that ICU knows about, falling back to default data
    810   // values.
    811   for (const char* const* country_pointer = icu::Locale::getISOCountries();
    812        *country_pointer;
    813        ++country_pointer) {
    814     std::string country_code = *country_pointer;
    815     if (!country_data_.count(country_code)) {
    816       CountryData data = {
    817         IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    818         IDS_AUTOFILL_FIELD_LABEL_PROVINCE
    819       };
    820       country_data_.insert(std::make_pair(country_code, data));
    821     }
    822   }
    823 }
    824 
    825 const CountryDataMap::Iterator CountryDataMap::Begin() {
    826   return GetInstance()->country_data_.begin();
    827 }
    828 
    829 const CountryDataMap::Iterator CountryDataMap::End() {
    830   return GetInstance()->country_data_.end();
    831 }
    832 
    833 const CountryDataMap::Iterator CountryDataMap::Find(
    834     const std::string& country_code) {
    835   return GetInstance()->country_data_.find(country_code);
    836 }
    837 
    838 // A singleton class that encapsulates mappings from country names to their
    839 // corresponding country codes.
    840 class CountryNames {
    841  public:
    842   static CountryNames* GetInstance();
    843 
    844   // Returns the country code corresponding to |country|, which should be a
    845   // country code or country name localized to |locale|.
    846   const std::string GetCountryCode(const base::string16& country,
    847                                    const std::string& locale);
    848 
    849  private:
    850   CountryNames();
    851   ~CountryNames();
    852   friend struct DefaultSingletonTraits<CountryNames>;
    853 
    854   // Populates |locales_to_localized_names_| with the mapping of country names
    855   // localized to |locale| to their corresponding country codes.
    856   void AddLocalizedNamesForLocale(const std::string& locale);
    857 
    858   // Interprets |country_name| as a full country name localized to the given
    859   // |locale| and returns the corresponding country code stored in
    860   // |locales_to_localized_names_|, or an empty string if there is none.
    861   const std::string GetCountryCodeForLocalizedName(
    862       const base::string16& country_name,
    863       const std::string& locale);
    864 
    865   // Returns an ICU collator -- i.e. string comparator -- appropriate for the
    866   // given |locale|.
    867   icu::Collator* GetCollatorForLocale(const std::string& locale);
    868 
    869   // Returns the ICU sort key corresponding to |str| for the given |collator|.
    870   // Uses |buffer| as temporary storage, and might resize |buffer| as a side-
    871   // effect. |buffer_size| should specify the |buffer|'s size, and is updated if
    872   // the |buffer| is resized.
    873   const std::string GetSortKey(const icu::Collator& collator,
    874                                const base::string16& str,
    875                                scoped_ptr<uint8_t[]>* buffer,
    876                                int32_t* buffer_size) const;
    877 
    878   // Maps from common country names, including 2- and 3-letter country codes,
    879   // to the corresponding 2-letter country codes. The keys are uppercase ASCII
    880   // strings.
    881   std::map<std::string, std::string> common_names_;
    882 
    883   // The outer map keys are ICU locale identifiers.
    884   // The inner maps map from localized country names to their corresponding
    885   // country codes. The inner map keys are ICU collation sort keys corresponding
    886   // to the target localized country name.
    887   std::map<std::string, std::map<std::string, std::string> >
    888       locales_to_localized_names_;
    889 
    890   // Maps ICU locale names to their corresponding collators.
    891   std::map<std::string, icu::Collator*> collators_;
    892 
    893   DISALLOW_COPY_AND_ASSIGN(CountryNames);
    894 };
    895 
    896 // static
    897 CountryNames* CountryNames::GetInstance() {
    898   return Singleton<CountryNames>::get();
    899 }
    900 
    901 CountryNames::CountryNames() {
    902   // Add 2- and 3-letter ISO country codes.
    903   for (CountryDataMap::Iterator it = CountryDataMap::Begin();
    904        it != CountryDataMap::End();
    905        ++it) {
    906     const std::string& country_code = it->first;
    907     std::string iso3_country_code =
    908         icu::Locale(NULL, country_code.c_str()).getISO3Country();
    909 
    910     common_names_.insert(std::make_pair(country_code, country_code));
    911     common_names_.insert(std::make_pair(iso3_country_code, country_code));
    912   }
    913 
    914   // Add a few other common synonyms.
    915   common_names_.insert(std::make_pair("UNITED STATES OF AMERICA", "US"));
    916   common_names_.insert(std::make_pair("U.S.A.", "US"));
    917   common_names_.insert(std::make_pair("GREAT BRITAIN", "GB"));
    918   common_names_.insert(std::make_pair("UK", "GB"));
    919   common_names_.insert(std::make_pair("BRASIL", "BR"));
    920   common_names_.insert(std::make_pair("DEUTSCHLAND", "DE"));
    921 }
    922 
    923 CountryNames::~CountryNames() {
    924   STLDeleteContainerPairSecondPointers(collators_.begin(),
    925                                        collators_.end());
    926 }
    927 
    928 const std::string CountryNames::GetCountryCode(const base::string16& country,
    929                                                const std::string& locale) {
    930   // First, check common country names, including 2- and 3-letter country codes.
    931   std::string country_utf8 = base::UTF16ToUTF8(StringToUpperASCII(country));
    932   std::map<std::string, std::string>::const_iterator result =
    933       common_names_.find(country_utf8);
    934   if (result != common_names_.end())
    935     return result->second;
    936 
    937   // Next, check country names localized to |locale|.
    938   std::string country_code = GetCountryCodeForLocalizedName(country, locale);
    939   if (!country_code.empty())
    940     return country_code;
    941 
    942   // Finally, check country names localized to US English.
    943   return GetCountryCodeForLocalizedName(country, "en_US");
    944 }
    945 
    946 void CountryNames::AddLocalizedNamesForLocale(const std::string& locale) {
    947   // Nothing to do if we've previously added the localized names for the given
    948   // |locale|.
    949   if (locales_to_localized_names_.count(locale))
    950     return;
    951 
    952   std::map<std::string, std::string> localized_names;
    953   const icu::Collator* collator = GetCollatorForLocale(locale);
    954   int32_t buffer_size = 1000;
    955   scoped_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]);
    956 
    957   for (CountryDataMap::Iterator it = CountryDataMap::Begin();
    958        it != CountryDataMap::End();
    959        ++it) {
    960     const std::string& country_code = it->first;
    961     base::string16 country_name = l10n_util::GetDisplayNameForCountry(
    962         country_code, locale);
    963     std::string sort_key = GetSortKey(*collator,
    964                                       country_name,
    965                                       &buffer,
    966                                       &buffer_size);
    967 
    968     localized_names.insert(std::make_pair(sort_key, country_code));
    969   }
    970 
    971   locales_to_localized_names_.insert(std::make_pair(locale, localized_names));
    972 }
    973 
    974 const std::string CountryNames::GetCountryCodeForLocalizedName(
    975     const base::string16& country_name,
    976     const std::string& locale) {
    977   AddLocalizedNamesForLocale(locale);
    978 
    979   icu::Collator* collator = GetCollatorForLocale(locale);
    980 
    981   // As recommended[1] by ICU, initialize the buffer size to four times the
    982   // source string length.
    983   // [1] http://userguide.icu-project.org/collation/api#TOC-Examples
    984   int32_t buffer_size = country_name.size() * 4;
    985   scoped_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]);
    986   std::string sort_key = GetSortKey(*collator,
    987                                     country_name,
    988                                     &buffer,
    989                                     &buffer_size);
    990 
    991   const std::map<std::string, std::string>& localized_names =
    992       locales_to_localized_names_[locale];
    993   std::map<std::string, std::string>::const_iterator result =
    994       localized_names.find(sort_key);
    995 
    996   if (result != localized_names.end())
    997     return result->second;
    998 
    999   return std::string();
   1000 }
   1001 
   1002 icu::Collator* CountryNames::GetCollatorForLocale(const std::string& locale) {
   1003   if (!collators_.count(locale)) {
   1004     icu::Locale icu_locale(locale.c_str());
   1005     UErrorCode ignored = U_ZERO_ERROR;
   1006     icu::Collator* collator(icu::Collator::createInstance(icu_locale, ignored));
   1007 
   1008     // Compare case-insensitively and ignoring punctuation.
   1009     ignored = U_ZERO_ERROR;
   1010     collator->setAttribute(UCOL_STRENGTH, UCOL_SECONDARY, ignored);
   1011     ignored = U_ZERO_ERROR;
   1012     collator->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, ignored);
   1013 
   1014     collators_.insert(std::make_pair(locale, collator));
   1015   }
   1016 
   1017   return collators_[locale];
   1018 }
   1019 
   1020 const std::string CountryNames::GetSortKey(const icu::Collator& collator,
   1021                                            const base::string16& str,
   1022                                            scoped_ptr<uint8_t[]>* buffer,
   1023                                            int32_t* buffer_size) const {
   1024   DCHECK(buffer);
   1025   DCHECK(buffer_size);
   1026 
   1027   icu::UnicodeString icu_str(str.c_str(), str.length());
   1028   int32_t expected_size = collator.getSortKey(icu_str, buffer->get(),
   1029                                               *buffer_size);
   1030   if (expected_size > *buffer_size) {
   1031     // If there wasn't enough space, grow the buffer and try again.
   1032     *buffer_size = expected_size;
   1033     buffer->reset(new uint8_t[*buffer_size]);
   1034     DCHECK(buffer->get());
   1035 
   1036     expected_size = collator.getSortKey(icu_str, buffer->get(), *buffer_size);
   1037     DCHECK_EQ(*buffer_size, expected_size);
   1038   }
   1039 
   1040   return std::string(reinterpret_cast<const char*>(buffer->get()));
   1041 }
   1042 
   1043 }  // namespace
   1044 
   1045 AutofillCountry::AutofillCountry(const std::string& country_code,
   1046                                  const std::string& locale) {
   1047   const CountryDataMap::Iterator result = CountryDataMap::Find(country_code);
   1048   DCHECK(result != CountryDataMap::End());
   1049   const CountryData& data = result->second;
   1050 
   1051   country_code_ = country_code;
   1052   name_ = l10n_util::GetDisplayNameForCountry(country_code, locale);
   1053   postal_code_label_ = l10n_util::GetStringUTF16(data.postal_code_label_id);
   1054   state_label_ = l10n_util::GetStringUTF16(data.state_label_id);
   1055   address_required_fields_ = data.address_required_fields;
   1056 }
   1057 
   1058 AutofillCountry::~AutofillCountry() {
   1059 }
   1060 
   1061 // static
   1062 void AutofillCountry::GetAvailableCountries(
   1063     std::vector<std::string>* country_codes) {
   1064   DCHECK(country_codes);
   1065 
   1066   for (CountryDataMap::Iterator it = CountryDataMap::Begin();
   1067        it != CountryDataMap::End();
   1068        ++it) {
   1069     country_codes->push_back(it->first);
   1070   }
   1071 }
   1072 
   1073 // static
   1074 const std::string AutofillCountry::CountryCodeForLocale(
   1075     const std::string& locale) {
   1076   // Add likely subtags to the locale. In particular, add any likely country
   1077   // subtags -- e.g. for locales like "ru" that only include the language.
   1078   std::string likely_locale;
   1079   UErrorCode error_ignored = U_ZERO_ERROR;
   1080   uloc_addLikelySubtags(locale.c_str(),
   1081                         WriteInto(&likely_locale, kLocaleCapacity),
   1082                         kLocaleCapacity,
   1083                         &error_ignored);
   1084 
   1085   // Extract the country code.
   1086   std::string country_code = icu::Locale(likely_locale.c_str()).getCountry();
   1087 
   1088   // Default to the United States if we have no better guess.
   1089   if (CountryDataMap::Find(country_code) == CountryDataMap::End())
   1090     return "US";
   1091 
   1092   return country_code;
   1093 }
   1094 
   1095 // static
   1096 const std::string AutofillCountry::GetCountryCode(const base::string16& country,
   1097                                                   const std::string& locale) {
   1098   return CountryNames::GetInstance()->GetCountryCode(country, locale);
   1099 }
   1100 
   1101 AutofillCountry::AutofillCountry(const std::string& country_code,
   1102                                  const base::string16& name,
   1103                                  const base::string16& postal_code_label,
   1104                                  const base::string16& state_label)
   1105     : country_code_(country_code),
   1106       name_(name),
   1107       postal_code_label_(postal_code_label),
   1108       state_label_(state_label) {
   1109 }
   1110 
   1111 }  // namespace autofill
   1112