autofill_dialog_controller_impl.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/autofill/autofill_dialog_controller_impl.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm>
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <map>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "apps/app_window.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "apps/app_window_registry.h"
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/base64.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind_helpers.h"
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/i18n/case_conversion.h"
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/i18n/rtl.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/prefs/pref_registry_simple.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h"
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/rand_util.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h"
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/autofill/personal_data_manager_factory.h"
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/autofill/validation_rules_storage_factory.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/browser_process.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/autofill/autofill_dialog_common.h"
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/autofill/autofill_dialog_i18n_input.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/autofill/autofill_dialog_view.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/autofill/data_model_wrapper.h"
35ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/autofill/generated_credit_card_bubble_controller.h"
36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/autofill/new_credit_card_bubble_controller.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/common/chrome_content_client.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_version_info.h"
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h"
44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/common/render_messages.h"
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/url_constants.h"
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/risk/fingerprint.h"
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/risk/proto/fingerprint.pb.h"
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/content/browser/wallet/form_field_error.h"
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/full_wallet.h"
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/autofill/content/browser/wallet/gaia_account.h"
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/instrument.h"
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/wallet_address.h"
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/wallet_items.h"
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/wallet_service_url.h"
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/wallet_signin_helper.h"
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/autofill/core/browser/address_i18n.h"
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_country.h"
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_data_model.h"
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_manager.h"
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_type.h"
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/personal_data_manager.h"
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/phone_number_i18n.h"
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/validation.h"
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/autofill/core/common/autofill_pref_names.h"
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_data.h"
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/metrics/metrics_service.h"
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h"
6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/geolocation_provider.h"
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_controller.h"
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_details.h"
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_entry.h"
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_service.h"
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_types.h"
75ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/browser/render_view_host.h"
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h"
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/url_constants.h"
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "extensions/browser/app_window/native_app_window.h"
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/chromium_strings.h"
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "grit/component_scaled_resources.h"
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "grit/components_strings.h"
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/generated_resources.h"
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "grit/platform_locale_settings.h"
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/theme_resources.h"
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/cert_status_flags.h"
866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "third_party/libaddressinput/chromium/chrome_metadata_source.h"
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "third_party/libaddressinput/chromium/chrome_storage_impl.h"
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/libaddressinput/messages.h"
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_data.h"
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_field.h"
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_problem.h"
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/libaddressinput/src/cpp/include/libaddressinput/localization.h"
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/base/base_window.h"
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/models/combobox_model.h"
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/canvas.h"
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/image/image_skia_operations.h"
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/skia_util.h"
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using ::i18n::addressinput::AddressData;
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using ::i18n::addressinput::AddressField;
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using ::i18n::addressinput::AddressProblem;
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing ::i18n::addressinput::ADMIN_AREA;
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing ::i18n::addressinput::DEPENDENT_LOCALITY;
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing ::i18n::addressinput::FieldProblemMap;
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing ::i18n::addressinput::Localization;
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing ::i18n::addressinput::MISSING_REQUIRED_FIELD;
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace autofill {
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kAddNewItemKey[] = "add-new-item";
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kManageItemsKey[] = "manage-items";
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kSameAsBillingKey[] = "same-as-billing";
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// URLs for Wallet error messages.
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kBuyerLegalAddressStatusUrl[] =
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "https://wallet.google.com/manage/settings";
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kKnowYourCustomerStatusUrl[] = "https://wallet.google.com/kyc";
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Keys for the kAutofillDialogAutofillDefault pref dictionary (do not change
12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// these values).
12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char kGuidPrefKey[] = "guid";
12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This string is stored along with saved addresses and credit cards in the
12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// WebDB, and hence should not be modified, so that it remains consistent over
12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// time.
13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char kAutofillDialogOrigin[] = "Chrome Autofill dialog";
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// HSL shift to gray out an image.
13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const color_utils::HSL kGrayImageShift = {-1, 0, 0.8};
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// Limit Wallet items refresh rate to at most once per minute.
13668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int64 kWalletItemsRefreshRateSeconds = 60;
13758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// The number of milliseconds to delay enabling the submit button after showing
13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// the dialog. This delay prevents users from accidentally clicking the submit
14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// button on startup.
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const int kSubmitButtonDelayMs = 1000;
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// A helper class to make sure an AutofillDialogView knows when a series of
1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// updates is incoming.
1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class ScopedViewUpdates {
1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  explicit ScopedViewUpdates(AutofillDialogView* view) : view_(view) {
1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (view_)
1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      view_->UpdatesStarted();
1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ~ScopedViewUpdates() {
1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (view_)
1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      view_->UpdatesFinished();
1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  AutofillDialogView* view_;
1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScopedViewUpdates);
1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 NullGetInfo(const AutofillType& type) {
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return base::string16();
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Extract |type| from |inputs| using |section| to determine whether the info
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// should be billing or shipping specific (for sections with address info).
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 GetInfoFromInputs(const FieldValueMap& inputs,
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 DialogSection section,
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 const AutofillType& type) {
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ServerFieldType field_type = type.GetStorableType();
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (section != SECTION_SHIPPING)
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    field_type = AutofillType::GetEquivalentBillingFieldType(field_type);
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 info;
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FieldValueMap::const_iterator it = inputs.find(field_type);
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (it != inputs.end())
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    info = it->second;
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!info.empty() && type.html_type() == HTML_TYPE_COUNTRY_CODE) {
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    info = base::ASCIIToUTF16(AutofillCountry::GetCountryCode(
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        info, g_browser_process->GetApplicationLocale()));
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return info;
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns true if |input| should be used to fill a site-requested |field| which
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is notated with a "shipping" tag, for use when the user has decided to use
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the billing address as the shipping address.
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ServerTypeMatchesShippingField(ServerFieldType type,
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    const AutofillField& field) {
194b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Equivalent billing field type is used to support UseBillingAsShipping
195b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // usecase.
196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return common::ServerTypeEncompassesFieldType(
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      type,
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AutofillType(AutofillType::GetEquivalentBillingFieldType(
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          field.Type().GetStorableType())));
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Initializes |form_group| from user-entered data.
203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void FillFormGroupFromOutputs(const FieldValueMap& detail_outputs,
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              FormGroup* form_group) {
205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (FieldValueMap::const_iterator iter = detail_outputs.begin();
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter != detail_outputs.end(); ++iter) {
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ServerFieldType type = iter->first;
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!iter->second.empty()) {
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      form_group->SetInfo(AutofillType(type),
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          iter->second,
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          g_browser_process->GetApplicationLocale());
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Get billing info from |output| and put it into |card|, |cvc|, and |profile|.
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These outparams are required because |card|/|profile| accept different types
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// of raw info, and CreditCard doesn't save CVCs.
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void GetBillingInfoFromOutputs(const FieldValueMap& output,
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               CreditCard* card,
221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               base::string16* cvc,
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               AutofillProfile* profile) {
223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (FieldValueMap::const_iterator it = output.begin();
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != output.end(); ++it) {
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const ServerFieldType type = it->first;
226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::string16 trimmed;
227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    base::TrimWhitespace(it->second, base::TRIM_ALL, &trimmed);
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Special case CVC as CreditCard just swallows it.
230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (type == CREDIT_CARD_VERIFICATION_CODE) {
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (cvc)
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        cvc->assign(trimmed);
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    } else if (common::IsCreditCardType(type)) {
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      card->SetRawInfo(type, trimmed);
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Copy the credit card name to |profile| in addition to |card| as
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // wallet::Instrument requires a recipient name for its billing address.
238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (card && type == NAME_FULL)
2397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        card->SetRawInfo(CREDIT_CARD_NAME, trimmed);
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      if (profile) {
242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        profile->SetInfo(AutofillType(AutofillType(type).GetStorableType()),
243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         trimmed,
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         g_browser_process->GetApplicationLocale());
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Returns the containing window for the given |web_contents|. The containing
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// window might be a browser window for a Chrome tab, or it might be an app
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// window for a platform app.
25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)ui::BaseWindow* GetBaseWindowForWebContents(
254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    content::WebContents* web_contents) {
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (browser)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return browser->window();
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  gfx::NativeWindow native_window = web_contents->GetTopLevelNativeWindow();
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  apps::AppWindow* app_window =
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      apps::AppWindowRegistry::GetAppWindowForNativeWindowAnyProfile(
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          native_window);
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return app_window->GetBaseWindow();
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Returns a string descriptor for a DialogSection, for use with prefs (do not
26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// change these values).
26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)std::string SectionToPrefString(DialogSection section) {
26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  switch (section) {
27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case SECTION_CC:
27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return "cc";
27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case SECTION_BILLING:
27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return "billing";
27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
27690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case SECTION_CC_BILLING:
27790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // The SECTION_CC_BILLING section isn't active when using Autofill.
27890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      NOTREACHED();
27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return std::string();
28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case SECTION_SHIPPING:
28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return "shipping";
28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NOTREACHED();
28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return std::string();
28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Check if a given MaskedInstrument is allowed for the purchase.
29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool IsInstrumentAllowed(
29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const wallet::WalletItems::MaskedInstrument& instrument) {
292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  switch (instrument.status()) {
293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case wallet::WalletItems::MaskedInstrument::VALID:
294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case wallet::WalletItems::MaskedInstrument::PENDING:
295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case wallet::WalletItems::MaskedInstrument::EXPIRED:
296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case wallet::WalletItems::MaskedInstrument::BILLING_INCOMPLETE:
297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return true;
298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    default:
299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return false;
300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Loops through |addresses_| comparing to |address| ignoring ID. If a match
30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// is not found, NULL is returned.
30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const wallet::Address* FindDuplicateAddress(
30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const std::vector<wallet::Address*>& addresses,
30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const wallet::Address& address) {
30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  for (size_t i = 0; i < addresses.size(); ++i) {
30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (addresses[i]->EqualsIgnoreID(address))
31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return addresses[i];
31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
31290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return NULL;
31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool IsCardHolderNameValidForWallet(const base::string16& name) {
316a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::string16 whitespace_collapsed_name =
317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::CollapseWhitespace(name, true);
31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::vector<base::string16> split_name;
31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::SplitString(whitespace_collapsed_name, ' ', &split_name);
32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return split_name.size() >= 2;
32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)DialogSection SectionFromLocation(wallet::FormFieldError::Location location) {
3247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  switch (location) {
3257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::FormFieldError::PAYMENT_INSTRUMENT:
3267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::FormFieldError::LEGAL_ADDRESS:
3277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return SECTION_CC_BILLING;
3287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::FormFieldError::SHIPPING_ADDRESS:
3307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return SECTION_SHIPPING;
3317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::FormFieldError::UNKNOWN_LOCATION:
3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      NOTREACHED();
3347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return SECTION_MAX;
3357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  NOTREACHED();
3387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return SECTION_MAX;
3397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
34158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)scoped_ptr<DialogNotification> GetWalletError(
34258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    wallet::WalletClient::ErrorType error_type) {
34358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::string16 text;
34458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GURL url;
34558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  switch (error_type) {
34758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case wallet::WalletClient::UNVERIFIED_KNOW_YOUR_CUSTOMER_STATUS:
34858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      text = l10n_util::GetStringUTF16(
34958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          IDS_AUTOFILL_WALLET_UNVERIFIED_KNOW_YOUR_CUSTOMER_STATUS);
35058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      url = GURL(kKnowYourCustomerStatusUrl);
35158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
3527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
353ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    case wallet::WalletClient::BUYER_LEGAL_ADDRESS_NOT_SUPPORTED:
35458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      text = l10n_util::GetStringUTF16(
355ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          IDS_AUTOFILL_WALLET_BUYER_COUNTRY_NOT_SUPPORTED);
35658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      url = GURL(kBuyerLegalAddressStatusUrl);
35758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
358ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
35958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    default:
36058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // The notification will not have a link; it's handled in the next
36158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // switch statement.
36258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
36358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
36458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
36558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!text.empty()) {
36658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<DialogNotification> notification(new DialogNotification(
36758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        DialogNotification::WALLET_ERROR,
36858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        text));
36958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    notification->set_link_url(url);
37058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return notification.Pass();
37158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
37258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int error_ids = 0;
3744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int error_code = 0;
3754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
37658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switch (error_type) {
377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    case wallet::WalletClient::UNSUPPORTED_MERCHANT:
3784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_ids = IDS_AUTOFILL_WALLET_UNSUPPORTED_MERCHANT;
37958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
380ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::WalletClient::BAD_REQUEST:
3824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_ids = IDS_AUTOFILL_WALLET_UPGRADE_CHROME_ERROR;
3834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_code = 71;
38458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
385ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
3867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::WalletClient::INVALID_PARAMS:
387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      error_ids = IDS_AUTOFILL_WALLET_BAD_TRANSACTION_AMOUNT;
388116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      error_code = 76;
38958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
390ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
39158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case wallet::WalletClient::BUYER_ACCOUNT_ERROR:
3924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_ids = IDS_AUTOFILL_WALLET_BUYER_ACCOUNT_ERROR;
3934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_code = 12;
39458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
395ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::WalletClient::UNSUPPORTED_API_VERSION:
3974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_ids = IDS_AUTOFILL_WALLET_UPGRADE_CHROME_ERROR;
3984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_code = 43;
39958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
4007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::WalletClient::SERVICE_UNAVAILABLE:
4024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_ids = IDS_AUTOFILL_WALLET_SERVICE_UNAVAILABLE_ERROR;
4034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_code = 61;
40458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
4057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::WalletClient::INTERNAL_ERROR:
407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      error_ids = IDS_AUTOFILL_WALLET_UPGRADE_CHROME_ERROR;
4084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_code = 62;
40958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
410ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
4117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::WalletClient::MALFORMED_RESPONSE:
4124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_ids = IDS_AUTOFILL_WALLET_UNKNOWN_ERROR;
4134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_code = 72;
41458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
415ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
4167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::WalletClient::NETWORK_ERROR:
4174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_ids = IDS_AUTOFILL_WALLET_UNKNOWN_ERROR;
4184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_code = 73;
41958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
420ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
4217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::WalletClient::UNKNOWN_ERROR:
4224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_ids = IDS_AUTOFILL_WALLET_UNKNOWN_ERROR;
4234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_code = 74;
42458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
42558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case wallet::WalletClient::UNSUPPORTED_USER_AGENT_OR_API_KEY:
427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      error_ids = IDS_AUTOFILL_WALLET_UNSUPPORTED_AGENT_OR_API_KEY;
428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      error_code = 75;
429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
431116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case wallet::WalletClient::SPENDING_LIMIT_EXCEEDED:
432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      error_ids = IDS_AUTOFILL_WALLET_BAD_TRANSACTION_AMOUNT;
433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      break;
434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Handled in the prior switch().
436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case wallet::WalletClient::UNVERIFIED_KNOW_YOUR_CUSTOMER_STATUS:
437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case wallet::WalletClient::BUYER_LEGAL_ADDRESS_NOT_SUPPORTED:
438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      NOTREACHED();
43958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
4407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
4417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK_NE(0, error_ids);
44358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
44458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The other error types are strings of the form "XXX. You can pay without
44558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // wallet."
4464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<DialogNotification> notification(new DialogNotification(
44758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      DialogNotification::WALLET_ERROR,
44858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      l10n_util::GetStringFUTF16(IDS_AUTOFILL_DIALOG_COMPLETE_WITHOUT_WALLET,
4494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                 l10n_util::GetStringUTF16(error_ids))));
4504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (error_code) {
4524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    notification->set_tooltip_text(
4534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        l10n_util::GetStringFUTF16(IDS_AUTOFILL_WALLET_ERROR_CODE_TOOLTIP,
4544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   base::IntToString16(error_code)));
4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return notification.Pass();
4587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
46058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Returns the ID of the address or instrument that should be selected in the
46158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// UI, given that the |default_id| is currently the default ID on the Wallet
46258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// server, |previous_default_id| was the default ID prior to re-fetching the
46358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Wallet data, and |previously_selected_id| was the ID of the item selected in
46458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// the dialog prior to re-fetching the Wallet data.
46558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)std::string GetIdToSelect(const std::string& default_id,
46658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          const std::string& previous_default_id,
46758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          const std::string& previously_selected_id) {
46858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // If the default ID changed since the last fetch of the Wallet data, select
46958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // it rather than the previously selected item, as the user's intention in
47058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // changing the default was probably to use it.
47158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (default_id != previous_default_id)
47258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return default_id;
47358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
47458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Otherwise, prefer the previously selected item, if there was one.
47558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return !previously_selected_id.empty() ? previously_selected_id : default_id;
47658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
47758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
47858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Generate a random card number in a user displayable format.
47958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)base::string16 GenerateRandomCardNumber() {
48058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string card_number;
48158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  for (size_t i = 0; i < 4; ++i) {
48258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int part = base::RandInt(0, 10000);
48358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    base::StringAppendF(&card_number, "%04d ", part);
48458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return base::ASCIIToUTF16(card_number);
48658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
48758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
488d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)gfx::Image CreditCardIconForType(const std::string& credit_card_type) {
489d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  const int input_card_idr = CreditCard::IconResourceId(credit_card_type);
490d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
491d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  gfx::Image result = rb.GetImageNamed(input_card_idr);
492d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (input_card_idr == IDR_AUTOFILL_CC_GENERIC) {
493d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    // When the credit card type is unknown, no image should be shown. However,
494d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    // to simplify the view code on Mac, save space for the credit card image by
4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // returning a transparent image of the appropriate size. Not all credit
4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // card images are the same size, but none is larger than the Visa icon.
497d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    result = gfx::Image(gfx::ImageSkiaOperations::CreateTransparentImage(
4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        rb.GetImageNamed(IDR_AUTOFILL_CC_VISA).AsImageSkia(), 0));
499d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
500d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return result;
501d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
502d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
503d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)gfx::Image CvcIconForCreditCardType(const base::string16& credit_card_type) {
504d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
505d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (credit_card_type == l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_AMEX))
506d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return rb.GetImageNamed(IDR_CREDIT_CARD_CVC_HINT_AMEX);
507d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
508d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return rb.GetImageNamed(IDR_CREDIT_CARD_CVC_HINT);
509d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
510d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ServerFieldType CountryTypeForSection(DialogSection section) {
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return section == SECTION_SHIPPING ? ADDRESS_HOME_COUNTRY :
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       ADDRESS_BILLING_COUNTRY;
5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Attempts to canonicalize the administrative area name in |profile| using the
5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// rules in |validator|.
5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CanonicalizeState(const AddressValidator* validator,
5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       AutofillProfile* profile) {
5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 administrative_area;
521cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<AddressData> address_data =
522cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      i18n::CreateAddressDataFromAutofillProfile(
523cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          *profile, g_browser_process->GetApplicationLocale());
524a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
525cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  validator->CanonicalizeAdministrativeArea(address_data.get());
526cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  administrative_area = base::UTF8ToUTF16(address_data->administrative_area);
5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  profile->SetInfo(AutofillType(ADDRESS_HOME_STATE),
5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   administrative_area,
5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   g_browser_process->GetApplicationLocale());
5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
53323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)ValidityMessage GetPhoneValidityMessage(const base::string16& country_name,
53423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                        const base::string16& number) {
53523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  std::string region = AutofillCountry::GetCountryCode(
53623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      country_name,
53723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      g_browser_process->GetApplicationLocale());
53823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  i18n::PhoneObject phone_object(number, region);
53923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ValidityMessage phone_message(base::string16(), true);
54023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
54123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Check if the phone number is invalid. Allow valid international
54223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // numbers that don't match the address's country only if they have an
54323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // international calling code.
54423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (!phone_object.IsValidNumber() ||
54523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      (phone_object.country_code().empty() &&
54623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)       phone_object.region() != region)) {
54723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    phone_message.text = l10n_util::GetStringUTF16(
54823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_PHONE_NUMBER);
54923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
55023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
55123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return phone_message;
55223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
55323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
554010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Constructs |inputs| from template data for a given |dialog_section|.
555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// |country_country| specifies the country code that the inputs should be built
556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// for. Sets the |language_code| to be used for address formatting, if
557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// internationalized address input is enabled. The |language_code| parameter can
558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// be NULL.
559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void BuildInputsForSection(DialogSection dialog_section,
560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           const std::string& country_code,
561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           DetailInputs* inputs,
562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           std::string* language_code) {
563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  using l10n_util::GetStringUTF16;
564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
565010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const DetailInput kCCInputs[] = {
566010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG,
567010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      CREDIT_CARD_NUMBER,
568010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GetStringUTF16(IDS_AUTOFILL_DIALOG_PLACEHOLDER_CARD_NUMBER) },
569010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::SHORT,
570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      CREDIT_CARD_EXP_MONTH,
571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GetStringUTF16(IDS_AUTOFILL_DIALOG_PLACEHOLDER_EXPIRY_MONTH) },
572010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::SHORT,
573010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      CREDIT_CARD_EXP_4_DIGIT_YEAR,
574010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GetStringUTF16(IDS_AUTOFILL_DIALOG_PLACEHOLDER_EXPIRY_YEAR) },
575010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::SHORT_EOL,
576010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      CREDIT_CARD_VERIFICATION_CODE,
577010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GetStringUTF16(IDS_AUTOFILL_DIALOG_PLACEHOLDER_CVC),
578010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      1.5 },
579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  };
580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const DetailInput kBillingPhoneInputs[] = {
582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG,
583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      PHONE_BILLING_WHOLE_NUMBER,
584010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GetStringUTF16(IDS_AUTOFILL_DIALOG_PLACEHOLDER_PHONE_NUMBER) },
585010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  };
586010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
587010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const DetailInput kEmailInputs[] = {
588010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG,
589010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      EMAIL_ADDRESS,
590010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GetStringUTF16(IDS_AUTOFILL_DIALOG_PLACEHOLDER_EMAIL) },
591010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  };
592010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
593010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const DetailInput kShippingPhoneInputs[] = {
594010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { DetailInput::LONG,
595010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      PHONE_HOME_WHOLE_NUMBER,
596010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GetStringUTF16(IDS_AUTOFILL_DIALOG_PLACEHOLDER_PHONE_NUMBER) },
597010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  };
598010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
599010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  switch (dialog_section) {
600010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case SECTION_CC: {
601010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      common::BuildInputs(kCCInputs, arraysize(kCCInputs), inputs);
602010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
603010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
604010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
605010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case SECTION_BILLING: {
606010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      i18ninput::BuildAddressInputs(common::ADDRESS_TYPE_BILLING,
607010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    country_code, inputs, language_code);
608010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      common::BuildInputs(kBillingPhoneInputs, arraysize(kBillingPhoneInputs),
609010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          inputs);
610010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      common::BuildInputs(kEmailInputs, arraysize(kEmailInputs), inputs);
611010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
612010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
613010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
614010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case SECTION_CC_BILLING: {
615010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      common::BuildInputs(kCCInputs, arraysize(kCCInputs), inputs);
616010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
617010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      // Wallet only supports US billing addresses.
618010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const std::string hardcoded_country_code = "US";
619010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      i18ninput::BuildAddressInputs(common::ADDRESS_TYPE_BILLING,
620010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    hardcoded_country_code,
621010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    inputs,
622010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    language_code);
623010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      DCHECK_EQ(inputs->back().type, ADDRESS_BILLING_COUNTRY);
624010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      inputs->back().length = DetailInput::NONE;
625010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const std::string& app_locale =
626010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          g_browser_process->GetApplicationLocale();
627010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      inputs->back().initial_value =
628010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          AutofillCountry(hardcoded_country_code, app_locale).name();
629010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
630010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      common::BuildInputs(kBillingPhoneInputs, arraysize(kBillingPhoneInputs),
631010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          inputs);
632010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
633010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
634010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
635010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case SECTION_SHIPPING: {
636010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      i18ninput::BuildAddressInputs(common::ADDRESS_TYPE_SHIPPING,
637010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    country_code, inputs, language_code);
638010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      common::BuildInputs(kShippingPhoneInputs, arraysize(kShippingPhoneInputs),
639010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          inputs);
640010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      break;
641010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
642010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
643010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
644010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6473240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochAutofillDialogViewDelegate::~AutofillDialogViewDelegate() {}
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutofillDialogControllerImpl::~AutofillDialogControllerImpl() {
6507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (popup_controller_)
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    popup_controller_->Hide();
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
65358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogInitialUserState(initial_user_state_);
654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
656116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Checks the country code against the values the form structure enumerates.
657116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool AutofillCountryFilter(
658116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::set<base::string16>& form_structure_values,
659116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& country_code) {
660116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!form_structure_values.empty() &&
661116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      !form_structure_values.count(base::ASCIIToUTF16(country_code))) {
662116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
663116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
664116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
665116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
666116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
667116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
668116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Checks the country code against the values the form structure enumerates and
669116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// against the ones Wallet allows.
670116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool WalletCountryFilter(
671116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::set<base::string16>& form_structure_values,
672116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::set<std::string>& wallet_allowed_values,
673116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& country_code) {
674116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if ((!form_structure_values.empty() &&
675116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch       !form_structure_values.count(base::ASCIIToUTF16(country_code))) ||
676116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      (!wallet_allowed_values.empty() &&
677116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch       !wallet_allowed_values.count(country_code))) {
678a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return false;
679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
680a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
681a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return true;
682a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
683a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::WeakPtr<AutofillDialogControllerImpl>
686f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)AutofillDialogControllerImpl::Create(
687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::WebContents* contents,
688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const FormData& form_structure,
689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const GURL& source_url,
690f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const AutofillClient::ResultCallback& callback) {
691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // AutofillDialogControllerImpl owns itself.
692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillDialogControllerImpl* autofill_dialog_controller =
693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new AutofillDialogControllerImpl(contents,
694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       form_structure,
695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       source_url,
696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       callback);
697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return autofill_dialog_controller->weak_ptr_factory_.GetWeakPtr();
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
7010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogController::RegisterPrefs(PrefRegistrySimple* registry) {
7020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  registry->RegisterListPref(::prefs::kAutofillDialogWalletLocationAcceptance);
7030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
7040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// static
7060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogController::RegisterProfilePrefs(
707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    user_prefs::PrefRegistrySyncable* registry) {
708868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  registry->RegisterBooleanPref(
709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ::prefs::kAutofillDialogPayWithoutWallet,
710868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      false,
711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
71290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  registry->RegisterDictionaryPref(
71390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ::prefs::kAutofillDialogAutofillDefault,
71490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
71558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  registry->RegisterBooleanPref(
71658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ::prefs::kAutofillDialogSaveData,
71758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      true,
71858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  registry->RegisterBooleanPref(
7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ::prefs::kAutofillDialogWalletShippingSameAsBilling,
7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      false,
7225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
725ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
726ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController> AutofillDialogController::Create(
727ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    content::WebContents* contents,
728ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const FormData& form_structure,
729ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const GURL& source_url,
730f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const AutofillClient::ResultCallback& callback) {
731ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return AutofillDialogControllerImpl::Create(contents,
732ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                              form_structure,
733ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                              source_url,
734ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                              callback);
735ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
736ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::Show() {
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dialog_shown_timestamp_ = base::Time::Now();
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Determine what field types should be included in the dialog.
7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool has_types = false;
7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool has_sections = false;
7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  form_structure_.ParseFieldTypesFromAutocompleteAttributes(
7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      &has_types, &has_sections);
7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Fail if the author didn't specify autocomplete types.
7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!has_types) {
748a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    callback_.Run(
749f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        AutofillClient::AutocompleteResultErrorDisabled,
750a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        base::ASCIIToUTF16("Form is missing autocomplete attributes."),
751a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        NULL);
7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    delete this;
7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
7545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
7555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Fail if the author didn't ask for at least some kind of credit card
7570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // information.
7580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  bool has_credit_card_field = false;
7590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  for (size_t i = 0; i < form_structure_.field_count(); ++i) {
7600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    AutofillType type = form_structure_.field(i)->Type();
7610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if (type.html_type() != HTML_TYPE_UNKNOWN && type.group() == CREDIT_CARD) {
7620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      has_credit_card_field = true;
7630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      break;
7640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
7650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
7660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
7670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (!has_credit_card_field) {
768f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    callback_.Run(AutofillClient::AutocompleteResultErrorDisabled,
769f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  base::ASCIIToUTF16(
770f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                      "Form is not a payment form (must contain "
771f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                      "some autocomplete=\"cc-*\" fields). "),
772f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  NULL);
7730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    delete this;
7740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return;
7750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
7760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
777116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  billing_country_combobox_model_.reset(new CountryComboboxModel());
778116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  billing_country_combobox_model_->SetCountries(
779a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      *GetManager(),
780116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(AutofillCountryFilter,
781116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 form_structure_.PossibleValues(ADDRESS_BILLING_COUNTRY)));
782116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  shipping_country_combobox_model_.reset(new CountryComboboxModel());
783116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  acceptable_shipping_countries_ =
784116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      form_structure_.PossibleValues(ADDRESS_HOME_COUNTRY);
785116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  shipping_country_combobox_model_->SetCountries(
786a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      *GetManager(),
787116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(AutofillCountryFilter,
788116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 base::ConstRef(acceptable_shipping_countries_)));
789116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
790116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // If the form has a country <select> but none of the options are valid, bail.
791116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (billing_country_combobox_model_->GetItemCount() == 0 ||
792116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      shipping_country_combobox_model_->GetItemCount() == 0) {
793116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    callback_.Run(AutofillClient::AutocompleteResultErrorDisabled,
794116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                  base::ASCIIToUTF16("No valid/supported country options"
795116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     " found."),
796116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                  NULL);
797116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    delete this;
798116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
799116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
800a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
8015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Log any relevant UI metrics and security exceptions.
8025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_SHOWN);
8035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GetMetricLogger().LogDialogSecurityMetric(
8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AutofillMetrics::SECURITY_METRIC_DIALOG_SHOWN);
8065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
807f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The Autofill dialog is shown in response to a message from the renderer and
808f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // as such, it can only be made in the context of the current document. A call
809f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // to GetActiveEntry would return a pending entry, if there was one, which
810f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // would be a security bug. Therefore, we use the last committed URL for the
811f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // access checks.
812f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const GURL& current_url = web_contents()->GetLastCommittedURL();
813f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  invoked_from_same_origin_ =
814f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      current_url.GetOrigin() == source_url_.GetOrigin();
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!invoked_from_same_origin_) {
817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GetMetricLogger().LogDialogSecurityMetric(
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AutofillMetrics::SECURITY_METRIC_CROSS_ORIGIN_FRAME);
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) {
8225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DialogSection section = static_cast<DialogSection>(i);
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::string country_code;
8255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CountryComboboxModel* model = CountryComboboxModelForSection(section);
8265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (model)
8275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      country_code = model->GetDefaultCountryCode();
8285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DetailInputs* inputs = MutableRequestedFieldsForSection(section);
830010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    BuildInputsForSection(
831a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        section, country_code, inputs,
832a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        MutableAddressLanguageCodeForSection(section));
8335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
835868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Test whether we need to show the shipping section. If filling that section
836868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // would be a no-op, don't show it.
8375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cares_about_shipping_ = form_structure_.FillFields(
8385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      RequestedTypesForSection(SECTION_SHIPPING),
8395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(common::ServerTypeMatchesField, SECTION_SHIPPING),
8405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(NullGetInfo),
8415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      std::string(),
8425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->GetApplicationLocale());
843868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
844116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  transaction_amount_ = form_structure_.GetUniqueValue(
845116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      HTML_TYPE_TRANSACTION_AMOUNT);
846116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  transaction_currency_ = form_structure_.GetUniqueValue(
847116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      HTML_TYPE_TRANSACTION_CURRENCY);
848116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
849a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  account_chooser_model_.reset(
850a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      new AccountChooserModel(this,
851a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                              profile_,
852a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                              !ShouldShowAccountChooser(),
853a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                              metric_logger_));
85458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
855cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  acceptable_cc_types_ = form_structure_.PossibleValues(CREDIT_CARD_TYPE);
856cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Wallet generates MC virtual cards, so we have to disable it if MC is not
857cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // allowed.
858cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (ShouldDisallowCcType(CreditCard::TypeForDisplay(kMasterCard)))
859cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DisableWallet(wallet::WalletClient::UNSUPPORTED_MERCHANT);
860cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
861a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (account_chooser_model_->WalletIsSelected())
862f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    FetchWalletCookie();
863f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
864116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  validator_.reset(new AddressValidator(
8656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      scoped_ptr< ::i18n::addressinput::Source>(
8666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          new autofill::ChromeMetadataSource(I18N_ADDRESS_VALIDATION_DATA_URL,
8676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                             profile_->GetRequestContext())),
868a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ValidationRulesStorageFactory::CreateStorage(),
869116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      this));
8705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
871a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SuggestionsUpdated();
872a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SubmitButtonDelayBegin();
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_.reset(CreateView());
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_->Show();
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetManager()->AddObserver(this);
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
877a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!account_chooser_model_->WalletIsSelected())
8787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    LogDialogLatencyToShow();
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::Hide() {
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (view_)
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->Hide();
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
88658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid AutofillDialogControllerImpl::TabActivated() {
88758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  // If the user switched away from this tab and then switched back, reload the
88858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  // Wallet items, in case they've changed.
88968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int64 seconds_elapsed_since_last_refresh =
89058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      (base::TimeTicks::Now() - last_wallet_items_fetch_timestamp_).InSeconds();
89158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  if (IsPayingWithWallet() && wallet_items_ &&
89258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      seconds_elapsed_since_last_refresh >= kWalletItemsRefreshRateSeconds) {
89358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    GetWalletItems();
89458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  }
89558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch}
89658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
89758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
89858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// AutofillDialogViewDelegate implementation.
899eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
900a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::DialogTitle() const {
90158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (ShouldShowSpinner())
902a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return base::string16();
9033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
90458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_TITLE);
905eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
906eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
907a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::AccountChooserText() const {
908a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!account_chooser_model_->WalletIsSelected())
90958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PAYING_WITHOUT_WALLET);
910eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
91158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (SignedInState() == SIGNED_IN)
912a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return account_chooser_model_->GetActiveWalletAccountName();
91358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
91458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // In this case, the account chooser should be showing the signin link.
915a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return base::string16();
91690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
91790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
918a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::SignInLinkText() const {
9190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  int ids = SignedInState() == NOT_CHECKED ?
9200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      IDS_AUTOFILL_DIALOG_USE_WALLET_LINK :
921f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ShouldShowSignInWebView() ? IDS_AUTOFILL_DIALOG_CANCEL_SIGN_IN :
922f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                  IDS_AUTOFILL_DIALOG_SIGN_IN;
9230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
9240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return l10n_util::GetStringUTF16(ids);
92558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
927a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::SpinnerText() const {
92858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_LOADING);
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
931a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::EditSuggestionText() const {
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_EDIT);
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
935a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::CancelButtonText() const {
936ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return l10n_util::GetStringUTF16(IDS_CANCEL);
937ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
938ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
939a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::ConfirmButtonText() const {
940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return l10n_util::GetStringUTF16(IsSubmitPausedOn(wallet::VERIFY_CVV) ?
941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_AUTOFILL_DIALOG_VERIFY_BUTTON : IDS_AUTOFILL_DIALOG_SUBMIT_BUTTON);
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
944a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::SaveLocallyText() const {
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SAVE_LOCALLY_CHECKBOX);
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
948a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::SaveLocallyTooltip() const {
949bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SAVE_LOCALLY_TOOLTIP);
950bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
951bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
952a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::LegalDocumentsText() {
953f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!IsPayingWithWallet() || ShouldShowSignInWebView())
954a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return base::string16();
955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return legal_documents_text_;
957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldShowSpinner() const {
960f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return SignedInState() == REQUIRES_RESPONSE ||
961f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         SignedInState() == REQUIRES_PASSIVE_SIGN_IN;
962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
964a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool AutofillDialogControllerImpl::ShouldShowAccountChooser() const {
9655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return !ShouldShowSpinner() && GetManager()->IsCountryOfInterest("US");
966a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
967a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
9681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool AutofillDialogControllerImpl::ShouldShowSignInWebView() const {
9691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return !signin_registrar_.IsEmpty();
9701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
9711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
9721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)GURL AutofillDialogControllerImpl::SignInUrl() const {
9731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return wallet::GetSignInUrl();
9741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
9751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldOfferToSaveInChrome() const {
977a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return IsAutofillEnabled() &&
978a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      !IsPayingWithWallet() &&
979b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      !profile_->IsOffTheRecord() &&
980b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      IsManuallyEditingAnySection() &&
981ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      !ShouldShowSpinner();
98290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
98390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
98458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldSaveInChrome() const {
98558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return profile_->GetPrefs()->GetBoolean(::prefs::kAutofillDialogSaveData);
98658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
98758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
98890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)int AutofillDialogControllerImpl::GetDialogButtons() const {
9894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (waiting_for_explicit_sign_in_response_)
9904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return ui::DIALOG_BUTTON_NONE;
9914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
9920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (ShouldShowSpinner() && !handling_use_wallet_link_click_)
99390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return ui::DIALOG_BUTTON_CANCEL;
99458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
99558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL;
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::IsDialogButtonEnabled(
9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::DialogButton button) const {
1000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (button == ui::DIALOG_BUTTON_OK) {
1001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (IsSubmitPausedOn(wallet::VERIFY_CVV))
1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return true;
1003ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
100458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (ShouldShowSpinner() || is_submitting_)
1005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return false;
1006ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
100758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (submit_button_delay_timer_.IsRunning())
100858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      return false;
1009ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
1011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(ui::DIALOG_BUTTON_CANCEL, button);
1014ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return !is_submitting_ || IsSubmitPausedOn(wallet::VERIFY_CVV);
1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
101758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)DialogOverlayState AutofillDialogControllerImpl::GetDialogOverlay() {
10187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool show_wallet_interstitial = IsPayingWithWallet() && is_submitting_ &&
101958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      !(full_wallet_ && !full_wallet_->required_actions().empty());
102058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!show_wallet_interstitial) {
102158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    card_scrambling_delay_.Stop();
102258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    card_scrambling_refresher_.Stop();
10237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return DialogOverlayState();
102458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
10257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
10265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance();
10277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DialogOverlayState state;
10285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  state.string.font_list = rb->GetFontList(ui::ResourceBundle::MediumFont);
102958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
103058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const SkColor start_top_color = SkColorSetRGB(0xD6, 0xD6, 0xD6);
103158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const SkColor start_bottom_color = SkColorSetRGB(0x98, 0x98, 0x98);
103258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const SkColor final_top_color = SkColorSetRGB(0x52, 0x9F, 0xF8);
103358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const SkColor final_bottom_color = SkColorSetRGB(0x22, 0x75, 0xE5);
10347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
10357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (full_wallet_ && full_wallet_->required_actions().empty()) {
103658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    card_scrambling_delay_.Stop();
103758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    card_scrambling_refresher_.Stop();
103858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 cc_number = base::ASCIIToUTF16(full_wallet_->GetPan());
1040f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    DCHECK_GE(cc_number.size(), 4U);
10417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    state.image = GetGeneratedCardImage(
10425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::ASCIIToUTF16("XXXX XXXX XXXX ") +
104358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            cc_number.substr(cc_number.size() - 4),
104458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        full_wallet_->billing_address()->recipient_name(),
104558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        color_utils::AlphaBlend(
104658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            final_top_color,
104758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            start_top_color,
104858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            255 * card_generated_animation_.GetCurrentValue()),
104958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        color_utils::AlphaBlend(
105058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            final_bottom_color,
105158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            start_bottom_color,
105258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            255 * card_generated_animation_.GetCurrentValue()));
105358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    state.string.text = l10n_util::GetStringUTF16(
10557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        IDS_AUTOFILL_DIALOG_CARD_GENERATION_DONE);
10567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  } else {
105758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Start the refresher if it isn't running. Wait one second before pumping
105858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // updates to the view.
105958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (!card_scrambling_delay_.IsRunning() &&
106058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        !card_scrambling_refresher_.IsRunning()) {
106158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      scrambled_card_number_ = GenerateRandomCardNumber();
106258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      card_scrambling_delay_.Start(
106358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          FROM_HERE,
106458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          base::TimeDelta::FromSeconds(1),
106558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          this,
106658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          &AutofillDialogControllerImpl::StartCardScramblingRefresher);
106758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
106858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
106958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(!scrambled_card_number_.empty());
107058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    state.image = GetGeneratedCardImage(
107158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        scrambled_card_number_,
107258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        submitted_cardholder_name_,
107358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        start_top_color,
107458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        start_bottom_color);
10757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
10767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // "Submitting" waiting page.
10774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    state.string.text = l10n_util::GetStringUTF16(
10787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        IDS_AUTOFILL_DIALOG_CARD_GENERATION_IN_PROGRESS);
10797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
10807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
10817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return state;
10827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
10837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
108458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const std::vector<gfx::Range>& AutofillDialogControllerImpl::
1085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LegalDocumentLinks() {
1086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return legal_document_link_ranges_;
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::SectionIsActive(DialogSection section)
10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const {
1091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (IsSubmitPausedOn(wallet::VERIFY_CVV))
1092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return section == SECTION_CC_BILLING;
1093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1094868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!FormStructureCaresAboutSection(section))
1095868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
1096868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (IsPayingWithWallet())
1098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return section == SECTION_CC_BILLING || section == SECTION_SHIPPING;
10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return section != SECTION_CC_BILLING;
11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::GetWalletItems() {
11043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ScopedViewUpdates updates(view_.get());
1105558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
11060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  wallet_items_requested_ = true;
1107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  wallet::WalletClient* wallet_client = GetWalletClient();
11085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  wallet_client->CancelRequest();
11090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
111058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  previously_selected_instrument_id_.clear();
111158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  previously_selected_shipping_address_id_.clear();
111258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  if (wallet_items_) {
111358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    previous_default_instrument_id_ = wallet_items_->default_instrument_id();
111458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    previous_default_shipping_address_id_ = wallet_items_->default_address_id();
111558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
111658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const wallet::WalletItems::MaskedInstrument* instrument =
111758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ActiveInstrument();
111858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (instrument)
111958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      previously_selected_instrument_id_ = instrument->object_id();
1120558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1121558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    const wallet::Address* address = ActiveShippingAddress();
1122558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    if (address)
1123558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      previously_selected_shipping_address_id_ = address->object_id();
112458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  }
112558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
112658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  last_wallet_items_fetch_timestamp_ = base::TimeTicks::Now();
1127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  passive_failed_ = false;
1128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  wallet_items_.reset();
112958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
1130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The "Loading..." page should be showing now, which should cause the
1131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // account chooser to hide.
1132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  view_->UpdateAccountChooser();
1133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  wallet_client->GetWalletItems(transaction_amount_, transaction_currency_);
1134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1136a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void AutofillDialogControllerImpl::HideSignIn() {
11373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ScopedViewUpdates updates(view_.get());
1138a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  signin_registrar_.RemoveAll();
1139a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  view_->HideSignIn();
1140a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  view_->UpdateAccountChooser();
1141a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
1142a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
114358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)AutofillDialogControllerImpl::DialogSignedInState
114458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    AutofillDialogControllerImpl::SignedInState() const {
114558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (wallet_error_notification_)
114658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return SIGN_IN_DISABLED;
114758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (signin_helper_ || (wallet_items_requested_ && !wallet_items_))
114958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return REQUIRES_RESPONSE;
115058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (!wallet_items_requested_)
11520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return NOT_CHECKED;
11530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (wallet_items_->HasRequiredAction(wallet::GAIA_AUTH) ||
1155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      passive_failed_) {
115658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return REQUIRES_SIGN_IN;
1157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
115858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
115958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (wallet_items_->HasRequiredAction(wallet::PASSIVE_GAIA_AUTH))
116058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return REQUIRES_PASSIVE_SIGN_IN;
116158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
116258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return SIGNED_IN;
116358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
116458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::SignedInStateUpdated() {
11664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!ShouldShowSpinner())
11674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    waiting_for_explicit_sign_in_response_ = false;
11684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  switch (SignedInState()) {
1170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case SIGNED_IN:
1171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      LogDialogLatencyToShow();
1172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
1173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case REQUIRES_SIGN_IN:
11750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      if (handling_use_wallet_link_click_)
11760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        SignInLinkClicked();
11770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      // Fall through.
1178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case SIGN_IN_DISABLED:
1179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Switch to the local account and refresh the dialog.
11804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      signin_helper_.reset();
1181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OnWalletSigninError();
11820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      handling_use_wallet_link_click_ = false;
1183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
1184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case REQUIRES_PASSIVE_SIGN_IN:
1186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Attempt to passively sign in the user.
1187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      DCHECK(!signin_helper_);
1188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      signin_helper_.reset(new wallet::WalletSigninHelper(
1189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          this,
1190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          profile_->GetRequestContext()));
1191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      signin_helper_->StartPassiveSignin(GetWalletClient()->user_index());
1192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
1193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    case NOT_CHECKED:
1195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case REQUIRES_RESPONSE:
1196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
1197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::OnWalletOrSigninUpdate() {
12013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ScopedViewUpdates updates(view_.get());
1202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SignedInStateUpdated();
1203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SuggestionsUpdated();
1204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateAccountChooserView();
1205b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
120658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (view_) {
1207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    view_->UpdateButtonStrip();
120858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    view_->UpdateOverlay();
120958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
1210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // On the first successful response, compute the initial user state metric.
1212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (initial_user_state_ == AutofillMetrics::DIALOG_USER_STATE_UNKNOWN)
1213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    initial_user_state_ = GetInitialUserState();
1214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void AutofillDialogControllerImpl::OnWalletFormFieldError(
12177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::vector<wallet::FormFieldError>& form_field_errors) {
12187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (form_field_errors.empty())
12197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
12207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
12217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  for (std::vector<wallet::FormFieldError>::const_iterator it =
12227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)           form_field_errors.begin();
12237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       it != form_field_errors.end(); ++it) {
12247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (it->error_type() == wallet::FormFieldError::UNKNOWN_ERROR ||
12257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        it->GetAutofillType() == MAX_VALID_FIELD_TYPE ||
12267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        it->location() == wallet::FormFieldError::UNKNOWN_LOCATION) {
12277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      wallet_server_validation_recoverable_ = false;
12287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
12297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
12307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    DialogSection section = SectionFromLocation(it->location());
12317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    wallet_errors_[section][it->GetAutofillType()] =
12327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        std::make_pair(it->GetErrorMessage(),
12337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       GetValueFromSection(section, it->GetAutofillType()));
12347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
12357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
12367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Unrecoverable validation errors.
12377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!wallet_server_validation_recoverable_)
12387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    DisableWallet(wallet::WalletClient::UNKNOWN_ERROR);
12397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  UpdateForErrors();
12417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
12427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
12431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void AutofillDialogControllerImpl::ConstructLegalDocumentsText() {
12440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  legal_documents_text_.clear();
12450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  legal_document_link_ranges_.clear();
12460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
12470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (!wallet_items_)
12480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return;
12490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
12500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  PrefService* local_state = g_browser_process->local_state();
12510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // List of users who have accepted location sharing for fraud protection
12520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // on this device.
12530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  const base::ListValue* accepted =
12540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      local_state->GetList(::prefs::kAutofillDialogWalletLocationAcceptance);
12550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  bool has_accepted_location_sharing =
12560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      accepted->Find(base::StringValue(
1257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          account_chooser_model_->GetActiveWalletAccountName())) !=
12580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      accepted->end();
12590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
12600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (wallet_items_->legal_documents().empty()) {
12610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (!has_accepted_location_sharing) {
12620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      legal_documents_text_ = l10n_util::GetStringUTF16(
12630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          IDS_AUTOFILL_DIALOG_LOCATION_DISCLOSURE);
12640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
12650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
12670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
1268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::vector<wallet::WalletItems::LegalDocument*>& documents =
1270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      wallet_items_->legal_documents();
12711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // There should never be just one document because the privacy policy doc gets
12721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // tacked on the end of other documents.
1273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK_GE(documents.size(), 2U);
1274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::vector<base::string16> link_names;
12761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (size_t i = 0; i < documents.size(); ++i) {
12771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    link_names.push_back(documents[i]->display_name());
12781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
12791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
12801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  int resource_id = 0;
12811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  switch (documents.size()) {
12821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case 2U:
1283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      resource_id = IDS_AUTOFILL_DIALOG_LEGAL_LINKS_2;
12841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
12851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case 3U:
1286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      resource_id = IDS_AUTOFILL_DIALOG_LEGAL_LINKS_3;
12871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
12881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case 4U:
1289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      resource_id = IDS_AUTOFILL_DIALOG_LEGAL_LINKS_4;
12901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
12911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case 5U:
1292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      resource_id = IDS_AUTOFILL_DIALOG_LEGAL_LINKS_5;
12931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
12941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case 6U:
1295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      resource_id = IDS_AUTOFILL_DIALOG_LEGAL_LINKS_6;
12961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
12971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    default:
12981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      // We can only handle so many documents. For lack of a better way of
12991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      // handling document overflow, just error out if there are too many.
13001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      DisableWallet(wallet::WalletClient::UNKNOWN_ERROR);
13011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return;
1302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::vector<size_t> offsets;
1305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 text =
1306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      l10n_util::GetStringFUTF16(resource_id, link_names,&offsets);
13070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
13080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Tack on the location string if need be.
13090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  size_t base_offset = 0;
13100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (!has_accepted_location_sharing) {
13110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    text = l10n_util::GetStringFUTF16(
13120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        IDS_AUTOFILL_DIALOG_LOCATION_DISCLOSURE_WITH_LEGAL_DOCS,
13130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        text,
13140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        &base_offset);
13150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
13160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < documents.size(); ++i) {
13180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    size_t link_start = offsets[i] + base_offset;
131958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    legal_document_link_ranges_.push_back(gfx::Range(
1320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        link_start, link_start + documents[i]->display_name().size()));
1321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  legal_documents_text_ = text;
1323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::ResetSectionInput(DialogSection section) {
1326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetEditingExistingData(section, false);
13275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  needs_validation_.erase(section);
13285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CountryComboboxModel* model = CountryComboboxModelForSection(section);
1330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (model) {
1331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    base::string16 country = model->GetItemAt(model->GetDefaultIndex());
1332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    RebuildInputsForCountry(section, country, false);
13335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1334eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1335eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DetailInputs* inputs = MutableRequestedFieldsForSection(section);
13365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (DetailInputs::iterator it = inputs->begin();
13375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       it != inputs->end(); ++it) {
13380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if (it->length != DetailInput::NONE) {
1339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      it->initial_value.clear();
13400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    } else if (!it->initial_value.empty() &&
13410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch               (it->type == ADDRESS_BILLING_COUNTRY ||
13420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                it->type == ADDRESS_HOME_COUNTRY)) {
13430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      GetValidator()->LoadRules(AutofillCountry::GetCountryCode(
13440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          it->initial_value, g_browser_process->GetApplicationLocale()));
13450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
1346eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
1347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1348eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1349eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::ShowEditUiIfBadSuggestion(
1350eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DialogSection section) {
1351eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // |CreateWrapper()| returns an empty wrapper if |IsEditingExistingData()|, so
1352eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // get the wrapper before this potentially happens below.
135390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section);
1354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If the chosen item in |model| yields an empty suggestion text, it is
1356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // invalid. In this case, show the edit UI and highlight invalid fields.
1357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section);
1358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 unused, unused2;
1359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (IsASuggestionItemKey(model->GetItemKeyForCheckedItem()) &&
1360c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      !SuggestionTextForSection(section, &unused, &unused2)) {
1361868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SetEditingExistingData(section, true);
1362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (wrapper && IsEditingExistingData(section)) {
13655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 country =
13665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        wrapper->GetInfo(AutofillType(CountryTypeForSection(section)));
13675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!country.empty()) {
13685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // There's no user input to restore here as this is only called after
13695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // resetting all section input.
13705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (RebuildInputsForCountry(section, country, false))
13715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        UpdateSection(section);
13725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
13735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    wrapper->FillInputs(MutableRequestedFieldsForSection(section));
13745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
137690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerImpl::InputWasEdited(ServerFieldType type,
1378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                  const base::string16& value) {
1379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (value.empty())
1380eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return false;
138190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // If this is a combobox at the default value, don't preserve it.
1383ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ui::ComboboxModel* model = ComboboxModelForAutofillType(type);
1384eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (model && model->GetItemAt(model->GetDefaultIndex()) == value)
1385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return false;
1386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1387eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return true;
1388eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1390f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)FieldValueMap AutofillDialogControllerImpl::TakeUserInputSnapshot() {
1391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FieldValueMap snapshot;
1392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!view_)
1393eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return snapshot;
1394eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1395eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) {
1396eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DialogSection section = static_cast<DialogSection>(i);
1397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section);
1398eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (model->GetItemKeyForCheckedItem() != kAddNewItemKey)
1399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      continue;
1400eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1401f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    FieldValueMap outputs;
1402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    view_->GetUserInput(section, &outputs);
1403eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Remove fields that are empty, at their default values, or invalid.
1404f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    for (FieldValueMap::iterator it = outputs.begin(); it != outputs.end();
1405eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         ++it) {
1406f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (InputWasEdited(it->first, it->second) &&
1407f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          InputValidityMessage(section, it->first, it->second).empty()) {
1408eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        snapshot.insert(std::make_pair(it->first, it->second));
1409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      }
1410eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
1411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
1412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1413eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return snapshot;
1414eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1415eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1416eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::RestoreUserInputFromSnapshot(
1417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const FieldValueMap& snapshot) {
1418eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (snapshot.empty())
1419eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
1420eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1421eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) {
1422eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DialogSection section = static_cast<DialogSection>(i);
1423eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (!SectionIsActive(section))
1424eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      continue;
1425eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1426eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DetailInputs* inputs = MutableRequestedFieldsForSection(section);
1427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    for (size_t i = 0; i < inputs->size(); ++i) {
14285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DetailInput* input = &(*inputs)[i];
14295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (input->length != DetailInput::NONE) {
14305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        input->initial_value =
14315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            GetInfoFromInputs(snapshot, section, AutofillType(input->type));
1432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      }
14335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (InputWasEdited(input->type, input->initial_value))
14345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        SuggestionsMenuModelForSection(section)->SetCheckedItem(kAddNewItemKey);
1435eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
1436eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
1437eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1438eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::UpdateSection(DialogSection section) {
1440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (view_)
1441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    view_->UpdateSection(section);
1442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1444eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::UpdateForErrors() {
1445eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!view_)
1446eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
1447eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Currently, the view should only need to be updated if there are
1449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // |wallet_errors_| or validating a suggestion that's based on existing data.
1450eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool should_update = !wallet_errors_.empty();
1451eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!should_update) {
1452eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) {
1453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if (IsEditingExistingData(static_cast<DialogSection>(i))) {
1454eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        should_update = true;
1455eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
1456eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      }
1457eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
1458eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
1459eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1460eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (should_update)
1461eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    view_->UpdateForErrors();
1462eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1463eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1464f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)gfx::Image AutofillDialogControllerImpl::GetGeneratedCardImage(
1465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const base::string16& card_number,
1466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const base::string16& name,
1467f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const SkColor& gradient_top,
1468f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const SkColor& gradient_bottom) {
1469f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const int kCardWidthPx = 300;
1470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const int kCardHeightPx = 190;
1471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const gfx::Size size(kCardWidthPx, kCardHeightPx);
1472cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  float scale_factor = ui::GetScaleFactorForNativeView(
1473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      web_contents()->GetNativeView());
1474cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Canvas canvas(size, scale_factor, false);
1475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Rect display_rect(size);
1477f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  skia::RefPtr<SkShader> shader = gfx::CreateGradientShader(
1479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      0, size.height(), gradient_top, gradient_bottom);
1480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SkPaint paint;
1481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  paint.setShader(shader.get());
1482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  canvas.DrawRoundRect(display_rect, 8, paint);
1483f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  display_rect.Inset(20, 0, 0, 0);
1485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Font font(l10n_util::GetStringUTF8(IDS_FIXED_FONT_FAMILY), 18);
1486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::FontList font_list(font);
1487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::ShadowValues shadows;
1488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  shadows.push_back(gfx::ShadowValue(gfx::Point(0, 1), 1.0, SK_ColorBLACK));
1489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  canvas.DrawStringRectWithShadows(
1490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      card_number,
1491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      font_list,
1492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SK_ColorWHITE,
1493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      display_rect, 0, 0, shadows);
1494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::string16 capitalized_name = base::i18n::ToUpper(name);
1496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  display_rect.Inset(0, size.height() / 2, 0, 0);
1497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  canvas.DrawStringRectWithShadows(
1498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      capitalized_name,
1499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      font_list,
1500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SK_ColorWHITE,
1501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      display_rect, 0, 0, shadows);
1502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::ImageSkia skia(canvas.ExtractImageRep());
1504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return gfx::Image(skia);
1505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1506f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
150758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::StartCardScramblingRefresher() {
150858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RefreshCardScramblingOverlay();
150958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  card_scrambling_refresher_.Start(
151058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      FROM_HERE,
151158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      base::TimeDelta::FromMilliseconds(75),
151258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      this,
151358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      &AutofillDialogControllerImpl::RefreshCardScramblingOverlay);
151458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
151558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
151658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::RefreshCardScramblingOverlay() {
151758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scrambled_card_number_ = GenerateRandomCardNumber();
151858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  PushOverlayUpdate();
151958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
152058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
152158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::PushOverlayUpdate() {
152258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (view_) {
152358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ScopedViewUpdates updates(view_.get());
152458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    view_->UpdateOverlay();
152558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
152658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
152758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const DetailInputs& AutofillDialogControllerImpl::RequestedFieldsForSection(
15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DialogSection section) const {
15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (section) {
15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_CC:
15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return requested_cc_fields_;
15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_BILLING:
15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return requested_billing_fields_;
15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_CC_BILLING:
15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return requested_cc_billing_fields_;
15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_SHIPPING:
15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return requested_shipping_fields_;
15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return requested_billing_fields_;
15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::ComboboxModel* AutofillDialogControllerImpl::ComboboxModelForAutofillType(
15463240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    ServerFieldType type) {
1547bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  switch (type) {
15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CREDIT_CARD_EXP_MONTH:
15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return &cc_exp_month_combobox_model_;
15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CREDIT_CARD_EXP_4_DIGIT_YEAR:
15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return &cc_exp_year_combobox_model_;
15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1554bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    case ADDRESS_BILLING_COUNTRY:
1555a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return billing_country_combobox_model_.get();
15565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ADDRESS_HOME_COUNTRY:
1558a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return shipping_country_combobox_model_.get();
15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return NULL;
15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::MenuModel* AutofillDialogControllerImpl::MenuModelForSection(
15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DialogSection section) {
1567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section);
1568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The shipping section menu is special. It will always show because there is
1569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // a choice between "Use billing" and "enter new".
1570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (section == SECTION_SHIPPING)
1571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return model;
1572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // For other sections, only show a menu if there's at least one suggestion.
1574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (int i = 0; i < model->GetItemCount(); ++i) {
1575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (IsASuggestionItemKey(model->GetItemKeyAt(i)))
1576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return model;
1577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return NULL;
1580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::MenuModel* AutofillDialogControllerImpl::MenuModelForAccountChooser() {
1583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If there were unrecoverable Wallet errors, or if there are choices other
1584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // than "Pay without the wallet", show the full menu.
15854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // TODO(estade): this can present a braindead menu (only 1 option) when
15864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // there's a wallet error.
158758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (wallet_error_notification_ ||
15884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      (SignedInState() == SIGNED_IN &&
1589a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)       account_chooser_model_->HasAccountsToChoose() &&
1590f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)       !ShouldShowSignInWebView())) {
1591a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return account_chooser_model_.get();
1592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Otherwise, there is no menu, just a sign in link.
1595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return NULL;
15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Image AutofillDialogControllerImpl::AccountChooserImage() {
1599f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!MenuModelForAccountChooser() && !ShouldShowSignInWebView()) {
1600f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return ui::ResourceBundle::GetSharedInstance().GetImageNamed(
1601f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        IDR_WALLET_ICON);
16022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1604f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return gfx::Image();
16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochgfx::Image AutofillDialogControllerImpl::ButtonStripImage() const {
160858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (IsPayingWithWallet()) {
16092385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    return ui::ResourceBundle::GetSharedInstance().GetImageNamed(
16102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        IDR_WALLET_LOGO);
16112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
16122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
16132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  return gfx::Image();
16142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
16152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1616a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::LabelForSection(
1617a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    DialogSection section) const {
16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (section) {
16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_CC:
16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SECTION_CC);
16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_BILLING:
16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_CC_BILLING:
16237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SECTION_BILLING);
16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_SHIPPING:
16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SECTION_SHIPPING);
16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
162758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  NOTREACHED();
1628a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return base::string16();
16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SuggestionState AutofillDialogControllerImpl::SuggestionStateForSection(
1632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DialogSection section) {
1633a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 vertically_compact, horizontally_compact;
1634c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  bool show_suggestion = SuggestionTextForSection(section,
1635c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                                  &vertically_compact,
1636c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                                  &horizontally_compact);
1637c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  return SuggestionState(show_suggestion,
1638c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                         vertically_compact,
1639c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                         horizontally_compact,
1640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         SuggestionIconForSection(section),
1641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         ExtraSuggestionTextForSection(section),
16427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         ExtraSuggestionIconForSection(section));
1643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1645c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochbool AutofillDialogControllerImpl::SuggestionTextForSection(
1646c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    DialogSection section,
1647c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    base::string16* vertically_compact,
1648c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    base::string16* horizontally_compact) {
1649c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  base::string16 action_text = RequiredActionTextForSection(section);
1650c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  if (!action_text.empty()) {
1651c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    *vertically_compact = *horizontally_compact = action_text;
1652c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    return true;
1653c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  }
1654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // When the user has clicked 'edit' or a suggestion is somehow invalid (e.g. a
1656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // user selects a credit card that has expired), don't show a suggestion (even
1657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // though there is a profile selected in the model).
1658868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (IsEditingExistingData(section))
1659c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    return false;
16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section);
16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string item_key = model->GetItemKeyForCheckedItem();
1663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (item_key == kSameAsBillingKey) {
1664c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    *vertically_compact = *horizontally_compact = l10n_util::GetStringUTF16(
1665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        IDS_AUTOFILL_DIALOG_USING_BILLING_FOR_SHIPPING);
1666c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    return true;
1667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!IsASuggestionItemKey(item_key))
1670c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    return false;
16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1672a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!IsPayingWithWallet() &&
1673a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      (section == SECTION_BILLING || section == SECTION_SHIPPING)) {
1674a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Also check if the address is invalid (rules may have loaded since
1675a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // the dialog was shown).
1676a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (HasInvalidAddress(*GetManager()->GetProfileByGUID(item_key)))
1677a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return false;
1678a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
1679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
16802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section);
1681c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  return wrapper->GetDisplayText(vertically_compact, horizontally_compact);
1682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1684a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::RequiredActionTextForSection(
1685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DialogSection section) const {
1686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (section == SECTION_CC_BILLING && IsSubmitPausedOn(wallet::VERIFY_CVV)) {
1687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const wallet::WalletItems::MaskedInstrument* current_instrument =
1688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        wallet_items_->GetInstrumentById(active_instrument_id_);
1689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (current_instrument)
1690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return current_instrument->TypeAndLastFourDigits();
1691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1692f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    FieldValueMap output;
1693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    view_->GetUserInput(section, &output);
1694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    CreditCard card;
1695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GetBillingInfoFromOutputs(output, &card, NULL, NULL);
1696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return card.TypeAndLastFourDigits();
1697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1699a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return base::string16();
1700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1702a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::ExtraSuggestionTextForSection(
1703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DialogSection section) const {
1704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (section == SECTION_CC ||
1705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      (section == SECTION_CC_BILLING && IsSubmitPausedOn(wallet::VERIFY_CVV))) {
1706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PLACEHOLDER_CVC);
1707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1709a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return base::string16();
1710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1712868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const wallet::WalletItems::MaskedInstrument* AutofillDialogControllerImpl::
1713868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ActiveInstrument() const {
1714868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!IsPayingWithWallet())
1715868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return NULL;
1716868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1717868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const SuggestionsMenuModel* model =
1718868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SuggestionsMenuModelForSection(SECTION_CC_BILLING);
1719868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const std::string item_key = model->GetItemKeyForCheckedItem();
1720868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!IsASuggestionItemKey(item_key))
1721868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return NULL;
1722868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1723868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int index;
1724868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!base::StringToInt(item_key, &index) || index < 0 ||
1725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      static_cast<size_t>(index) >= wallet_items_->instruments().size()) {
1726868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    NOTREACHED();
1727868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return NULL;
1728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1729868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1730868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return wallet_items_->instruments()[index];
1731868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1732868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1733868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const wallet::Address* AutofillDialogControllerImpl::
1734868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ActiveShippingAddress() const {
1735a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!IsPayingWithWallet() || !IsShippingAddressRequired())
1736868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return NULL;
1737868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1738868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const SuggestionsMenuModel* model =
1739868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SuggestionsMenuModelForSection(SECTION_SHIPPING);
1740868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const std::string item_key = model->GetItemKeyForCheckedItem();
1741868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!IsASuggestionItemKey(item_key))
1742868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return NULL;
1743868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1744868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int index;
1745868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!base::StringToInt(item_key, &index) || index < 0 ||
1746868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      static_cast<size_t>(index) >= wallet_items_->addresses().size()) {
1747868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    NOTREACHED();
1748868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return NULL;
1749868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1750868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1751868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return wallet_items_->addresses()[index];
1752868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1753868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
17542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<DataModelWrapper> AutofillDialogControllerImpl::CreateWrapper(
17552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DialogSection section) {
1756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (IsPayingWithWallet() && full_wallet_ &&
1757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      full_wallet_->required_actions().empty()) {
17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (section == SECTION_CC_BILLING) {
17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return scoped_ptr<DataModelWrapper>(
17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          new FullWalletBillingWrapper(full_wallet_.get()));
17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (section == SECTION_SHIPPING) {
17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return scoped_ptr<DataModelWrapper>(
17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          new FullWalletShippingWrapper(full_wallet_.get()));
17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section);
17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string item_key = model->GetItemKeyForCheckedItem();
1770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!IsASuggestionItemKey(item_key) || IsManuallyEditingSection(section))
17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return scoped_ptr<DataModelWrapper>();
17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (IsPayingWithWallet()) {
17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (section == SECTION_CC_BILLING) {
17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return scoped_ptr<DataModelWrapper>(
1776868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          new WalletInstrumentWrapper(ActiveInstrument()));
17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (section == SECTION_SHIPPING) {
1780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return scoped_ptr<DataModelWrapper>(
1781868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          new WalletAddressWrapper(ActiveShippingAddress()));
1782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return scoped_ptr<DataModelWrapper>();
17852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
17862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (section == SECTION_CC) {
17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CreditCard* card = GetManager()->GetCreditCardByGUID(item_key);
17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(card);
17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return scoped_ptr<DataModelWrapper>(new AutofillCreditCardWrapper(card));
17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AutofillProfile* profile = GetManager()->GetProfileByGUID(item_key);
17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(profile);
179558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (section == SECTION_SHIPPING) {
179658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return scoped_ptr<DataModelWrapper>(
1797d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        new AutofillShippingAddressWrapper(profile));
179858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
179958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK_EQ(SECTION_BILLING, section);
18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return scoped_ptr<DataModelWrapper>(
1801d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      new AutofillProfileWrapper(profile));
18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Image AutofillDialogControllerImpl::SuggestionIconForSection(
18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DialogSection section) {
18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<DataModelWrapper> model = CreateWrapper(section);
18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!model.get())
18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Image();
18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return model->GetIcon();
18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Image AutofillDialogControllerImpl::ExtraSuggestionIconForSection(
1814d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DialogSection section) {
1815d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (section != SECTION_CC && section != SECTION_CC_BILLING)
1816d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return gfx::Image();
1817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1818d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  scoped_ptr<DataModelWrapper> model = CreateWrapper(section);
1819d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!model.get())
1820d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return gfx::Image();
1821d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1822d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return CvcIconForCreditCardType(
1823d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      model->GetInfo(AutofillType(CREDIT_CARD_TYPE)));
1824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1826d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)FieldIconMap AutofillDialogControllerImpl::IconsForFields(
1827d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const FieldValueMap& user_inputs) const {
1828d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  FieldIconMap result;
1829d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::string16 credit_card_type;
1830d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1831d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  FieldValueMap::const_iterator credit_card_iter =
1832d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      user_inputs.find(CREDIT_CARD_NUMBER);
1833d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (credit_card_iter != user_inputs.end()) {
1834a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& number = credit_card_iter->second;
1835d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const std::string type = CreditCard::GetCreditCardType(number);
1836d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    credit_card_type = CreditCard::TypeForDisplay(type);
1837d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    result[CREDIT_CARD_NUMBER] = CreditCardIconForType(type);
1838d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
1839d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1840d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!user_inputs.count(CREDIT_CARD_VERIFICATION_CODE))
1841d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return result;
1842d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1843d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  result[CREDIT_CARD_VERIFICATION_CODE] =
1844d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      CvcIconForCreditCardType(credit_card_type);
1845d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1846d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return result;
1847d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
1848d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1849d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool AutofillDialogControllerImpl::FieldControlsIcons(
1850d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    ServerFieldType type) const {
1851d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return type == CREDIT_CARD_NUMBER;
1852d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
1853d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1854a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::TooltipForField(
1855a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ServerFieldType type) const {
18564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (type == PHONE_HOME_WHOLE_NUMBER || type == PHONE_BILLING_WHOLE_NUMBER)
18574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_TOOLTIP_PHONE_NUMBER);
18584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1859a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return base::string16();
18604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
18614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool AutofillDialogControllerImpl::InputIsEditable(
18638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    const DetailInput& input,
18648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    DialogSection section) {
186523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (section != SECTION_CC_BILLING || !IsPayingWithWallet())
18668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return true;
18678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
18688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (input.type == CREDIT_CARD_NUMBER)
18698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return !IsEditingExistingData(section);
18708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
18718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // For CVC, only require (allow) input if the user has edited some other
18728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // aspect of the card.
18738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (input.type == CREDIT_CARD_VERIFICATION_CODE &&
18748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      IsEditingExistingData(section)) {
1875f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    FieldValueMap output;
18768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    view_->GetUserInput(section, &output);
18778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    WalletInstrumentWrapper wrapper(ActiveInstrument());
18788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1879f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    for (FieldValueMap::iterator iter = output.begin(); iter != output.end();
18808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)         ++iter) {
1881f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (iter->first == input.type)
18828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        continue;
18838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1884f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      AutofillType type(iter->first);
18858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      if (type.group() == CREDIT_CARD &&
18868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)          iter->second != wrapper.GetInfo(type)) {
18878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        return true;
18888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      }
18898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    }
18908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
18918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return false;
18928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
18938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
18948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return true;
18958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
18968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
18974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// TODO(groby): Add more tests.
1898a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::InputValidityMessage(
18997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    DialogSection section,
19003240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    ServerFieldType type,
1901a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& value) {
19027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // If the field is edited, clear any Wallet errors.
19037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (IsPayingWithWallet()) {
19047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WalletValidationErrors::iterator it = wallet_errors_.find(section);
19057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (it != wallet_errors_.end()) {
19067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      TypeErrorInputMap::const_iterator iter = it->second.find(type);
19077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      if (iter != it->second.end()) {
19087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        if (iter->second.second == value)
19097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          return iter->second.first;
19107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        it->second.erase(type);
19117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      }
19127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
19137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
19147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
19155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AutofillType autofill_type(type);
1916a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (autofill_type.group() == ADDRESS_HOME ||
1917a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      autofill_type.group() == ADDRESS_BILLING) {
19185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return base::string16();
19195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
19205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
19215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  switch (autofill_type.GetStorableType()) {
192290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case EMAIL_ADDRESS:
1923868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (!value.empty() && !IsValidEmailAddress(value)) {
1924868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        return l10n_util::GetStringUTF16(
1925868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_EMAIL_ADDRESS);
1926868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      }
192790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      break;
192890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1929eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case CREDIT_CARD_NUMBER: {
1930eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if (!value.empty()) {
1931eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        base::string16 message = CreditCardNumberValidityMessage(value);
1932eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        if (!message.empty())
1933eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          return message;
1934eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      }
1935eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      break;
1936eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
193790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
193890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case CREDIT_CARD_EXP_MONTH:
1939ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (!InputWasEdited(CREDIT_CARD_EXP_MONTH, value)) {
1940ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        return l10n_util::GetStringUTF16(
1941116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            IDS_LIBADDRESSINPUT_MISSING_REQUIRED_FIELD);
1942ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      }
1943ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      break;
1944ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
194590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case CREDIT_CARD_EXP_4_DIGIT_YEAR:
1946ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (!InputWasEdited(CREDIT_CARD_EXP_4_DIGIT_YEAR, value)) {
1947ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        return l10n_util::GetStringUTF16(
1948116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            IDS_LIBADDRESSINPUT_MISSING_REQUIRED_FIELD);
1949ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      }
195090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      break;
195190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
195290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case CREDIT_CARD_VERIFICATION_CODE:
1953868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (!value.empty() && !autofill::IsValidCreditCardSecurityCode(value)) {
1954868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        return l10n_util::GetStringUTF16(
1955868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_SECURITY_CODE);
1956868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      }
195790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      break;
195890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
19597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    case NAME_FULL:
19607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      // Wallet requires a first and last billing name.
1961c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      if (IsPayingWithWallet() && !value.empty() &&
19627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          !IsCardHolderNameValidForWallet(value)) {
19637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        return l10n_util::GetStringUTF16(
19647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            IDS_AUTOFILL_DIALOG_VALIDATION_WALLET_REQUIRES_TWO_NAMES);
19657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      }
196690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      break;
19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1968868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case PHONE_HOME_WHOLE_NUMBER:  // Used in shipping section.
1969868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
1970868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1971868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case PHONE_BILLING_WHOLE_NUMBER:  // Used in billing section.
197290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      break;
197390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
197490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    default:
197590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      NOTREACHED();  // Trying to validate unknown field.
197690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      break;
197790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
197890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
19795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return value.empty() ? l10n_util::GetStringUTF16(
1980116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             IDS_LIBADDRESSINPUT_MISSING_REQUIRED_FIELD) :
19815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         base::string16();
19822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// TODO(groby): Also add tests.
19854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)ValidityMessages AutofillDialogControllerImpl::InputsAreValid(
19867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    DialogSection section,
1987f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const FieldValueMap& inputs) {
19884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ValidityMessages messages;
19895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (inputs.empty())
19905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return messages;
19915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
19925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AddressValidator::Status status = AddressValidator::SUCCESS;
1993a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (section != SECTION_CC) {
19945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    AutofillProfile profile;
19955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    FillFormGroupFromOutputs(inputs, &profile);
1996cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    scoped_ptr<AddressData> address_data =
1997cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        i18n::CreateAddressDataFromAutofillProfile(
1998cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            profile, g_browser_process->GetApplicationLocale());
1999cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    address_data->language_code = AddressLanguageCodeForSection(section);
20005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2001116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Localization localization;
2002116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    localization.SetGetter(l10n_util::GetStringUTF8);
2003116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    FieldProblemMap problems;
2004116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    status = GetValidator()->ValidateAddress(*address_data, NULL, &problems);
2005116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool billing = section != SECTION_SHIPPING;
2006116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2007116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    for (FieldProblemMap::const_iterator iter = problems.begin();
2008116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         iter != problems.end(); ++iter) {
2009116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      bool sure = iter->second != MISSING_REQUIRED_FIELD;
2010116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::string16 text = base::UTF8ToUTF16(localization.GetErrorMessage(
2011116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          *address_data, iter->first, iter->second, true, false));
2012116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      messages.Set(i18n::TypeForField(iter->first, billing),
20135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   ValidityMessage(text, sure));
20145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
20155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
20165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2017f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (FieldValueMap::const_iterator iter = inputs.begin();
20182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter != inputs.end(); ++iter) {
2019f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const ServerFieldType type = iter->first;
20204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::string16 text = InputValidityMessage(section, type, iter->second);
20214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Skip empty/unchanged fields in edit mode. If the individual field does
20235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // not have validation errors, assume it to be valid unless later proven
20245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // otherwise.
20255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool sure = InputWasEdited(type, iter->second);
20265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
20275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (sure && status == AddressValidator::RULES_NOT_READY &&
20285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        !ComboboxModelForAutofillType(type) &&
20295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        (AutofillType(type).group() == ADDRESS_HOME ||
20305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         AutofillType(type).group() == ADDRESS_BILLING)) {
20315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DCHECK(text.empty());
20325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      text = l10n_util::GetStringUTF16(
20335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          IDS_AUTOFILL_DIALOG_VALIDATION_WAITING_FOR_RULES);
20345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      sure = false;
20355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      needs_validation_.insert(section);
20364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
20375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
20384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    messages.Set(type, ValidityMessage(text, sure));
20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // For the convenience of using operator[].
20425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FieldValueMap& field_values = const_cast<FieldValueMap&>(inputs);
2043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Validate the date formed by month and year field. (Autofill dialog is
2044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // never supposed to have 2-digit years, so not checked).
2045868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (field_values.count(CREDIT_CARD_EXP_4_DIGIT_YEAR) &&
2046868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      field_values.count(CREDIT_CARD_EXP_MONTH) &&
2047ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      InputWasEdited(CREDIT_CARD_EXP_4_DIGIT_YEAR,
2048ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     field_values[CREDIT_CARD_EXP_4_DIGIT_YEAR]) &&
2049ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      InputWasEdited(CREDIT_CARD_EXP_MONTH,
20504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     field_values[CREDIT_CARD_EXP_MONTH])) {
20514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ValidityMessage year_message(base::string16(), true);
20524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ValidityMessage month_message(base::string16(), true);
20534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!IsCreditCardExpirationValid(field_values[CREDIT_CARD_EXP_4_DIGIT_YEAR],
20544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     field_values[CREDIT_CARD_EXP_MONTH])) {
20554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      // The dialog shows the same error message for the month and year fields.
20564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      year_message.text = l10n_util::GetStringUTF16(
20574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_EXPIRATION_DATE);
20584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      month_message.text = l10n_util::GetStringUTF16(
20594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_EXPIRATION_DATE);
20604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
20614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    messages.Set(CREDIT_CARD_EXP_4_DIGIT_YEAR, year_message);
20624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    messages.Set(CREDIT_CARD_EXP_MONTH, month_message);
20632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
20642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If there is a credit card number and a CVC, validate them together.
20662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (field_values.count(CREDIT_CARD_NUMBER) &&
20674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      field_values.count(CREDIT_CARD_VERIFICATION_CODE)) {
20684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ValidityMessage ccv_message(base::string16(), true);
20694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!autofill::IsValidCreditCardSecurityCode(
20704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            field_values[CREDIT_CARD_VERIFICATION_CODE],
20714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            field_values[CREDIT_CARD_NUMBER])) {
20724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ccv_message.text = l10n_util::GetStringUTF16(
20734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_SECURITY_CODE);
20744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
20754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    messages.Set(CREDIT_CARD_VERIFICATION_CODE, ccv_message);
20762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
20772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2078868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Validate the shipping phone number against the country code of the address.
207990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (field_values.count(ADDRESS_HOME_COUNTRY) &&
208090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      field_values.count(PHONE_HOME_WHOLE_NUMBER)) {
208123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    messages.Set(
208223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        PHONE_HOME_WHOLE_NUMBER,
208323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        GetPhoneValidityMessage(field_values[ADDRESS_HOME_COUNTRY],
208423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                field_values[PHONE_HOME_WHOLE_NUMBER]));
2085868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
2086868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2087868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Validate the billing phone number against the country code of the address.
2088868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (field_values.count(ADDRESS_BILLING_COUNTRY) &&
2089868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      field_values.count(PHONE_BILLING_WHOLE_NUMBER)) {
209023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    messages.Set(
209123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        PHONE_BILLING_WHOLE_NUMBER,
209223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        GetPhoneValidityMessage(field_values[ADDRESS_BILLING_COUNTRY],
209323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                field_values[PHONE_BILLING_WHOLE_NUMBER]));
209490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
209590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return messages;
20972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::UserEditedOrActivatedInput(
21007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    DialogSection section,
2101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ServerFieldType type,
21022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::NativeView parent_view,
21032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Rect& content_bounds,
2104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& field_contents,
21052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool was_edit) {
21065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScopedViewUpdates updates(view_.get());
21075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
21085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (type == ADDRESS_BILLING_COUNTRY || type == ADDRESS_HOME_COUNTRY) {
2109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const FieldValueMap& snapshot = TakeUserInputSnapshot();
21105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
21115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Clobber the inputs because the view's already been updated.
21125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RebuildInputsForCountry(section, field_contents, true);
21135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RestoreUserInputFromSnapshot(snapshot);
21145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    UpdateSection(section);
21155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
21165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The rest of this method applies only to textfields while Autofill is
2118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // enabled. If a combobox or Autofill is disabled, bail.
2119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (ComboboxModelForAutofillType(type) || !IsAutofillEnabled())
21205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
21215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the field is edited down to empty, don't show a popup.
21232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (was_edit && field_contents.empty()) {
21242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    HidePopup();
21252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
21262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
21272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the user clicks while the popup is already showing, be sure to hide
21292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // it.
2130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!was_edit && popup_controller_.get()) {
21312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    HidePopup();
21322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
21332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
21342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<base::string16> popup_values, popup_labels, popup_icons;
2136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (common::IsCreditCardType(type)) {
2137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    GetManager()->GetCreditCardSuggestions(AutofillType(type),
21382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           field_contents,
21392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           &popup_values,
21402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           &popup_labels,
21412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           &popup_icons,
21422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           &popup_guids_);
21432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
2144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    GetManager()->GetProfileSuggestions(
2145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        AutofillType(type),
2146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        field_contents,
2147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        false,
2148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        RequestedTypesForSection(section),
2149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        base::Bind(&AutofillDialogControllerImpl::ShouldSuggestProfile,
2150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   base::Unretained(this), section),
2151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        &popup_values,
2152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        &popup_labels,
2153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        &popup_icons,
2154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        &popup_guids_);
2155effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2156effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    GetI18nValidatorSuggestions(section, type, &popup_values, &popup_labels,
2157effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                &popup_icons);
21582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
21592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (popup_values.empty()) {
2161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    HidePopup();
21622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
21642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // |popup_input_type_| must be set before calling |Show()|.
21665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  popup_input_type_ = type;
2167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  popup_section_ = section;
2168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
21692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(estade): do we need separators and control rows like 'Clear
21702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Form'?
21712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<int> popup_ids;
2172effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  for (size_t i = 0; i < popup_values.size(); ++i) {
21732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    popup_ids.push_back(i);
21742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
21752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  popup_controller_ = AutofillPopupControllerImpl::GetOrCreate(
2177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      popup_controller_,
2178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_ptr_factory_.GetWeakPtr(),
21790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      NULL,
2180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      parent_view,
21817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content_bounds,
21827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::i18n::IsRTL() ?
21837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          base::i18n::RIGHT_TO_LEFT : base::i18n::LEFT_TO_RIGHT);
21842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  popup_controller_->Show(popup_values,
21852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          popup_labels,
21862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          popup_icons,
21872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          popup_ids);
21882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
21892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::FocusMoved() {
21912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HidePopup();
21922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
21932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldShowErrorBubble() const {
21955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return popup_input_type_ == UNKNOWN_TYPE;
21964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
21974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
21982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::ViewClosed() {
21992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetManager()->RemoveObserver(this);
22002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Called from here rather than in ~AutofillDialogControllerImpl as this
22027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // relies on virtual methods that change to their base class in the dtor.
22037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  MaybeShowCreditCardBubble();
22047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
22052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delete this;
22062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
22072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)std::vector<DialogNotification> AutofillDialogControllerImpl::
2209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    CurrentNotifications() {
22102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<DialogNotification> notifications;
22112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
221258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // TODO(dbeam): figure out a way to dismiss this error after a while.
221358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (wallet_error_notification_)
221458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    notifications.push_back(*wallet_error_notification_);
2215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (IsSubmitPausedOn(wallet::VERIFY_CVV)) {
2217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    notifications.push_back(DialogNotification(
2218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        DialogNotification::REQUIRED_ACTION,
2219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_VERIFY_CVV)));
22202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
22212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!wallet_server_validation_recoverable_) {
2223a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    notifications.push_back(DialogNotification(
2224a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        DialogNotification::REQUIRED_ACTION,
22257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        l10n_util::GetStringUTF16(
22267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            IDS_AUTOFILL_DIALOG_FAILED_TO_SAVE_WALLET_DATA)));
2227a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
2228a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (choose_another_instrument_or_address_) {
2230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    notifications.push_back(DialogNotification(
2231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        DialogNotification::REQUIRED_ACTION,
22327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        l10n_util::GetStringUTF16(
22337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            IDS_AUTOFILL_DIALOG_CHOOSE_DIFFERENT_WALLET_INSTRUMENT)));
2234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
2235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2236d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (notifications.empty() && MenuModelForAccountChooser()) {
2237d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    base::string16 text = l10n_util::GetStringUTF16(
2238d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        IsManuallyEditingAnySection() ?
2239d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            IDS_AUTOFILL_DIALOG_SAVE_DETAILS_IN_WALLET :
2240d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            IDS_AUTOFILL_DIALOG_USE_WALLET);
2241d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DialogNotification notification(
2242d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        DialogNotification::WALLET_USAGE_CONFIRMATION,
2243d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        text);
2244d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    notification.set_tooltip_text(
2245d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        l10n_util::GetStringUTF16(
2246d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            IDS_AUTOFILL_DIALOG_SAVE_IN_WALLET_TOOLTIP));
2247d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    notification.set_checked(IsPayingWithWallet());
2248d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    notifications.push_back(notification);
2249d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
2250d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2251d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (IsPayingWithWallet() && !wallet::IsUsingProd()) {
2252d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    notifications.push_back(DialogNotification(
2253d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        DialogNotification::DEVELOPER_WARNING,
2254d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_NOT_PROD_WARNING)));
2255d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
2256d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2257d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!invoked_from_same_origin_) {
2258d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    notifications.push_back(DialogNotification(
2259d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        DialogNotification::SECURITY_WARNING,
2260d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        l10n_util::GetStringFUTF16(IDS_AUTOFILL_DIALOG_SITE_WARNING,
22615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   base::UTF8ToUTF16(source_url_.host()))));
2262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
2263eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
22642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return notifications;
22652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
22662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
226758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::LinkClicked(const GURL& url) {
226858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  OpenTabWithUrl(url);
226958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
227058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2271a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void AutofillDialogControllerImpl::SignInLinkClicked() {
22723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ScopedViewUpdates updates(view_.get());
22733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
22740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (SignedInState() == NOT_CHECKED) {
22750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    handling_use_wallet_link_click_ = true;
2276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    account_chooser_model_->SelectWalletAccount(0);
2277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    FetchWalletCookie();
22780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  } else if (signin_registrar_.IsEmpty()) {
2279a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    // Start sign in.
22804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    waiting_for_explicit_sign_in_response_ = true;
2281a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    content::Source<content::NavigationController> source(view_->ShowSignIn());
2282a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    signin_registrar_.Add(
2283a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, source);
22842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2285a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    GetMetricLogger().LogDialogUiEvent(
228658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        AutofillMetrics::DIALOG_UI_SIGNIN_SHOWN);
2287a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  } else {
22884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    waiting_for_explicit_sign_in_response_ = false;
2289a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    HideSignIn();
2290a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
22915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
22925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  view_->UpdateAccountChooser();
22935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  view_->UpdateButtonStrip();
22942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
22952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::NotificationCheckboxStateChanged(
2297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DialogNotification::Type type, bool checked) {
2298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (type == DialogNotification::WALLET_USAGE_CONFIRMATION) {
2299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (checked) {
2300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      account_chooser_model_->SelectWalletAccount(
2301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          GetWalletClient()->user_index());
2302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    } else {
2303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      account_chooser_model_->SelectUseAutofill();
2304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
2305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    AccountChoiceChanged();
23072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
23092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LegalDocumentLinkClicked(
231158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const gfx::Range& range) {
2312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < legal_document_link_ranges_.size(); ++i) {
2313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (legal_document_link_ranges_[i] == range) {
2314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OpenTabWithUrl(wallet_items_->legal_documents()[i]->url());
2315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
2316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
23172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NOTREACHED();
23202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
23212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2322ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool AutofillDialogControllerImpl::OnCancel() {
2323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HidePopup();
232458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!is_submitting_)
23257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    LogOnCancelMetrics();
2326f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  callback_.Run(
2327f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      AutofillClient::AutocompleteResultErrorCancel, base::string16(), NULL);
2328ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return true;
2329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2331ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool AutofillDialogControllerImpl::OnAccept() {
23320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScopedViewUpdates updates(view_.get());
2333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  choose_another_instrument_or_address_ = false;
23347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  wallet_server_validation_recoverable_ = true;
2335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HidePopup();
233658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
233758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // This must come before SetIsSubmitting().
2338eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (IsPayingWithWallet()) {
23398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // In the VERIFY_CVV case, hold onto the previously submitted cardholder
23408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // name.
23418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    if (!IsSubmitPausedOn(wallet::VERIFY_CVV)) {
23428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      submitted_cardholder_name_ =
23438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)          GetValueFromSection(SECTION_CC_BILLING, NAME_BILLING_FULL);
23448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
23458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      // Snag the last four digits of the backing card now as it could be wiped
23468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      // out if a CVC challenge happens.
23478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      if (ActiveInstrument()) {
23488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        backing_card_last_four_ = ActiveInstrument()->TypeAndLastFourDigits();
23498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      } else {
2350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        FieldValueMap output;
23518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        view_->GetUserInput(SECTION_CC_BILLING, &output);
23528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        CreditCard card;
23538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        GetBillingInfoFromOutputs(output, &card, NULL, NULL);
23548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        backing_card_last_four_ = card.TypeAndLastFourDigits();
23558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      }
23568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    }
23578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    DCHECK(!submitted_cardholder_name_.empty());
23588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    DCHECK(!backing_card_last_four_.empty());
2359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
2360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetIsSubmitting(true);
236258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (IsSubmitPausedOn(wallet::VERIFY_CVV)) {
2364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DCHECK(!active_instrument_id_.empty());
23650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    full_wallet_.reset();
2366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GetWalletClient()->AuthenticateInstrument(
2367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        active_instrument_id_,
23685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::UTF16ToUTF8(view_->GetCvc()));
23690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    view_->UpdateOverlay();
2370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else if (IsPayingWithWallet()) {
23710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    AcceptLegalTerms();
2372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
23732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FinishSubmit();
2374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2375ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2376ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return false;
23772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
23782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Profile* AutofillDialogControllerImpl::profile() {
23802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return profile_;
23812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
23822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2383bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochcontent::WebContents* AutofillDialogControllerImpl::GetWebContents() {
2384bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  return web_contents();
23852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
23862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
23882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// AutofillPopupDelegate implementation.
23892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogControllerImpl::OnPopupShown() {
23914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ScopedViewUpdates update(view_.get());
23924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  view_->UpdateErrorBubble();
23934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
239458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogPopupEvent(AutofillMetrics::DIALOG_POPUP_SHOWN);
23952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
23962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogControllerImpl::OnPopupHidden() {}
2398424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void AutofillDialogControllerImpl::DidSelectSuggestion(
2400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const base::string16& value,
2401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    int identifier) {
24022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(estade): implement.
24032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
24042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void AutofillDialogControllerImpl::DidAcceptSuggestion(
2406a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& value,
2407a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int identifier) {
24085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK_NE(UNKNOWN_TYPE, popup_input_type_);
24095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Because |HidePopup()| can be called from |UpdateSection()|, remember the
24105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // type of the input for later here.
24115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const ServerFieldType popup_input_type = popup_input_type_;
24125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
24133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ScopedViewUpdates updates(view_.get());
2414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<DataModelWrapper> wrapper;
2415effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2416effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (static_cast<size_t>(identifier) < popup_guids_.size()) {
2417effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const PersonalDataManager::GUIDPair& pair = popup_guids_[identifier];
2418effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (common::IsCreditCardType(popup_input_type)) {
2419effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      wrapper.reset(new AutofillCreditCardWrapper(
2420effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          GetManager()->GetCreditCardByGUID(pair.first)));
2421effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    } else {
2422effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      wrapper.reset(new AutofillProfileWrapper(
2423effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          GetManager()->GetProfileByGUID(pair.first),
2424effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          AutofillType(popup_input_type),
2425effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          pair.second));
2426effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
2427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
2428effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    wrapper.reset(new I18nAddressDataWrapper(
2429effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        &i18n_validator_suggestions_[identifier - popup_guids_.size()]));
2430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
24312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // If the user hasn't switched away from the default country and |wrapper|'s
2433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // country differs from the |view_|'s, rebuild inputs and restore user data.
2434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const FieldValueMap snapshot = TakeUserInputSnapshot();
2435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool billing_rebuilt = false, shipping_rebuilt = false;
24365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::string16 billing_country =
2438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      wrapper->GetInfo(AutofillType(ADDRESS_BILLING_COUNTRY));
2439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (popup_section_ == ActiveBillingSection() &&
2440116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      !snapshot.count(ADDRESS_BILLING_COUNTRY) &&
2441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      !billing_country.empty()) {
2442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    billing_rebuilt = RebuildInputsForCountry(
2443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        ActiveBillingSection(), billing_country, false);
2444a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
24455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2446a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::string16 shipping_country =
2447a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      wrapper->GetInfo(AutofillType(ADDRESS_HOME_COUNTRY));
2448116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (popup_section_ == SECTION_SHIPPING &&
2449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      !snapshot.count(ADDRESS_HOME_COUNTRY) &&
2450a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      !shipping_country.empty()) {
2451a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    shipping_rebuilt = RebuildInputsForCountry(
2452a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        SECTION_SHIPPING, shipping_country, false);
2453a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
2454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (billing_rebuilt || shipping_rebuilt) {
2456a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    RestoreUserInputFromSnapshot(snapshot);
2457a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (billing_rebuilt)
2458a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      UpdateSection(ActiveBillingSection());
2459a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (shipping_rebuilt)
2460a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      UpdateSection(SECTION_SHIPPING);
24615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
24625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2463116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(SectionIsActive(popup_section_));
2464116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  wrapper->FillInputs(MutableRequestedFieldsForSection(popup_section_));
2465116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  view_->FillSection(popup_section_, popup_input_type);
24662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetMetricLogger().LogDialogPopupEvent(
246858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      AutofillMetrics::DIALOG_POPUP_FORM_FILLED);
24692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(estade): not sure why it's necessary to do this explicitly.
24712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HidePopup();
24722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
24732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void AutofillDialogControllerImpl::RemoveSuggestion(
2475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& value,
2476a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int identifier) {
24772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(estade): implement.
24782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
24792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::ClearPreviewedForm() {
24812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(estade): implement.
24822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
24832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
24852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// content::NotificationObserver implementation.
24862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::Observe(
24882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int type,
24892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::NotificationSource& source,
24902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::NotificationDetails& details) {
24912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(type, content::NOTIFICATION_NAV_ENTRY_COMMITTED);
24922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::LoadCommittedDetails* load_details =
24932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::Details<content::LoadCommittedDetails>(details).ptr();
2494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  size_t user_index = 0;
2495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (IsSignInContinueUrl(load_details->entry->GetVirtualURL(), &user_index)) {
24965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GetWalletClient()->SetUserIndex(user_index);
2497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    FetchWalletCookie();
24981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
24991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // NOTE: |HideSignIn()| may delete the WebContents which doesn't expect to
25001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // be deleted while committing a nav entry. Just call |HideSignIn()| later.
25011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
25021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        base::Bind(&AutofillDialogControllerImpl::HideSignIn,
25031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                   base::Unretained(this)));
25042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
25052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
25062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
25082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// SuggestionsMenuModelDelegate implementation.
25092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::SuggestionItemSelected(
2511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SuggestionsMenuModel* model,
2512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    size_t index) {
25133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ScopedViewUpdates updates(view_.get());
25143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (model->GetItemKeyAt(index) == kManageItemsKey) {
251690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    GURL url;
251790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (!IsPayingWithWallet()) {
2518a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      DCHECK(IsAutofillEnabled());
251990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GURL settings_url(chrome::kChromeUISettingsURL);
252090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      url = settings_url.Resolve(chrome::kAutofillSubPage);
252190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    } else {
252258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      // Reset |last_wallet_items_fetch_timestamp_| to ensure that the Wallet
252358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      // data is refreshed as soon as the user switches back to this tab after
252458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      // potentially editing his data.
252558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      last_wallet_items_fetch_timestamp_ = base::TimeTicks();
2526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      size_t user_index = GetWalletClient()->user_index();
252790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      url = SectionForSuggestionsMenuModel(*model) == SECTION_SHIPPING ?
25284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          wallet::GetManageAddressesUrl(user_index) :
25294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          wallet::GetManageInstrumentsUrl(user_index);
253090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
253190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    OpenTabWithUrl(url);
2533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
2534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  model->SetCheckedIndex(index);
2537eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DialogSection section = SectionForSuggestionsMenuModel(*model);
25385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2539eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ResetSectionInput(section);
2540eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ShowEditUiIfBadSuggestion(section);
2541eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  UpdateSection(section);
2542d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  view_->UpdateNotificationArea();
2543eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  UpdateForErrors();
2544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LogSuggestionItemSelectedMetric(*model);
25462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
25472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
25492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// wallet::WalletClientDelegate implementation.
25502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const AutofillMetrics& AutofillDialogControllerImpl::GetMetricLogger() const {
25522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return metric_logger_;
25532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
25542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string AutofillDialogControllerImpl::GetRiskData() const {
2556eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(!risk_data_.empty());
2557eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return risk_data_;
25582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
25592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstd::string AutofillDialogControllerImpl::GetWalletCookieValue() const {
25617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return wallet_cookie_value_;
25627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
25637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2564a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool AutofillDialogControllerImpl::IsShippingAddressRequired() const {
2565a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return cares_about_shipping_;
2566a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
2567a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
25682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidAcceptLegalDocuments() {
256990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(is_submitting_ && IsPayingWithWallet());
257090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  has_accepted_legal_documents_ = true;
257190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  LoadRiskFingerprintData();
25722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
25732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidAuthenticateInstrument(bool success) {
2575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(is_submitting_ && IsPayingWithWallet());
2576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // TODO(dbeam): use the returned full wallet. http://crbug.com/224992
2578eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (success) {
25792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetFullWallet();
2580eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else {
25817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    DisableWallet(wallet::WalletClient::UNKNOWN_ERROR);
2582eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SuggestionsUpdated();
2583eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
25842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
25852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidGetFullWallet(
25872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<wallet::FullWallet> full_wallet) {
2588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(is_submitting_ && IsPayingWithWallet());
25893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ScopedViewUpdates updates(view_.get());
2590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  full_wallet_ = full_wallet.Pass();
25922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (full_wallet_->required_actions().empty()) {
25942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FinishSubmit();
2595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
2596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2598868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  switch (full_wallet_->required_actions()[0]) {
2599868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case wallet::CHOOSE_ANOTHER_INSTRUMENT_OR_ADDRESS:
2600868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      choose_another_instrument_or_address_ = true;
2601868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SetIsSubmitting(false);
2602eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      GetWalletItems();
2603868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
2604868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2605868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case wallet::VERIFY_CVV:
2606868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SuggestionsUpdated();
2607868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
2608868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2609868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    default:
26107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      DisableWallet(wallet::WalletClient::UNKNOWN_ERROR);
26118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      return;
2612868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
26138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
26148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  view_->UpdateNotificationArea();
26158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  view_->UpdateButtonStrip();
26168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  view_->UpdateOverlay();
2617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AutofillDialogControllerImpl::OnPassiveSigninSuccess() {
2620f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FetchWalletCookie();
2621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::OnPassiveSigninFailure(
2624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const GoogleServiceAuthError& error) {
26254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  signin_helper_.reset();
2626f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  passive_failed_ = true;
2627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2628f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (handling_use_wallet_link_click_ ||
2629f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GetWalletClient()->user_index() != 0) {
2630f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // TODO(estade): When a secondary account is selected and fails passive
2631f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // auth, we show a sign in page. Currently we show the generic add account
2632f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // page, but we should instead show sign in for the selected account.
2633f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // http://crbug.com/323327
2634f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SignInLinkClicked();
2635f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    handling_use_wallet_link_click_ = false;
2636f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
2637f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2638f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  OnWalletSigninError();
2639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
26417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AutofillDialogControllerImpl::OnDidFetchWalletCookieValue(
26427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const std::string& cookie_value) {
26437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  wallet_cookie_value_ = cookie_value;
26447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  signin_helper_.reset();
26457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  GetWalletItems();
26462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
26472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidGetWalletItems(
26492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<wallet::WalletItems> wallet_items) {
2650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  legal_documents_text_.clear();
2651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  legal_document_link_ranges_.clear();
265290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  has_accepted_legal_documents_ = false;
26532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  wallet_items_ = wallet_items.Pass();
2655f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2656a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (wallet_items_ && !wallet_items_->ObfuscatedGaiaId().empty()) {
2657f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Making sure the user index is in sync shouldn't be necessary, but is an
2658f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // extra precaution. But if there is no active account (such as in the
2659f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // PASSIVE_AUTH case), stick with the old active account.
26605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GetWalletClient()->SetUserIndex(wallet_items_->active_account_index());
2661f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2662a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    std::vector<std::string> usernames;
2663a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    for (size_t i = 0; i < wallet_items_->gaia_accounts().size(); ++i) {
2664a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      usernames.push_back(wallet_items_->gaia_accounts()[i]->email_address());
2665a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
2666a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    account_chooser_model_->SetWalletAccounts(
2667a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        usernames, wallet_items_->active_account_index());
2668f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
2669f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2670116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (wallet_items_) {
2671116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    shipping_country_combobox_model_->SetCountries(
2672116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        *GetManager(),
2673116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        base::Bind(WalletCountryFilter,
2674116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   acceptable_shipping_countries_,
2675116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   wallet_items_->allowed_shipping_countries()));
2676116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2677116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // If the site doesn't ship to any of the countries Wallet allows shipping
2678116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // to, the merchant is not supported. (Note we generally shouldn't get here
2679116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // as such a merchant wouldn't make it onto the Wallet whitelist.)
2680116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (shipping_country_combobox_model_->GetItemCount() == 0)
2681116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      DisableWallet(wallet::WalletClient::UNSUPPORTED_MERCHANT);
2682116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
2683116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
26841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ConstructLegalDocumentsText();
26850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  OnWalletOrSigninUpdate();
26862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
26872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2688ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid AutofillDialogControllerImpl::OnDidSaveToWallet(
26892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& instrument_id,
2690ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const std::string& address_id,
26917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::vector<wallet::RequiredAction>& required_actions,
26927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::vector<wallet::FormFieldError>& form_field_errors) {
2693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(is_submitting_ && IsPayingWithWallet());
2694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2695a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (required_actions.empty()) {
2696ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (!address_id.empty())
2697ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      active_address_id_ = address_id;
2698ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (!instrument_id.empty())
2699ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      active_instrument_id_ = instrument_id;
2700ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    GetFullWallet();
2701a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  } else {
27027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    OnWalletFormFieldError(form_field_errors);
2703a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    HandleSaveOrUpdateRequiredActions(required_actions);
2704a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
27052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
27062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnWalletError(
27082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    wallet::WalletClient::ErrorType error_type) {
27097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DisableWallet(error_type);
27102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
27112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
27132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// PersonalDataManagerObserver implementation.
27142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnPersonalDataChanged() {
271690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (is_submitting_)
271790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
271890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SuggestionsUpdated();
27202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
27212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// AccountChooserModelDelegate implementation.
2724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
27252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::AccountChoiceChanged() {
27263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ScopedViewUpdates updates(view_.get());
27274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  wallet::WalletClient* client = GetWalletClient();
27283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (is_submitting_)
27305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    client->CancelRequest();
2731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetIsSubmitting(false);
2733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
27344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  size_t selected_user_index =
2735a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      account_chooser_model_->GetActiveWalletAccountIndex();
2736a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (account_chooser_model_->WalletIsSelected() &&
27374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      client->user_index() != selected_user_index) {
27385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    client->SetUserIndex(selected_user_index);
2739f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Clear |wallet_items_| so we don't try to restore the selected instrument
2740f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // and address.
2741f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    wallet_items_.reset();
27424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    GetWalletItems();
27434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  } else {
27444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SuggestionsUpdated();
27454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    UpdateAccountChooserView();
27464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
27482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2749f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AutofillDialogControllerImpl::AddAccount() {
2750f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SignInLinkClicked();
2751f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
2752f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::UpdateAccountChooserView() {
2754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (view_) {
27553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ScopedViewUpdates updates(view_.get());
2756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    view_->UpdateAccountChooser();
2757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    view_->UpdateNotificationArea();
27582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
27592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
27602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
27622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::HandleKeyPressEventInInput(
27642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::NativeWebKeyboardEvent& event) {
2765868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (popup_controller_.get())
27662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return popup_controller_->HandleKeyPressEvent(event);
27672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
27692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
27702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool AutofillDialogControllerImpl::IsSubmitPausedOn(
27728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    wallet::RequiredAction required_action) const {
27738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return full_wallet_ && full_wallet_->HasRequiredAction(required_action);
27748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
27758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2776ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerImpl::ShowNewCreditCardBubble(
2777ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    scoped_ptr<CreditCard> new_card,
2778ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    scoped_ptr<AutofillProfile> billing_profile) {
27790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  NewCreditCardBubbleController::Show(web_contents(),
2780ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                      new_card.Pass(),
2781ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                      billing_profile.Pass());
2782ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
2783ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
278458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::SubmitButtonDelayBegin() {
278558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  submit_button_delay_timer_.Start(
278658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      FROM_HERE,
278758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      base::TimeDelta::FromMilliseconds(kSubmitButtonDelayMs),
278858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      this,
278958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      &AutofillDialogControllerImpl::OnSubmitButtonDelayEnd);
279058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
279158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
279258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::SubmitButtonDelayEndForTesting() {
279358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(submit_button_delay_timer_.IsRunning());
279458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  submit_button_delay_timer_.user_task().Run();
279558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  submit_button_delay_timer_.Stop();
279658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
279758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
27984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AutofillDialogControllerImpl::
27994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ClearLastWalletItemsFetchTimestampForTesting() {
28004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  last_wallet_items_fetch_timestamp_ = base::TimeTicks();
28014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
28024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2803f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)AccountChooserModel* AutofillDialogControllerImpl::
2804f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    AccountChooserModelForTesting() {
2805a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return account_chooser_model_.get();
28061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
28071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2808f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool AutofillDialogControllerImpl::IsSignInContinueUrl(
2809f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const GURL& url,
2810f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    size_t* user_index) const {
2811f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return wallet::IsSignInContinueUrl(url, user_index);
28121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
28131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)AutofillDialogControllerImpl::AutofillDialogControllerImpl(
2815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::WebContents* contents,
2816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const FormData& form_structure,
2817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const GURL& source_url,
2818f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const AutofillClient::ResultCallback& callback)
2819bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    : WebContentsObserver(contents),
2820bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      profile_(Profile::FromBrowserContext(contents->GetBrowserContext())),
2821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      initial_user_state_(AutofillMetrics::DIALOG_USER_STATE_UNKNOWN),
282258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      form_structure_(form_structure),
2823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      invoked_from_same_origin_(true),
2824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      source_url_(source_url),
2825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      callback_(callback),
28264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      wallet_client_(profile_->GetRequestContext(), this, source_url),
28270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      wallet_items_requested_(false),
28280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      handling_use_wallet_link_click_(false),
2829f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      passive_failed_(false),
2830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      suggested_cc_(this),
2831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      suggested_billing_(this),
2832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      suggested_cc_billing_(this),
2833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      suggested_shipping_(this),
2834868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      cares_about_shipping_(true),
28355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      popup_input_type_(UNKNOWN_TYPE),
2836116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      popup_section_(SECTION_MIN),
28374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      waiting_for_explicit_sign_in_response_(false),
283890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      has_accepted_legal_documents_(false),
2839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      is_submitting_(false),
2840868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      choose_another_instrument_or_address_(false),
28417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      wallet_server_validation_recoverable_(true),
2842bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      data_was_passed_back_(false),
2843ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      was_ui_latency_logged_(false),
28445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      card_generated_animation_(2000, 60, this),
28455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      weak_ptr_factory_(this) {
2846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback_.is_null());
2847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutofillDialogView* AutofillDialogControllerImpl::CreateView() {
28502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return AutofillDialogView::Create(this);
28512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
28522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2853a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)PersonalDataManager* AutofillDialogControllerImpl::GetManager() const {
28542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return PersonalDataManagerFactory::GetForProfile(profile_);
28552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
28562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)AddressValidator* AutofillDialogControllerImpl::GetValidator() {
28585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return validator_.get();
28595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
28605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2861f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const wallet::WalletClient* AutofillDialogControllerImpl::GetWalletClient()
2862f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const {
2863f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return const_cast<AutofillDialogControllerImpl*>(this)->GetWalletClient();
2864f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
2865f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
28662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)wallet::WalletClient* AutofillDialogControllerImpl::GetWalletClient() {
28672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return &wallet_client_;
28682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
28692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::IsPayingWithWallet() const {
2871a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return account_chooser_model_->WalletIsSelected() &&
2872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         SignedInState() == SIGNED_IN;
28732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
28742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
287590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AutofillDialogControllerImpl::LoadRiskFingerprintData() {
287690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  risk_data_.clear();
287790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
287890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  uint64 obfuscated_gaia_id = 0;
2879a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool success = base::StringToUint64(wallet_items_->ObfuscatedGaiaId(),
288090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                      &obfuscated_gaia_id);
288190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(success);
288290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
288390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect window_bounds;
288490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  window_bounds = GetBaseWindowForWebContents(web_contents())->GetBounds();
288590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
288690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PrefService* user_prefs = profile_->GetPrefs();
288790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string charset = user_prefs->GetString(::prefs::kDefaultCharset);
288890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string accept_languages =
288990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_prefs->GetString(::prefs::kAcceptLanguages);
289090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::Time install_time = base::Time::FromTimeT(
2891116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      g_browser_process->metrics_service()->GetInstallDate());
289290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
289390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  risk::GetFingerprint(
2894010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      obfuscated_gaia_id, window_bounds, web_contents(),
289590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      chrome::VersionInfo().Version(), charset, accept_languages, install_time,
2896a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      g_browser_process->GetApplicationLocale(), GetUserAgent(),
289790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&AutofillDialogControllerImpl::OnDidLoadRiskFingerprintData,
289890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr()));
289990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
290090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
290190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidLoadRiskFingerprintData(
290290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    scoped_ptr<risk::Fingerprint> fingerprint) {
290390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(AreLegalDocumentsCurrent());
290490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
290590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string proto_data;
290690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  fingerprint->SerializeToString(&proto_data);
2907a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::Base64Encode(proto_data, &risk_data_);
290890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2909eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SubmitWithWallet();
291090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
291190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::OpenTabWithUrl(const GURL& url) {
2913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chrome::NavigateParams params(
2914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      chrome::FindBrowserWithWebContents(web_contents()),
2915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      url,
2916f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      content::PAGE_TRANSITION_LINK);
2917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  params.disposition = NEW_FOREGROUND_TAB;
2918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chrome::Navigate(&params);
29192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
29202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DialogSection AutofillDialogControllerImpl::ActiveBillingSection() const {
29225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return IsPayingWithWallet() ? SECTION_CC_BILLING : SECTION_BILLING;
29235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
29245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2925eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AutofillDialogControllerImpl::IsEditingExistingData(
2926eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DialogSection section) const {
2927eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return section_editing_state_.count(section) > 0;
2928eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
2929eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2930eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AutofillDialogControllerImpl::IsManuallyEditingSection(
2931eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DialogSection section) const {
2932eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return IsEditingExistingData(section) ||
2933eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         SuggestionsMenuModelForSection(section)->
2934eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch             GetItemKeyForCheckedItem() == kAddNewItemKey;
2935eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
2936eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2937868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void AutofillDialogControllerImpl::OnWalletSigninError() {
2938a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  account_chooser_model_->SetHadWalletSigninError();
29395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GetWalletClient()->CancelRequest();
2940868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  LogDialogLatencyToShow();
2941868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
2942868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
29437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void AutofillDialogControllerImpl::DisableWallet(
29447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    wallet::WalletClient::ErrorType error_type) {
2945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  signin_helper_.reset();
2946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  wallet_items_.reset();
29477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  wallet_errors_.clear();
29485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GetWalletClient()->CancelRequest();
2949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetIsSubmitting(false);
295058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  wallet_error_notification_ = GetWalletError(error_type);
2951a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  account_chooser_model_->SetHadWalletError();
29522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
29532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::SuggestionsUpdated() {
29553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ScopedViewUpdates updates(view_.get());
29563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2957f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const FieldValueMap snapshot = TakeUserInputSnapshot();
2958eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
29592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  suggested_cc_.Reset();
29602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  suggested_billing_.Reset();
29612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  suggested_cc_billing_.Reset();
29622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  suggested_shipping_.Reset();
2963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HidePopup();
2964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  suggested_shipping_.AddKeyedItem(
2966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kSameAsBillingKey,
2967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_USE_BILLING_FOR_SHIPPING));
29682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (IsPayingWithWallet()) {
2970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::vector<wallet::Address*>& addresses =
2971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        wallet_items_->addresses();
29725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
29735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool shipping_same_as_billing = profile_->GetPrefs()->GetBoolean(
29745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ::prefs::kAutofillDialogWalletShippingSameAsBilling);
29755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
29765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (shipping_same_as_billing)
29775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      suggested_shipping_.SetCheckedItem(kSameAsBillingKey);
29785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (size_t i = 0; i < addresses.size(); ++i) {
2980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      std::string key = base::IntToString(i);
298158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      suggested_shipping_.AddKeyedItemWithMinorText(
2982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          key,
2983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          addresses[i]->DisplayName(),
2984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          addresses[i]->DisplayNameDetail());
2985a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      suggested_shipping_.SetEnabled(
2986a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          key,
2987a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          CanAcceptCountry(SECTION_SHIPPING,
2988a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           addresses[i]->country_name_code()));
2989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
29905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // TODO(scr): Move this assignment outside the loop or comment why it
29915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // can't be there.
299258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      const std::string default_shipping_address_id =
299358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          GetIdToSelect(wallet_items_->default_address_id(),
299458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        previous_default_shipping_address_id_,
299558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        previously_selected_shipping_address_id_);
29965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
29975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (!shipping_same_as_billing &&
29985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          addresses[i]->object_id() == default_shipping_address_id) {
2999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        suggested_shipping_.SetCheckedItem(key);
30005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      }
3001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
30022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!IsSubmitPausedOn(wallet::VERIFY_CVV)) {
30042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::vector<wallet::WalletItems::MaskedInstrument*>& instruments =
30052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          wallet_items_->instruments();
300690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      std::string first_active_instrument_key;
300790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      std::string default_instrument_key;
30082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (size_t i = 0; i < instruments.size(); ++i) {
3009a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        bool allowed = IsInstrumentAllowed(*instruments[i]) &&
3010a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            CanAcceptCountry(SECTION_BILLING,
3011a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             instruments[i]->address().country_name_code());
301290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        gfx::Image icon = instruments[i]->CardIcon();
301390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if (!allowed && !icon.IsEmpty()) {
301490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          // Create a grayed disabled icon.
301590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          SkBitmap disabled_bitmap = SkBitmapOperations::CreateHSLShiftedBitmap(
301690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              *icon.ToSkBitmap(), kGrayImageShift);
301790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          icon = gfx::Image(
301890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              gfx::ImageSkia::CreateFrom1xBitmap(disabled_bitmap));
301990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        }
3020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        std::string key = base::IntToString(i);
302158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        suggested_cc_billing_.AddKeyedItemWithMinorTextAndIcon(
3022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            key,
30232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            instruments[i]->DisplayName(),
30242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            instruments[i]->DisplayNameDetail(),
302590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            icon);
302690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        suggested_cc_billing_.SetEnabled(key, allowed);
302790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
302890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if (allowed) {
302990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          if (first_active_instrument_key.empty())
303090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            first_active_instrument_key = key;
303158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
303258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch          const std::string default_instrument_id =
303358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              GetIdToSelect(wallet_items_->default_instrument_id(),
303458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                            previous_default_instrument_id_,
303558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                            previously_selected_instrument_id_);
303658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch          if (instruments[i]->object_id() == default_instrument_id)
303790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            default_instrument_key = key;
3038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
30392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
30402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      suggested_cc_billing_.AddKeyedItem(
3042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          kAddNewItemKey,
3043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_ADD_BILLING_DETAILS));
304490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (!wallet_items_->HasRequiredAction(wallet::SETUP_WALLET)) {
304558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        suggested_cc_billing_.AddKeyedItemWithMinorText(
304690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            kManageItemsKey,
304790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            l10n_util::GetStringUTF16(
30487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                IDS_AUTOFILL_DIALOG_MANAGE_BILLING_DETAILS),
30495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                base::UTF8ToUTF16(wallet::GetManageInstrumentsUrl(0U).host()));
305090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      }
305190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
305290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // Determine which instrument item should be selected.
305390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (!default_instrument_key.empty())
305490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        suggested_cc_billing_.SetCheckedItem(default_instrument_key);
305590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      else if (!first_active_instrument_key.empty())
305690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        suggested_cc_billing_.SetCheckedItem(first_active_instrument_key);
305790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      else
305890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        suggested_cc_billing_.SetCheckedItem(kAddNewItemKey);
3059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
30602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
3061116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    shipping_country_combobox_model_->SetCountries(
3062116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        *GetManager(),
3063116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        base::Bind(AutofillCountryFilter, acceptable_shipping_countries_));
3064116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3065a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (IsAutofillEnabled()) {
3066a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      PersonalDataManager* manager = GetManager();
3067a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const std::vector<CreditCard*>& cards = manager->GetCreditCards();
3068a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
3069a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      for (size_t i = 0; i < cards.size(); ++i) {
3070a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        if (!i18ninput::CardHasCompleteAndVerifiedData(*cards[i]))
3071a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          continue;
3072a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3073a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        suggested_cc_.AddKeyedItemWithIcon(
3074a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            cards[i]->guid(),
3075a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            cards[i]->Label(),
3076a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            rb.GetImageNamed(CreditCard::IconResourceId(cards[i]->type())));
3077cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        suggested_cc_.SetEnabled(
3078cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            cards[i]->guid(),
3079cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            !ShouldDisallowCcType(cards[i]->TypeForDisplay()));
3080eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      }
30812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3082a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const std::vector<AutofillProfile*>& profiles = manager->GetProfiles();
3083a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      std::vector<base::string16> labels;
3084116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      AutofillProfile::CreateDifferentiatingLabels(
3085116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          profiles,
3086116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          g_browser_process->GetApplicationLocale(),
3087116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          &labels);
3088a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      DCHECK_EQ(labels.size(), profiles.size());
3089a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      for (size_t i = 0; i < profiles.size(); ++i) {
3090a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        const AutofillProfile& profile = *profiles[i];
3091cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        if (!i18ninput::AddressHasCompleteAndVerifiedData(
3092f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                profile, g_browser_process->GetApplicationLocale())) {
3093a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          continue;
3094a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        }
3095a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3096a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        // Don't add variants for addresses: name is part of credit card and
3097a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        // we'll just ignore email and phone number variants.
3098a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        suggested_shipping_.AddKeyedItem(profile.guid(), labels[i]);
3099a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        suggested_shipping_.SetEnabled(
3100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            profile.guid(),
3101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            CanAcceptCountry(
3102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                SECTION_SHIPPING,
3103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                base::UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_COUNTRY))));
3104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        if (!profile.GetRawInfo(EMAIL_ADDRESS).empty() &&
3105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            !profile.IsPresentButInvalid(EMAIL_ADDRESS)) {
3106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          suggested_billing_.AddKeyedItem(profile.guid(), labels[i]);
3107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          suggested_billing_.SetEnabled(
3108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              profile.guid(),
3109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              CanAcceptCountry(
3110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  SECTION_BILLING,
3111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  base::UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_COUNTRY))));
3112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        }
31132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
31142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
31152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
31162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    suggested_cc_.AddKeyedItem(
3117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        kAddNewItemKey,
3118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        l10n_util::GetStringUTF16(IsAutofillEnabled() ?
3119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            IDS_AUTOFILL_DIALOG_ADD_CREDIT_CARD :
3120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            IDS_AUTOFILL_DIALOG_ENTER_CREDIT_CARD));
3121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    suggested_cc_.AddKeyedItem(
3122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        kManageItemsKey,
3123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_MANAGE_CREDIT_CARD));
31242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    suggested_billing_.AddKeyedItem(
3125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        kAddNewItemKey,
3126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        l10n_util::GetStringUTF16(IsAutofillEnabled() ?
3127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            IDS_AUTOFILL_DIALOG_ADD_BILLING_ADDRESS :
3128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            IDS_AUTOFILL_DIALOG_ENTER_BILLING_DETAILS));
3129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    suggested_billing_.AddKeyedItem(
3130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        kManageItemsKey,
3131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_MANAGE_BILLING_ADDRESS));
31322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
31332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
31342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  suggested_shipping_.AddKeyedItem(
3135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kAddNewItemKey,
3136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      l10n_util::GetStringUTF16(IsPayingWithWallet() || IsAutofillEnabled() ?
3137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          IDS_AUTOFILL_DIALOG_ADD_SHIPPING_ADDRESS :
3138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          IDS_AUTOFILL_DIALOG_USE_DIFFERENT_SHIPPING_ADDRESS));
3139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
31407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!IsPayingWithWallet()) {
3141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (IsAutofillEnabled()) {
3142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      suggested_shipping_.AddKeyedItem(
3143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          kManageItemsKey,
3144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          l10n_util::GetStringUTF16(
3145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              IDS_AUTOFILL_DIALOG_MANAGE_SHIPPING_ADDRESS));
3146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
31477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  } else if (!wallet_items_->HasRequiredAction(wallet::SETUP_WALLET)) {
314858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    suggested_shipping_.AddKeyedItemWithMinorText(
31497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        kManageItemsKey,
31507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_MANAGE_SHIPPING_ADDRESS),
31515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::UTF8ToUTF16(wallet::GetManageAddressesUrl(0U).host()));
315290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
3153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!IsPayingWithWallet() && IsAutofillEnabled()) {
315590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) {
315690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      DialogSection section = static_cast<DialogSection>(i);
315790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (!SectionIsActive(section))
315890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        continue;
315990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
316090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // Set the starting choice for the menu. First set to the default in case
316190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // the GUID saved in prefs refers to a profile that no longer exists.
316290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      std::string guid;
3163d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      GetDefaultAutofillChoice(section, &guid);
316490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section);
3165d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      model->SetCheckedItem(guid);
3166d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      if (GetAutofillChoice(section, &guid))
3167d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        model->SetCheckedItem(guid);
316890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
3169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
3170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (view_)
3172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    view_->ModelChanged();
3173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) {
3175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ResetSectionInput(static_cast<DialogSection>(i));
3176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
3177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
31785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FieldValueMap::const_iterator billing_it =
31795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      snapshot.find(ADDRESS_BILLING_COUNTRY);
31805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (billing_it != snapshot.end())
31815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RebuildInputsForCountry(ActiveBillingSection(), billing_it->second, true);
31825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
31835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FieldValueMap::const_iterator shipping_it =
31845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      snapshot.find(ADDRESS_HOME_COUNTRY);
31855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (shipping_it != snapshot.end())
31865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RebuildInputsForCountry(SECTION_SHIPPING, shipping_it->second, true);
31875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RestoreUserInputFromSnapshot(snapshot);
3189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) {
3191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DialogSection section = static_cast<DialogSection>(i);
31924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!SectionIsActive(section))
31934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      continue;
31944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ShowEditUiIfBadSuggestion(section);
3196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    UpdateSection(section);
3197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
3198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  UpdateForErrors();
32002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
32012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
32022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::FillOutputForSectionWithComparator(
32032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DialogSection section,
32045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const FormStructure::InputFieldComparator& compare) {
32052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!SectionIsActive(section))
32062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
32072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
32085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DetailInputs inputs;
32095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string country_code = CountryCodeForSection(section);
3210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BuildInputsForSection(section, country_code, &inputs,
3211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        MutableAddressLanguageCodeForSection(section));
32125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<ServerFieldType> types = common::TypesFromInputs(inputs);
32135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
32142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section);
32152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (wrapper) {
32162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Only fill in data that is associated with this section.
32175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    wrapper->FillFormStructure(types, compare, &form_structure_);
32182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
32192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // CVC needs special-casing because the CreditCard class doesn't store or
32202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // handle them. This isn't necessary when filling the combined CC and
32212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // billing section as CVC comes from |full_wallet_| in this case.
32222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (section == SECTION_CC)
322358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      SetOutputForFieldsOfType(CREDIT_CARD_VERIFICATION_CODE, view_->GetCvc());
322458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
322558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // When filling from Wallet data, use the email address associated with the
322658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // account. There is no other email address stored as part of a Wallet
322758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // address.
322858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (section == SECTION_CC_BILLING) {
322958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      SetOutputForFieldsOfType(
3230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          EMAIL_ADDRESS, account_chooser_model_->GetActiveWalletAccountName());
323158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
32322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
32332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The user manually input data. If using Autofill, save the info as new or
32342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // edited data. Always fill local data into |form_structure_|.
3235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    FieldValueMap output;
32362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->GetUserInput(section, &output);
32372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
32382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (section == SECTION_CC) {
32392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreditCard card;
32402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FillFormGroupFromOutputs(output, &card);
32412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
32427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      // The card holder name comes from the billing address section.
32437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      card.SetRawInfo(CREDIT_CARD_NAME,
32444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      GetValueFromSection(SECTION_BILLING, NAME_BILLING_FULL));
32457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
32467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if (ShouldSaveDetailsLocally()) {
3247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        card.set_origin(kAutofillDialogOrigin);
32485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3249d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        std::string guid = GetManager()->SaveImportedCreditCard(card);
3250d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        newly_saved_data_model_guids_[section] = guid;
32517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        DCHECK(!profile()->IsOffTheRecord());
32527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        newly_saved_card_.reset(new CreditCard(card));
32537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      }
32542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      AutofillCreditCardWrapper card_wrapper(&card);
32565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      card_wrapper.FillFormStructure(types, compare, &form_structure_);
32572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
32582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Again, CVC needs special-casing. Fill it in directly from |output|.
325958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      SetOutputForFieldsOfType(
326058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          CREDIT_CARD_VERIFICATION_CODE,
3261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          output[CREDIT_CARD_VERIFICATION_CODE]);
32622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
32632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AutofillProfile profile;
32642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FillFormGroupFromOutputs(output, &profile);
3265a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      profile.set_language_code(AddressLanguageCodeForSection(section));
32662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3267d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      if (ShouldSaveDetailsLocally()) {
32685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        profile.set_origin(RulesAreLoaded(section) ?
32695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            kAutofillDialogOrigin : source_url_.GetOrigin().spec());
32705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3271d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        std::string guid = GetManager()->SaveImportedProfile(profile);
3272d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        newly_saved_data_model_guids_[section] = guid;
3273d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      }
32742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3275d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      AutofillProfileWrapper profile_wrapper(&profile);
32765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      profile_wrapper.FillFormStructure(types, compare, &form_structure_);
32772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
32782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
32792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
32802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
32812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::FillOutputForSection(DialogSection section) {
32827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FillOutputForSectionWithComparator(
32835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      section, base::Bind(common::ServerTypeMatchesField, section));
32842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
32852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool AutofillDialogControllerImpl::FormStructureCaresAboutSection(
3287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DialogSection section) const {
3288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // For now, only SECTION_SHIPPING may be omitted due to a site not asking for
3289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // any of the fields.
3290a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (section == SECTION_SHIPPING)
3291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return cares_about_shipping_;
3292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
32942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
32952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
329658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::SetOutputForFieldsOfType(
329758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ServerFieldType type,
329858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const base::string16& output) {
32992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < form_structure_.field_count(); ++i) {
33002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AutofillField* field = form_structure_.field(i);
330158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (field->Type().GetStorableType() == type)
330258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      field->value = output;
33032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
33042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
33052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::GetValueFromSection(
330790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    DialogSection section,
33083240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    ServerFieldType type) {
330990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(SectionIsActive(section));
331090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
331190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section);
331290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (wrapper)
33133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    return wrapper->GetInfo(AutofillType(type));
3314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3315f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FieldValueMap output;
331690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  view_->GetUserInput(section, &output);
3317f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return output[type];
331890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
331990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool AutofillDialogControllerImpl::CanAcceptCountry(
3321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DialogSection section,
3322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const std::string& country_code) {
332323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DCHECK_EQ(2U, country_code.size());
332423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (section == SECTION_CC_BILLING)
3326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return LowerCaseEqualsASCII(country_code, "us");
3327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CountryComboboxModel* model = CountryComboboxModelForSection(section);
3329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const std::vector<AutofillCountry*>& countries = model->countries();
3330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  for (size_t i = 0; i < countries.size(); ++i) {
3331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (countries[i] && countries[i]->country_code() == country_code)
3332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return true;
3333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
3334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return false;
3336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
3337a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool AutofillDialogControllerImpl::ShouldSuggestProfile(
3339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DialogSection section,
3340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const AutofillProfile& profile) {
3341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::string country_code =
3342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::UTF16ToASCII(profile.GetRawInfo(ADDRESS_HOME_COUNTRY));
3343a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return country_code.empty() || CanAcceptCountry(section, country_code);
3344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
3345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
33462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SuggestionsMenuModel* AutofillDialogControllerImpl::
33472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SuggestionsMenuModelForSection(DialogSection section) {
33482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (section) {
33492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_CC:
33502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return &suggested_cc_;
33512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_BILLING:
33522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return &suggested_billing_;
33532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_SHIPPING:
33542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return &suggested_shipping_;
33552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_CC_BILLING:
33562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return &suggested_cc_billing_;
33572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
33582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
33602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return NULL;
33612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
33622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const SuggestionsMenuModel* AutofillDialogControllerImpl::
3364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SuggestionsMenuModelForSection(DialogSection section) const {
3365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return const_cast<AutofillDialogControllerImpl*>(this)->
3366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SuggestionsMenuModelForSection(section);
3367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
33692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DialogSection AutofillDialogControllerImpl::SectionForSuggestionsMenuModel(
33702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const SuggestionsMenuModel& model) {
33712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (&model == &suggested_cc_)
33722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return SECTION_CC;
33732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (&model == &suggested_billing_)
33752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return SECTION_BILLING;
33762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (&model == &suggested_cc_billing_)
33782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return SECTION_CC_BILLING;
33792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(&model, &suggested_shipping_);
33812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return SECTION_SHIPPING;
33822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
33832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)CountryComboboxModel* AutofillDialogControllerImpl::
33855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CountryComboboxModelForSection(DialogSection section) {
33865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (section == SECTION_BILLING)
3387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return billing_country_combobox_model_.get();
33885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
33895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (section == SECTION_SHIPPING)
3390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return shipping_country_combobox_model_.get();
33915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
33925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return NULL;
33935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
33945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3395effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid AutofillDialogControllerImpl::GetI18nValidatorSuggestions(
3396effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    DialogSection section,
3397effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    ServerFieldType type,
3398effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    std::vector<base::string16>* popup_values,
3399effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    std::vector<base::string16>* popup_labels,
3400effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    std::vector<base::string16>* popup_icons) {
3401effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  AddressField focused_field;
3402116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!i18n::FieldForType(type, &focused_field))
3403effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
3404effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
3405effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  FieldValueMap inputs;
3406effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  view_->GetUserInput(section, &inputs);
3407effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
3408effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  AutofillProfile profile;
3409effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  FillFormGroupFromOutputs(inputs, &profile);
3410effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
3411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<AddressData> user_input =
3412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      i18n::CreateAddressDataFromAutofillProfile(
3413cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          profile, g_browser_process->GetApplicationLocale());
3414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  user_input->language_code = AddressLanguageCodeForSection(section);
3415effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
3416effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  static const size_t kSuggestionsLimit = 10;
3417effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  AddressValidator::Status status = GetValidator()->GetSuggestions(
3418cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      *user_input, focused_field, kSuggestionsLimit,
3419effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      &i18n_validator_suggestions_);
3420effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
3421effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (status != AddressValidator::SUCCESS)
3422effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
3423effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
3424effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  for (size_t i = 0; i < i18n_validator_suggestions_.size(); ++i) {
3425effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    popup_values->push_back(base::UTF8ToUTF16(
3426effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        i18n_validator_suggestions_[i].GetFieldValue(focused_field)));
3427effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
3428effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // Disambiguate the suggestion by showing the smallest administrative
3429effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // region of the suggested address:
3430effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    //    ADMIN_AREA > LOCALITY > DEPENDENT_LOCALITY
3431effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    popup_labels->push_back(base::string16());
3432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    for (int field = DEPENDENT_LOCALITY; field >= ADMIN_AREA; --field) {
3433effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const std::string& field_value =
3434effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          i18n_validator_suggestions_[i].GetFieldValue(
3435effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              static_cast<AddressField>(field));
3436effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      if (focused_field != field && !field_value.empty()) {
3437effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        popup_labels->back().assign(base::UTF8ToUTF16(field_value));
3438effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        break;
3439effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      }
3440effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
3441effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
3442effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  popup_icons->resize(popup_values->size());
3443effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
3444effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
34452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DetailInputs* AutofillDialogControllerImpl::MutableRequestedFieldsForSection(
34462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DialogSection section) {
34472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return const_cast<DetailInputs*>(&RequestedFieldsForSection(section));
34482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
34492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3450a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochstd::string* AutofillDialogControllerImpl::MutableAddressLanguageCodeForSection(
3451a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    DialogSection section) {
3452a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  switch (section) {
3453a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    case SECTION_BILLING:
3454a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    case SECTION_CC_BILLING:
3455a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      return &billing_address_language_code_;
3456a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    case SECTION_SHIPPING:
3457a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      return &shipping_address_language_code_;
3458a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    case SECTION_CC:
3459a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      return NULL;
3460a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
3461a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  NOTREACHED();
3462a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return NULL;
3463a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
3464a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
3465a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochstd::string AutofillDialogControllerImpl::AddressLanguageCodeForSection(
3466a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    DialogSection section) {
3467a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  std::string* language_code = MutableAddressLanguageCodeForSection(section);
3468a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return language_code != NULL ? *language_code : std::string();
3469a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
3470a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
34715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::vector<ServerFieldType> AutofillDialogControllerImpl::
34725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RequestedTypesForSection(DialogSection section) const {
34735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return common::TypesFromInputs(RequestedFieldsForSection(section));
34745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
34755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
34765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string AutofillDialogControllerImpl::CountryCodeForSection(
34775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DialogSection section) {
34785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 country;
34795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
34805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section);
34815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (wrapper) {
34825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    country = wrapper->GetInfo(AutofillType(CountryTypeForSection(section)));
34835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else {
34845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    FieldValueMap outputs;
34855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    view_->GetUserInput(section, &outputs);
34865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    country = outputs[CountryTypeForSection(section)];
34875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
34885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
34895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return AutofillCountry::GetCountryCode(
34905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      country, g_browser_process->GetApplicationLocale());
34915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
34925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
34935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool AutofillDialogControllerImpl::RebuildInputsForCountry(
34945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DialogSection section,
34955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::string16& country_name,
34965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool should_clobber) {
3497a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CountryComboboxModel* model = CountryComboboxModelForSection(section);
3498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!model)
3499a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return false;
3500a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3501a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::string country_code = AutofillCountry::GetCountryCode(
3502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      country_name, g_browser_process->GetApplicationLocale());
3503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(CanAcceptCountry(section, country_code));
35045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
35055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (view_ && !should_clobber) {
35065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    FieldValueMap outputs;
35075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    view_->GetUserInput(section, &outputs);
35085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
35095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // If |country_name| is the same as the view, no-op and let the caller know.
35105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (outputs[CountryTypeForSection(section)] == country_name)
35115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return false;
35125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
35135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
35145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DetailInputs* inputs = MutableRequestedFieldsForSection(section);
35155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  inputs->clear();
3516010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BuildInputsForSection(section, country_code, inputs,
3517010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        MutableAddressLanguageCodeForSection(section));
35180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
35190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (!country_code.empty()) {
35200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    GetValidator()->LoadRules(AutofillCountry::GetCountryCode(
35210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        country_name, g_browser_process->GetApplicationLocale()));
35220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
35230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
35245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
35255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
35265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
35272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::HidePopup() {
3528c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (popup_controller_)
35292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    popup_controller_->Hide();
35305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  popup_input_type_ = UNKNOWN_TYPE;
35312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
35322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3533868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void AutofillDialogControllerImpl::SetEditingExistingData(
3534868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DialogSection section, bool editing) {
3535868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (editing)
3536868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    section_editing_state_.insert(section);
3537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  else
3538868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    section_editing_state_.erase(section);
3539868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
3540868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::IsASuggestionItemKey(
3542868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const std::string& key) const {
3543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return !key.empty() &&
3544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      key != kAddNewItemKey &&
3545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      key != kManageItemsKey &&
3546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      key != kSameAsBillingKey;
3547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
35482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3549a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool AutofillDialogControllerImpl::IsAutofillEnabled() const {
3550a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return profile_->GetPrefs()->GetBoolean(prefs::kAutofillEnabled);
3551a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
3552a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::IsManuallyEditingAnySection() const {
3554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t section = SECTION_MIN; section <= SECTION_MAX; ++section) {
3555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (IsManuallyEditingSection(static_cast<DialogSection>(section)))
3556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return true;
3557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
35582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
35592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
35602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::CreditCardNumberValidityMessage(
35627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const base::string16& number) const {
35637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!number.empty() && !autofill::IsValidCreditCardNumber(number)) {
35647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return l10n_util::GetStringUTF16(
35657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_NUMBER);
35667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
35677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3568cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!IsPayingWithWallet() &&
3569cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ShouldDisallowCcType(CreditCard::TypeForDisplay(
3570cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          CreditCard::GetCreditCardType(number)))) {
3571116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    int ids = IDS_AUTOFILL_DIALOG_VALIDATION_UNACCEPTED_GENERIC_CARD;
3572116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const char* const type = CreditCard::GetCreditCardType(number);
3573116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (type == kAmericanExpressCard)
3574116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ids = IDS_AUTOFILL_DIALOG_VALIDATION_UNACCEPTED_AMEX;
3575116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    else if (type == kDiscoverCard)
3576116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ids = IDS_AUTOFILL_DIALOG_VALIDATION_UNACCEPTED_DISCOVER;
3577116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    else if (type == kMasterCard)
3578116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ids = IDS_AUTOFILL_DIALOG_VALIDATION_UNACCEPTED_MASTERCARD;
3579116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    else if (type == kVisaCard)
3580116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ids = IDS_AUTOFILL_DIALOG_VALIDATION_UNACCEPTED_VISA;
3581116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3582116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return l10n_util::GetStringUTF16(ids);
3583cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
3584cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
35851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::string16 message;
35861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (IsPayingWithWallet() && !wallet_items_->SupportsCard(number, &message))
35871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return message;
35887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
35897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Card number is good and supported.
35907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return base::string16();
35917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
35927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
35937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool AutofillDialogControllerImpl::AllSectionsAreValid() {
3594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t section = SECTION_MIN; section <= SECTION_MAX; ++section) {
3595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!SectionIsValid(static_cast<DialogSection>(section)))
3596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return false;
3597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
3598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
3599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::SectionIsValid(
36027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    DialogSection section) {
3603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!IsManuallyEditingSection(section))
3604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
3605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3606f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FieldValueMap detail_outputs;
3607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  view_->GetUserInput(section, &detail_outputs);
36084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return !InputsAreValid(section, detail_outputs).HasSureErrors();
3609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
36115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool AutofillDialogControllerImpl::RulesAreLoaded(DialogSection section) {
36125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AddressData address_data;
3613116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  address_data.region_code = CountryCodeForSection(section);
36145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AddressValidator::Status status = GetValidator()->ValidateAddress(
3615116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      address_data, NULL, NULL);
36165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return status == AddressValidator::SUCCESS;
36175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
36185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool AutofillDialogControllerImpl::IsCreditCardExpirationValid(
3620868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const base::string16& year,
3621868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const base::string16& month) const {
3622868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // If the expiration is in the past as per the local clock, it's invalid.
3623868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::Time now = base::Time::Now();
3624868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!autofill::IsValidCreditCardExpirationDate(year, month, now))
3625868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
3626868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
36275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const wallet::WalletItems::MaskedInstrument* instrument =
36285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ActiveInstrument();
36295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (instrument) {
3630868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const std::string& locale = g_browser_process->GetApplicationLocale();
3631868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int month_int;
3632868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (base::StringToInt(month, &month_int) &&
3633868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        instrument->status() ==
3634868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            wallet::WalletItems::MaskedInstrument::EXPIRED &&
36353240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        year ==
36363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch            instrument->GetInfo(
36373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                AutofillType(CREDIT_CARD_EXP_4_DIGIT_YEAR), locale) &&
3638868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        month_int == instrument->expiration_month()) {
3639868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // Otherwise, if the user is editing an instrument that's deemed expired
3640868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // by the Online Wallet server, mark it invalid on selection.
3641868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return false;
3642868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
3643868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
3644868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3645868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
3646868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
3647868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3648cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool AutofillDialogControllerImpl::ShouldDisallowCcType(
3649cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const base::string16& type) const {
3650cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (acceptable_cc_types_.empty())
3651cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return false;
3652cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3653cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (acceptable_cc_types_.find(base::i18n::ToUpper(type)) ==
3654cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          acceptable_cc_types_.end()) {
3655cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return true;
3656cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
3657cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3658cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return false;
3659cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
3660cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3661a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool AutofillDialogControllerImpl::HasInvalidAddress(
3662a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const AutofillProfile& profile) {
3663cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<AddressData> address_data =
3664cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      i18n::CreateAddressDataFromAutofillProfile(
3665cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          profile, g_browser_process->GetApplicationLocale());
3666a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3667116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FieldProblemMap problems;
3668116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GetValidator()->ValidateAddress(*address_data, NULL, &problems);
3669a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return !problems.empty();
3670a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
3671a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldUseBillingForShipping() {
3673868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return SectionIsActive(SECTION_SHIPPING) &&
3674868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      suggested_shipping_.GetItemKeyForCheckedItem() == kSameAsBillingKey;
3675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
36772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldSaveDetailsLocally() {
36782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // It's possible that the user checked [X] Save details locally before
36792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // switching payment methods, so only ask the view whether to save details
36802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // locally if that checkbox is showing (currently if not paying with wallet).
3681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Also, if the user isn't editing any sections, there's no data to save
3682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // locally.
3683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return ShouldOfferToSaveInChrome() && view_->SaveDetailsLocally();
3684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::SetIsSubmitting(bool submitting) {
3687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  is_submitting_ = submitting;
3688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
368990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!submitting)
369090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    full_wallet_.reset();
369190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (view_) {
36933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ScopedViewUpdates updates(view_.get());
3694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    view_->UpdateButtonStrip();
369558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    view_->UpdateOverlay();
3696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    view_->UpdateNotificationArea();
3697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
36982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
36992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
370090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool AutofillDialogControllerImpl::AreLegalDocumentsCurrent() const {
370190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return has_accepted_legal_documents_ ||
370290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      (wallet_items_ && wallet_items_->legal_documents().empty());
370390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
370490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
37050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogControllerImpl::AcceptLegalTerms() {
3706cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  content::GeolocationProvider::GetInstance()->UserDidOptIntoLocationServices();
37070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  PrefService* local_state = g_browser_process->local_state();
37080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ListPrefUpdate accepted(
37090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      local_state, ::prefs::kAutofillDialogWalletLocationAcceptance);
37100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  accepted->AppendIfNotPresent(new base::StringValue(
3711a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      account_chooser_model_->GetActiveWalletAccountName()));
371290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3713d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (AreLegalDocumentsCurrent()) {
371490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LoadRiskFingerprintData();
3715d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  } else {
3716d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    GetWalletClient()->AcceptLegalDocuments(
3717d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        wallet_items_->legal_documents(),
37184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        wallet_items_->google_transaction_id());
3719d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
3720eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
3721eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3722eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::SubmitWithWallet() {
3723eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  active_instrument_id_.clear();
3724eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  active_address_id_.clear();
3725eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  full_wallet_.reset();
372690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3727868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const wallet::WalletItems::MaskedInstrument* active_instrument =
3728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ActiveInstrument();
3729a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (!IsManuallyEditingSection(SECTION_CC_BILLING)) {
3730868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    active_instrument_id_ = active_instrument->object_id();
3731a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    DCHECK(!active_instrument_id_.empty());
3732a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
37332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3734868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const wallet::Address* active_address = ActiveShippingAddress();
3735a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (!IsManuallyEditingSection(SECTION_SHIPPING) &&
3736a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      !ShouldUseBillingForShipping() &&
3737a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      IsShippingAddressRequired()) {
3738868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    active_address_id_ = active_address->object_id();
3739a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    DCHECK(!active_address_id_.empty());
37402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
37412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3742a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  scoped_ptr<wallet::Instrument> inputted_instrument =
3743a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      CreateTransientInstrument();
37442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3745a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  scoped_ptr<wallet::Address> inputted_address;
3746a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (active_address_id_.empty() && IsShippingAddressRequired()) {
3747a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (ShouldUseBillingForShipping()) {
374890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      const wallet::Address& address = inputted_instrument ?
3749ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          *inputted_instrument->address() : active_instrument->address();
375090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // Try to find an exact matched shipping address and use it for shipping,
375190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // otherwise save it as a new shipping address. http://crbug.com/225442
375290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      const wallet::Address* duplicated_address =
375390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          FindDuplicateAddress(wallet_items_->addresses(), address);
375490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (duplicated_address) {
375590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        active_address_id_ = duplicated_address->object_id();
375690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        DCHECK(!active_address_id_.empty());
375790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      } else {
375890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        inputted_address.reset(new wallet::Address(address));
375990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        DCHECK(inputted_address->object_id().empty());
376090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      }
3761a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    } else {
3762a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      inputted_address = CreateTransientAddress();
37632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
37642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
37652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
376690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // If there's neither an address nor instrument to save, |GetFullWallet()|
376790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // is called when the risk fingerprint is loaded.
3768a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!active_instrument_id_.empty() &&
3769a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      (!active_address_id_.empty() || !IsShippingAddressRequired())) {
3770eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    GetFullWallet();
377190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
3772eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
377390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
37745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GetWalletClient()->SaveToWallet(
37755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      inputted_instrument.Pass(),
37765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      inputted_address.Pass(),
37775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      IsEditingExistingData(SECTION_CC_BILLING) ? active_instrument : NULL,
37785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      IsEditingExistingData(SECTION_SHIPPING) ? active_address : NULL);
37792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
37802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3781a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)scoped_ptr<wallet::Instrument> AutofillDialogControllerImpl::
3782a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    CreateTransientInstrument() {
3783a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (!active_instrument_id_.empty())
3784a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    return scoped_ptr<wallet::Instrument>();
3785a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
3786f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FieldValueMap output;
3787a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  view_->GetUserInput(SECTION_CC_BILLING, &output);
3788a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
3789a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreditCard card;
3790a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  AutofillProfile profile;
3791a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 cvc;
3792a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  GetBillingInfoFromOutputs(output, &card, &cvc, &profile);
37935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CanonicalizeState(validator_.get(), &profile);
3794a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
3795a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return scoped_ptr<wallet::Instrument>(
3796a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      new wallet::Instrument(card, cvc, profile));
3797a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
3798a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
3799a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)scoped_ptr<wallet::Address>AutofillDialogControllerImpl::
3800a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    CreateTransientAddress() {
3801a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // If not using billing for shipping, just scrape the view.
3802f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FieldValueMap output;
3803a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  view_->GetUserInput(SECTION_SHIPPING, &output);
3804a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
3805a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  AutofillProfile profile;
3806a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  FillFormGroupFromOutputs(output, &profile);
3807a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  profile.set_language_code(shipping_address_language_code_);
38085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CanonicalizeState(validator_.get(), &profile);
3809a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
3810a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return scoped_ptr<wallet::Address>(new wallet::Address(profile));
3811a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
3812a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
38132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::GetFullWallet() {
3814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(is_submitting_);
38152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(IsPayingWithWallet());
38162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(wallet_items_);
38172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!active_instrument_id_.empty());
3818a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(!active_address_id_.empty() || !IsShippingAddressRequired());
38192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<wallet::WalletClient::RiskCapability> capabilities;
3821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  capabilities.push_back(wallet::WalletClient::VERIFY_CVC);
3822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
38232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetWalletClient()->GetFullWallet(wallet::WalletClient::FullWalletRequest(
38242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      active_instrument_id_,
38252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      active_address_id_,
38262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      wallet_items_->google_transaction_id(),
38273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      capabilities,
38283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      wallet_items_->HasRequiredAction(wallet::SETUP_WALLET)));
38292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
38302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3831a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void AutofillDialogControllerImpl::HandleSaveOrUpdateRequiredActions(
3832a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const std::vector<wallet::RequiredAction>& required_actions) {
3833a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  DCHECK(!required_actions.empty());
3834a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
38354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // TODO(ahutter): Investigate if we need to support more generic actions on
38367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // this call such as GAIA_AUTH. See crbug.com/243457.
3837a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  for (std::vector<wallet::RequiredAction>::const_iterator iter =
3838a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)           required_actions.begin();
3839a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       iter != required_actions.end(); ++iter) {
38407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (*iter != wallet::INVALID_FORM_FIELD) {
3841a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      // TODO(dbeam): handle this more gracefully.
38427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      DisableWallet(wallet::WalletClient::UNKNOWN_ERROR);
3843a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
3844a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
3845a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetIsSubmitting(false);
3846a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
3847a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
38482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::FinishSubmit() {
384958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (IsPayingWithWallet()) {
385058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ScopedViewUpdates updates(view_.get());
385158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    view_->UpdateOverlay();
385258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
385358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    card_generated_animation_.Start();
385458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
385558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
385658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DoFinishSubmit();
385758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
385858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
385958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::AnimationProgressed(
3860d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const gfx::Animation* animation) {
386158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK_EQ(animation, &card_generated_animation_);
386258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  PushOverlayUpdate();
386358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
386458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
386558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::AnimationEnded(
3866d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const gfx::Animation* animation) {
386758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK_EQ(animation, &card_generated_animation_);
386858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DoFinishSubmit();
386958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
387058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
38715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AutofillDialogControllerImpl::OnAddressValidationRulesLoaded(
38725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& country_code,
38735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool success) {
3874a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Rules may load instantly (during initialization, before the view is
3875a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // even ready). We'll validate when the view is created.
3876a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!view_)
3877a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
3878a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3879a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ScopedViewUpdates updates(view_.get());
3880a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
38815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(dbeam): should we retry on failure?
38825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) {
38835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DialogSection section = static_cast<DialogSection>(i);
3884a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (!SectionIsActive(section) ||
3885a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        CountryCodeForSection(section) != country_code) {
38865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      continue;
3887a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
38885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3889a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (IsManuallyEditingSection(section) &&
3890a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        needs_validation_.count(section)) {
38915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      view_->ValidateSection(section);
38925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      needs_validation_.erase(section);
3893a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    } else if (success) {
3894a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ShowEditUiIfBadSuggestion(section);
3895a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      UpdateSection(section);
38965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
38975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
38985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
38995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
390058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::DoFinishSubmit() {
39012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FillOutputForSection(SECTION_CC);
39022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FillOutputForSection(SECTION_BILLING);
39032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FillOutputForSection(SECTION_CC_BILLING);
3904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
39052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ShouldUseBillingForShipping()) {
39062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FillOutputForSectionWithComparator(
39072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SECTION_BILLING,
39085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::Bind(ServerTypeMatchesShippingField));
39092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FillOutputForSectionWithComparator(
39102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SECTION_CC,
39115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::Bind(ServerTypeMatchesShippingField));
3912a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    FillOutputForSectionWithComparator(
3913a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        SECTION_CC_BILLING,
39145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::Bind(ServerTypeMatchesShippingField));
39152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
39162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FillOutputForSection(SECTION_SHIPPING);
39172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
39182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
39195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (IsPayingWithWallet()) {
39205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (SectionIsActive(SECTION_SHIPPING)) {
39215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      profile_->GetPrefs()->SetBoolean(
39225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          ::prefs::kAutofillDialogWalletShippingSameAsBilling,
39235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          suggested_shipping_.GetItemKeyForCheckedItem() == kSameAsBillingKey);
39245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
3925a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else if (ShouldOfferToSaveInChrome()) {
392690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) {
392790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      DialogSection section = static_cast<DialogSection>(i);
392890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (!SectionIsActive(section))
392990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        continue;
393090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
393190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section);
393290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      std::string item_key = model->GetItemKeyForCheckedItem();
393390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (IsASuggestionItemKey(item_key) || item_key == kSameAsBillingKey) {
3934d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        PersistAutofillChoice(section, item_key);
3935d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      } else if (item_key == kAddNewItemKey && ShouldSaveDetailsLocally()) {
3936d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        DCHECK(newly_saved_data_model_guids_.count(section));
3937d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        PersistAutofillChoice(section, newly_saved_data_model_guids_[section]);
393890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      }
393990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
394058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
394158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    profile_->GetPrefs()->SetBoolean(::prefs::kAutofillDialogSaveData,
394258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                     view_->SaveDetailsLocally());
394390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
394490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3945868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // On a successful submit, if the user manually selected "pay without wallet",
3946868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // stop trying to pay with Wallet on future runs of the dialog. On the other
3947868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // hand, if there was an error that prevented the user from having the choice
3948868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // of using Wallet, leave the pref alone.
394958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!wallet_error_notification_ &&
3950a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      account_chooser_model_->HasAccountsToChoose()) {
3951868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    profile_->GetPrefs()->SetBoolean(
3952868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        ::prefs::kAutofillDialogPayWithoutWallet,
3953a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        !account_chooser_model_->WalletIsSelected());
3954868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
3955868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LogOnFinishSubmitMetrics();
3957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3958868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Callback should be called as late as possible.
3959f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  callback_.Run(AutofillClient::AutocompleteResultSuccess,
3960a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                base::string16(),
3961a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                &form_structure_);
3962bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  data_was_passed_back_ = true;
3963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3964868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // This might delete us.
396558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Hide();
39662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
39672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
396890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AutofillDialogControllerImpl::PersistAutofillChoice(
396990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    DialogSection section,
3970d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const std::string& guid) {
3971a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(!IsPayingWithWallet() && ShouldOfferToSaveInChrome());
397290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue());
397390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  value->SetString(kGuidPrefKey, guid);
397490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
397590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DictionaryPrefUpdate updater(profile()->GetPrefs(),
397690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                               ::prefs::kAutofillDialogAutofillDefault);
397790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::DictionaryValue* autofill_choice = updater.Get();
397890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  autofill_choice->Set(SectionToPrefString(section), value.release());
397990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
398090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
398190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AutofillDialogControllerImpl::GetDefaultAutofillChoice(
398290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    DialogSection section,
3983d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    std::string* guid) {
3984a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(!IsPayingWithWallet() && IsAutofillEnabled());
398590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The default choice is the first thing in the menu that is a suggestion
398690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // item.
398790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section);
398890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  for (int i = 0; i < model->GetItemCount(); ++i) {
3989a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Try the first suggestion item that is enabled.
3990a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (IsASuggestionItemKey(model->GetItemKeyAt(i)) && model->IsEnabledAt(i)) {
3991a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      *guid = model->GetItemKeyAt(i);
3992a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return;
3993a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Fall back to the first non-suggestion key.
3994a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    } else if (!IsASuggestionItemKey(model->GetItemKeyAt(i)) && guid->empty()) {
399590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      *guid = model->GetItemKeyAt(i);
399690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
399790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
399890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
399990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
400090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool AutofillDialogControllerImpl::GetAutofillChoice(DialogSection section,
4001d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                                     std::string* guid) {
4002a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(!IsPayingWithWallet() && IsAutofillEnabled());
400390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const base::DictionaryValue* choices = profile()->GetPrefs()->GetDictionary(
400490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ::prefs::kAutofillDialogAutofillDefault);
400590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!choices)
400690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return false;
400790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
400890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const base::DictionaryValue* choice = NULL;
400990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!choices->GetDictionary(SectionToPrefString(section), &choice))
401090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return false;
401190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
401290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  choice->GetString(kGuidPrefKey, guid);
401390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return true;
401490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
401590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LogOnFinishSubmitMetrics() {
4017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetMetricLogger().LogDialogUiDuration(
4018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Time::Now() - dialog_shown_timestamp_,
4019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      AutofillMetrics::DIALOG_ACCEPTED);
4020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
402158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_ACCEPTED);
4022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillMetrics::DialogDismissalState dismissal_state;
4024a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!IsManuallyEditingAnySection()) {
4025a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    dismissal_state = IsPayingWithWallet() ?
4026a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        AutofillMetrics::DIALOG_ACCEPTED_EXISTING_WALLET_DATA :
4027a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        AutofillMetrics::DIALOG_ACCEPTED_EXISTING_AUTOFILL_DATA;
4028a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else if (IsPayingWithWallet()) {
4029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dismissal_state = AutofillMetrics::DIALOG_ACCEPTED_SAVE_TO_WALLET;
4030a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else if (ShouldSaveDetailsLocally()) {
4031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dismissal_state = AutofillMetrics::DIALOG_ACCEPTED_SAVE_TO_AUTOFILL;
4032a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
4033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dismissal_state = AutofillMetrics::DIALOG_ACCEPTED_NO_SAVE;
4034a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
4035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
403658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogDismissalState(dismissal_state);
4037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
4038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LogOnCancelMetrics() {
404058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_CANCELED);
4041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillMetrics::DialogDismissalState dismissal_state;
4043f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (ShouldShowSignInWebView())
40447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    dismissal_state = AutofillMetrics::DIALOG_CANCELED_DURING_SIGNIN;
40457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  else if (!IsManuallyEditingAnySection())
4046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dismissal_state = AutofillMetrics::DIALOG_CANCELED_NO_EDITS;
4047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else if (AllSectionsAreValid())
4048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dismissal_state = AutofillMetrics::DIALOG_CANCELED_NO_INVALID_FIELDS;
4049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else
4050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dismissal_state = AutofillMetrics::DIALOG_CANCELED_WITH_INVALID_FIELDS;
4051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
405258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogDismissalState(dismissal_state);
4053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetMetricLogger().LogDialogUiDuration(
4055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Time::Now() - dialog_shown_timestamp_,
4056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      AutofillMetrics::DIALOG_CANCELED);
4057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
4058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LogSuggestionItemSelectedMetric(
4060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const SuggestionsMenuModel& model) {
4061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DialogSection section = SectionForSuggestionsMenuModel(model);
4062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillMetrics::DialogUiEvent dialog_ui_event;
4064c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (model.GetItemKeyForCheckedItem() == kAddNewItemKey) {
4065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Selected to add a new item.
4066ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    dialog_ui_event = common::DialogSectionToUiItemAddedEvent(section);
4067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else if (IsASuggestionItemKey(model.GetItemKeyForCheckedItem())) {
4068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Selected an existing item.
4069ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    dialog_ui_event = common::DialogSectionToUiSelectionChangedEvent(section);
4070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
4071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // TODO(estade): add logging for "Manage items" or "Use billing for
4072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // shipping"?
4073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
4074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
4075c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
407658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogUiEvent(dialog_ui_event);
4077c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
4078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LogDialogLatencyToShow() {
4080c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (was_ui_latency_logged_)
4081c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
4082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetMetricLogger().LogDialogLatencyToShow(
4084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Time::Now() - dialog_shown_timestamp_);
4085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  was_ui_latency_logged_ = true;
4086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
4087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
40882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutofillMetrics::DialogInitialUserStateMetric
40892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AutofillDialogControllerImpl::GetInitialUserState() const {
40902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Consider a user to be an Autofill user if the user has any credit cards
4091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // or addresses saved. Check that the item count is greater than 2 because
4092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // an "empty" menu still has the "add new" menu item and "manage" menu item.
40932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool has_autofill_profiles =
4094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      suggested_cc_.GetItemCount() > 2 ||
4095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      suggested_billing_.GetItemCount() > 2;
40962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
40972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (SignedInState() != SIGNED_IN) {
40982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Not signed in.
40992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return has_autofill_profiles ?
41002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AutofillMetrics::DIALOG_USER_NOT_SIGNED_IN_HAS_AUTOFILL :
41012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AutofillMetrics::DIALOG_USER_NOT_SIGNED_IN_NO_AUTOFILL;
41022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
41032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
41042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Signed in.
41052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (wallet_items_->instruments().empty()) {
41062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // No Wallet items.
41072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return has_autofill_profiles ?
41082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AutofillMetrics::DIALOG_USER_SIGNED_IN_NO_WALLET_HAS_AUTOFILL :
41092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AutofillMetrics::DIALOG_USER_SIGNED_IN_NO_WALLET_NO_AUTOFILL;
41102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
41112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
41122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Has Wallet items.
41132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return has_autofill_profiles ?
41142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AutofillMetrics::DIALOG_USER_SIGNED_IN_HAS_WALLET_HAS_AUTOFILL :
41152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AutofillMetrics::DIALOG_USER_SIGNED_IN_HAS_WALLET_NO_AUTOFILL;
41162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
41172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
41187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AutofillDialogControllerImpl::MaybeShowCreditCardBubble() {
4119bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  if (!data_was_passed_back_)
4120bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    return;
4121bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
41227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (newly_saved_card_) {
4123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    scoped_ptr<AutofillProfile> billing_profile;
4124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (IsManuallyEditingSection(SECTION_BILLING)) {
4125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      // Scrape the view as the user's entering or updating information.
4126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      FieldValueMap outputs;
4127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      view_->GetUserInput(SECTION_BILLING, &outputs);
4128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      billing_profile.reset(new AutofillProfile);
4129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      FillFormGroupFromOutputs(outputs, billing_profile.get());
4130a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      billing_profile->set_language_code(billing_address_language_code_);
4131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    } else {
4132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      // Just snag the currently suggested profile.
4133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      std::string item_key = SuggestionsMenuModelForSection(SECTION_BILLING)->
4134ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          GetItemKeyForCheckedItem();
4135ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      AutofillProfile* profile = GetManager()->GetProfileByGUID(item_key);
4136ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      billing_profile.reset(new AutofillProfile(*profile));
4137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
4138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ShowNewCreditCardBubble(newly_saved_card_.Pass(),
4140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                            billing_profile.Pass());
41417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
41427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
41437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!full_wallet_ || !full_wallet_->billing_address())
4145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return;
4146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GeneratedCreditCardBubbleController::Show(
4148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      web_contents(),
4149424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      full_wallet_->TypeAndLastFourDigits(),
41508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      backing_card_last_four_);
41517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
41527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
415358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::OnSubmitButtonDelayEnd() {
415458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!view_)
415558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
415658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ScopedViewUpdates updates(view_.get());
415758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  view_->UpdateButtonStrip();
415858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
415958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AutofillDialogControllerImpl::FetchWalletCookie() {
41614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  net::URLRequestContextGetter* request_context = profile_->GetRequestContext();
41624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  signin_helper_.reset(new wallet::WalletSigninHelper(this, request_context));
41634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  signin_helper_->StartWalletCookieValueFetch();
41644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
41654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
41662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace autofill
4167