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   { "AC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
     49             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
     50             ADDRESS_REQUIRES_CITY } },
     51   { "AD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
     52             IDS_AUTOFILL_FIELD_LABEL_PARISH,
     53             ADDRESS_REQUIRES_STATE } },
     54   { "AE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
     55             IDS_AUTOFILL_FIELD_LABEL_EMIRATE,
     56             ADDRESS_REQUIRES_STATE } },
     57   { "AF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
     58             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
     59             ADDRESS_REQUIREMENTS_UNKNOWN } },
     60   { "AG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
     61             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
     62             ADDRESS_REQUIRES_ADDRESS_LINE_1_ONLY } },
     63   { "AI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
     64             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
     65             ADDRESS_REQUIREMENTS_UNKNOWN } },
     66   { "AL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
     67             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
     68             ADDRESS_REQUIREMENTS_UNKNOWN } },
     69   { "AM", { 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   { "TA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    667             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    668             ADDRESS_REQUIRES_CITY } },
    669   { "TC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    670             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    671             ADDRESS_REQUIRES_CITY_ZIP } },
    672   { "TD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    673             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    674             ADDRESS_REQUIREMENTS_UNKNOWN } },
    675   { "TF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    676             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    677             ADDRESS_REQUIREMENTS_UNKNOWN } },
    678   { "TG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    679             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    680             ADDRESS_REQUIREMENTS_UNKNOWN } },
    681   { "TH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    682             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    683             ADDRESS_REQUIREMENTS_UNKNOWN } },
    684   { "TJ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    685             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    686             ADDRESS_REQUIREMENTS_UNKNOWN } },
    687   { "TK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    688             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    689             ADDRESS_REQUIREMENTS_UNKNOWN } },
    690   { "TL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    691             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    692             ADDRESS_REQUIREMENTS_UNKNOWN } },
    693   { "TM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    694             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    695             ADDRESS_REQUIREMENTS_UNKNOWN } },
    696   { "TN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    697             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    698             ADDRESS_REQUIREMENTS_UNKNOWN } },
    699   { "TO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    700             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    701             ADDRESS_REQUIREMENTS_UNKNOWN } },
    702   { "TR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    703             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    704             ADDRESS_REQUIRES_CITY_ZIP } },
    705   { "TT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    706             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    707             ADDRESS_REQUIREMENTS_UNKNOWN } },
    708   { "TV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    709             IDS_AUTOFILL_FIELD_LABEL_ISLAND,
    710             ADDRESS_REQUIREMENTS_UNKNOWN } },
    711   { "TW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    712             IDS_AUTOFILL_FIELD_LABEL_COUNTY,
    713             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
    714   { "TZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    715             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    716             ADDRESS_REQUIREMENTS_UNKNOWN } },
    717   { "UA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    718             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    719             ADDRESS_REQUIREMENTS_UNKNOWN } },
    720   { "UG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    721             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    722             ADDRESS_REQUIREMENTS_UNKNOWN } },
    723   { "UM", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
    724             IDS_AUTOFILL_FIELD_LABEL_STATE,
    725             ADDRESS_REQUIRES_CITY_STATE } },
    726   { "US", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
    727             IDS_AUTOFILL_FIELD_LABEL_STATE,
    728             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
    729   { "UY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    730             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    731             ADDRESS_REQUIREMENTS_UNKNOWN } },
    732   { "UZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    733             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    734             ADDRESS_REQUIREMENTS_UNKNOWN } },
    735   { "VA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    736             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    737             ADDRESS_REQUIREMENTS_UNKNOWN } },
    738   { "VC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    739             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    740             ADDRESS_REQUIREMENTS_UNKNOWN } },
    741   { "VE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    742             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    743             ADDRESS_REQUIRES_CITY_STATE } },
    744   { "VG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    745             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    746             ADDRESS_REQUIRES_ADDRESS_LINE_1_ONLY } },
    747   { "VI", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE,
    748             IDS_AUTOFILL_FIELD_LABEL_STATE,
    749             ADDRESS_REQUIRES_CITY_STATE_ZIP } },
    750   { "VN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    751             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    752             ADDRESS_REQUIRES_CITY } },
    753   { "VU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    754             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    755             ADDRESS_REQUIREMENTS_UNKNOWN } },
    756   { "WF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    757             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    758             ADDRESS_REQUIRES_CITY_ZIP } },
    759   { "WS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    760             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    761             ADDRESS_REQUIREMENTS_UNKNOWN } },
    762   { "YE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    763             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    764             ADDRESS_REQUIRES_CITY } },
    765   { "YT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    766             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    767             ADDRESS_REQUIRES_CITY_ZIP } },
    768   { "ZA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    769             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    770             ADDRESS_REQUIRES_CITY_ZIP } },
    771   { "ZM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    772             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    773             ADDRESS_REQUIRES_CITY } },
    774   { "ZW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    775             IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
    776             ADDRESS_REQUIREMENTS_UNKNOWN } },
    777 };
    778 
    779 // A singleton class that encapsulates a map from country codes to country data.
    780 class CountryDataMap {
    781  public:
    782   // A const iterator over the wrapped map data.
    783   typedef std::map<std::string, CountryData>::const_iterator Iterator;
    784 
    785   static CountryDataMap* GetInstance();
    786   static const Iterator Begin();
    787   static const Iterator End();
    788   static const Iterator Find(const std::string& country_code);
    789 
    790  private:
    791   CountryDataMap();
    792   friend struct DefaultSingletonTraits<CountryDataMap>;
    793 
    794   std::map<std::string, CountryData> country_data_;
    795 
    796   DISALLOW_COPY_AND_ASSIGN(CountryDataMap);
    797 };
    798 
    799 // static
    800 CountryDataMap* CountryDataMap::GetInstance() {
    801   return Singleton<CountryDataMap>::get();
    802 }
    803 
    804 CountryDataMap::CountryDataMap() {
    805   // Add all the countries we have explicit data for.
    806   for (size_t i = 0; i < arraysize(kCountryData); ++i) {
    807     const StaticCountryData& static_data = kCountryData[i];
    808     country_data_.insert(std::make_pair(static_data.country_code,
    809                                         static_data.country_data));
    810   }
    811 
    812   // Add any other countries that ICU knows about, falling back to default data
    813   // values.
    814   for (const char* const* country_pointer = icu::Locale::getISOCountries();
    815        *country_pointer;
    816        ++country_pointer) {
    817     std::string country_code = *country_pointer;
    818     if (!country_data_.count(country_code)) {
    819       CountryData data = {
    820         IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
    821         IDS_AUTOFILL_FIELD_LABEL_PROVINCE
    822       };
    823       country_data_.insert(std::make_pair(country_code, data));
    824     }
    825   }
    826 }
    827 
    828 const CountryDataMap::Iterator CountryDataMap::Begin() {
    829   return GetInstance()->country_data_.begin();
    830 }
    831 
    832 const CountryDataMap::Iterator CountryDataMap::End() {
    833   return GetInstance()->country_data_.end();
    834 }
    835 
    836 const CountryDataMap::Iterator CountryDataMap::Find(
    837     const std::string& country_code) {
    838   return GetInstance()->country_data_.find(country_code);
    839 }
    840 
    841 // A singleton class that encapsulates mappings from country names to their
    842 // corresponding country codes.
    843 class CountryNames {
    844  public:
    845   static CountryNames* GetInstance();
    846 
    847   // Returns the country code corresponding to |country|, which should be a
    848   // country code or country name localized to |locale|.
    849   const std::string GetCountryCode(const base::string16& country,
    850                                    const std::string& locale);
    851 
    852  private:
    853   CountryNames();
    854   ~CountryNames();
    855   friend struct DefaultSingletonTraits<CountryNames>;
    856 
    857   // Populates |locales_to_localized_names_| with the mapping of country names
    858   // localized to |locale| to their corresponding country codes.
    859   void AddLocalizedNamesForLocale(const std::string& locale);
    860 
    861   // Interprets |country_name| as a full country name localized to the given
    862   // |locale| and returns the corresponding country code stored in
    863   // |locales_to_localized_names_|, or an empty string if there is none.
    864   const std::string GetCountryCodeForLocalizedName(
    865       const base::string16& country_name,
    866       const std::string& locale);
    867 
    868   // Returns an ICU collator -- i.e. string comparator -- appropriate for the
    869   // given |locale|.
    870   icu::Collator* GetCollatorForLocale(const std::string& locale);
    871 
    872   // Returns the ICU sort key corresponding to |str| for the given |collator|.
    873   // Uses |buffer| as temporary storage, and might resize |buffer| as a side-
    874   // effect. |buffer_size| should specify the |buffer|'s size, and is updated if
    875   // the |buffer| is resized.
    876   const std::string GetSortKey(const icu::Collator& collator,
    877                                const base::string16& str,
    878                                scoped_ptr<uint8_t[]>* buffer,
    879                                int32_t* buffer_size) const;
    880 
    881   // Maps from common country names, including 2- and 3-letter country codes,
    882   // to the corresponding 2-letter country codes. The keys are uppercase ASCII
    883   // strings.
    884   std::map<std::string, std::string> common_names_;
    885 
    886   // The outer map keys are ICU locale identifiers.
    887   // The inner maps map from localized country names to their corresponding
    888   // country codes. The inner map keys are ICU collation sort keys corresponding
    889   // to the target localized country name.
    890   std::map<std::string, std::map<std::string, std::string> >
    891       locales_to_localized_names_;
    892 
    893   // Maps ICU locale names to their corresponding collators.
    894   std::map<std::string, icu::Collator*> collators_;
    895 
    896   DISALLOW_COPY_AND_ASSIGN(CountryNames);
    897 };
    898 
    899 // static
    900 CountryNames* CountryNames::GetInstance() {
    901   return Singleton<CountryNames>::get();
    902 }
    903 
    904 CountryNames::CountryNames() {
    905   // Add 2- and 3-letter ISO country codes.
    906   for (CountryDataMap::Iterator it = CountryDataMap::Begin();
    907        it != CountryDataMap::End();
    908        ++it) {
    909     const std::string& country_code = it->first;
    910     common_names_.insert(std::make_pair(country_code, country_code));
    911 
    912     std::string iso3_country_code =
    913         icu::Locale(NULL, country_code.c_str()).getISO3Country();
    914 
    915     // ICU list of countries can be out-of-date with CLDR.
    916     if (!iso3_country_code.empty())
    917       common_names_.insert(std::make_pair(iso3_country_code, country_code));
    918   }
    919 
    920   // Add a few other common synonyms.
    921   common_names_.insert(std::make_pair("UNITED STATES OF AMERICA", "US"));
    922   common_names_.insert(std::make_pair("U.S.A.", "US"));
    923   common_names_.insert(std::make_pair("GREAT BRITAIN", "GB"));
    924   common_names_.insert(std::make_pair("UK", "GB"));
    925   common_names_.insert(std::make_pair("BRASIL", "BR"));
    926   common_names_.insert(std::make_pair("DEUTSCHLAND", "DE"));
    927 }
    928 
    929 CountryNames::~CountryNames() {
    930   STLDeleteContainerPairSecondPointers(collators_.begin(),
    931                                        collators_.end());
    932 }
    933 
    934 const std::string CountryNames::GetCountryCode(const base::string16& country,
    935                                                const std::string& locale) {
    936   // First, check common country names, including 2- and 3-letter country codes.
    937   std::string country_utf8 = base::UTF16ToUTF8(StringToUpperASCII(country));
    938   std::map<std::string, std::string>::const_iterator result =
    939       common_names_.find(country_utf8);
    940   if (result != common_names_.end())
    941     return result->second;
    942 
    943   // Next, check country names localized to |locale|.
    944   std::string country_code = GetCountryCodeForLocalizedName(country, locale);
    945   if (!country_code.empty())
    946     return country_code;
    947 
    948   // Finally, check country names localized to US English.
    949   return GetCountryCodeForLocalizedName(country, "en_US");
    950 }
    951 
    952 void CountryNames::AddLocalizedNamesForLocale(const std::string& locale) {
    953   // Nothing to do if we've previously added the localized names for the given
    954   // |locale|.
    955   if (locales_to_localized_names_.count(locale))
    956     return;
    957 
    958   std::map<std::string, std::string> localized_names;
    959   const icu::Collator* collator = GetCollatorForLocale(locale);
    960   int32_t buffer_size = 1000;
    961   scoped_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]);
    962 
    963   for (CountryDataMap::Iterator it = CountryDataMap::Begin();
    964        it != CountryDataMap::End();
    965        ++it) {
    966     const std::string& country_code = it->first;
    967     base::string16 country_name = l10n_util::GetDisplayNameForCountry(
    968         country_code, locale);
    969     std::string sort_key = GetSortKey(*collator,
    970                                       country_name,
    971                                       &buffer,
    972                                       &buffer_size);
    973 
    974     localized_names.insert(std::make_pair(sort_key, country_code));
    975   }
    976 
    977   locales_to_localized_names_.insert(std::make_pair(locale, localized_names));
    978 }
    979 
    980 const std::string CountryNames::GetCountryCodeForLocalizedName(
    981     const base::string16& country_name,
    982     const std::string& locale) {
    983   AddLocalizedNamesForLocale(locale);
    984 
    985   icu::Collator* collator = GetCollatorForLocale(locale);
    986 
    987   // As recommended[1] by ICU, initialize the buffer size to four times the
    988   // source string length.
    989   // [1] http://userguide.icu-project.org/collation/api#TOC-Examples
    990   int32_t buffer_size = country_name.size() * 4;
    991   scoped_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]);
    992   std::string sort_key = GetSortKey(*collator,
    993                                     country_name,
    994                                     &buffer,
    995                                     &buffer_size);
    996 
    997   const std::map<std::string, std::string>& localized_names =
    998       locales_to_localized_names_[locale];
    999   std::map<std::string, std::string>::const_iterator result =
   1000       localized_names.find(sort_key);
   1001 
   1002   if (result != localized_names.end())
   1003     return result->second;
   1004 
   1005   return std::string();
   1006 }
   1007 
   1008 icu::Collator* CountryNames::GetCollatorForLocale(const std::string& locale) {
   1009   if (!collators_.count(locale)) {
   1010     icu::Locale icu_locale(locale.c_str());
   1011     UErrorCode ignored = U_ZERO_ERROR;
   1012     icu::Collator* collator(icu::Collator::createInstance(icu_locale, ignored));
   1013 
   1014     // Compare case-insensitively and ignoring punctuation.
   1015     ignored = U_ZERO_ERROR;
   1016     collator->setAttribute(UCOL_STRENGTH, UCOL_SECONDARY, ignored);
   1017     ignored = U_ZERO_ERROR;
   1018     collator->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, ignored);
   1019 
   1020     collators_.insert(std::make_pair(locale, collator));
   1021   }
   1022 
   1023   return collators_[locale];
   1024 }
   1025 
   1026 const std::string CountryNames::GetSortKey(const icu::Collator& collator,
   1027                                            const base::string16& str,
   1028                                            scoped_ptr<uint8_t[]>* buffer,
   1029                                            int32_t* buffer_size) const {
   1030   DCHECK(buffer);
   1031   DCHECK(buffer_size);
   1032 
   1033   icu::UnicodeString icu_str(str.c_str(), str.length());
   1034   int32_t expected_size = collator.getSortKey(icu_str, buffer->get(),
   1035                                               *buffer_size);
   1036   if (expected_size > *buffer_size) {
   1037     // If there wasn't enough space, grow the buffer and try again.
   1038     *buffer_size = expected_size;
   1039     buffer->reset(new uint8_t[*buffer_size]);
   1040     DCHECK(buffer->get());
   1041 
   1042     expected_size = collator.getSortKey(icu_str, buffer->get(), *buffer_size);
   1043     DCHECK_EQ(*buffer_size, expected_size);
   1044   }
   1045 
   1046   return std::string(reinterpret_cast<const char*>(buffer->get()));
   1047 }
   1048 
   1049 }  // namespace
   1050 
   1051 AutofillCountry::AutofillCountry(const std::string& country_code,
   1052                                  const std::string& locale) {
   1053   const CountryDataMap::Iterator result = CountryDataMap::Find(country_code);
   1054   DCHECK(result != CountryDataMap::End());
   1055   const CountryData& data = result->second;
   1056 
   1057   country_code_ = country_code;
   1058   name_ = l10n_util::GetDisplayNameForCountry(country_code, locale);
   1059   postal_code_label_ = l10n_util::GetStringUTF16(data.postal_code_label_id);
   1060   state_label_ = l10n_util::GetStringUTF16(data.state_label_id);
   1061   address_required_fields_ = data.address_required_fields;
   1062 }
   1063 
   1064 AutofillCountry::~AutofillCountry() {
   1065 }
   1066 
   1067 // static
   1068 void AutofillCountry::GetAvailableCountries(
   1069     std::vector<std::string>* country_codes) {
   1070   DCHECK(country_codes);
   1071 
   1072   for (CountryDataMap::Iterator it = CountryDataMap::Begin();
   1073        it != CountryDataMap::End();
   1074        ++it) {
   1075     country_codes->push_back(it->first);
   1076   }
   1077 }
   1078 
   1079 // static
   1080 const std::string AutofillCountry::CountryCodeForLocale(
   1081     const std::string& locale) {
   1082   // Add likely subtags to the locale. In particular, add any likely country
   1083   // subtags -- e.g. for locales like "ru" that only include the language.
   1084   std::string likely_locale;
   1085   UErrorCode error_ignored = U_ZERO_ERROR;
   1086   uloc_addLikelySubtags(locale.c_str(),
   1087                         WriteInto(&likely_locale, kLocaleCapacity),
   1088                         kLocaleCapacity,
   1089                         &error_ignored);
   1090 
   1091   // Extract the country code.
   1092   std::string country_code = icu::Locale(likely_locale.c_str()).getCountry();
   1093 
   1094   // Default to the United States if we have no better guess.
   1095   if (CountryDataMap::Find(country_code) == CountryDataMap::End())
   1096     return "US";
   1097 
   1098   return country_code;
   1099 }
   1100 
   1101 // static
   1102 const std::string AutofillCountry::GetCountryCode(const base::string16& country,
   1103                                                   const std::string& locale) {
   1104   return CountryNames::GetInstance()->GetCountryCode(country, locale);
   1105 }
   1106 
   1107 AutofillCountry::AutofillCountry(const std::string& country_code,
   1108                                  const base::string16& name,
   1109                                  const base::string16& postal_code_label,
   1110                                  const base::string16& state_label)
   1111     : country_code_(country_code),
   1112       name_(name),
   1113       postal_code_label_(postal_code_label),
   1114       state_label_(state_label) {
   1115 }
   1116 
   1117 }  // namespace autofill
   1118