Commit 8622737d authored by Guillaume Jenkins's avatar Guillaume Jenkins Committed by Commit Bot

[Autofill] Add Price field as heuristic type.

This adds a new unfillable field type, PRICE, to the heuristics. The
idea is that by adding more specific field types instead of using
UNKNOWN, it will help reduce cases where fields are detected as the
wrong type.

For example, go to https://cydemind.bandcamp.com/album/erosion and
click "Buy Digital Album". In the popup, there is a "Name your price"
input, which gets incorrectly detected as NAME_FIRST.

Bug: crbug.com/807748
Change-Id: I8ee3ddbf7bc6928817c7c886e8431a338db1b5b6
Reviewed-on: https://chromium-review.googlesource.com/c/1495200
Commit-Queue: Guillaume Jenkins <gujen@google.com>
Reviewed-by: default avatarSebastien Seguin-Gagnon <sebsg@chromium.org>
Reviewed-by: default avatarParastoo Geranmayeh <parastoog@google.com>
Cr-Commit-Position: refs/heads/master@{#636958}
parent 30bac9e8
...@@ -175,6 +175,8 @@ jumbo_static_library("browser") { ...@@ -175,6 +175,8 @@ jumbo_static_library("browser") {
"phone_number_i18n.h", "phone_number_i18n.h",
"popup_item_ids.h", "popup_item_ids.h",
"popup_types.h", "popup_types.h",
"price_field.cc",
"price_field.h",
"randomized_encoder.cc", "randomized_encoder.cc",
"randomized_encoder.h", "randomized_encoder.h",
"rationalization_util.cc", "rationalization_util.cc",
...@@ -560,6 +562,7 @@ source_set("unit_tests") { ...@@ -560,6 +562,7 @@ source_set("unit_tests") {
"phone_field_unittest.cc", "phone_field_unittest.cc",
"phone_number_i18n_unittest.cc", "phone_number_i18n_unittest.cc",
"phone_number_unittest.cc", "phone_number_unittest.cc",
"price_field_unittest.cc",
"proto/legacy_proto_bridge_unittest.cc", "proto/legacy_proto_bridge_unittest.cc",
"randomized_encoder_unittest.cc", "randomized_encoder_unittest.cc",
"rationalization_util_unittest.cc", "rationalization_util_unittest.cc",
......
...@@ -116,6 +116,7 @@ FieldTypeGroup GroupTypeOfServerFieldType(ServerFieldType field_type) { ...@@ -116,6 +116,7 @@ FieldTypeGroup GroupTypeOfServerFieldType(ServerFieldType field_type) {
case USERNAME: case USERNAME:
return USERNAME_FIELD; return USERNAME_FIELD;
case PRICE:
case SEARCH_TERM: case SEARCH_TERM:
return UNFILLABLE; return UNFILLABLE;
...@@ -774,6 +775,8 @@ std::string AutofillType::ServerFieldTypeToString(ServerFieldType type) { ...@@ -774,6 +775,8 @@ std::string AutofillType::ServerFieldTypeToString(ServerFieldType type) {
return "CONFIRMATION_PASSWORD"; return "CONFIRMATION_PASSWORD";
case SEARCH_TERM: case SEARCH_TERM:
return "SEARCH_TERM"; return "SEARCH_TERM";
case PRICE:
return "PRICE";
case AMBIGUOUS_TYPE: case AMBIGUOUS_TYPE:
return "AMBIGUOUS_TYPE"; return "AMBIGUOUS_TYPE";
......
...@@ -169,9 +169,12 @@ enum ServerFieldType { ...@@ -169,9 +169,12 @@ enum ServerFieldType {
// Search term fields are detected, but not filled. // Search term fields are detected, but not filled.
SEARCH_TERM = 97, SEARCH_TERM = 97,
// Price fields are detected, but not filled.
PRICE = 98,
// No new types can be added without a corresponding change to the Autofill // No new types can be added without a corresponding change to the Autofill
// server. // server.
MAX_VALID_FIELD_TYPE = 98, MAX_VALID_FIELD_TYPE = 99,
}; };
// The list of all HTML autocomplete field type hints supported by Chrome. // The list of all HTML autocomplete field type hints supported by Chrome.
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include "components/autofill/core/browser/form_structure.h" #include "components/autofill/core/browser/form_structure.h"
#include "components/autofill/core/browser/name_field.h" #include "components/autofill/core/browser/name_field.h"
#include "components/autofill/core/browser/phone_field.h" #include "components/autofill/core/browser/phone_field.h"
#include "components/autofill/core/browser/price_field.h"
#include "components/autofill/core/browser/search_field.h" #include "components/autofill/core/browser/search_field.h"
#include "components/autofill/core/browser/travel_field.h" #include "components/autofill/core/browser/travel_field.h"
#include "components/autofill/core/common/autofill_constants.h" #include "components/autofill/core/common/autofill_constants.h"
...@@ -39,6 +40,7 @@ const float FormField::kBasePhoneParserScore = 1.3f; ...@@ -39,6 +40,7 @@ const float FormField::kBasePhoneParserScore = 1.3f;
const float FormField::kBaseTravelParserScore = 1.2f; const float FormField::kBaseTravelParserScore = 1.2f;
const float FormField::kBaseAddressParserScore = 1.1f; const float FormField::kBaseAddressParserScore = 1.1f;
const float FormField::kBaseCreditCardParserScore = 1.0f; const float FormField::kBaseCreditCardParserScore = 1.0f;
const float FormField::kBasePriceParserScore = 0.95f;
const float FormField::kBaseNameParserScore = 0.9f; const float FormField::kBaseNameParserScore = 0.9f;
const float FormField::kBaseSearchParserScore = 0.8f; const float FormField::kBaseSearchParserScore = 0.8f;
...@@ -82,6 +84,9 @@ FieldCandidatesMap FormField::ParseFormFields( ...@@ -82,6 +84,9 @@ FieldCandidatesMap FormField::ParseFormFields(
ParseFormFieldsPass(CreditCardField::Parse, processed_fields, ParseFormFieldsPass(CreditCardField::Parse, processed_fields,
&field_candidates); &field_candidates);
// Price pass.
ParseFormFieldsPass(PriceField::Parse, processed_fields, &field_candidates);
// Name pass. // Name pass.
ParseFormFieldsPass(NameField::Parse, processed_fields, &field_candidates); ParseFormFieldsPass(NameField::Parse, processed_fields, &field_candidates);
......
...@@ -63,6 +63,7 @@ class FormField { ...@@ -63,6 +63,7 @@ class FormField {
static const float kBaseTravelParserScore; static const float kBaseTravelParserScore;
static const float kBaseAddressParserScore; static const float kBaseAddressParserScore;
static const float kBaseCreditCardParserScore; static const float kBaseCreditCardParserScore;
static const float kBasePriceParserScore;
static const float kBaseNameParserScore; static const float kBaseNameParserScore;
static const float kBaseSearchParserScore; static const float kBaseSearchParserScore;
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/autofill/core/browser/price_field.h"
#include "base/strings/utf_string_conversions.h"
#include "components/autofill/core/browser/autofill_field.h"
#include "components/autofill/core/browser/autofill_scanner.h"
#include "components/autofill/core/common/autofill_regex_constants.h"
namespace autofill {
// static
std::unique_ptr<FormField> PriceField::Parse(AutofillScanner* scanner) {
AutofillField* field;
if (ParseFieldSpecifics(
scanner, base::UTF8ToUTF16(kPriceRe),
MATCH_DEFAULT | MATCH_NUMBER | MATCH_SELECT | MATCH_TEXT_AREA,
&field)) {
return std::make_unique<PriceField>(field);
}
return nullptr;
}
PriceField::PriceField(const AutofillField* field) : field_(field) {}
void PriceField::AddClassifications(
FieldCandidatesMap* field_candidates) const {
AddClassification(field_, PRICE, kBasePriceParserScore, field_candidates);
}
} // namespace autofill
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PRICE_FIELD_H_
#define COMPONENTS_AUTOFILL_CORE_BROWSER_PRICE_FIELD_H_
#include <memory>
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "components/autofill/core/browser/form_field.h"
namespace autofill {
class AutofillField;
class AutofillScanner;
// Price fields are not filled by autofill, but identifying them will help to
// reduce the number of false positives.
class PriceField : public FormField {
public:
static std::unique_ptr<FormField> Parse(AutofillScanner* scanner);
PriceField(const AutofillField* field);
protected:
void AddClassifications(FieldCandidatesMap* field_candidates) const override;
private:
FRIEND_TEST_ALL_PREFIXES(PriceFieldTest, ParsePrice);
FRIEND_TEST_ALL_PREFIXES(PriceFieldTest, ParseNonPrice);
const AutofillField* field_;
DISALLOW_COPY_AND_ASSIGN(PriceField);
};
} // namespace autofill
#endif // COMPONENTS_AUTOFILL_CORE_BROWSER_PRICE_FIELD_H_
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/autofill/core/browser/price_field.h"
#include <memory>
#include <vector>
#include "base/macros.h"
#include "base/memory/ptr_util.h"
#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "components/autofill/core/browser/autofill_field.h"
#include "components/autofill/core/browser/autofill_scanner.h"
#include "components/autofill/core/common/form_field_data.h"
#include "testing/gtest/include/gtest/gtest.h"
using base::ASCIIToUTF16;
namespace autofill {
class PriceFieldTest : public testing::Test {
public:
PriceFieldTest() {}
protected:
std::vector<std::unique_ptr<AutofillField>> list_;
std::unique_ptr<PriceField> field_;
FieldCandidatesMap field_candidates_map_;
// Downcast for tests.
static std::unique_ptr<PriceField> Parse(AutofillScanner* scanner) {
std::unique_ptr<FormField> field = PriceField::Parse(scanner);
return std::unique_ptr<PriceField>(
static_cast<PriceField*>(field.release()));
}
private:
DISALLOW_COPY_AND_ASSIGN(PriceFieldTest);
};
TEST_F(PriceFieldTest, ParsePrice) {
FormFieldData price_field;
price_field.form_control_type = "text";
price_field.label = ASCIIToUTF16("name your price");
price_field.name = ASCIIToUTF16("userPrice");
list_.push_back(
std::make_unique<AutofillField>(price_field, ASCIIToUTF16("price1")));
AutofillScanner scanner(list_);
field_ = Parse(&scanner);
ASSERT_NE(nullptr, field_.get());
field_->AddClassifications(&field_candidates_map_);
ASSERT_TRUE(field_candidates_map_.find(ASCIIToUTF16("price1")) !=
field_candidates_map_.end());
EXPECT_EQ(PRICE,
field_candidates_map_[ASCIIToUTF16("price1")].BestHeuristicType());
}
TEST_F(PriceFieldTest, ParseNonPrice) {
FormFieldData address_field;
address_field.form_control_type = "text";
address_field.label = ASCIIToUTF16("Name");
address_field.name = ASCIIToUTF16("firstName");
list_.push_back(
std::make_unique<AutofillField>(address_field, ASCIIToUTF16("name1")));
AutofillScanner scanner(list_);
field_ = Parse(&scanner);
ASSERT_EQ(nullptr, field_.get());
}
} // namespace autofill
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include "components/autofill/core/browser/search_field.h" #include "components/autofill/core/browser/search_field.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "components/autofill/core/browser/autofill_field.h"
#include "components/autofill/core/browser/autofill_scanner.h" #include "components/autofill/core/browser/autofill_scanner.h"
#include "components/autofill/core/common/autofill_regex_constants.h" #include "components/autofill/core/common/autofill_regex_constants.h"
...@@ -14,7 +15,8 @@ namespace autofill { ...@@ -14,7 +15,8 @@ namespace autofill {
std::unique_ptr<FormField> SearchField::Parse(AutofillScanner* scanner) { std::unique_ptr<FormField> SearchField::Parse(AutofillScanner* scanner) {
AutofillField* field; AutofillField* field;
if (ParseFieldSpecifics(scanner, base::UTF8ToUTF16(kSearchTermRe), if (ParseFieldSpecifics(scanner, base::UTF8ToUTF16(kSearchTermRe),
MATCH_DEFAULT | MATCH_SEARCH, &field)) { MATCH_DEFAULT | MATCH_SEARCH | MATCH_TEXT_AREA,
&field)) {
return std::make_unique<SearchField>(field); return std::make_unique<SearchField>(field);
} }
......
...@@ -13,6 +13,9 @@ ...@@ -13,6 +13,9 @@
namespace autofill { namespace autofill {
class AutofillField;
class AutofillScanner;
// Search fields are not filled by autofill, but identifying them will help // Search fields are not filled by autofill, but identifying them will help
// to reduce the number of false positives. // to reduce the number of false positives.
class SearchField : public FormField { class SearchField : public FormField {
......
...@@ -143,6 +143,15 @@ const char kSearchTermRe[] = ...@@ -143,6 +143,15 @@ const char kSearchTermRe[] =
"|جستجو" // fa "|جستجو" // fa
"|искать|найти|поиск"; // ru "|искать|найти|поиск"; // ru
/////////////////////////////////////////////////////////////////////////////
// field_price.cc
/////////////////////////////////////////////////////////////////////////////
const char kPriceRe[] =
"\\bprice\\b|\\brate\\b|\\bcost\\b"
"قیمة‎|سعر‎" // ar
"قیمت" // fa
"|\\bprix\\b|\\bcoût\\b|\\bcout\\b|\\btarif\\b"; // fr-CA
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// credit_card_field.cc // credit_card_field.cc
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
......
...@@ -60,6 +60,7 @@ extern const char kPassportRe[]; ...@@ -60,6 +60,7 @@ extern const char kPassportRe[];
extern const char kTravelOriginRe[]; extern const char kTravelOriginRe[];
extern const char kTravelDestinationRe[]; extern const char kTravelDestinationRe[];
extern const char kFlightRe[]; extern const char kFlightRe[];
extern const char kPriceRe[];
// Used to match field data that might be a UPI Virtual Payment Address. // Used to match field data that might be a UPI Virtual Payment Address.
// See: // See:
......
<html>
<!-- Form found at https://alvvays.bandcamp.com/album/antisocialites and then click "Buy Digital Album" for the pop-up to appear -->
<body lang="en">
<div tabindex="-1"
role="dialog" aria-labelledby="ui-id-3"
style="outline: 0px; z-index: 1002; height: auto; width: 35.5em; top: 10px; left: 10px; display: block;">
<div ><span id="ui-id-3"
>Digital Album</span><a href="#"
role="button"><span >close</span></a></div>
<div scrolltop="0" scrollleft="0"
style="width: auto; min-height: 104px; height: auto;">
<div>
<div id="download-panel-vm" >
<form id="fan_email" accept-charset="utf-8">
<input type="hidden" id="encoding_name" name="encoding_name" value="none">
<div data-bind="with: panes.pricing">
<div >
<div >
<label id="nyp-header" for="userPrice">
Name your price: </label>
<span >
<span >$</span>
<input id="userPrice" size="6" value="" autocomplete="off" type="text">
<span >
<span >
<span >USD</span>
(<span >$8</span> or more)
</span>
<a id="currencyToggle" href="#">convert</a>
</span>
</span>
</div>
</div>
</div>
<div >
<div >
Includes unlimited streaming via the free Bandcamp app, plus high-quality download in MP3, FLAC and <a
href="/faq_downloading#format" target="_blank">more</a>.
</div>
<div >
Have a gift card?
<a href="https://bandcamp.com/redeem?resume_id=a1204311381&amp;resume_action=buy">Redeem it here</a>
<a href="https://bandcamp.com/redeem?resume_id=a1204311381&amp;resume_action=buy">
<svg width="9px" height="10px" viewBox="0 0 9 10">
<use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#gift-card-icon"></use>
</svg>
</a>
</div>
<div >
<div id="purchase-note-link">
<a href="#">Include a message</a> to <nobr>Alvvays.</nobr>
</div>
<div id="purchase-note-entry">
<textarea id="purchase-note-input" rows="5"></textarea>
<div id="purchase-note-footer"><a href="#">cancel</a><span
id="purchase-note-countdown">
<span id="purchase-note-count" >300</span> characters remaining</span></div>
</div>
</div>
<div >
<div id="notify-me-section" >
<label for="notify-me">
<input id="notify-me" name="notify-me" type="checkbox" data-bind="checked: false">
<div >Add me to the mailing list for Alvvays.</div>
</label>
</div>
<div id="notify-me-label-section" >
<label for="notify-me-label">
<input id="notify-me-label" name="notify-me-label" type="checkbox" data-bind="checked: false">
<div >
Add me to the mailing list for Polyvinyl Records.
</div>
</label>
</div>
</div>
<div id="email-section" >
<input type="hidden" name="item_id" value="1204311381">
<input type="hidden" name="item_type" value="album">
<div >
<div>Email a link to my free download to:</div>
<input type="email" name="address" id="fan_email_address"
onkeydown="return ChargeEmail.filter_returnkey()" title="email address">
<div >Your email address won’t be shared with <nobr>third parties.</nobr>
</div>
</div>
<div >
<select name="country" id="fan_email_country" data-bind="options: countryList,
optionsText: 'name',
optionsValue: 'code',
optionsAfterRender: setOptionDisable" onchange="ChargeEmail.update_dialog()">
<option value="US" style="color: inherit;">United States</option>
<option value="CA" style="color: inherit;">Canada</option>
<option value="GB" style="color: inherit;">United Kingdom</option>
<option value="AU" style="color: inherit;">Australia</option>
<option value="FR" style="color: inherit;">France</option>
<option value="DE" style="color: inherit;">Germany</option>
<option value="JP" style="color: inherit;">Japan</option>
<option value="--" disabled="" style="color: rgb(187, 187, 187);">---</option>
<option value="AF" style="color: inherit;">Afghanistan</option>
<option value="AX" style="color: inherit;">Aland</option>
<option value="AL" style="color: inherit;">Albania</option>
<option value="DZ" style="color: inherit;">Algeria</option>
<option value="AS" style="color: inherit;">American Samoa</option>
<option value="AD" style="color: inherit;">Andorra</option>
<option value="AO" style="color: inherit;">Angola</option>
<option value="AI" style="color: inherit;">Anguilla</option>
<option value="AQ" style="color: inherit;">Antarctica</option>
<option value="AG" style="color: inherit;">Antigua and Barbuda</option>
<option value="AR" style="color: inherit;">Argentina</option>
<option value="AM" style="color: inherit;">Armenia</option>
<option value="AW" style="color: inherit;">Aruba</option>
<option value="AC" style="color: inherit;">Ascension</option>
<option value="AU" style="color: inherit;">Australia</option>
<option value="AT" style="color: inherit;">Austria</option>
<option value="AZ" style="color: inherit;">Azerbaijan</option>
<option value="BS" style="color: inherit;">Bahamas</option>
<option value="BH" style="color: inherit;">Bahrain</option>
<option value="BD" style="color: inherit;">Bangladesh</option>
<option value="BB" style="color: inherit;">Barbados</option>
<option value="BY" style="color: inherit;">Belarus</option>
<option value="BE" style="color: inherit;">Belgium</option>
<option value="BZ" style="color: inherit;">Belize</option>
<option value="BJ" style="color: inherit;">Benin</option>
<option value="BM" style="color: inherit;">Bermuda</option>
<option value="BT" style="color: inherit;">Bhutan</option>
<option value="BO" style="color: inherit;">Bolivia</option>
<option value="BA" style="color: inherit;">Bosnia and Herzegovina</option>
<option value="BW" style="color: inherit;">Botswana</option>
<option value="BV" style="color: inherit;">Bouvet Island</option>
<option value="BR" style="color: inherit;">Brazil</option>
<option value="IO" style="color: inherit;">British Indian Ocean Territory</option>
<option value="BN" style="color: inherit;">Brunei</option>
<option value="BG" style="color: inherit;">Bulgaria</option>
<option value="BF" style="color: inherit;">Burkina Faso</option>
<option value="BI" style="color: inherit;">Burundi</option>
<option value="KH" style="color: inherit;">Cambodia</option>
<option value="CM" style="color: inherit;">Cameroon</option>
<option value="CA" style="color: inherit;">Canada</option>
<option value="CV" style="color: inherit;">Cape Verde</option>
<option value="BQ" style="color: inherit;">Caribbean Netherlands</option>
<option value="KY" style="color: inherit;">Cayman Islands</option>
<option value="CF" style="color: inherit;">Central African Republic</option>
<option value="TD" style="color: inherit;">Chad</option>
<option value="CL" style="color: inherit;">Chile</option>
<option value="CN" style="color: inherit;">China</option>
<option value="CX" style="color: inherit;">Christmas Island</option>
<option value="CC" style="color: inherit;">Cocos (Keeling) Islands</option>
<option value="CO" style="color: inherit;">Colombia</option>
<option value="KM" style="color: inherit;">Comoros</option>
<option value="CG" style="color: inherit;">Congo (Brazzaville)</option>
<option value="CD" style="color: inherit;">Congo (Kinshasa)</option>
<option value="CK" style="color: inherit;">Cook Islands</option>
<option value="CR" style="color: inherit;">Costa Rica</option>
<option value="CI" style="color: inherit;">Cote d'Ivoire (Ivory Coast)</option>
<option value="HR" style="color: inherit;">Croatia</option>
<option value="CU" style="color: inherit;">Cuba</option>
<option value="CW" style="color: inherit;">Curaçao</option>
<option value="CY" style="color: inherit;">Cyprus</option>
<option value="CZ" style="color: inherit;">Czech Republic</option>
<option value="DK" style="color: inherit;">Denmark</option>
<option value="DJ" style="color: inherit;">Djibouti</option>
<option value="DM" style="color: inherit;">Dominica</option>
<option value="DO" style="color: inherit;">Dominican Republic</option>
<option value="EC" style="color: inherit;">Ecuador</option>
<option value="EG" style="color: inherit;">Egypt</option>
<option value="SV" style="color: inherit;">El Salvador</option>
<option value="GQ" style="color: inherit;">Equatorial Guinea</option>
<option value="ER" style="color: inherit;">Eritrea</option>
<option value="EE" style="color: inherit;">Estonia</option>
<option value="ET" style="color: inherit;">Ethiopia</option>
<option value="FK" style="color: inherit;">Falkland Islands (Islas Malvinas)</option>
<option value="FO" style="color: inherit;">Faroe Islands</option>
<option value="FJ" style="color: inherit;">Fiji</option>
<option value="FI" style="color: inherit;">Finland</option>
<option value="FR" style="color: inherit;">France</option>
<option value="GF" style="color: inherit;">French Guiana</option>
<option value="PF" style="color: inherit;">French Polynesia</option>
<option value="TF" style="color: inherit;">French Southern Territories</option>
<option value="GA" style="color: inherit;">Gabon</option>
<option value="GM" style="color: inherit;">Gambia</option>
<option value="GE" style="color: inherit;">Georgia</option>
<option value="DE" style="color: inherit;">Germany</option>
<option value="GH" style="color: inherit;">Ghana</option>
<option value="GI" style="color: inherit;">Gibraltar</option>
<option value="GR" style="color: inherit;">Greece</option>
<option value="GL" style="color: inherit;">Greenland</option>
<option value="GD" style="color: inherit;">Grenada</option>
<option value="GP" style="color: inherit;">Guadeloupe</option>
<option value="GU" style="color: inherit;">Guam</option>
<option value="GT" style="color: inherit;">Guatemala</option>
<option value="GG" style="color: inherit;">Guernsey</option>
<option value="GN" style="color: inherit;">Guinea</option>
<option value="GW" style="color: inherit;">Guinea-Bissau</option>
<option value="GY" style="color: inherit;">Guyana</option>
<option value="HT" style="color: inherit;">Haiti</option>
<option value="HM" style="color: inherit;">Heard Island and McDonald Islands</option>
<option value="HN" style="color: inherit;">Honduras</option>
<option value="HK" style="color: inherit;">Hong Kong</option>
<option value="HU" style="color: inherit;">Hungary</option>
<option value="HY" style="color: inherit;">Hyrule</option>
<option value="IS" style="color: inherit;">Iceland</option>
<option value="IN" style="color: inherit;">India</option>
<option value="ID" style="color: inherit;">Indonesia</option>
<option value="IR" style="color: inherit;">Iran</option>
<option value="IQ" style="color: inherit;">Iraq</option>
<option value="IE" style="color: inherit;">Ireland</option>
<option value="IM" style="color: inherit;">Isle of Man</option>
<option value="IL" style="color: inherit;">Israel</option>
<option value="IT" style="color: inherit;">Italy</option>
<option value="JM" style="color: inherit;">Jamaica</option>
<option value="JP" style="color: inherit;">Japan</option>
<option value="JE" style="color: inherit;">Jersey</option>
<option value="JO" style="color: inherit;">Jordan</option>
<option value="KZ" style="color: inherit;">Kazakhstan</option>
<option value="KE" style="color: inherit;">Kenya</option>
<option value="KI" style="color: inherit;">Kiribati</option>
<option value="XK" style="color: inherit;">Kosovo</option>
<option value="KW" style="color: inherit;">Kuwait</option>
<option value="KG" style="color: inherit;">Kyrgyzstan</option>
<option value="LA" style="color: inherit;">Laos</option>
<option value="LV" style="color: inherit;">Latvia</option>
<option value="LB" style="color: inherit;">Lebanon</option>
<option value="LS" style="color: inherit;">Lesotho</option>
<option value="LR" style="color: inherit;">Liberia</option>
<option value="LY" style="color: inherit;">Libya</option>
<option value="LI" style="color: inherit;">Liechtenstein</option>
<option value="LT" style="color: inherit;">Lithuania</option>
<option value="LU" style="color: inherit;">Luxembourg</option>
<option value="MO" style="color: inherit;">Macau</option>
<option value="MK" style="color: inherit;">Macedonia</option>
<option value="MG" style="color: inherit;">Madagascar</option>
<option value="MW" style="color: inherit;">Malawi</option>
<option value="MY" style="color: inherit;">Malaysia</option>
<option value="MV" style="color: inherit;">Maldives</option>
<option value="ML" style="color: inherit;">Mali</option>
<option value="MT" style="color: inherit;">Malta</option>
<option value="MH" style="color: inherit;">Marshall Islands</option>
<option value="MQ" style="color: inherit;">Martinique</option>
<option value="MR" style="color: inherit;">Mauritania</option>
<option value="MU" style="color: inherit;">Mauritius</option>
<option value="YT" style="color: inherit;">Mayotte</option>
<option value="MX" style="color: inherit;">Mexico</option>
<option value="FM" style="color: inherit;">Micronesia</option>
<option value="UM" style="color: inherit;">Midway Islands</option>
<option value="MD" style="color: inherit;">Moldova</option>
<option value="MC" style="color: inherit;">Monaco</option>
<option value="MN" style="color: inherit;">Mongolia</option>
<option value="ME" style="color: inherit;">Montenegro</option>
<option value="MS" style="color: inherit;">Montserrat</option>
<option value="MA" style="color: inherit;">Morocco</option>
<option value="MZ" style="color: inherit;">Mozambique</option>
<option value="MM" style="color: inherit;">Myanmar</option>
<option value="NA" style="color: inherit;">Namibia</option>
<option value="NR" style="color: inherit;">Nauru</option>
<option value="NP" style="color: inherit;">Nepal</option>
<option value="NL" style="color: inherit;">Netherlands</option>
<option value="AN" style="color: inherit;">Netherlands Antilles</option>
<option value="NC" style="color: inherit;">New Caledonia</option>
<option value="NZ" style="color: inherit;">New Zealand</option>
<option value="NI" style="color: inherit;">Nicaragua</option>
<option value="NE" style="color: inherit;">Niger</option>
<option value="NG" style="color: inherit;">Nigeria</option>
<option value="NU" style="color: inherit;">Niue</option>
<option value="NF" style="color: inherit;">Norfolk Island</option>
<option value="KP" style="color: inherit;">North Korea</option>
<option value="MP" style="color: inherit;">Northern Mariana Islands</option>
<option value="NO" style="color: inherit;">Norway</option>
<option value="OM" style="color: inherit;">Oman</option>
<option value="PK" style="color: inherit;">Pakistan</option>
<option value="PW" style="color: inherit;">Palau</option>
<option value="PS" style="color: inherit;">Palestine</option>
<option value="PA" style="color: inherit;">Panama</option>
<option value="PG" style="color: inherit;">Papua New Guinea</option>
<option value="PY" style="color: inherit;">Paraguay</option>
<option value="PE" style="color: inherit;">Peru</option>
<option value="PH" style="color: inherit;">Philippines</option>
<option value="PN" style="color: inherit;">Pitcairn Islands</option>
<option value="PL" style="color: inherit;">Poland</option>
<option value="PT" style="color: inherit;">Portugal</option>
<option value="PR" style="color: inherit;">Puerto Rico</option>
<option value="QA" style="color: inherit;">Qatar</option>
<option value="RE" style="color: inherit;">Reunion</option>
<option value="RO" style="color: inherit;">Romania</option>
<option value="RU" style="color: inherit;">Russia</option>
<option value="RW" style="color: inherit;">Rwanda</option>
<option value="BL" style="color: inherit;">Saint Barthélemy</option>
<option value="SH" style="color: inherit;">Saint Helena</option>
<option value="KN" style="color: inherit;">Saint Kitts and Nevis</option>
<option value="LC" style="color: inherit;">Saint Lucia</option>
<option value="MF" style="color: inherit;">Saint Martin</option>
<option value="PM" style="color: inherit;">Saint Pierre and Miquelon</option>
<option value="VC" style="color: inherit;">Saint Vincent and the Grenadines</option>
<option value="WS" style="color: inherit;">Samoa</option>
<option value="SM" style="color: inherit;">San Marino</option>
<option value="ST" style="color: inherit;">Sao Tome and Principe</option>
<option value="SA" style="color: inherit;">Saudi Arabia</option>
<option value="SN" style="color: inherit;">Senegal</option>
<option value="RS" style="color: inherit;">Serbia</option>
<option value="SC" style="color: inherit;">Seychelles</option>
<option value="SL" style="color: inherit;">Sierra Leone</option>
<option value="SG" style="color: inherit;">Singapore</option>
<option value="SX" style="color: inherit;">Sint Maarten</option>
<option value="SK" style="color: inherit;">Slovakia</option>
<option value="SI" style="color: inherit;">Slovenia</option>
<option value="SB" style="color: inherit;">Solomon Islands</option>
<option value="SO" style="color: inherit;">Somalia</option>
<option value="ZA" style="color: inherit;">South Africa</option>
<option value="GS" style="color: inherit;">South Georgia and the South Sandwich Islands</option>
<option value="KR" style="color: inherit;">South Korea</option>
<option value="SS" style="color: inherit;">South Sudan</option>
<option value="ES" style="color: inherit;">Spain</option>
<option value="LK" style="color: inherit;">Sri Lanka</option>
<option value="SD" style="color: inherit;">Sudan</option>
<option value="SR" style="color: inherit;">Suriname</option>
<option value="SJ" style="color: inherit;">Svalbard and Jan Mayen</option>
<option value="SZ" style="color: inherit;">Swaziland</option>
<option value="SE" style="color: inherit;">Sweden</option>
<option value="CH" style="color: inherit;">Switzerland</option>
<option value="SY" style="color: inherit;">Syria</option>
<option value="TW" style="color: inherit;">Taiwan</option>
<option value="TJ" style="color: inherit;">Tajikistan</option>
<option value="TZ" style="color: inherit;">Tanzania</option>
<option value="TH" style="color: inherit;">Thailand</option>
<option value="TL" style="color: inherit;">Timor-Leste</option>
<option value="TG" style="color: inherit;">Togo</option>
<option value="TK" style="color: inherit;">Tokelau</option>
<option value="TO" style="color: inherit;">Tonga</option>
<option value="TT" style="color: inherit;">Trinidad and Tobago</option>
<option value="TA" style="color: inherit;">Tristan da Cunha</option>
<option value="TN" style="color: inherit;">Tunisia</option>
<option value="TR" style="color: inherit;">Turkey</option>
<option value="TM" style="color: inherit;">Turkmenistan</option>
<option value="TC" style="color: inherit;">Turks and Caicos Islands</option>
<option value="TV" style="color: inherit;">Tuvalu</option>
<option value="UG" style="color: inherit;">Uganda</option>
<option value="UA" style="color: inherit;">Ukraine</option>
<option value="AE" style="color: inherit;">United Arab Emirates</option>
<option value="GB" style="color: inherit;">United Kingdom</option>
<option value="US" style="color: inherit;">United States</option>
<option value="UY" style="color: inherit;">Uruguay</option>
<option value="UZ" style="color: inherit;">Uzbekistan</option>
<option value="VU" style="color: inherit;">Vanuatu</option>
<option value="VA" style="color: inherit;">Vatican City</option>
<option value="VE" style="color: inherit;">Venezuela</option>
<option value="VN" style="color: inherit;">Viet Nam</option>
<option value="VG" style="color: inherit;">Virgin Islands, British</option>
<option value="VI" style="color: inherit;">Virgin Islands, U.S.</option>
<option value="WF" style="color: inherit;">Wallis and Futuna</option>
<option value="EH" style="color: inherit;">Western Sahara</option>
<option value="YE" style="color: inherit;">Yemen</option>
<option value="ZM" style="color: inherit;">Zambia</option>
<option value="ZW" style="color: inherit;">Zimbabwe</option>
</select>
<input type="text" name="postcode" id="fan_email_postalcode"
onkeydown="return ChargeEmail.filter_returnkey()" title="zip code" pattern=".*"
placeholder="zip code">
</div>
<div >
You’ll be added to the Alvvays mailing list, from which you can unsubscribe at any time.
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</body>
</html>
UNKNOWN_TYPE | ctl00$ContentPlaceHolder1$ddlCategory | My Query Relates to * | 0 | ctl00$ContentPlaceHolder1$ddlCategory_1-default UNKNOWN_TYPE | ctl00$ContentPlaceHolder1$ddlCategory | My Query Relates to * | 0 | ctl00$ContentPlaceHolder1$ddlCategory_1-default
UNKNOWN_TYPE | ctl00$ContentPlaceHolder1$txtQueryl | Mention Your Query * | | ctl00$ContentPlaceHolder1$ddlCategory_1-default SEARCH_TERM | ctl00$ContentPlaceHolder1$txtQueryl | Mention Your Query * | | ctl00$ContentPlaceHolder1$ddlCategory_1-default
NAME_FULL | ctl00$ContentPlaceHolder1$txtName | Name * | | ctl00$ContentPlaceHolder1$ddlCategory_1-default NAME_FULL | ctl00$ContentPlaceHolder1$txtName | Name * | | ctl00$ContentPlaceHolder1$ddlCategory_1-default
EMAIL_ADDRESS | ctl00$ContentPlaceHolder1$txtEmail | Email ID * | | ctl00$ContentPlaceHolder1$ddlCategory_1-default EMAIL_ADDRESS | ctl00$ContentPlaceHolder1$txtEmail | Email ID * | | ctl00$ContentPlaceHolder1$ddlCategory_1-default
PHONE_HOME_WHOLE_NUMBER | ctl00$ContentPlaceHolder1$txtContact | Contact Number * | | ctl00$ContentPlaceHolder1$ddlCategory_1-default PHONE_HOME_WHOLE_NUMBER | ctl00$ContentPlaceHolder1$txtContact | Contact Number * | | ctl00$ContentPlaceHolder1$ddlCategory_1-default
PRICE | userPrice | Name your price: | | userPrice_1-default
UNKNOWN_TYPE | purchase-note-input | Include a message to Alvvays. | | userPrice_1-default
UNKNOWN_TYPE | notify-me | Have a gift card? Redeem it here | on | userPrice_1-default
UNKNOWN_TYPE | notify-me-label | Have a gift card? Redeem it here | on | userPrice_1-default
EMAIL_ADDRESS | address | Email a link to my free download to: | | userPrice_1-default
ADDRESS_HOME_COUNTRY | country | Have a gift card? Redeem it here | US | userPrice_1-default
ADDRESS_HOME_ZIP | postcode | zip code | | userPrice_1-default
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment