autofill_dialog_controller_impl.cc revision 0f1bc08d4cfcc34181b0b5cbf065c40f687bf740
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)
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "apps/shell_window.h"
12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "apps/shell_window_registry.h"
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "apps/ui/native_app_window.h"
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/base64.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.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"
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h"
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/autofill/personal_data_manager_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"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/autofill/autofill_dialog_view.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/autofill/data_model_wrapper.h"
34ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if !defined(OS_ANDROID)
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"
37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_window.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"
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/instrument.h"
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/wallet_address.h"
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/wallet_items.h"
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/wallet_service_url.h"
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/wallet_signin_helper.h"
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_country.h"
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_data_model.h"
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_manager.h"
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_type.h"
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/personal_data_manager.h"
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/phone_number_i18n.h"
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/validation.h"
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_data.h"
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/user_prefs/pref_registry_syncable.h"
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/geolocation_provider.h"
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_controller.h"
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_details.h"
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_entry.h"
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_service.h"
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_types.h"
71ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/browser/render_view_host.h"
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h"
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_view.h"
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/url_constants.h"
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/chromium_strings.h"
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "grit/component_strings.h"
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/generated_resources.h"
78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "grit/platform_locale_settings.h"
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/theme_resources.h"
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/webkit_resources.h"
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/cert_status_flags.h"
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/base/base_window.h"
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/models/combobox_model.h"
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/canvas.h"
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/image/image_skia_operations.h"
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/skia_util.h"
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace autofill {
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kAddNewItemKey[] = "add-new-item";
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kManageItemsKey[] = "manage-items";
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kSameAsBillingKey[] = "same-as-billing";
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// URLs for Wallet error messages.
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kBuyerLegalAddressStatusUrl[] =
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "https://wallet.google.com/manage/settings";
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kKnowYourCustomerStatusUrl[] = "https://wallet.google.com/kyc";
10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Keys for the kAutofillDialogAutofillDefault pref dictionary (do not change
10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// these values).
10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char kGuidPrefKey[] = "guid";
10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This string is stored along with saved addresses and credit cards in the
10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// WebDB, and hence should not be modified, so that it remains consistent over
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// time.
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char kAutofillDialogOrigin[] = "Chrome Autofill dialog";
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// HSL shift to gray out an image.
11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const color_utils::HSL kGrayImageShift = {-1, 0, 0.8};
11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// Limit Wallet items refresh rate to at most once per minute.
11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int64 kWalletItemsRefreshRateSeconds = 60;
11858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// The number of milliseconds to delay enabling the submit button after showing
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// the dialog. This delay prevents users from accidentally clicking the submit
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// button on startup.
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const int kSubmitButtonDelayMs = 1000;
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// A helper class to make sure an AutofillDialogView knows when a series of
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// updates is incoming.
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class ScopedViewUpdates {
1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  explicit ScopedViewUpdates(AutofillDialogView* view) : view_(view) {
1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (view_)
1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      view_->UpdatesStarted();
1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ~ScopedViewUpdates() {
1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (view_)
1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      view_->UpdatesFinished();
1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  AutofillDialogView* view_;
1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScopedViewUpdates);
1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns true if |input| should be used to fill a site-requested |field| which
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is notated with a "shipping" tag, for use when the user has decided to use
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the billing address as the shipping address.
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DetailInputMatchesShippingField(const DetailInput& input,
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const AutofillField& field) {
149b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Equivalent billing field type is used to support UseBillingAsShipping
150b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // usecase.
1513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  ServerFieldType field_type =
152bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      AutofillType::GetEquivalentBillingFieldType(
153bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch          field.Type().GetStorableType());
154b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
155ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return common::InputTypeMatchesFieldType(input, AutofillType(field_type));
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Initializes |form_group| from user-entered data.
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FillFormGroupFromOutputs(const DetailOutputMap& detail_outputs,
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              FormGroup* form_group) {
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (DetailOutputMap::const_iterator iter = detail_outputs.begin();
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter != detail_outputs.end(); ++iter) {
1633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    ServerFieldType type = iter->first->type;
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!iter->second.empty()) {
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (type == ADDRESS_HOME_COUNTRY || type == ADDRESS_BILLING_COUNTRY) {
1663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        form_group->SetInfo(AutofillType(type),
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            iter->second,
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            g_browser_process->GetApplicationLocale());
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      } else {
170424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        form_group->SetRawInfo(
171424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            AutofillType(type).GetStorableType(), iter->second);
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Get billing info from |output| and put it into |card|, |cvc|, and |profile|.
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These outparams are required because |card|/|profile| accept different types
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// of raw info, and CreditCard doesn't save CVCs.
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GetBillingInfoFromOutputs(const DetailOutputMap& output,
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               CreditCard* card,
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               string16* cvc,
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               AutofillProfile* profile) {
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (DetailOutputMap::const_iterator it = output.begin();
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != output.end(); ++it) {
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string16 trimmed;
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TrimWhitespace(it->second, TRIM_ALL, &trimmed);
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Special case CVC as CreditCard just swallows it.
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (it->first->type == CREDIT_CARD_VERIFICATION_CODE) {
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (cvc)
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        cvc->assign(trimmed);
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else if (it->first->type == ADDRESS_HOME_COUNTRY ||
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               it->first->type == ADDRESS_BILLING_COUNTRY) {
1957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if (profile) {
1963240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        profile->SetInfo(AutofillType(it->first->type),
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         trimmed,
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         g_browser_process->GetApplicationLocale());
1997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      }
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Copy the credit card name to |profile| in addition to |card| as
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // wallet::Instrument requires a recipient name for its billing address.
2037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if (card && it->first->type == NAME_FULL)
2047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        card->SetRawInfo(CREDIT_CARD_NAME, trimmed);
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
206ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (common::IsCreditCardType(it->first->type)) {
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (card)
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          card->SetRawInfo(it->first->type, trimmed);
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      } else if (profile) {
210424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        profile->SetRawInfo(
211424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            AutofillType(it->first->type).GetStorableType(), trimmed);
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Returns the containing window for the given |web_contents|. The containing
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// window might be a browser window for a Chrome tab, or it might be a shell
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// window for a platform app.
22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)ui::BaseWindow* GetBaseWindowForWebContents(
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::WebContents* web_contents) {
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (browser)
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return browser->window();
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::NativeWindow native_window =
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents->GetView()->GetTopLevelNativeWindow();
228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  apps::ShellWindow* shell_window =
229ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      apps::ShellWindowRegistry::
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GetShellWindowForNativeWindowAnyProfile(native_window);
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return shell_window->GetBaseWindow();
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Extracts the string value of a field with |type| from |output|. This is
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// useful when you only need the value of 1 input from a section of view inputs.
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)string16 GetValueForType(const DetailOutputMap& output,
2373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                         ServerFieldType type) {
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (DetailOutputMap::const_iterator it = output.begin();
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != output.end(); ++it) {
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (it->first->type == type)
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return it->second;
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return string16();
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Returns a string descriptor for a DialogSection, for use with prefs (do not
24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// change these values).
24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)std::string SectionToPrefString(DialogSection section) {
24990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  switch (section) {
25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case SECTION_CC:
25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return "cc";
25290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case SECTION_BILLING:
25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return "billing";
25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
25690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case SECTION_CC_BILLING:
25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // The SECTION_CC_BILLING section isn't active when using Autofill.
25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      NOTREACHED();
25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return std::string();
26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case SECTION_SHIPPING:
26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return "shipping";
26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NOTREACHED();
26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return std::string();
26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Check if a given MaskedInstrument is allowed for the purchase.
27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool IsInstrumentAllowed(
27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const wallet::WalletItems::MaskedInstrument& instrument) {
272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  switch (instrument.status()) {
273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case wallet::WalletItems::MaskedInstrument::VALID:
274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case wallet::WalletItems::MaskedInstrument::PENDING:
275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case wallet::WalletItems::MaskedInstrument::EXPIRED:
276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case wallet::WalletItems::MaskedInstrument::BILLING_INCOMPLETE:
277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return true;
278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    default:
279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return false;
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Signals that the user has opted in to geolocation services.  Factored out
28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// into a separate method because all interaction with the geolocation provider
28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// needs to happen on the IO thread, which is not the thread
2863240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch// AutofillDialogViewDelegate lives on.
28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserDidOptIntoLocationServices() {
28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::GeolocationProvider::GetInstance()->UserDidOptIntoLocationServices();
28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Returns whether |data_model| is complete, i.e. can fill out all the
29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// |requested_fields|, and verified, i.e. not just automatically aggregated.
29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Incomplete or unverifed data will not be displayed in the dropdown menu.
29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool HasCompleteAndVerifiedData(const AutofillDataModel& data_model,
29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                const DetailInputs& requested_fields) {
29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!data_model.IsVerified())
29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return false;
29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  for (size_t i = 0; i < requested_fields.size(); ++i) {
30058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ServerFieldType type =
30158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        AutofillType(requested_fields[i].type).GetStorableType();
30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (type != ADDRESS_HOME_LINE2 &&
30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        type != CREDIT_CARD_VERIFICATION_CODE &&
30458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        data_model.GetRawInfo(type).empty()) {
30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return false;
30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return true;
31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
312eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Returns true if |profile| has an invalid address, i.e. an invalid state, zip
31358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// code, phone number, or email address. Otherwise returns false. Profiles with
31458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// invalid addresses are not suggested in the dropdown menu for billing and
31558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// shipping addresses.
316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool HasInvalidAddress(const AutofillProfile& profile) {
317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return profile.IsPresentButInvalid(ADDRESS_HOME_STATE) ||
318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         profile.IsPresentButInvalid(ADDRESS_HOME_ZIP) ||
319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         profile.IsPresentButInvalid(PHONE_HOME_WHOLE_NUMBER);
320eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Loops through |addresses_| comparing to |address| ignoring ID. If a match
32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// is not found, NULL is returned.
32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const wallet::Address* FindDuplicateAddress(
32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const std::vector<wallet::Address*>& addresses,
32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const wallet::Address& address) {
32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  for (size_t i = 0; i < addresses.size(); ++i) {
32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (addresses[i]->EqualsIgnoreID(address))
32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return addresses[i];
33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return NULL;
33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool IsCardHolderNameValidForWallet(const string16& name) {
33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::string16 whitespace_collapsed_name = CollapseWhitespace(name, true);
33690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::vector<base::string16> split_name;
33790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::SplitString(whitespace_collapsed_name, ' ', &split_name);
33890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return split_name.size() >= 2;
33990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
34090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)DialogSection SectionFromLocation(wallet::FormFieldError::Location location) {
3427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  switch (location) {
3437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::FormFieldError::PAYMENT_INSTRUMENT:
3447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::FormFieldError::LEGAL_ADDRESS:
3457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return SECTION_CC_BILLING;
3467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::FormFieldError::SHIPPING_ADDRESS:
3487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return SECTION_SHIPPING;
3497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::FormFieldError::UNKNOWN_LOCATION:
3517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      NOTREACHED();
3527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return SECTION_MAX;
3537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  NOTREACHED();
3567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return SECTION_MAX;
3577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
35958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)scoped_ptr<DialogNotification> GetWalletError(
36058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    wallet::WalletClient::ErrorType error_type) {
36158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::string16 text;
36258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GURL url;
36358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  switch (error_type) {
36558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case wallet::WalletClient::UNVERIFIED_KNOW_YOUR_CUSTOMER_STATUS:
36658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      text = l10n_util::GetStringUTF16(
36758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          IDS_AUTOFILL_WALLET_UNVERIFIED_KNOW_YOUR_CUSTOMER_STATUS);
36858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      url = GURL(kKnowYourCustomerStatusUrl);
36958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
3707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    case wallet::WalletClient::BUYER_LEGAL_ADDRESS_NOT_SUPPORTED:
37258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      text = l10n_util::GetStringUTF16(
373ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          IDS_AUTOFILL_WALLET_BUYER_COUNTRY_NOT_SUPPORTED);
37458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      url = GURL(kBuyerLegalAddressStatusUrl);
37558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
376ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
37758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    default:
37858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // The notification will not have a link; it's handled in the next
37958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // switch statement.
38058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
38158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
38258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
38358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!text.empty()) {
38458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<DialogNotification> notification(new DialogNotification(
38558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        DialogNotification::WALLET_ERROR,
38658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        text));
38758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    notification->set_link_url(url);
38858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return notification.Pass();
38958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
39058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int error_ids = 0;
3924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int error_code = 0;
3934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
39458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switch (error_type) {
395ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    case wallet::WalletClient::UNSUPPORTED_MERCHANT:
3964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_ids = IDS_AUTOFILL_WALLET_UNSUPPORTED_MERCHANT;
39758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
398ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::WalletClient::BAD_REQUEST:
4004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_ids = IDS_AUTOFILL_WALLET_UPGRADE_CHROME_ERROR;
4014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_code = 71;
40258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
403ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
4047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::WalletClient::INVALID_PARAMS:
4054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_ids = IDS_AUTOFILL_WALLET_UPGRADE_CHROME_ERROR;
4064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_code = 42;
40758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
408ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
40958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case wallet::WalletClient::BUYER_ACCOUNT_ERROR:
4104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_ids = IDS_AUTOFILL_WALLET_BUYER_ACCOUNT_ERROR;
4114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_code = 12;
41258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
413ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::WalletClient::UNSUPPORTED_API_VERSION:
4154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_ids = IDS_AUTOFILL_WALLET_UPGRADE_CHROME_ERROR;
4164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_code = 43;
41758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
4187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::WalletClient::SERVICE_UNAVAILABLE:
4204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_ids = IDS_AUTOFILL_WALLET_SERVICE_UNAVAILABLE_ERROR;
4214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_code = 61;
42258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
4237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::WalletClient::INTERNAL_ERROR:
4254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_ids = IDS_AUTOFILL_WALLET_UNKNOWN_ERROR;
4264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_code = 62;
42758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
428ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
4297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::WalletClient::MALFORMED_RESPONSE:
4304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_ids = IDS_AUTOFILL_WALLET_UNKNOWN_ERROR;
4314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_code = 72;
43258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
433ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
4347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::WalletClient::NETWORK_ERROR:
4354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_ids = IDS_AUTOFILL_WALLET_UNKNOWN_ERROR;
4364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_code = 73;
43758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
438ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
4397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case wallet::WalletClient::UNKNOWN_ERROR:
4404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_ids = IDS_AUTOFILL_WALLET_UNKNOWN_ERROR;
4414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      error_code = 74;
44258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
44358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
44458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    default:
44558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
4467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
4477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK_NE(0, error_ids);
44958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
45058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The other error types are strings of the form "XXX. You can pay without
45158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // wallet."
4524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<DialogNotification> notification(new DialogNotification(
45358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      DialogNotification::WALLET_ERROR,
45458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      l10n_util::GetStringFUTF16(IDS_AUTOFILL_DIALOG_COMPLETE_WITHOUT_WALLET,
4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                 l10n_util::GetStringUTF16(error_ids))));
4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (error_code) {
4584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    notification->set_tooltip_text(
4594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        l10n_util::GetStringFUTF16(IDS_AUTOFILL_WALLET_ERROR_CODE_TOOLTIP,
4604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   base::IntToString16(error_code)));
4614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
4624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return notification.Pass();
4647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
46658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)gfx::Image GetGeneratedCardImage(const base::string16& card_number,
46758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                 const base::string16& name,
46858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                 const SkColor& gradient_top,
46958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                 const SkColor& gradient_bottom) {
47058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const int kCardWidthPx = 300;
47158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const int kCardHeightPx = 190;
47258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const gfx::Size size(kCardWidthPx, kCardHeightPx);
47368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  gfx::Canvas canvas(size, 1.0f, false);
47458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
47558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Rect display_rect(size);
47658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
47758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  skia::RefPtr<SkShader> shader = gfx::CreateGradientShader(
47858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      0, size.height(), gradient_top, gradient_bottom);
47958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SkPaint paint;
48058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  paint.setShader(shader.get());
48158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  canvas.DrawRoundRect(display_rect, 8, paint);
48258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
48358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  display_rect.Inset(20, 0, 0, 0);
4844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Font font(l10n_util::GetStringUTF8(IDS_FIXED_FONT_FAMILY), 18);
4854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::FontList font_list(font);
4867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::ShadowValues shadows;
48758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  shadows.push_back(gfx::ShadowValue(gfx::Point(0, 1), 1.0, SK_ColorBLACK));
4884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  canvas.DrawStringRectWithShadows(
4897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      card_number,
4904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      font_list,
49158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      SK_ColorWHITE,
49258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      display_rect, 0, 0, shadows);
49358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
49458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::string16 capitalized_name = base::i18n::ToUpper(name);
49558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  display_rect.Inset(0, size.height() / 2, 0, 0);
4964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  canvas.DrawStringRectWithShadows(
49758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      capitalized_name,
4984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      font_list,
4997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      SK_ColorWHITE,
5007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      display_rect, 0, 0, shadows);
5017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::ImageSkia skia(canvas.ExtractImageRep());
5037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return gfx::Image(skia);
5047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
5057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
50658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Returns the ID of the address or instrument that should be selected in the
50758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// UI, given that the |default_id| is currently the default ID on the Wallet
50858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// server, |previous_default_id| was the default ID prior to re-fetching the
50958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Wallet data, and |previously_selected_id| was the ID of the item selected in
51058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// the dialog prior to re-fetching the Wallet data.
51158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)std::string GetIdToSelect(const std::string& default_id,
51258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          const std::string& previous_default_id,
51358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          const std::string& previously_selected_id) {
51458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // If the default ID changed since the last fetch of the Wallet data, select
51558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // it rather than the previously selected item, as the user's intention in
51658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // changing the default was probably to use it.
51758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (default_id != previous_default_id)
51858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return default_id;
51958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
52058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Otherwise, prefer the previously selected item, if there was one.
52158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return !previously_selected_id.empty() ? previously_selected_id : default_id;
52258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
52358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
52458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Generate a random card number in a user displayable format.
52558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)base::string16 GenerateRandomCardNumber() {
52658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string card_number;
52758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  for (size_t i = 0; i < 4; ++i) {
52858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int part = base::RandInt(0, 10000);
52958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    base::StringAppendF(&card_number, "%04d ", part);
53058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
53158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return ASCIIToUTF16(card_number);
53258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
53358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
534d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)gfx::Image CreditCardIconForType(const std::string& credit_card_type) {
535d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  const int input_card_idr = CreditCard::IconResourceId(credit_card_type);
536d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
537d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  gfx::Image result = rb.GetImageNamed(input_card_idr);
538d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (input_card_idr == IDR_AUTOFILL_CC_GENERIC) {
539d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    // When the credit card type is unknown, no image should be shown. However,
540d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    // to simplify the view code on Mac, save space for the credit card image by
541d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    // returning a transparent image of the appropriate size.
542d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    result = gfx::Image(gfx::ImageSkiaOperations::CreateTransparentImage(
543d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        result.AsImageSkia(), 0));
544d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
545d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return result;
546d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
547d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
548d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)gfx::Image CvcIconForCreditCardType(const base::string16& credit_card_type) {
549d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
550d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (credit_card_type == l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_AMEX))
551d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return rb.GetImageNamed(IDR_CREDIT_CARD_CVC_HINT_AMEX);
552d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
553d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return rb.GetImageNamed(IDR_CREDIT_CARD_CVC_HINT);
554d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
555d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochAutofillDialogViewDelegate::~AutofillDialogViewDelegate() {}
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutofillDialogControllerImpl::~AutofillDialogControllerImpl() {
5617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (popup_controller_)
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    popup_controller_->Hide();
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
56458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogInitialUserState(initial_user_state_);
565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::WeakPtr<AutofillDialogControllerImpl>
569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AutofillDialogControllerImpl::Create(
570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::WebContents* contents,
571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const FormData& form_structure,
572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const GURL& source_url,
573d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const base::Callback<void(const FormStructure*)>& callback) {
574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // AutofillDialogControllerImpl owns itself.
575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillDialogControllerImpl* autofill_dialog_controller =
576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new AutofillDialogControllerImpl(contents,
577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       form_structure,
578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       source_url,
579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       callback);
580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return autofill_dialog_controller->weak_ptr_factory_.GetWeakPtr();
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
5840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogController::RegisterPrefs(PrefRegistrySimple* registry) {
5850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  registry->RegisterListPref(::prefs::kAutofillDialogWalletLocationAcceptance);
5860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
5870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
5880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// static
5890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogController::RegisterProfilePrefs(
590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    user_prefs::PrefRegistrySyncable* registry) {
591d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // TODO(estade): this pref is no longer used, but may prove to be valuable.
592d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Remove it if we don't wind up using it at some point.
5937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  registry->RegisterIntegerPref(
5947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ::prefs::kAutofillDialogShowCount,
5957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      0,
5967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
597d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // TODO(estade): this pref is no longer used, but may prove to be valuable.
598d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Remove it if we don't wind up using it at some point.
599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
600868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ::prefs::kAutofillDialogHasPaidWithWallet,
601868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      false,
602868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
603868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  registry->RegisterBooleanPref(
604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ::prefs::kAutofillDialogPayWithoutWallet,
605868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      false,
606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
60790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  registry->RegisterDictionaryPref(
60890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ::prefs::kAutofillDialogAutofillDefault,
60990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
61058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  registry->RegisterBooleanPref(
61158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ::prefs::kAutofillDialogSaveData,
61258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      true,
61358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
616ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
617ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController> AutofillDialogController::Create(
618ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    content::WebContents* contents,
619ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const FormData& form_structure,
620ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const GURL& source_url,
621d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const base::Callback<void(const FormStructure*)>& callback) {
622ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return AutofillDialogControllerImpl::Create(contents,
623ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                              form_structure,
624ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                              source_url,
625ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                              callback);
626ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
627ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::Show() {
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dialog_shown_timestamp_ = base::Time::Now();
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
631bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  content::NavigationEntry* entry =
632bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      web_contents()->GetController().GetActiveEntry();
633bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  const GURL& active_url = entry ? entry->GetURL() : web_contents()->GetURL();
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  invoked_from_same_origin_ = active_url.GetOrigin() == source_url_.GetOrigin();
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Log any relevant UI metrics and security exceptions.
63758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_SHOWN);
638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetMetricLogger().LogDialogSecurityMetric(
64058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      AutofillMetrics::SECURITY_METRIC_DIALOG_SHOWN);
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
64268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Determine what field types should be included in the dialog.
64368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Note that RequestingCreditCardInfo() below relies on parsed field types.
64468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool has_types = false;
64568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool has_sections = false;
64668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  form_structure_.ParseFieldTypesFromAutocompleteAttributes(
64768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      &has_types, &has_sections);
64868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (RequestingCreditCardInfo() && !TransmissionWillBeSecure()) {
650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GetMetricLogger().LogDialogSecurityMetric(
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AutofillMetrics::SECURITY_METRIC_CREDIT_CARD_OVER_HTTP);
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!invoked_from_same_origin_) {
655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GetMetricLogger().LogDialogSecurityMetric(
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AutofillMetrics::SECURITY_METRIC_CROSS_ORIGIN_FRAME);
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fail if the author didn't specify autocomplete types.
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!has_types) {
661d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    callback_.Run(NULL);
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delete this;
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
666ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  common::BuildInputsForSection(SECTION_CC,
667ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                &requested_cc_fields_);
668ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  common::BuildInputsForSection(SECTION_BILLING,
669ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                &requested_billing_fields_);
670ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  common::BuildInputsForSection(SECTION_CC_BILLING,
671ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                &requested_cc_billing_fields_);
672ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  common::BuildInputsForSection(SECTION_SHIPPING,
673ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                &requested_shipping_fields_);
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
675868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Test whether we need to show the shipping section. If filling that section
676868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // would be a no-op, don't show it.
677868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const DetailInputs& inputs = RequestedFieldsForSection(SECTION_SHIPPING);
678868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EmptyDataModelWrapper empty_wrapper;
679868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  cares_about_shipping_ = empty_wrapper.FillFormStructure(
680868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      inputs,
681ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(common::DetailInputMatchesField, SECTION_SHIPPING),
682868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      &form_structure_);
683868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SuggestionsUpdated();
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int show_count =
6877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      profile_->GetPrefs()->GetInteger(::prefs::kAutofillDialogShowCount);
6887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  profile_->GetPrefs()->SetInteger(::prefs::kAutofillDialogShowCount,
6897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                   show_count + 1);
6907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
69158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SubmitButtonDelayBegin();
69258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(estade): don't show the dialog if the site didn't specify the right
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // fields. First we must figure out what the "right" fields are.
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_.reset(CreateView());
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_->Show();
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetManager()->AddObserver(this);
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (!account_chooser_model_.WalletIsSelected()) {
7007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    LogDialogLatencyToShow();
7010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  } else {
7020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // TODO(aruslan): UMA metrics for sign-in.
7030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    FetchWalletCookieAndUserName();
7040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::Hide() {
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (view_)
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->Hide();
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
71258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid AutofillDialogControllerImpl::TabActivated() {
71358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  // If the user switched away from this tab and then switched back, reload the
71458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  // Wallet items, in case they've changed.
71568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int64 seconds_elapsed_since_last_refresh =
71658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      (base::TimeTicks::Now() - last_wallet_items_fetch_timestamp_).InSeconds();
71758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  if (IsPayingWithWallet() && wallet_items_ &&
71858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      seconds_elapsed_since_last_refresh >= kWalletItemsRefreshRateSeconds) {
71958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    GetWalletItems();
72058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  }
72158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch}
72258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
723eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTestableAutofillDialogView* AutofillDialogControllerImpl::GetTestableView() {
724eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return view_ ? view_->GetTestableView() : NULL;
725eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
726eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
72758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
72858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// AutofillDialogViewDelegate implementation.
729eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
73058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)string16 AutofillDialogControllerImpl::DialogTitle() const {
73158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (ShouldShowSpinner())
73258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return string16();
7333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
73458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_TITLE);
735eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
736eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
73758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)string16 AutofillDialogControllerImpl::AccountChooserText() const {
73858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!account_chooser_model_.WalletIsSelected())
73958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PAYING_WITHOUT_WALLET);
740eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
74158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (SignedInState() == SIGNED_IN)
7424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return account_chooser_model_.GetActiveWalletAccountName();
74358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
74458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // In this case, the account chooser should be showing the signin link.
74558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return string16();
74690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
74790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
74858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)string16 AutofillDialogControllerImpl::SignInLinkText() const {
7490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  int ids = SignedInState() == NOT_CHECKED ?
7500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      IDS_AUTOFILL_DIALOG_USE_WALLET_LINK :
75158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      signin_registrar_.IsEmpty() ? IDS_AUTOFILL_DIALOG_SIGN_IN :
7520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                    IDS_AUTOFILL_DIALOG_CANCEL_SIGN_IN;
7530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
7540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return l10n_util::GetStringUTF16(ids);
75558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
75758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)string16 AutofillDialogControllerImpl::SpinnerText() const {
75858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_LOADING);
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)string16 AutofillDialogControllerImpl::EditSuggestionText() const {
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_EDIT);
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)string16 AutofillDialogControllerImpl::CancelButtonText() const {
766ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return l10n_util::GetStringUTF16(IDS_CANCEL);
767ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
768ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
769ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstring16 AutofillDialogControllerImpl::ConfirmButtonText() const {
770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return l10n_util::GetStringUTF16(IsSubmitPausedOn(wallet::VERIFY_CVV) ?
771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_AUTOFILL_DIALOG_VERIFY_BUTTON : IDS_AUTOFILL_DIALOG_SUBMIT_BUTTON);
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)string16 AutofillDialogControllerImpl::SaveLocallyText() const {
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SAVE_LOCALLY_CHECKBOX);
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
778bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochstring16 AutofillDialogControllerImpl::SaveLocallyTooltip() const {
779bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SAVE_LOCALLY_TOOLTIP);
780bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
781bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)string16 AutofillDialogControllerImpl::LegalDocumentsText() {
78358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!IsPayingWithWallet())
784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return string16();
785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return legal_documents_text_;
787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
78958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldDisableSignInLink() const {
79058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return SignedInState() == REQUIRES_RESPONSE;
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldShowSpinner() const {
794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return account_chooser_model_.WalletIsSelected() &&
795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         SignedInState() == REQUIRES_RESPONSE;
796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool AutofillDialogControllerImpl::ShouldShowSignInWebView() const {
7991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return !signin_registrar_.IsEmpty();
8001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
8011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
8021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)GURL AutofillDialogControllerImpl::SignInUrl() const {
8031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return wallet::GetSignInUrl();
8041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
8051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldOfferToSaveInChrome() const {
807b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return !IsPayingWithWallet() &&
808b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      !profile_->IsOffTheRecord() &&
809b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      IsManuallyEditingAnySection() &&
810ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      !ShouldShowSpinner();
81190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
81290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
81358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldSaveInChrome() const {
81458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return profile_->GetPrefs()->GetBoolean(::prefs::kAutofillDialogSaveData);
81558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
81658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
81790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)int AutofillDialogControllerImpl::GetDialogButtons() const {
8184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (waiting_for_explicit_sign_in_response_)
8194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return ui::DIALOG_BUTTON_NONE;
8204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
8210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (ShouldShowSpinner() && !handling_use_wallet_link_click_)
82290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return ui::DIALOG_BUTTON_CANCEL;
82358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
82458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL;
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::IsDialogButtonEnabled(
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::DialogButton button) const {
829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (button == ui::DIALOG_BUTTON_OK) {
830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (IsSubmitPausedOn(wallet::VERIFY_CVV))
831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return true;
832ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
83358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (ShouldShowSpinner() || is_submitting_)
834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return false;
835ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
83658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (submit_button_delay_timer_.IsRunning())
83758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      return false;
838ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
840c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(ui::DIALOG_BUTTON_CANCEL, button);
843ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return !is_submitting_ || IsSubmitPausedOn(wallet::VERIFY_CVV);
844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
84658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)DialogOverlayState AutofillDialogControllerImpl::GetDialogOverlay() {
8477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool show_wallet_interstitial = IsPayingWithWallet() && is_submitting_ &&
84858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      !(full_wallet_ && !full_wallet_->required_actions().empty());
84958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!show_wallet_interstitial) {
85058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    card_scrambling_delay_.Stop();
85158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    card_scrambling_refresher_.Stop();
8527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return DialogOverlayState();
85358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
8547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
8557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
8567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DialogOverlayState state;
8574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  state.string.font = rb.GetFont(ui::ResourceBundle::BaseFont).DeriveFont(3);
8584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  state.string.text_color = SK_ColorDKGRAY;
85958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
86058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const SkColor start_top_color = SkColorSetRGB(0xD6, 0xD6, 0xD6);
86158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const SkColor start_bottom_color = SkColorSetRGB(0x98, 0x98, 0x98);
86258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const SkColor final_top_color = SkColorSetRGB(0x52, 0x9F, 0xF8);
86358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const SkColor final_bottom_color = SkColorSetRGB(0x22, 0x75, 0xE5);
8647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
8657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (full_wallet_ && full_wallet_->required_actions().empty()) {
86658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    card_scrambling_delay_.Stop();
86758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    card_scrambling_refresher_.Stop();
86858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8693240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    string16 cc_number =
8703240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        full_wallet_->GetInfo(AutofillType(CREDIT_CARD_NUMBER));
8717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    DCHECK_EQ(16U, cc_number.size());
8727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    state.image = GetGeneratedCardImage(
87358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ASCIIToUTF16("XXXX XXXX XXXX ") +
87458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            cc_number.substr(cc_number.size() - 4),
87558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        full_wallet_->billing_address()->recipient_name(),
87658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        color_utils::AlphaBlend(
87758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            final_top_color,
87858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            start_top_color,
87958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            255 * card_generated_animation_.GetCurrentValue()),
88058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        color_utils::AlphaBlend(
88158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            final_bottom_color,
88258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            start_bottom_color,
88358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            255 * card_generated_animation_.GetCurrentValue()));
88458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    state.string.text = l10n_util::GetStringUTF16(
8867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        IDS_AUTOFILL_DIALOG_CARD_GENERATION_DONE);
8877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  } else {
88858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Start the refresher if it isn't running. Wait one second before pumping
88958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // updates to the view.
89058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (!card_scrambling_delay_.IsRunning() &&
89158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        !card_scrambling_refresher_.IsRunning()) {
89258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      scrambled_card_number_ = GenerateRandomCardNumber();
89358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      card_scrambling_delay_.Start(
89458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          FROM_HERE,
89558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          base::TimeDelta::FromSeconds(1),
89658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          this,
89758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          &AutofillDialogControllerImpl::StartCardScramblingRefresher);
89858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
89958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
90058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(!scrambled_card_number_.empty());
90158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    state.image = GetGeneratedCardImage(
90258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        scrambled_card_number_,
90358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        submitted_cardholder_name_,
90458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        start_top_color,
90558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        start_bottom_color);
9067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
9077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // "Submitting" waiting page.
9084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    state.string.text = l10n_util::GetStringUTF16(
9097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        IDS_AUTOFILL_DIALOG_CARD_GENERATION_IN_PROGRESS);
9107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
9117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
9127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return state;
9137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
9147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
91558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const std::vector<gfx::Range>& AutofillDialogControllerImpl::
916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LegalDocumentLinks() {
917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return legal_document_link_ranges_;
9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::SectionIsActive(DialogSection section)
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const {
922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (IsSubmitPausedOn(wallet::VERIFY_CVV))
923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return section == SECTION_CC_BILLING;
924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
925868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!FormStructureCaresAboutSection(section))
926868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
927868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (IsPayingWithWallet())
929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return section == SECTION_CC_BILLING || section == SECTION_SHIPPING;
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return section != SECTION_CC_BILLING;
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::GetWalletItems() {
9353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ScopedViewUpdates updates(view_.get());
936558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
9370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  wallet_items_requested_ = true;
9380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
93958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  previously_selected_instrument_id_.clear();
94058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  previously_selected_shipping_address_id_.clear();
94158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  if (wallet_items_) {
94258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    previous_default_instrument_id_ = wallet_items_->default_instrument_id();
94358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    previous_default_shipping_address_id_ = wallet_items_->default_address_id();
94458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
94558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const wallet::WalletItems::MaskedInstrument* instrument =
94658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ActiveInstrument();
94758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (instrument)
94858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      previously_selected_instrument_id_ = instrument->object_id();
949558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
950558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    const wallet::Address* address = ActiveShippingAddress();
951558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    if (address)
952558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      previously_selected_shipping_address_id_ = address->object_id();
95358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  }
95458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
95558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  last_wallet_items_fetch_timestamp_ = base::TimeTicks::Now();
956eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  wallet_items_.reset();
95758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
958eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The "Loading..." page should be showing now, which should cause the
959eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // account chooser to hide.
960eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  view_->UpdateAccountChooser();
9614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  GetWalletClient()->GetWalletItems();
962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
964a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void AutofillDialogControllerImpl::HideSignIn() {
9653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ScopedViewUpdates updates(view_.get());
966a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  signin_registrar_.RemoveAll();
967a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  view_->HideSignIn();
968a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  view_->UpdateAccountChooser();
969a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
970a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
97158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)AutofillDialogControllerImpl::DialogSignedInState
97258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    AutofillDialogControllerImpl::SignedInState() const {
97358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (wallet_error_notification_)
97458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return SIGN_IN_DISABLED;
97558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (signin_helper_ || (wallet_items_requested_ && !wallet_items_))
97758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return REQUIRES_RESPONSE;
97858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (!wallet_items_requested_)
9800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return NOT_CHECKED;
9810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
98258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (wallet_items_->HasRequiredAction(wallet::GAIA_AUTH))
98358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return REQUIRES_SIGN_IN;
98458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
98558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (wallet_items_->HasRequiredAction(wallet::PASSIVE_GAIA_AUTH))
98658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return REQUIRES_PASSIVE_SIGN_IN;
98758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Since the username can be pre-fetched as a performance optimization, Wallet
9894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // required actions take precedence over a pending username fetch.
9904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (username_fetcher_)
9914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return REQUIRES_RESPONSE;
9924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
99358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return SIGNED_IN;
99458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
99558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::SignedInStateUpdated() {
9974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!ShouldShowSpinner())
9984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    waiting_for_explicit_sign_in_response_ = false;
9994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  switch (SignedInState()) {
1001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case SIGNED_IN:
1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Start fetching the user name if we don't know it yet.
10034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      if (!account_chooser_model_.HasAccountsToChoose()) {
10044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        DCHECK(!username_fetcher_);
10054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        username_fetcher_.reset(new wallet::WalletSigninHelper(
1006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            this, profile_->GetRequestContext()));
10074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        username_fetcher_->StartUserNameFetch();
1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      } else {
1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        LogDialogLatencyToShow();
1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
1011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
1012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case REQUIRES_SIGN_IN:
10140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      if (handling_use_wallet_link_click_)
10150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        SignInLinkClicked();
10160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      // Fall through.
1017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case SIGN_IN_DISABLED:
1018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Switch to the local account and refresh the dialog.
10194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      signin_helper_.reset();
10204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      username_fetcher_.reset();
1021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OnWalletSigninError();
10220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      handling_use_wallet_link_click_ = false;
1023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
1024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case REQUIRES_PASSIVE_SIGN_IN:
10264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      // Cancel any pending username fetch and clear any stale username data.
10274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      username_fetcher_.reset();
10284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      account_chooser_model_.ClearWalletAccounts();
10294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Attempt to passively sign in the user.
1031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      DCHECK(!signin_helper_);
1032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      signin_helper_.reset(new wallet::WalletSigninHelper(
1033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          this,
1034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          profile_->GetRequestContext()));
1035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      signin_helper_->StartPassiveSignin();
1036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
1037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    case NOT_CHECKED:
1039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case REQUIRES_RESPONSE:
1040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
1041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::OnWalletOrSigninUpdate() {
10453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ScopedViewUpdates updates(view_.get());
1046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SignedInStateUpdated();
1047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SuggestionsUpdated();
1048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateAccountChooserView();
1049b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
105058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (view_) {
1051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    view_->UpdateButtonStrip();
105258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    view_->UpdateOverlay();
105358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
1054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // On the first successful response, compute the initial user state metric.
1056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (initial_user_state_ == AutofillMetrics::DIALOG_USER_STATE_UNKNOWN)
1057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    initial_user_state_ = GetInitialUserState();
1058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void AutofillDialogControllerImpl::OnWalletFormFieldError(
10617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::vector<wallet::FormFieldError>& form_field_errors) {
10627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (form_field_errors.empty())
10637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
10647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  for (std::vector<wallet::FormFieldError>::const_iterator it =
10667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)           form_field_errors.begin();
10677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       it != form_field_errors.end(); ++it) {
10687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (it->error_type() == wallet::FormFieldError::UNKNOWN_ERROR ||
10697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        it->GetAutofillType() == MAX_VALID_FIELD_TYPE ||
10707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        it->location() == wallet::FormFieldError::UNKNOWN_LOCATION) {
10717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      wallet_server_validation_recoverable_ = false;
10727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
10737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
10747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    DialogSection section = SectionFromLocation(it->location());
10757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    wallet_errors_[section][it->GetAutofillType()] =
10767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        std::make_pair(it->GetErrorMessage(),
10777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       GetValueFromSection(section, it->GetAutofillType()));
10787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
10797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Unrecoverable validation errors.
10817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!wallet_server_validation_recoverable_)
10827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    DisableWallet(wallet::WalletClient::UNKNOWN_ERROR);
10837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1084eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  UpdateForErrors();
10857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
10867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void AutofillDialogControllerImpl::ConstructLegalDocumentsText() {
10880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  legal_documents_text_.clear();
10890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  legal_document_link_ranges_.clear();
10900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
10910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (!wallet_items_)
10920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return;
10930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
10940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  PrefService* local_state = g_browser_process->local_state();
10950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // List of users who have accepted location sharing for fraud protection
10960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // on this device.
10970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  const base::ListValue* accepted =
10980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      local_state->GetList(::prefs::kAutofillDialogWalletLocationAcceptance);
10990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  bool has_accepted_location_sharing =
11000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      accepted->Find(base::StringValue(
11010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          account_chooser_model_.GetActiveWalletAccountName())) !=
11020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      accepted->end();
11030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
11040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (wallet_items_->legal_documents().empty()) {
11050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (!has_accepted_location_sharing) {
11060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      legal_documents_text_ = l10n_util::GetStringUTF16(
11070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          IDS_AUTOFILL_DIALOG_LOCATION_DISCLOSURE);
11080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
11090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
11110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
1112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::vector<wallet::WalletItems::LegalDocument*>& documents =
1114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      wallet_items_->legal_documents();
11151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // There should never be just one document because the privacy policy doc gets
11161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // tacked on the end of other documents.
1117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK_GE(documents.size(), 2U);
1118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::vector<base::string16> link_names;
11201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (size_t i = 0; i < documents.size(); ++i) {
11211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    link_names.push_back(documents[i]->display_name());
11221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
11231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
11241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const bool new_user = wallet_items_->HasRequiredAction(wallet::SETUP_WALLET);
11251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  int resource_id = 0;
11261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  switch (documents.size()) {
11271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case 2U:
11281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      resource_id = new_user ? IDS_AUTOFILL_DIALOG_LEGAL_LINKS_NEW_2 :
11291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                               IDS_AUTOFILL_DIALOG_LEGAL_LINKS_UPDATED_2;
11301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
11311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case 3U:
11321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      resource_id = new_user ? IDS_AUTOFILL_DIALOG_LEGAL_LINKS_NEW_3 :
11331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                               IDS_AUTOFILL_DIALOG_LEGAL_LINKS_UPDATED_3;
11341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
11351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case 4U:
11361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      resource_id = new_user ? IDS_AUTOFILL_DIALOG_LEGAL_LINKS_NEW_4 :
11371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                               IDS_AUTOFILL_DIALOG_LEGAL_LINKS_UPDATED_4;
11381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
11391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case 5U:
11401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      resource_id = new_user ? IDS_AUTOFILL_DIALOG_LEGAL_LINKS_NEW_5 :
11411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                               IDS_AUTOFILL_DIALOG_LEGAL_LINKS_UPDATED_5;
11421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
11431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case 6U:
11441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      resource_id = new_user ? IDS_AUTOFILL_DIALOG_LEGAL_LINKS_NEW_6 :
11451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                               IDS_AUTOFILL_DIALOG_LEGAL_LINKS_UPDATED_6;
11461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
11471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    default:
11481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      // We can only handle so many documents. For lack of a better way of
11491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      // handling document overflow, just error out if there are too many.
11501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      DisableWallet(wallet::WalletClient::UNKNOWN_ERROR);
11511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return;
1152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::vector<size_t> offsets;
11551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  string16 text = l10n_util::GetStringFUTF16(resource_id, link_names, &offsets);
11560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
11570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Tack on the location string if need be.
11580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  size_t base_offset = 0;
11590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (!has_accepted_location_sharing) {
11600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    text = l10n_util::GetStringFUTF16(
11610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        IDS_AUTOFILL_DIALOG_LOCATION_DISCLOSURE_WITH_LEGAL_DOCS,
11620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        text,
11630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        &base_offset);
11640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
11650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < documents.size(); ++i) {
11670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    size_t link_start = offsets[i] + base_offset;
116858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    legal_document_link_ranges_.push_back(gfx::Range(
1169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        link_start, link_start + documents[i]->display_name().size()));
1170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  legal_documents_text_ = text;
1172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::ResetSectionInput(DialogSection section) {
1175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetEditingExistingData(section, false);
1176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DetailInputs* inputs = MutableRequestedFieldsForSection(section);
1178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (DetailInputs::iterator it = inputs->begin(); it != inputs->end(); ++it) {
1179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    it->initial_value.clear();
1180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
1181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::ShowEditUiIfBadSuggestion(
1184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DialogSection section) {
1185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // |CreateWrapper()| returns an empty wrapper if |IsEditingExistingData()|, so
1186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // get the wrapper before this potentially happens below.
118790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section);
1188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If the chosen item in |model| yields an empty suggestion text, it is
1190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // invalid. In this case, show the edit UI and highlight invalid fields.
1191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section);
1192c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  string16 unused, unused2;
1193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (IsASuggestionItemKey(model->GetItemKeyForCheckedItem()) &&
1194c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      !SuggestionTextForSection(section, &unused, &unused2)) {
1195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SetEditingExistingData(section, true);
1196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
119890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DetailInputs* inputs = MutableRequestedFieldsForSection(section);
1199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (wrapper && IsEditingExistingData(section))
1200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    wrapper->FillInputs(inputs);
1201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
120290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1203ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerImpl::InputWasEdited(ServerFieldType type,
1204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                  const base::string16& value) {
1205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (value.empty())
1206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return false;
120790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1208ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // If this is a combobox at the default value, don't preserve it.
1209ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ui::ComboboxModel* model = ComboboxModelForAutofillType(type);
1210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (model && model->GetItemAt(model->GetDefaultIndex()) == value)
1211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return false;
1212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return true;
1214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochDetailOutputMap AutofillDialogControllerImpl::TakeUserInputSnapshot() {
1217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DetailOutputMap snapshot;
1218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!view_)
1219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return snapshot;
1220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) {
1222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DialogSection section = static_cast<DialogSection>(i);
1223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section);
1224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (model->GetItemKeyForCheckedItem() != kAddNewItemKey)
1225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      continue;
1226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DetailOutputMap outputs;
1228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    view_->GetUserInput(section, &outputs);
1229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Remove fields that are empty, at their default values, or invalid.
1230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    for (DetailOutputMap::iterator it = outputs.begin(); it != outputs.end();
1231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         ++it) {
1232ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (InputWasEdited(it->first->type, it->second) &&
1233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          InputValidityMessage(section, it->first->type, it->second).empty()) {
1234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        snapshot.insert(std::make_pair(it->first, it->second));
1235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      }
1236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
1237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
1238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return snapshot;
1240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::RestoreUserInputFromSnapshot(
1243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const DetailOutputMap& snapshot) {
1244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (snapshot.empty())
1245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
1246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DetailOutputWrapper wrapper(snapshot);
1248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) {
1249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DialogSection section = static_cast<DialogSection>(i);
1250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (!SectionIsActive(section))
1251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      continue;
1252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DetailInputs* inputs = MutableRequestedFieldsForSection(section);
1254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    wrapper.FillInputs(inputs);
1255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    for (size_t i = 0; i < inputs->size(); ++i) {
1257ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (InputWasEdited((*inputs)[i].type, (*inputs)[i].initial_value)) {
1258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        SuggestionsMenuModelForSection(section)->SetCheckedItem(kAddNewItemKey);
1259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
1260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      }
1261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
1262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
1263eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::UpdateSection(DialogSection section) {
1266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (view_)
1267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    view_->UpdateSection(section);
1268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1270eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::UpdateForErrors() {
1271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!view_)
1272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
1273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Currently, the view should only need to be updated if there are
1275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // |wallet_errors_| or validating a suggestion that's based on existing data.
1276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool should_update = !wallet_errors_.empty();
1277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!should_update) {
1278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) {
1279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if (IsEditingExistingData(static_cast<DialogSection>(i))) {
1280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        should_update = true;
1281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        break;
1282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      }
1283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
1284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
1285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (should_update)
1287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    view_->UpdateForErrors();
1288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
129058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::StartCardScramblingRefresher() {
129158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RefreshCardScramblingOverlay();
129258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  card_scrambling_refresher_.Start(
129358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      FROM_HERE,
129458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      base::TimeDelta::FromMilliseconds(75),
129558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      this,
129658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      &AutofillDialogControllerImpl::RefreshCardScramblingOverlay);
129758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
129858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
129958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::RefreshCardScramblingOverlay() {
130058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scrambled_card_number_ = GenerateRandomCardNumber();
130158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  PushOverlayUpdate();
130258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
130358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
130458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::PushOverlayUpdate() {
130558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (view_) {
130658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ScopedViewUpdates updates(view_.get());
130758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    view_->UpdateOverlay();
130858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
130958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
131058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const DetailInputs& AutofillDialogControllerImpl::RequestedFieldsForSection(
13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DialogSection section) const {
13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (section) {
13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_CC:
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return requested_cc_fields_;
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_BILLING:
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return requested_billing_fields_;
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_CC_BILLING:
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return requested_cc_billing_fields_;
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_SHIPPING:
13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return requested_shipping_fields_;
13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return requested_billing_fields_;
13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::ComboboxModel* AutofillDialogControllerImpl::ComboboxModelForAutofillType(
13293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    ServerFieldType type) {
1330bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  switch (type) {
13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CREDIT_CARD_EXP_MONTH:
13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return &cc_exp_month_combobox_model_;
13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CREDIT_CARD_EXP_4_DIGIT_YEAR:
13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return &cc_exp_year_combobox_model_;
13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case ADDRESS_HOME_COUNTRY:
1338bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    case ADDRESS_BILLING_COUNTRY:
13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return &country_combobox_model_;
13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return NULL;
13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::MenuModel* AutofillDialogControllerImpl::MenuModelForSection(
13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DialogSection section) {
1348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section);
1349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The shipping section menu is special. It will always show because there is
1350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // a choice between "Use billing" and "enter new".
1351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (section == SECTION_SHIPPING)
1352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return model;
1353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // For other sections, only show a menu if there's at least one suggestion.
1355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (int i = 0; i < model->GetItemCount(); ++i) {
1356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (IsASuggestionItemKey(model->GetItemKeyAt(i)))
1357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return model;
1358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return NULL;
1361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::MenuModel* AutofillDialogControllerImpl::MenuModelForAccountChooser() {
1364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If there were unrecoverable Wallet errors, or if there are choices other
1365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // than "Pay without the wallet", show the full menu.
13664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // TODO(estade): this can present a braindead menu (only 1 option) when
13674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // there's a wallet error.
136858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (wallet_error_notification_ ||
13694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      (SignedInState() == SIGNED_IN &&
13704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)       account_chooser_model_.HasAccountsToChoose())) {
1371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return &account_chooser_model_;
1372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Otherwise, there is no menu, just a sign in link.
1375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return NULL;
13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Image AutofillDialogControllerImpl::AccountChooserImage() {
13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!MenuModelForAccountChooser()) {
1380a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (signin_registrar_.IsEmpty()) {
1381a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      return ui::ResourceBundle::GetSharedInstance().GetImageNamed(
1382a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)          IDR_WALLET_ICON);
1383a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
1384a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1385a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    return gfx::Image();
13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Image icon;
1389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  account_chooser_model_.GetIconAt(
1390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      account_chooser_model_.GetIndexOfCommandId(
1391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          account_chooser_model_.checked_item()),
1392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &icon);
13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return icon;
13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochgfx::Image AutofillDialogControllerImpl::ButtonStripImage() const {
139758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (IsPayingWithWallet()) {
13982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    return ui::ResourceBundle::GetSharedInstance().GetImageNamed(
13992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        IDR_WALLET_LOGO);
14002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
14012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
14022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  return gfx::Image();
14032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
14042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)string16 AutofillDialogControllerImpl::LabelForSection(DialogSection section)
14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const {
14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (section) {
14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_CC:
14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SECTION_CC);
14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_BILLING:
14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_CC_BILLING:
14127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SECTION_BILLING);
14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_SHIPPING:
14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SECTION_SHIPPING);
14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
141658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  NOTREACHED();
141758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return string16();
14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SuggestionState AutofillDialogControllerImpl::SuggestionStateForSection(
1421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DialogSection section) {
1422c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  string16 vertically_compact, horizontally_compact;
1423c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  bool show_suggestion = SuggestionTextForSection(section,
1424c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                                  &vertically_compact,
1425c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                                  &horizontally_compact);
1426c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  return SuggestionState(show_suggestion,
1427c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                         vertically_compact,
1428c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                         horizontally_compact,
1429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         SuggestionIconForSection(section),
1430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         ExtraSuggestionTextForSection(section),
14317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                         ExtraSuggestionIconForSection(section));
1432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1434c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochbool AutofillDialogControllerImpl::SuggestionTextForSection(
1435c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    DialogSection section,
1436c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    base::string16* vertically_compact,
1437c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    base::string16* horizontally_compact) {
1438c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  base::string16 action_text = RequiredActionTextForSection(section);
1439c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  if (!action_text.empty()) {
1440c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    *vertically_compact = *horizontally_compact = action_text;
1441c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    return true;
1442c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  }
1443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // When the user has clicked 'edit' or a suggestion is somehow invalid (e.g. a
1445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // user selects a credit card that has expired), don't show a suggestion (even
1446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // though there is a profile selected in the model).
1447868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (IsEditingExistingData(section))
1448c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    return false;
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section);
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string item_key = model->GetItemKeyForCheckedItem();
1452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (item_key == kSameAsBillingKey) {
1453c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    *vertically_compact = *horizontally_compact = l10n_util::GetStringUTF16(
1454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        IDS_AUTOFILL_DIALOG_USING_BILLING_FOR_SHIPPING);
1455c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    return true;
1456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!IsASuggestionItemKey(item_key))
1459c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    return false;
14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section);
1462c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  return wrapper->GetDisplayText(vertically_compact, horizontally_compact);
1463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)string16 AutofillDialogControllerImpl::RequiredActionTextForSection(
1466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DialogSection section) const {
1467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (section == SECTION_CC_BILLING && IsSubmitPausedOn(wallet::VERIFY_CVV)) {
1468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const wallet::WalletItems::MaskedInstrument* current_instrument =
1469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        wallet_items_->GetInstrumentById(active_instrument_id_);
1470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (current_instrument)
1471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return current_instrument->TypeAndLastFourDigits();
1472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DetailOutputMap output;
1474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    view_->GetUserInput(section, &output);
1475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    CreditCard card;
1476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GetBillingInfoFromOutputs(output, &card, NULL, NULL);
1477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return card.TypeAndLastFourDigits();
1478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return string16();
1481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)string16 AutofillDialogControllerImpl::ExtraSuggestionTextForSection(
1484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DialogSection section) const {
1485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (section == SECTION_CC ||
1486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      (section == SECTION_CC_BILLING && IsSubmitPausedOn(wallet::VERIFY_CVV))) {
1487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PLACEHOLDER_CVC);
1488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return string16();
1491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1493868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const wallet::WalletItems::MaskedInstrument* AutofillDialogControllerImpl::
1494868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ActiveInstrument() const {
1495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!IsPayingWithWallet())
1496868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return NULL;
1497868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const SuggestionsMenuModel* model =
1499868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SuggestionsMenuModelForSection(SECTION_CC_BILLING);
1500868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const std::string item_key = model->GetItemKeyForCheckedItem();
1501868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!IsASuggestionItemKey(item_key))
1502868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return NULL;
1503868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1504868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int index;
1505868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!base::StringToInt(item_key, &index) || index < 0 ||
1506868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      static_cast<size_t>(index) >= wallet_items_->instruments().size()) {
1507868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    NOTREACHED();
1508868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return NULL;
1509868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1510868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1511868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return wallet_items_->instruments()[index];
1512868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1513868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1514868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const wallet::Address* AutofillDialogControllerImpl::
1515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ActiveShippingAddress() const {
1516a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!IsPayingWithWallet() || !IsShippingAddressRequired())
1517868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return NULL;
1518868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1519868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const SuggestionsMenuModel* model =
1520868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SuggestionsMenuModelForSection(SECTION_SHIPPING);
1521868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const std::string item_key = model->GetItemKeyForCheckedItem();
1522868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!IsASuggestionItemKey(item_key))
1523868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return NULL;
1524868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1525868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int index;
1526868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!base::StringToInt(item_key, &index) || index < 0 ||
1527868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      static_cast<size_t>(index) >= wallet_items_->addresses().size()) {
1528868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    NOTREACHED();
1529868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return NULL;
1530868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1531868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1532868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return wallet_items_->addresses()[index];
1533868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1534868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<DataModelWrapper> AutofillDialogControllerImpl::CreateWrapper(
15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DialogSection section) {
1537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (IsPayingWithWallet() && full_wallet_ &&
1538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      full_wallet_->required_actions().empty()) {
15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (section == SECTION_CC_BILLING) {
15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return scoped_ptr<DataModelWrapper>(
15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          new FullWalletBillingWrapper(full_wallet_.get()));
15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (section == SECTION_SHIPPING) {
15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return scoped_ptr<DataModelWrapper>(
15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          new FullWalletShippingWrapper(full_wallet_.get()));
15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section);
15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string item_key = model->GetItemKeyForCheckedItem();
1551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!IsASuggestionItemKey(item_key) || IsManuallyEditingSection(section))
15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return scoped_ptr<DataModelWrapper>();
15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (IsPayingWithWallet()) {
15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (section == SECTION_CC_BILLING) {
15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return scoped_ptr<DataModelWrapper>(
1557868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          new WalletInstrumentWrapper(ActiveInstrument()));
15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (section == SECTION_SHIPPING) {
1561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return scoped_ptr<DataModelWrapper>(
1562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          new WalletAddressWrapper(ActiveShippingAddress()));
1563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return scoped_ptr<DataModelWrapper>();
15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (section == SECTION_CC) {
15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CreditCard* card = GetManager()->GetCreditCardByGUID(item_key);
15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(card);
15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return scoped_ptr<DataModelWrapper>(new AutofillCreditCardWrapper(card));
15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AutofillProfile* profile = GetManager()->GetProfileByGUID(item_key);
15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(profile);
157658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (section == SECTION_SHIPPING) {
157758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return scoped_ptr<DataModelWrapper>(
1578d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        new AutofillShippingAddressWrapper(profile));
157958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
158058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK_EQ(SECTION_BILLING, section);
15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return scoped_ptr<DataModelWrapper>(
1582d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      new AutofillProfileWrapper(profile));
15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Image AutofillDialogControllerImpl::SuggestionIconForSection(
15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DialogSection section) {
15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<DataModelWrapper> model = CreateWrapper(section);
15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!model.get())
15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Image();
15902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return model->GetIcon();
15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Image AutofillDialogControllerImpl::ExtraSuggestionIconForSection(
1595d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DialogSection section) {
1596d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (section != SECTION_CC && section != SECTION_CC_BILLING)
1597d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return gfx::Image();
1598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1599d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  scoped_ptr<DataModelWrapper> model = CreateWrapper(section);
1600d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!model.get())
1601d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return gfx::Image();
1602d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1603d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return CvcIconForCreditCardType(
1604d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      model->GetInfo(AutofillType(CREDIT_CARD_TYPE)));
1605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1607d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)FieldIconMap AutofillDialogControllerImpl::IconsForFields(
1608d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const FieldValueMap& user_inputs) const {
1609d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  FieldIconMap result;
1610d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::string16 credit_card_type;
1611d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1612d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  FieldValueMap::const_iterator credit_card_iter =
1613d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      user_inputs.find(CREDIT_CARD_NUMBER);
1614d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (credit_card_iter != user_inputs.end()) {
1615d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const string16& number = credit_card_iter->second;
1616d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const std::string type = CreditCard::GetCreditCardType(number);
1617d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    credit_card_type = CreditCard::TypeForDisplay(type);
1618d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    result[CREDIT_CARD_NUMBER] = CreditCardIconForType(type);
1619d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
1620d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1621d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!user_inputs.count(CREDIT_CARD_VERIFICATION_CODE))
1622d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return result;
1623d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1624d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  result[CREDIT_CARD_VERIFICATION_CODE] =
1625d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      CvcIconForCreditCardType(credit_card_type);
1626d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1627d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return result;
1628d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
1629d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1630d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool AutofillDialogControllerImpl::FieldControlsIcons(
1631d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    ServerFieldType type) const {
1632d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return type == CREDIT_CARD_NUMBER;
1633d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
1634d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
16354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)string16 AutofillDialogControllerImpl::TooltipForField(ServerFieldType type)
16364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const {
16374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (type == PHONE_HOME_WHOLE_NUMBER || type == PHONE_BILLING_WHOLE_NUMBER)
16384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_TOOLTIP_PHONE_NUMBER);
16394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
16404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return string16();
16414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
16424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
16438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool AutofillDialogControllerImpl::InputIsEditable(
16448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    const DetailInput& input,
16458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    DialogSection section) {
16468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (section != SECTION_CC_BILLING)
16478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return true;
16488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
16498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (input.type == CREDIT_CARD_NUMBER)
16508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return !IsEditingExistingData(section);
16518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
16528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // For CVC, only require (allow) input if the user has edited some other
16538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // aspect of the card.
16548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (input.type == CREDIT_CARD_VERIFICATION_CODE &&
16558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      IsEditingExistingData(section)) {
16568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    DetailOutputMap output;
16578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    view_->GetUserInput(section, &output);
16588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    WalletInstrumentWrapper wrapper(ActiveInstrument());
16598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
16608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    for (DetailOutputMap::iterator iter = output.begin(); iter != output.end();
16618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)         ++iter) {
16628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      if (iter->first->type == input.type)
16638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        continue;
16648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
16658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      AutofillType type(iter->first->type);
16668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      if (type.group() == CREDIT_CARD &&
16678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)          iter->second != wrapper.GetInfo(type)) {
16688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        return true;
16698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      }
16708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    }
16718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
16728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return false;
16738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
16748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
16758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return true;
16768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
16778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
16784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// TODO(groby): Add more tests.
1679a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)string16 AutofillDialogControllerImpl::InputValidityMessage(
16807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    DialogSection section,
16813240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    ServerFieldType type,
16827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const string16& value) {
16837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // If the field is edited, clear any Wallet errors.
16847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (IsPayingWithWallet()) {
16857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WalletValidationErrors::iterator it = wallet_errors_.find(section);
16867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (it != wallet_errors_.end()) {
16877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      TypeErrorInputMap::const_iterator iter = it->second.find(type);
16887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      if (iter != it->second.end()) {
16897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        if (iter->second.second == value)
16907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          return iter->second.first;
16917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        it->second.erase(type);
16927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      }
16937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
16947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
16957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1696bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  switch (AutofillType(type).GetStorableType()) {
169790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case EMAIL_ADDRESS:
1698868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (!value.empty() && !IsValidEmailAddress(value)) {
1699868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        return l10n_util::GetStringUTF16(
1700868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_EMAIL_ADDRESS);
1701868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      }
170290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      break;
170390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1704eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case CREDIT_CARD_NUMBER: {
1705eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if (!value.empty()) {
1706eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        base::string16 message = CreditCardNumberValidityMessage(value);
1707eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        if (!message.empty())
1708eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          return message;
1709eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      }
1710eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      break;
1711eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
171290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
171390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case CREDIT_CARD_EXP_MONTH:
1714ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (!InputWasEdited(CREDIT_CARD_EXP_MONTH, value)) {
1715ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        return l10n_util::GetStringUTF16(
1716ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            IDS_AUTOFILL_DIALOG_VALIDATION_MISSING_VALUE);
1717ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      }
1718ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      break;
1719ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
172090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case CREDIT_CARD_EXP_4_DIGIT_YEAR:
1721ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (!InputWasEdited(CREDIT_CARD_EXP_4_DIGIT_YEAR, value)) {
1722ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        return l10n_util::GetStringUTF16(
1723ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            IDS_AUTOFILL_DIALOG_VALIDATION_MISSING_VALUE);
1724ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      }
172590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      break;
172690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
172790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case CREDIT_CARD_VERIFICATION_CODE:
1728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (!value.empty() && !autofill::IsValidCreditCardSecurityCode(value)) {
1729868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        return l10n_util::GetStringUTF16(
1730868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_SECURITY_CODE);
1731868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      }
173290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      break;
173390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
173490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case ADDRESS_HOME_LINE1:
173590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      break;
17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
173790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case ADDRESS_HOME_LINE2:
173890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return base::string16();  // Line 2 is optional - always valid.
173990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
17407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case ADDRESS_HOME_CITY:
17417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case ADDRESS_HOME_COUNTRY:
17427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
17437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
174490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case ADDRESS_HOME_STATE:
17457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if (!value.empty() && !autofill::IsValidState(value)) {
17467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        return l10n_util::GetStringUTF16(
17477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_REGION);
17487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      }
17495e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)      break;
17505e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)
175190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case ADDRESS_HOME_ZIP:
17527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      if (!value.empty() && !autofill::IsValidZip(value)) {
17537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        return l10n_util::GetStringUTF16(
17547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_ZIP_CODE);
17557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      }
175690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      break;
175790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
17587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    case NAME_FULL:
17597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      // Wallet requires a first and last billing name.
17607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if (section == SECTION_CC_BILLING && !value.empty() &&
17617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          !IsCardHolderNameValidForWallet(value)) {
17627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        DCHECK(IsPayingWithWallet());
17637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        return l10n_util::GetStringUTF16(
17647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            IDS_AUTOFILL_DIALOG_VALIDATION_WALLET_REQUIRES_TWO_NAMES);
17657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      }
176690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      break;
17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1768868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case PHONE_HOME_WHOLE_NUMBER:  // Used in shipping section.
1769868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
1770868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1771868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case PHONE_BILLING_WHOLE_NUMBER:  // Used in billing section.
177290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      break;
177390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
177490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    default:
177590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      NOTREACHED();  // Trying to validate unknown field.
177690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      break;
177790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
177890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1779868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return value.empty() ?
1780868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_VALIDATION_MISSING_VALUE) :
1781868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::string16();
17822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// TODO(groby): Also add tests.
17854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)ValidityMessages AutofillDialogControllerImpl::InputsAreValid(
17867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    DialogSection section,
17874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const DetailOutputMap& inputs) {
17884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ValidityMessages messages;
17893240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  std::map<ServerFieldType, string16> field_values;
17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (DetailOutputMap::const_iterator iter = inputs.begin();
17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter != inputs.end(); ++iter) {
1792ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const ServerFieldType type = iter->first->type;
1793ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
17944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::string16 text = InputValidityMessage(section, type, iter->second);
17954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1796ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // Skip empty/unchanged fields in edit mode. Ignore country code as it
17974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // always has a value. If the individual field does not have validation
17984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // errors, assume it to be valid unless later proven otherwise.
17994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    bool sure = InputWasEdited(type, iter->second) ||
18004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                ComboboxModelForAutofillType(type) == &country_combobox_model_;
1801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Consider only individually valid fields for inter-field validation.
18034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (text.empty()) {
1804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      field_values[type] = iter->second;
18054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      // If the field is valid but can be invalidated by inter-field validation,
18064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      // assume it to be unsure.
18074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      if (type == CREDIT_CARD_EXP_4_DIGIT_YEAR ||
18084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          type == CREDIT_CARD_EXP_MONTH ||
18094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          type == CREDIT_CARD_VERIFICATION_CODE ||
18104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          type == PHONE_HOME_WHOLE_NUMBER ||
18114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          type == PHONE_BILLING_WHOLE_NUMBER) {
18124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        sure = false;
18134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      }
18144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
18154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    messages.Set(type, ValidityMessage(text, sure));
18162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Validate the date formed by month and year field. (Autofill dialog is
1819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // never supposed to have 2-digit years, so not checked).
1820868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (field_values.count(CREDIT_CARD_EXP_4_DIGIT_YEAR) &&
1821868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      field_values.count(CREDIT_CARD_EXP_MONTH) &&
1822ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      InputWasEdited(CREDIT_CARD_EXP_4_DIGIT_YEAR,
1823ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     field_values[CREDIT_CARD_EXP_4_DIGIT_YEAR]) &&
1824ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      InputWasEdited(CREDIT_CARD_EXP_MONTH,
18254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     field_values[CREDIT_CARD_EXP_MONTH])) {
18264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ValidityMessage year_message(base::string16(), true);
18274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ValidityMessage month_message(base::string16(), true);
18284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!IsCreditCardExpirationValid(field_values[CREDIT_CARD_EXP_4_DIGIT_YEAR],
18294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     field_values[CREDIT_CARD_EXP_MONTH])) {
18304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      // The dialog shows the same error message for the month and year fields.
18314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      year_message.text = l10n_util::GetStringUTF16(
18324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_EXPIRATION_DATE);
18334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      month_message.text = l10n_util::GetStringUTF16(
18344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_EXPIRATION_DATE);
18354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
18364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    messages.Set(CREDIT_CARD_EXP_4_DIGIT_YEAR, year_message);
18374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    messages.Set(CREDIT_CARD_EXP_MONTH, month_message);
18382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If there is a credit card number and a CVC, validate them together.
18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (field_values.count(CREDIT_CARD_NUMBER) &&
18424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      field_values.count(CREDIT_CARD_VERIFICATION_CODE)) {
18434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ValidityMessage ccv_message(base::string16(), true);
18444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!autofill::IsValidCreditCardSecurityCode(
18454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            field_values[CREDIT_CARD_VERIFICATION_CODE],
18464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            field_values[CREDIT_CARD_NUMBER])) {
18474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ccv_message.text = l10n_util::GetStringUTF16(
18484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_SECURITY_CODE);
18494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
18504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    messages.Set(CREDIT_CARD_VERIFICATION_CODE, ccv_message);
18512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1853868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Validate the shipping phone number against the country code of the address.
185490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (field_values.count(ADDRESS_HOME_COUNTRY) &&
185590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      field_values.count(PHONE_HOME_WHOLE_NUMBER)) {
185690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    i18n::PhoneObject phone_object(
185790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        field_values[PHONE_HOME_WHOLE_NUMBER],
185890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        AutofillCountry::GetCountryCode(
185990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            field_values[ADDRESS_HOME_COUNTRY],
186090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            g_browser_process->GetApplicationLocale()));
18614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ValidityMessage phone_message(base::string16(), true);
186290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (!phone_object.IsValidNumber()) {
18634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      phone_message.text = l10n_util::GetStringUTF16(
1864868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_PHONE_NUMBER);
1865868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
18664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    messages.Set(PHONE_HOME_WHOLE_NUMBER, phone_message);
1867868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1868868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1869868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Validate the billing phone number against the country code of the address.
1870868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (field_values.count(ADDRESS_BILLING_COUNTRY) &&
1871868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      field_values.count(PHONE_BILLING_WHOLE_NUMBER)) {
1872868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    i18n::PhoneObject phone_object(
1873868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        field_values[PHONE_BILLING_WHOLE_NUMBER],
1874868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        AutofillCountry::GetCountryCode(
1875868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            field_values[ADDRESS_BILLING_COUNTRY],
1876868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            g_browser_process->GetApplicationLocale()));
18774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ValidityMessage phone_message(base::string16(), true);
1878868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (!phone_object.IsValidNumber()) {
18794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      phone_message.text = l10n_util::GetStringUTF16(
1880868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_PHONE_NUMBER);
188190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
18824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    messages.Set(PHONE_BILLING_WHOLE_NUMBER, phone_message);
188390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
188490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
18854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return messages;
18862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::UserEditedOrActivatedInput(
18897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    DialogSection section,
18902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const DetailInput* input,
18912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::NativeView parent_view,
18922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Rect& content_bounds,
18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const string16& field_contents,
18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool was_edit) {
18952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the field is edited down to empty, don't show a popup.
18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (was_edit && field_contents.empty()) {
18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    HidePopup();
18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
18992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
19002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the user clicks while the popup is already showing, be sure to hide
19022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // it.
1903868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!was_edit && popup_controller_.get()) {
19042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    HidePopup();
19052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
19062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
19072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<string16> popup_values, popup_labels, popup_icons;
1909ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (common::IsCreditCardType(input->type)) {
19103240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    GetManager()->GetCreditCardSuggestions(AutofillType(input->type),
19112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           field_contents,
19122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           &popup_values,
19132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           &popup_labels,
19142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           &popup_icons,
19152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           &popup_guids_);
19162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
19173240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    std::vector<ServerFieldType> field_types;
1918d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const DetailInputs& inputs = RequestedFieldsForSection(section);
1919d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    for (DetailInputs::const_iterator iter = inputs.begin();
1920d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)         iter != inputs.end(); ++iter) {
19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      field_types.push_back(iter->type);
19222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
19233240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    GetManager()->GetProfileSuggestions(AutofillType(input->type),
19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        field_contents,
19252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        false,
19262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        field_types,
19272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        &popup_values,
19282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        &popup_labels,
19292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        &popup_icons,
19302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        &popup_guids_);
19312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
19322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (popup_values.empty()) {
1934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    HidePopup();
19352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
19372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(estade): do we need separators and control rows like 'Clear
19392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Form'?
19402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<int> popup_ids;
19412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < popup_guids_.size(); ++i) {
19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    popup_ids.push_back(i);
19432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
19442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  popup_controller_ = AutofillPopupControllerImpl::GetOrCreate(
1946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      popup_controller_,
1947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_ptr_factory_.GetWeakPtr(),
19480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      NULL,
1949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      parent_view,
19507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content_bounds,
19517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::i18n::IsRTL() ?
19527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          base::i18n::RIGHT_TO_LEFT : base::i18n::LEFT_TO_RIGHT);
1953424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  popup_controller_->set_hide_on_outside_click(true);
19544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // |input_showing_popup_| must be set before calling |Show()|.
19564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  input_showing_popup_ = input;
19574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  popup_controller_->Show(popup_values,
19592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          popup_labels,
19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          popup_icons,
19612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          popup_ids);
19622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::FocusMoved() {
19652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HidePopup();
19662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldShowErrorBubble() const {
19694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return !input_showing_popup_;
19704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
19714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
19722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::ViewClosed() {
19732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetManager()->RemoveObserver(this);
19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Called from here rather than in ~AutofillDialogControllerImpl as this
19767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // relies on virtual methods that change to their base class in the dtor.
19777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  MaybeShowCreditCardBubble();
19787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
19792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delete this;
19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1982868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)std::vector<DialogNotification> AutofillDialogControllerImpl::
1983868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    CurrentNotifications() {
19842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<DialogNotification> notifications;
19852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
198658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // TODO(dbeam): figure out a way to dismiss this error after a while.
198758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (wallet_error_notification_)
198858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    notifications.push_back(*wallet_error_notification_);
1989eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (IsSubmitPausedOn(wallet::VERIFY_CVV)) {
1991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    notifications.push_back(DialogNotification(
1992868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        DialogNotification::REQUIRED_ACTION,
1993868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_VERIFY_CVV)));
19942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
19952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!wallet_server_validation_recoverable_) {
1997a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    notifications.push_back(DialogNotification(
1998a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        DialogNotification::REQUIRED_ACTION,
19997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        l10n_util::GetStringUTF16(
20007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            IDS_AUTOFILL_DIALOG_FAILED_TO_SAVE_WALLET_DATA)));
2001a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
2002a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2003868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (choose_another_instrument_or_address_) {
2004868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    notifications.push_back(DialogNotification(
2005868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        DialogNotification::REQUIRED_ACTION,
20067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        l10n_util::GetStringUTF16(
20077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            IDS_AUTOFILL_DIALOG_CHOOSE_DIFFERENT_WALLET_INSTRUMENT)));
2008868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
2009868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2010d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (notifications.empty() && MenuModelForAccountChooser()) {
2011d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    base::string16 text = l10n_util::GetStringUTF16(
2012d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        IsManuallyEditingAnySection() ?
2013d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            IDS_AUTOFILL_DIALOG_SAVE_DETAILS_IN_WALLET :
2014d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            IDS_AUTOFILL_DIALOG_USE_WALLET);
2015d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    DialogNotification notification(
2016d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        DialogNotification::WALLET_USAGE_CONFIRMATION,
2017d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        text);
2018d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    notification.set_tooltip_text(
2019d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        l10n_util::GetStringUTF16(
2020d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            IDS_AUTOFILL_DIALOG_SAVE_IN_WALLET_TOOLTIP));
2021d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    notification.set_checked(IsPayingWithWallet());
2022d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    notifications.push_back(notification);
2023d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
2024d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2025d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (IsPayingWithWallet() && !wallet::IsUsingProd()) {
2026d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    notifications.push_back(DialogNotification(
2027d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        DialogNotification::DEVELOPER_WARNING,
2028d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_NOT_PROD_WARNING)));
2029d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
2030d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2031d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (RequestingCreditCardInfo() && !TransmissionWillBeSecure()) {
2032d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    notifications.push_back(DialogNotification(
2033d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        DialogNotification::SECURITY_WARNING,
2034d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SECURITY_WARNING)));
2035d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
2036d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2037d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!invoked_from_same_origin_) {
2038d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    notifications.push_back(DialogNotification(
2039d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        DialogNotification::SECURITY_WARNING,
2040d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        l10n_util::GetStringFUTF16(IDS_AUTOFILL_DIALOG_SITE_WARNING,
2041d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                   UTF8ToUTF16(source_url_.host()))));
2042eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
2043eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
20442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return notifications;
20452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
204758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::LinkClicked(const GURL& url) {
204858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  OpenTabWithUrl(url);
204958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
205058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2051a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void AutofillDialogControllerImpl::SignInLinkClicked() {
20523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ScopedViewUpdates updates(view_.get());
20533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
20540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (SignedInState() == NOT_CHECKED) {
20550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    handling_use_wallet_link_click_ = true;
20560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    account_chooser_model_.SelectActiveWalletAccount();
20570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    FetchWalletCookieAndUserName();
20580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    view_->UpdateAccountChooser();
20590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  } else if (signin_registrar_.IsEmpty()) {
2060a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    // Start sign in.
2061a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    DCHECK(!IsPayingWithWallet());
2062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
20634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    waiting_for_explicit_sign_in_response_ = true;
2064a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    content::Source<content::NavigationController> source(view_->ShowSignIn());
2065a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    signin_registrar_.Add(
2066a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, source);
2067a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    view_->UpdateAccountChooser();
20682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2069a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    GetMetricLogger().LogDialogUiEvent(
207058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        AutofillMetrics::DIALOG_UI_SIGNIN_SHOWN);
2071a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  } else {
20724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    waiting_for_explicit_sign_in_response_ = false;
2073a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    HideSignIn();
2074a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
20752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2077c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::NotificationCheckboxStateChanged(
2078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DialogNotification::Type type, bool checked) {
2079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (type == DialogNotification::WALLET_USAGE_CONFIRMATION) {
2080c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (checked)
2081c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      account_chooser_model_.SelectActiveWalletAccount();
2082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    else
2083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      account_chooser_model_.SelectUseAutofill();
20842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
20862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LegalDocumentLinkClicked(
208858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const gfx::Range& range) {
2089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < legal_document_link_ranges_.size(); ++i) {
2090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (legal_document_link_ranges_[i] == range) {
2091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OpenTabWithUrl(wallet_items_->legal_documents()[i]->url());
2092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;
2093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
20942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NOTREACHED();
20972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2099ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool AutofillDialogControllerImpl::OnCancel() {
2100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HidePopup();
210158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!is_submitting_)
21027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    LogOnCancelMetrics();
2103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  callback_.Run(NULL);
2104ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return true;
2105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2107ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool AutofillDialogControllerImpl::OnAccept() {
21080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScopedViewUpdates updates(view_.get());
2109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  choose_another_instrument_or_address_ = false;
21107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  wallet_server_validation_recoverable_ = true;
2111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HidePopup();
211258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
211358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // This must come before SetIsSubmitting().
2114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (IsPayingWithWallet()) {
21158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // In the VERIFY_CVV case, hold onto the previously submitted cardholder
21168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // name.
21178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    if (!IsSubmitPausedOn(wallet::VERIFY_CVV)) {
21188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      submitted_cardholder_name_ =
21198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)          GetValueFromSection(SECTION_CC_BILLING, NAME_BILLING_FULL);
21208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
21218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      // Snag the last four digits of the backing card now as it could be wiped
21228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      // out if a CVC challenge happens.
21238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      if (ActiveInstrument()) {
21248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        backing_card_last_four_ = ActiveInstrument()->TypeAndLastFourDigits();
21258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      } else {
21268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        DetailOutputMap output;
21278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        view_->GetUserInput(SECTION_CC_BILLING, &output);
21288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        CreditCard card;
21298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        GetBillingInfoFromOutputs(output, &card, NULL, NULL);
21308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        backing_card_last_four_ = card.TypeAndLastFourDigits();
21318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      }
21328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    }
21338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    DCHECK(!submitted_cardholder_name_.empty());
21348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    DCHECK(!backing_card_last_four_.empty());
2135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
2136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetIsSubmitting(true);
213858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (IsSubmitPausedOn(wallet::VERIFY_CVV)) {
2140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DCHECK(!active_instrument_id_.empty());
21410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    full_wallet_.reset();
2142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GetWalletClient()->AuthenticateInstrument(
2143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        active_instrument_id_,
2144ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        UTF16ToUTF8(view_->GetCvc()));
21450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    view_->UpdateOverlay();
2146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else if (IsPayingWithWallet()) {
21470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    AcceptLegalTerms();
2148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
21492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FinishSubmit();
2150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2151ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2152ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return false;
21532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
21542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Profile* AutofillDialogControllerImpl::profile() {
21562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return profile_;
21572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
21582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2159bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochcontent::WebContents* AutofillDialogControllerImpl::GetWebContents() {
2160bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  return web_contents();
21612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
21622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
21642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// AutofillPopupDelegate implementation.
21652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogControllerImpl::OnPopupShown() {
21674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ScopedViewUpdates update(view_.get());
21684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  view_->UpdateErrorBubble();
21694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
217058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogPopupEvent(AutofillMetrics::DIALOG_POPUP_SHOWN);
21712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
21722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogControllerImpl::OnPopupHidden() {}
2174424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2175424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool AutofillDialogControllerImpl::ShouldRepostEvent(
2176424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const ui::MouseEvent& event) {
2177424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // If the event would be reposted inside |input_showing_popup_|, just ignore.
2178424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return !view_->HitTestInput(*input_showing_popup_, event.location());
2179424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
21802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::DidSelectSuggestion(int identifier) {
21822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(estade): implement.
21832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
21842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::DidAcceptSuggestion(const string16& value,
21862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                       int identifier) {
21873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ScopedViewUpdates updates(view_.get());
21882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const PersonalDataManager::GUIDPair& pair = popup_guids_[identifier];
21892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<DataModelWrapper> wrapper;
2191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (common::IsCreditCardType(input_showing_popup_->type)) {
2192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    wrapper.reset(new AutofillCreditCardWrapper(
2193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        GetManager()->GetCreditCardByGUID(pair.first)));
2194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
2195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    wrapper.reset(new AutofillProfileWrapper(
2196d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        GetManager()->GetProfileByGUID(pair.first),
2197d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        AutofillType(input_showing_popup_->type),
2198d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        pair.second));
2199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
22002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) {
2202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DialogSection section = static_cast<DialogSection>(i);
2203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    wrapper->FillInputs(MutableRequestedFieldsForSection(section));
2204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    view_->FillSection(section, *input_showing_popup_);
2205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
22062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetMetricLogger().LogDialogPopupEvent(
220858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      AutofillMetrics::DIALOG_POPUP_FORM_FILLED);
22092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(estade): not sure why it's necessary to do this explicitly.
22112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HidePopup();
22122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
22132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::RemoveSuggestion(const string16& value,
22152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                    int identifier) {
22162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(estade): implement.
22172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
22182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::ClearPreviewedForm() {
22202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(estade): implement.
22212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
22222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
22242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// content::NotificationObserver implementation.
22252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::Observe(
22272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int type,
22282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::NotificationSource& source,
22292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::NotificationDetails& details) {
22302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(type, content::NOTIFICATION_NAV_ENTRY_COMMITTED);
22312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::LoadCommittedDetails* load_details =
22322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::Details<content::LoadCommittedDetails>(details).ptr();
22331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (IsSignInContinueUrl(load_details->entry->GetVirtualURL())) {
22344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // TODO(estade): will need to update this when we fix <crbug.com/247755>.
2235b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    account_chooser_model_.SelectActiveWalletAccount();
22364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    FetchWalletCookieAndUserName();
22371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
22381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // NOTE: |HideSignIn()| may delete the WebContents which doesn't expect to
22391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // be deleted while committing a nav entry. Just call |HideSignIn()| later.
22401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
22411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        base::Bind(&AutofillDialogControllerImpl::HideSignIn,
22421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                   base::Unretained(this)));
22432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
22442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
22452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
22472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// SuggestionsMenuModelDelegate implementation.
22482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AutofillDialogControllerImpl::SuggestionsMenuWillShow() {
22504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  HidePopup();
22514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
22524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::SuggestionItemSelected(
2254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SuggestionsMenuModel* model,
2255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    size_t index) {
22563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ScopedViewUpdates updates(view_.get());
22573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (model->GetItemKeyAt(index) == kManageItemsKey) {
225990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    GURL url;
226090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (!IsPayingWithWallet()) {
226190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GURL settings_url(chrome::kChromeUISettingsURL);
226290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      url = settings_url.Resolve(chrome::kAutofillSubPage);
226390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    } else {
226458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      // Reset |last_wallet_items_fetch_timestamp_| to ensure that the Wallet
226558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      // data is refreshed as soon as the user switches back to this tab after
226658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      // potentially editing his data.
226758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      last_wallet_items_fetch_timestamp_ = base::TimeTicks();
22684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      size_t user_index = account_chooser_model_.GetActiveWalletAccountIndex();
226990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      url = SectionForSuggestionsMenuModel(*model) == SECTION_SHIPPING ?
22704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          wallet::GetManageAddressesUrl(user_index) :
22714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          wallet::GetManageInstrumentsUrl(user_index);
227290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
227390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    OpenTabWithUrl(url);
2275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
2276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  model->SetCheckedIndex(index);
2279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DialogSection section = SectionForSuggestionsMenuModel(*model);
2280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ResetSectionInput(section);
2281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ShowEditUiIfBadSuggestion(section);
2282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  UpdateSection(section);
2283d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  view_->UpdateNotificationArea();
2284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  UpdateForErrors();
2285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LogSuggestionItemSelectedMetric(*model);
22872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
22882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
22902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// wallet::WalletClientDelegate implementation.
22912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const AutofillMetrics& AutofillDialogControllerImpl::GetMetricLogger() const {
22932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return metric_logger_;
22942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
22952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string AutofillDialogControllerImpl::GetRiskData() const {
2297eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(!risk_data_.empty());
2298eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return risk_data_;
22992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
23002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstd::string AutofillDialogControllerImpl::GetWalletCookieValue() const {
23027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return wallet_cookie_value_;
23037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
23047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2305a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool AutofillDialogControllerImpl::IsShippingAddressRequired() const {
2306a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return cares_about_shipping_;
2307a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
2308a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
23092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidAcceptLegalDocuments() {
231090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(is_submitting_ && IsPayingWithWallet());
231190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  has_accepted_legal_documents_ = true;
231290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  LoadRiskFingerprintData();
23132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
23142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidAuthenticateInstrument(bool success) {
2316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(is_submitting_ && IsPayingWithWallet());
2317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // TODO(dbeam): use the returned full wallet. http://crbug.com/224992
2319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (success) {
23202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetFullWallet();
2321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else {
23227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    DisableWallet(wallet::WalletClient::UNKNOWN_ERROR);
2323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SuggestionsUpdated();
2324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
23252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
23262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidGetFullWallet(
23282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<wallet::FullWallet> full_wallet) {
2329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(is_submitting_ && IsPayingWithWallet());
23303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ScopedViewUpdates updates(view_.get());
2331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  full_wallet_ = full_wallet.Pass();
23332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (full_wallet_->required_actions().empty()) {
23352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FinishSubmit();
2336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
2337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  switch (full_wallet_->required_actions()[0]) {
2340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case wallet::CHOOSE_ANOTHER_INSTRUMENT_OR_ADDRESS:
2341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      choose_another_instrument_or_address_ = true;
2342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SetIsSubmitting(false);
2343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      GetWalletItems();
2344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
2345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case wallet::VERIFY_CVV:
2347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SuggestionsUpdated();
2348868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
2349868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2350868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    default:
23517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      DisableWallet(wallet::WalletClient::UNKNOWN_ERROR);
23528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      return;
2353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
23548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
23558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  view_->UpdateNotificationArea();
23568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  view_->UpdateButtonStrip();
23578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  view_->UpdateOverlay();
2358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::OnPassiveSigninSuccess(
23614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const std::vector<std::string>& usernames) {
23624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // TODO(estade): for now, we still only support single user login.
23634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<std::string> username;
23644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!usernames.empty())
23654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    username.push_back(usernames[0]);
23664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  account_chooser_model_.SetWalletAccounts(username);
23677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  signin_helper_->StartWalletCookieValueFetch();
2368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::OnUserNameFetchSuccess(
23714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const std::vector<std::string>& usernames) {
23723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ScopedViewUpdates updates(view_.get());
23734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // TODO(estade): for now, we still only support single user login.
23754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<std::string> username;
23764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!usernames.empty())
23774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    username.push_back(usernames[0]);
23784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  account_chooser_model_.SetWalletAccounts(username);
23804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  username_fetcher_.reset();
2381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  OnWalletOrSigninUpdate();
2382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::OnPassiveSigninFailure(
2385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const GoogleServiceAuthError& error) {
2386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(aruslan): report an error.
2387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LOG(ERROR) << "failed to passively sign in: " << error.ToString();
23884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  signin_helper_.reset();
2389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  OnWalletSigninError();
2390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::OnUserNameFetchFailure(
2393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const GoogleServiceAuthError& error) {
2394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(aruslan): report an error.
2395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LOG(ERROR) << "failed to fetch the user account name: " << error.ToString();
23964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  username_fetcher_.reset();
23974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Only treat the failed fetch as an error if the user is known to already be
23984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // signed in. Attempting to fetch the username prior to loading the
23994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // |wallet_items_| is purely a performance optimization that shouldn't be
24004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // treated as an error if it fails.
24014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (wallet_items_)
24024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    OnWalletSigninError();
2403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AutofillDialogControllerImpl::OnDidFetchWalletCookieValue(
24067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const std::string& cookie_value) {
24077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  wallet_cookie_value_ = cookie_value;
24087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  signin_helper_.reset();
24097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  GetWalletItems();
24102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
24112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidGetWalletItems(
24132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<wallet::WalletItems> wallet_items) {
2414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  legal_documents_text_.clear();
2415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  legal_document_link_ranges_.clear();
241690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  has_accepted_legal_documents_ = false;
24172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  wallet_items_ = wallet_items.Pass();
24191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ConstructLegalDocumentsText();
24200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  OnWalletOrSigninUpdate();
24212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
24222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2423ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid AutofillDialogControllerImpl::OnDidSaveToWallet(
24242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& instrument_id,
2425ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const std::string& address_id,
24267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::vector<wallet::RequiredAction>& required_actions,
24277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::vector<wallet::FormFieldError>& form_field_errors) {
2428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(is_submitting_ && IsPayingWithWallet());
2429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2430a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (required_actions.empty()) {
2431ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (!address_id.empty())
2432ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      active_address_id_ = address_id;
2433ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (!instrument_id.empty())
2434ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      active_instrument_id_ = instrument_id;
2435ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    GetFullWallet();
2436a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  } else {
24377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    OnWalletFormFieldError(form_field_errors);
2438a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    HandleSaveOrUpdateRequiredActions(required_actions);
2439a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
24402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
24412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnWalletError(
24432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    wallet::WalletClient::ErrorType error_type) {
24447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DisableWallet(error_type);
24452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
24462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
24482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// PersonalDataManagerObserver implementation.
24492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnPersonalDataChanged() {
245190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (is_submitting_)
245290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
245390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SuggestionsUpdated();
24552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
24562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// AccountChooserModelDelegate implementation.
2459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AutofillDialogControllerImpl::AccountChooserWillShow() {
24614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  HidePopup();
24624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
24634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
24642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::AccountChoiceChanged() {
24653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ScopedViewUpdates updates(view_.get());
24664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  wallet::WalletClient* client = GetWalletClient();
24673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (is_submitting_)
24694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    client->CancelRequests();
2470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetIsSubmitting(false);
2472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  size_t selected_user_index =
24744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      account_chooser_model_.GetActiveWalletAccountIndex();
24754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (account_chooser_model_.WalletIsSelected() &&
24764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      client->user_index() != selected_user_index) {
24774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    client->CancelRequests();
24784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    client->set_user_index(selected_user_index);
24794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    GetWalletItems();
24804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  } else {
24814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SuggestionsUpdated();
24824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    UpdateAccountChooserView();
24834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
24852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::UpdateAccountChooserView() {
2487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (view_) {
24883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ScopedViewUpdates updates(view_.get());
2489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    view_->UpdateAccountChooser();
2490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    view_->UpdateNotificationArea();
24912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
24922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
24932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
24952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::HandleKeyPressEventInInput(
24972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::NativeWebKeyboardEvent& event) {
2498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (popup_controller_.get())
24992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return popup_controller_->HandleKeyPressEvent(event);
25002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
25022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
25032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::RequestingCreditCardInfo() const {
25052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_GT(form_structure_.field_count(), 0U);
25062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < form_structure_.field_count(); ++i) {
2508bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    AutofillType type = form_structure_.field(i)->Type();
2509ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (common::IsCreditCardType(type.GetStorableType()))
25102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
25112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
25122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
25142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
25152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::TransmissionWillBeSecure() const {
2517424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return source_url_.SchemeIs(content::kHttpsScheme);
25182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
25192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool AutofillDialogControllerImpl::IsSubmitPausedOn(
25218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    wallet::RequiredAction required_action) const {
25228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return full_wallet_ && full_wallet_->HasRequiredAction(required_action);
25238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
25248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2525ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerImpl::ShowNewCreditCardBubble(
2526ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    scoped_ptr<CreditCard> new_card,
2527ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    scoped_ptr<AutofillProfile> billing_profile) {
2528ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if !defined(OS_ANDROID)
25290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  NewCreditCardBubbleController::Show(web_contents(),
2530ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                      new_card.Pass(),
2531ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                      billing_profile.Pass());
2532ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif
2533ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
2534ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
253558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::SubmitButtonDelayBegin() {
253658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  submit_button_delay_timer_.Start(
253758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      FROM_HERE,
253858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      base::TimeDelta::FromMilliseconds(kSubmitButtonDelayMs),
253958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      this,
254058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      &AutofillDialogControllerImpl::OnSubmitButtonDelayEnd);
254158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
254258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
254358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::SubmitButtonDelayEndForTesting() {
254458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(submit_button_delay_timer_.IsRunning());
254558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  submit_button_delay_timer_.user_task().Run();
254658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  submit_button_delay_timer_.Stop();
254758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
254858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
25494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AutofillDialogControllerImpl::
25504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ClearLastWalletItemsFetchTimestampForTesting() {
25514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  last_wallet_items_fetch_timestamp_ = base::TimeTicks();
25524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
25534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
25541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)const AccountChooserModel& AutofillDialogControllerImpl::
25551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    AccountChooserModelForTesting() const {
25561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return account_chooser_model_;
25571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
25581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
25591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool AutofillDialogControllerImpl::IsSignInContinueUrl(const GURL& url) const {
25601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return wallet::IsSignInContinueUrl(url);
25611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
25621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)AutofillDialogControllerImpl::AutofillDialogControllerImpl(
2564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::WebContents* contents,
2565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const FormData& form_structure,
2566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const GURL& source_url,
2567d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const base::Callback<void(const FormStructure*)>& callback)
2568bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    : WebContentsObserver(contents),
2569bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      profile_(Profile::FromBrowserContext(contents->GetBrowserContext())),
2570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      initial_user_state_(AutofillMetrics::DIALOG_USER_STATE_UNKNOWN),
257158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      form_structure_(form_structure),
2572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      invoked_from_same_origin_(true),
2573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      source_url_(source_url),
2574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      callback_(callback),
25750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      account_chooser_model_(this, profile_, metric_logger_),
25764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      wallet_client_(profile_->GetRequestContext(), this, source_url),
25770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      wallet_items_requested_(false),
25780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      handling_use_wallet_link_click_(false),
25790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      country_combobox_model_(*GetManager()),
2580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      suggested_cc_(this),
2581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      suggested_billing_(this),
2582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      suggested_cc_billing_(this),
2583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      suggested_shipping_(this),
2584868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      cares_about_shipping_(true),
2585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      input_showing_popup_(NULL),
2586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_ptr_factory_(this),
25874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      waiting_for_explicit_sign_in_response_(false),
258890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      has_accepted_legal_documents_(false),
2589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      is_submitting_(false),
2590868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      choose_another_instrument_or_address_(false),
25917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      wallet_server_validation_recoverable_(true),
2592bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      data_was_passed_back_(false),
2593ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      was_ui_latency_logged_(false),
259458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      card_generated_animation_(2000, 60, this) {
2595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(estade): remove duplicates from |form_structure|?
2596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!callback_.is_null());
2597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutofillDialogView* AutofillDialogControllerImpl::CreateView() {
26002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return AutofillDialogView::Create(this);
26012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
26022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PersonalDataManager* AutofillDialogControllerImpl::GetManager() {
26042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return PersonalDataManagerFactory::GetForProfile(profile_);
26052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
26062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)wallet::WalletClient* AutofillDialogControllerImpl::GetWalletClient() {
26082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return &wallet_client_;
26092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
26102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::IsPayingWithWallet() const {
2612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return account_chooser_model_.WalletIsSelected() &&
2613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         SignedInState() == SIGNED_IN;
26142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
26152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
261690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AutofillDialogControllerImpl::LoadRiskFingerprintData() {
261790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  risk_data_.clear();
261890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
261990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  uint64 obfuscated_gaia_id = 0;
262090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool success = base::StringToUint64(wallet_items_->obfuscated_gaia_id(),
262190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                      &obfuscated_gaia_id);
262290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(success);
262390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
262490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect window_bounds;
262590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  window_bounds = GetBaseWindowForWebContents(web_contents())->GetBounds();
262690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
262790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PrefService* user_prefs = profile_->GetPrefs();
262890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string charset = user_prefs->GetString(::prefs::kDefaultCharset);
262990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string accept_languages =
263090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      user_prefs->GetString(::prefs::kAcceptLanguages);
263190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::Time install_time = base::Time::FromTimeT(
263290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      g_browser_process->local_state()->GetInt64(::prefs::kInstallDate));
263390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
263490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  risk::GetFingerprint(
263590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      obfuscated_gaia_id, window_bounds, *web_contents(),
263690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      chrome::VersionInfo().Version(), charset, accept_languages, install_time,
263758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      g_browser_process->GetApplicationLocale(),
263890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&AutofillDialogControllerImpl::OnDidLoadRiskFingerprintData,
263990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr()));
264090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
264190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
264290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidLoadRiskFingerprintData(
264390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    scoped_ptr<risk::Fingerprint> fingerprint) {
264490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(AreLegalDocumentsCurrent());
264590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
264690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string proto_data;
264790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  fingerprint->SerializeToString(&proto_data);
264890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool success = base::Base64Encode(proto_data, &risk_data_);
264990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(success);
265090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2651eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SubmitWithWallet();
265290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
265390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::OpenTabWithUrl(const GURL& url) {
2655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chrome::NavigateParams params(
2656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      chrome::FindBrowserWithWebContents(web_contents()),
2657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      url,
2658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content::PAGE_TRANSITION_AUTO_BOOKMARK);
2659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  params.disposition = NEW_FOREGROUND_TAB;
2660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chrome::Navigate(&params);
26612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
26622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2663eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AutofillDialogControllerImpl::IsEditingExistingData(
2664eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DialogSection section) const {
2665eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return section_editing_state_.count(section) > 0;
2666eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
2667eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2668eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AutofillDialogControllerImpl::IsManuallyEditingSection(
2669eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DialogSection section) const {
2670eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return IsEditingExistingData(section) ||
2671eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         SuggestionsMenuModelForSection(section)->
2672eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch             GetItemKeyForCheckedItem() == kAddNewItemKey;
2673eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
2674eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2675868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void AutofillDialogControllerImpl::OnWalletSigninError() {
2676868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  account_chooser_model_.SetHadWalletSigninError();
2677868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GetWalletClient()->CancelRequests();
2678868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  LogDialogLatencyToShow();
2679868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
2680868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
26817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void AutofillDialogControllerImpl::DisableWallet(
26827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    wallet::WalletClient::ErrorType error_type) {
2683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  signin_helper_.reset();
26844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  username_fetcher_.reset();
2685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  wallet_items_.reset();
26867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  wallet_errors_.clear();
268790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GetWalletClient()->CancelRequests();
2688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetIsSubmitting(false);
268958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  wallet_error_notification_ = GetWalletError(error_type);
269058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  account_chooser_model_.SetHadWalletError();
26912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
26922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::SuggestionsUpdated() {
26943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ScopedViewUpdates updates(view_.get());
26953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2696eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const DetailOutputMap snapshot = TakeUserInputSnapshot();
2697eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
26982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  suggested_cc_.Reset();
26992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  suggested_billing_.Reset();
27002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  suggested_cc_billing_.Reset();
27012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  suggested_shipping_.Reset();
2702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HidePopup();
2703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  suggested_shipping_.AddKeyedItem(
2705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kSameAsBillingKey,
2706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_USE_BILLING_FOR_SHIPPING));
27072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (IsPayingWithWallet()) {
2709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::vector<wallet::Address*>& addresses =
2710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        wallet_items_->addresses();
2711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (size_t i = 0; i < addresses.size(); ++i) {
2712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      std::string key = base::IntToString(i);
271358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      suggested_shipping_.AddKeyedItemWithMinorText(
2714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          key,
2715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          addresses[i]->DisplayName(),
2716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          addresses[i]->DisplayNameDetail());
2717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
271858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      const std::string default_shipping_address_id =
271958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          GetIdToSelect(wallet_items_->default_address_id(),
272058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        previous_default_shipping_address_id_,
272158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        previously_selected_shipping_address_id_);
272258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      if (addresses[i]->object_id() == default_shipping_address_id)
2723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        suggested_shipping_.SetCheckedItem(key);
2724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
27252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!IsSubmitPausedOn(wallet::VERIFY_CVV)) {
27272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::vector<wallet::WalletItems::MaskedInstrument*>& instruments =
27282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          wallet_items_->instruments();
272990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      std::string first_active_instrument_key;
273090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      std::string default_instrument_key;
27312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (size_t i = 0; i < instruments.size(); ++i) {
273290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        bool allowed = IsInstrumentAllowed(*instruments[i]);
273390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        gfx::Image icon = instruments[i]->CardIcon();
273490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if (!allowed && !icon.IsEmpty()) {
273590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          // Create a grayed disabled icon.
273690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          SkBitmap disabled_bitmap = SkBitmapOperations::CreateHSLShiftedBitmap(
273790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              *icon.ToSkBitmap(), kGrayImageShift);
273890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          icon = gfx::Image(
273990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              gfx::ImageSkia::CreateFrom1xBitmap(disabled_bitmap));
274090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        }
2741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        std::string key = base::IntToString(i);
274258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        suggested_cc_billing_.AddKeyedItemWithMinorTextAndIcon(
2743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            key,
27442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            instruments[i]->DisplayName(),
27452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            instruments[i]->DisplayNameDetail(),
274690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            icon);
274790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        suggested_cc_billing_.SetEnabled(key, allowed);
274890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
274990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if (allowed) {
275090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          if (first_active_instrument_key.empty())
275190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            first_active_instrument_key = key;
275258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
275358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch          const std::string default_instrument_id =
275458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              GetIdToSelect(wallet_items_->default_instrument_id(),
275558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                            previous_default_instrument_id_,
275658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                            previously_selected_instrument_id_);
275758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch          if (instruments[i]->object_id() == default_instrument_id)
275890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            default_instrument_key = key;
2759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
27602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
27612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      suggested_cc_billing_.AddKeyedItem(
2763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          kAddNewItemKey,
2764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_ADD_BILLING_DETAILS));
276590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (!wallet_items_->HasRequiredAction(wallet::SETUP_WALLET)) {
276658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        suggested_cc_billing_.AddKeyedItemWithMinorText(
276790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            kManageItemsKey,
276890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            l10n_util::GetStringUTF16(
27697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                IDS_AUTOFILL_DIALOG_MANAGE_BILLING_DETAILS),
27704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                UTF8ToUTF16(wallet::GetManageInstrumentsUrl(0U).host()));
277190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      }
277290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
277390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // Determine which instrument item should be selected.
277490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (!default_instrument_key.empty())
277590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        suggested_cc_billing_.SetCheckedItem(default_instrument_key);
277690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      else if (!first_active_instrument_key.empty())
277790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        suggested_cc_billing_.SetCheckedItem(first_active_instrument_key);
277890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      else
277990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        suggested_cc_billing_.SetCheckedItem(kAddNewItemKey);
2780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
27812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
27822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PersonalDataManager* manager = GetManager();
2783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::vector<CreditCard*>& cards = manager->GetCreditCards();
27842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
27852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < cards.size(); ++i) {
278690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (!HasCompleteAndVerifiedData(*cards[i], requested_cc_fields_))
278790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        continue;
278890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
27892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      suggested_cc_.AddKeyedItemWithIcon(
27902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          cards[i]->guid(),
27912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          cards[i]->Label(),
27927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          rb.GetImageNamed(CreditCard::IconResourceId(cards[i]->type())));
27932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
27942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::vector<AutofillProfile*>& profiles = manager->GetProfiles();
2796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::string app_locale = g_browser_process->GetApplicationLocale();
27972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < profiles.size(); ++i) {
279858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const AutofillProfile& profile = *profiles[i];
279958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      if (!HasCompleteAndVerifiedData(profile, requested_shipping_fields_) ||
2800eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          HasInvalidAddress(*profiles[i])) {
28012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        continue;
2802eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      }
28032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
280458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // Don't add variants for addresses: name is part of credit card and we'll
280558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // just ignore email and phone number variants.
280658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      suggested_shipping_.AddKeyedItem(profile.guid(), profile.Label());
280758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      if (!profile.GetRawInfo(EMAIL_ADDRESS).empty() &&
280858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          !profile.IsPresentButInvalid(EMAIL_ADDRESS)) {
280958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        suggested_billing_.AddKeyedItem(profile.guid(), profile.Label());
28102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
28112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
28122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    suggested_cc_.AddKeyedItem(
2814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        kAddNewItemKey,
28152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_ADD_CREDIT_CARD));
2816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    suggested_cc_.AddKeyedItem(
2817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        kManageItemsKey,
2818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_MANAGE_CREDIT_CARD));
28192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    suggested_billing_.AddKeyedItem(
2820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        kAddNewItemKey,
28212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_ADD_BILLING_ADDRESS));
2822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    suggested_billing_.AddKeyedItem(
2823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        kManageItemsKey,
2824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_MANAGE_BILLING_ADDRESS));
28252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
28262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  suggested_shipping_.AddKeyedItem(
2828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kAddNewItemKey,
28292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_ADD_SHIPPING_ADDRESS));
28307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!IsPayingWithWallet()) {
283190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    suggested_shipping_.AddKeyedItem(
283290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        kManageItemsKey,
283390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_MANAGE_SHIPPING_ADDRESS));
28347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  } else if (!wallet_items_->HasRequiredAction(wallet::SETUP_WALLET)) {
283558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    suggested_shipping_.AddKeyedItemWithMinorText(
28367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        kManageItemsKey,
28377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_MANAGE_SHIPPING_ADDRESS),
28384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        UTF8ToUTF16(wallet::GetManageAddressesUrl(0U).host()));
283990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
2840c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!IsPayingWithWallet()) {
284290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) {
284390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      DialogSection section = static_cast<DialogSection>(i);
284490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (!SectionIsActive(section))
284590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        continue;
284690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
284790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // Set the starting choice for the menu. First set to the default in case
284890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // the GUID saved in prefs refers to a profile that no longer exists.
284990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      std::string guid;
2850d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      GetDefaultAutofillChoice(section, &guid);
285190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section);
2852d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      model->SetCheckedItem(guid);
2853d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      if (GetAutofillChoice(section, &guid))
2854d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        model->SetCheckedItem(guid);
285590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
2856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (view_)
2859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    view_->ModelChanged();
2860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2861eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) {
2862eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ResetSectionInput(static_cast<DialogSection>(i));
2863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2864eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2865eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RestoreUserInputFromSnapshot(snapshot);
2866eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2867eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) {
2868eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DialogSection section = static_cast<DialogSection>(i);
28694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!SectionIsActive(section))
28704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      continue;
28714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2872eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ShowEditUiIfBadSuggestion(section);
2873eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    UpdateSection(section);
2874eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
2875eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2876eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  UpdateForErrors();
28772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
28782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::FillOutputForSectionWithComparator(
28802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DialogSection section,
28812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const InputFieldComparator& compare) {
2882868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const DetailInputs& inputs = RequestedFieldsForSection(section);
2883868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
28842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!SectionIsActive(section))
28852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
28862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section);
28882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (wrapper) {
28892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Only fill in data that is associated with this section.
28902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const DetailInputs& inputs = RequestedFieldsForSection(section);
28912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    wrapper->FillFormStructure(inputs, compare, &form_structure_);
28922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // CVC needs special-casing because the CreditCard class doesn't store or
28942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // handle them. This isn't necessary when filling the combined CC and
28952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // billing section as CVC comes from |full_wallet_| in this case.
28962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (section == SECTION_CC)
289758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      SetOutputForFieldsOfType(CREDIT_CARD_VERIFICATION_CODE, view_->GetCvc());
289858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
289958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // When filling from Wallet data, use the email address associated with the
290058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // account. There is no other email address stored as part of a Wallet
290158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // address.
290258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (section == SECTION_CC_BILLING) {
290358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      SetOutputForFieldsOfType(
29044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          EMAIL_ADDRESS, account_chooser_model_.GetActiveWalletAccountName());
290558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
29062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
29072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The user manually input data. If using Autofill, save the info as new or
29082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // edited data. Always fill local data into |form_structure_|.
29092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DetailOutputMap output;
29102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->GetUserInput(section, &output);
29112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (section == SECTION_CC) {
29132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreditCard card;
291490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      card.set_origin(kAutofillDialogOrigin);
29152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FillFormGroupFromOutputs(output, &card);
29162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      // The card holder name comes from the billing address section.
29187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      card.SetRawInfo(CREDIT_CARD_NAME,
29194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      GetValueFromSection(SECTION_BILLING, NAME_BILLING_FULL));
29207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
29217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if (ShouldSaveDetailsLocally()) {
2922d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        std::string guid = GetManager()->SaveImportedCreditCard(card);
2923d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        newly_saved_data_model_guids_[section] = guid;
29247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        DCHECK(!profile()->IsOffTheRecord());
29257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        newly_saved_card_.reset(new CreditCard(card));
29267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      }
29272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2928868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      AutofillCreditCardWrapper card_wrapper(&card);
2929868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      card_wrapper.FillFormStructure(inputs, compare, &form_structure_);
29302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Again, CVC needs special-casing. Fill it in directly from |output|.
293258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      SetOutputForFieldsOfType(
293358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          CREDIT_CARD_VERIFICATION_CODE,
293458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          GetValueForType(output, CREDIT_CARD_VERIFICATION_CODE));
29352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
29362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AutofillProfile profile;
293790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      profile.set_origin(kAutofillDialogOrigin);
29382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FillFormGroupFromOutputs(output, &profile);
29392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2940d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      if (ShouldSaveDetailsLocally()) {
2941d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        std::string guid = GetManager()->SaveImportedProfile(profile);
2942d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        newly_saved_data_model_guids_[section] = guid;
2943d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      }
29442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2945d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      AutofillProfileWrapper profile_wrapper(&profile);
2946868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      profile_wrapper.FillFormStructure(inputs, compare, &form_structure_);
29472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
29482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
29492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
29502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::FillOutputForSection(DialogSection section) {
29527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  FillOutputForSectionWithComparator(
2953ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      section, base::Bind(common::DetailInputMatchesField, section));
29542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
29552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2956868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool AutofillDialogControllerImpl::FormStructureCaresAboutSection(
2957868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DialogSection section) const {
2958868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // For now, only SECTION_SHIPPING may be omitted due to a site not asking for
2959868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // any of the fields.
2960a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (section == SECTION_SHIPPING)
2961868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return cares_about_shipping_;
2962868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2963868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
29642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
29652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
296658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::SetOutputForFieldsOfType(
296758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ServerFieldType type,
296858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const base::string16& output) {
29692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < form_structure_.field_count(); ++i) {
29702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AutofillField* field = form_structure_.field(i);
297158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (field->Type().GetStorableType() == type)
297258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      field->value = output;
29732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
29742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
29752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
297690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)string16 AutofillDialogControllerImpl::GetValueFromSection(
297790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    DialogSection section,
29783240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    ServerFieldType type) {
297990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(SectionIsActive(section));
298090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
298190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section);
298290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (wrapper)
29833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    return wrapper->GetInfo(AutofillType(type));
2984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
298590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DetailOutputMap output;
298690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  view_->GetUserInput(section, &output);
29878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return GetValueForType(output, type);
298890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
298990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
29902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SuggestionsMenuModel* AutofillDialogControllerImpl::
29912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SuggestionsMenuModelForSection(DialogSection section) {
29922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (section) {
29932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_CC:
29942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return &suggested_cc_;
29952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_BILLING:
29962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return &suggested_billing_;
29972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_SHIPPING:
29982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return &suggested_shipping_;
29992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case SECTION_CC_BILLING:
30002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return &suggested_cc_billing_;
30012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
30022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
30042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return NULL;
30052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
30062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const SuggestionsMenuModel* AutofillDialogControllerImpl::
3008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SuggestionsMenuModelForSection(DialogSection section) const {
3009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return const_cast<AutofillDialogControllerImpl*>(this)->
3010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SuggestionsMenuModelForSection(section);
3011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
30132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DialogSection AutofillDialogControllerImpl::SectionForSuggestionsMenuModel(
30142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const SuggestionsMenuModel& model) {
30152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (&model == &suggested_cc_)
30162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return SECTION_CC;
30172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (&model == &suggested_billing_)
30192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return SECTION_BILLING;
30202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (&model == &suggested_cc_billing_)
30222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return SECTION_CC_BILLING;
30232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(&model, &suggested_shipping_);
30252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return SECTION_SHIPPING;
30262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
30272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DetailInputs* AutofillDialogControllerImpl::MutableRequestedFieldsForSection(
30292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DialogSection section) {
30302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return const_cast<DetailInputs*>(&RequestedFieldsForSection(section));
30312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
30322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::HidePopup() {
3034868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (popup_controller_.get())
30352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    popup_controller_->Hide();
3036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  input_showing_popup_ = NULL;
30372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
30382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3039868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void AutofillDialogControllerImpl::SetEditingExistingData(
3040868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DialogSection section, bool editing) {
3041868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (editing)
3042868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    section_editing_state_.insert(section);
3043868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  else
3044868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    section_editing_state_.erase(section);
3045868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
3046868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::IsASuggestionItemKey(
3048868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const std::string& key) const {
3049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return !key.empty() &&
3050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      key != kAddNewItemKey &&
3051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      key != kManageItemsKey &&
3052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      key != kSameAsBillingKey;
3053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
30542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::IsManuallyEditingAnySection() const {
3056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t section = SECTION_MIN; section <= SECTION_MAX; ++section) {
3057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (IsManuallyEditingSection(static_cast<DialogSection>(section)))
3058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return true;
3059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
30602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
30612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
30622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::CreditCardNumberValidityMessage(
30647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const base::string16& number) const {
30657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!number.empty() && !autofill::IsValidCreditCardNumber(number)) {
30667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return l10n_util::GetStringUTF16(
30677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_NUMBER);
30687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
30697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
30701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::string16 message;
30711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (IsPayingWithWallet() && !wallet_items_->SupportsCard(number, &message))
30721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return message;
30737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
30747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Card number is good and supported.
30757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return base::string16();
30767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
30777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
30787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool AutofillDialogControllerImpl::AllSectionsAreValid() {
3079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t section = SECTION_MIN; section <= SECTION_MAX; ++section) {
3080c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!SectionIsValid(static_cast<DialogSection>(section)))
3081c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return false;
3082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
3083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
3084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::SectionIsValid(
30877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    DialogSection section) {
3088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!IsManuallyEditingSection(section))
3089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
3090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DetailOutputMap detail_outputs;
3092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  view_->GetUserInput(section, &detail_outputs);
30934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return !InputsAreValid(section, detail_outputs).HasSureErrors();
3094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3096868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool AutofillDialogControllerImpl::IsCreditCardExpirationValid(
3097868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const base::string16& year,
3098868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const base::string16& month) const {
3099868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // If the expiration is in the past as per the local clock, it's invalid.
3100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::Time now = base::Time::Now();
3101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!autofill::IsValidCreditCardExpirationDate(year, month, now))
3102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
3103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (IsPayingWithWallet() && IsEditingExistingData(SECTION_CC_BILLING)) {
3105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const wallet::WalletItems::MaskedInstrument* instrument =
3106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        ActiveInstrument();
3107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const std::string& locale = g_browser_process->GetApplicationLocale();
3108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int month_int;
3109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (base::StringToInt(month, &month_int) &&
3110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        instrument->status() ==
3111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            wallet::WalletItems::MaskedInstrument::EXPIRED &&
31123240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        year ==
31133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch            instrument->GetInfo(
31143240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                AutofillType(CREDIT_CARD_EXP_4_DIGIT_YEAR), locale) &&
3115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        month_int == instrument->expiration_month()) {
3116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // Otherwise, if the user is editing an instrument that's deemed expired
3117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // by the Online Wallet server, mark it invalid on selection.
3118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return false;
3119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
3120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
3121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return true;
3123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
3124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldUseBillingForShipping() {
3126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return SectionIsActive(SECTION_SHIPPING) &&
3127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      suggested_shipping_.GetItemKeyForCheckedItem() == kSameAsBillingKey;
3128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
31302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldSaveDetailsLocally() {
31312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // It's possible that the user checked [X] Save details locally before
31322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // switching payment methods, so only ask the view whether to save details
31332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // locally if that checkbox is showing (currently if not paying with wallet).
3134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Also, if the user isn't editing any sections, there's no data to save
3135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // locally.
3136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return ShouldOfferToSaveInChrome() && view_->SaveDetailsLocally();
3137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::SetIsSubmitting(bool submitting) {
3140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  is_submitting_ = submitting;
3141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
314290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!submitting)
314390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    full_wallet_.reset();
314490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (view_) {
31463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ScopedViewUpdates updates(view_.get());
3147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    view_->UpdateButtonStrip();
314858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    view_->UpdateOverlay();
3149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    view_->UpdateNotificationArea();
3150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
31512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
31522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
315390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool AutofillDialogControllerImpl::AreLegalDocumentsCurrent() const {
315490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return has_accepted_legal_documents_ ||
315590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      (wallet_items_ && wallet_items_->legal_documents().empty());
315690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
315790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
31580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogControllerImpl::AcceptLegalTerms() {
315990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::BrowserThread::PostTask(
3160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      content::BrowserThread::IO, FROM_HERE,
3161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&UserDidOptIntoLocationServices));
31620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  PrefService* local_state = g_browser_process->local_state();
31630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ListPrefUpdate accepted(
31640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      local_state, ::prefs::kAutofillDialogWalletLocationAcceptance);
31650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  accepted->AppendIfNotPresent(new base::StringValue(
31660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      account_chooser_model_.GetActiveWalletAccountName()));
316790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3168d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (AreLegalDocumentsCurrent()) {
316990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LoadRiskFingerprintData();
3170d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  } else {
3171d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    GetWalletClient()->AcceptLegalDocuments(
3172d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        wallet_items_->legal_documents(),
31734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        wallet_items_->google_transaction_id());
3174d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
3175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
3176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::SubmitWithWallet() {
3178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  active_instrument_id_.clear();
3179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  active_address_id_.clear();
3180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  full_wallet_.reset();
318190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const wallet::WalletItems::MaskedInstrument* active_instrument =
3183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ActiveInstrument();
3184a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (!IsManuallyEditingSection(SECTION_CC_BILLING)) {
3185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    active_instrument_id_ = active_instrument->object_id();
3186a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    DCHECK(!active_instrument_id_.empty());
3187a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
31882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const wallet::Address* active_address = ActiveShippingAddress();
3190a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (!IsManuallyEditingSection(SECTION_SHIPPING) &&
3191a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      !ShouldUseBillingForShipping() &&
3192a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      IsShippingAddressRequired()) {
3193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    active_address_id_ = active_address->object_id();
3194a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    DCHECK(!active_address_id_.empty());
31952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
31962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3197a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  scoped_ptr<wallet::Instrument> inputted_instrument =
3198a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      CreateTransientInstrument();
3199ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (inputted_instrument && IsEditingExistingData(SECTION_CC_BILLING)) {
3200ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    inputted_instrument->set_object_id(active_instrument->object_id());
3201ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    DCHECK(!inputted_instrument->object_id().empty());
3202ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
32032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3204a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  scoped_ptr<wallet::Address> inputted_address;
3205a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (active_address_id_.empty() && IsShippingAddressRequired()) {
3206a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (ShouldUseBillingForShipping()) {
320790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      const wallet::Address& address = inputted_instrument ?
3208ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          *inputted_instrument->address() : active_instrument->address();
320990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // Try to find an exact matched shipping address and use it for shipping,
321090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // otherwise save it as a new shipping address. http://crbug.com/225442
321190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      const wallet::Address* duplicated_address =
321290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          FindDuplicateAddress(wallet_items_->addresses(), address);
321390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (duplicated_address) {
321490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        active_address_id_ = duplicated_address->object_id();
321590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        DCHECK(!active_address_id_.empty());
321690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      } else {
321790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        inputted_address.reset(new wallet::Address(address));
321890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        DCHECK(inputted_address->object_id().empty());
321990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      }
3220a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    } else {
3221a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      inputted_address = CreateTransientAddress();
3222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (IsEditingExistingData(SECTION_SHIPPING)) {
3223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        inputted_address->set_object_id(active_address->object_id());
3224a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        DCHECK(!inputted_address->object_id().empty());
3225a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      }
32262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
32272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
32282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // If there's neither an address nor instrument to save, |GetFullWallet()|
323090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // is called when the risk fingerprint is loaded.
3231a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!active_instrument_id_.empty() &&
3232a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      (!active_address_id_.empty() || !IsShippingAddressRequired())) {
3233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    GetFullWallet();
323490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
3235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
323690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3237ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  GetWalletClient()->SaveToWallet(inputted_instrument.Pass(),
32384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                  inputted_address.Pass());
32392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
32402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3241a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)scoped_ptr<wallet::Instrument> AutofillDialogControllerImpl::
3242a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    CreateTransientInstrument() {
3243a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (!active_instrument_id_.empty())
3244a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    return scoped_ptr<wallet::Instrument>();
3245a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
3246a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  DetailOutputMap output;
3247a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  view_->GetUserInput(SECTION_CC_BILLING, &output);
3248a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
3249a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  CreditCard card;
3250a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  AutofillProfile profile;
3251a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  string16 cvc;
3252a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  GetBillingInfoFromOutputs(output, &card, &cvc, &profile);
3253a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
3254a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return scoped_ptr<wallet::Instrument>(
3255a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      new wallet::Instrument(card, cvc, profile));
3256a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
3257a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
3258a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)scoped_ptr<wallet::Address>AutofillDialogControllerImpl::
3259a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    CreateTransientAddress() {
3260a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // If not using billing for shipping, just scrape the view.
3261a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  DetailOutputMap output;
3262a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  view_->GetUserInput(SECTION_SHIPPING, &output);
3263a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
3264a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  AutofillProfile profile;
3265a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  FillFormGroupFromOutputs(output, &profile);
3266a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
3267a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return scoped_ptr<wallet::Address>(new wallet::Address(profile));
3268a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
3269a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
32702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::GetFullWallet() {
3271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(is_submitting_);
32722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(IsPayingWithWallet());
32732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(wallet_items_);
32742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!active_instrument_id_.empty());
3275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(!active_address_id_.empty() || !IsShippingAddressRequired());
32762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<wallet::WalletClient::RiskCapability> capabilities;
3278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  capabilities.push_back(wallet::WalletClient::VERIFY_CVC);
3279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
32802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetWalletClient()->GetFullWallet(wallet::WalletClient::FullWalletRequest(
32812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      active_instrument_id_,
32822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      active_address_id_,
32832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      wallet_items_->google_transaction_id(),
32843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      capabilities,
32853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      wallet_items_->HasRequiredAction(wallet::SETUP_WALLET)));
32862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
32872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3288a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void AutofillDialogControllerImpl::HandleSaveOrUpdateRequiredActions(
3289a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const std::vector<wallet::RequiredAction>& required_actions) {
3290a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  DCHECK(!required_actions.empty());
3291a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
32924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // TODO(ahutter): Investigate if we need to support more generic actions on
32937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // this call such as GAIA_AUTH. See crbug.com/243457.
3294a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  for (std::vector<wallet::RequiredAction>::const_iterator iter =
3295a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)           required_actions.begin();
3296a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       iter != required_actions.end(); ++iter) {
32977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (*iter != wallet::INVALID_FORM_FIELD) {
3298a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      // TODO(dbeam): handle this more gracefully.
32997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      DisableWallet(wallet::WalletClient::UNKNOWN_ERROR);
3300a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
3301a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
3302a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  SetIsSubmitting(false);
3303a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
3304a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
33052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::FinishSubmit() {
330658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (IsPayingWithWallet()) {
330758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ScopedViewUpdates updates(view_.get());
330858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    view_->UpdateOverlay();
330958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
331058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    card_generated_animation_.Start();
331158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
331258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
331358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DoFinishSubmit();
331458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
331558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
331658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::AnimationProgressed(
3317d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const gfx::Animation* animation) {
331858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK_EQ(animation, &card_generated_animation_);
331958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  PushOverlayUpdate();
332058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
332158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
332258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::AnimationEnded(
3323d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const gfx::Animation* animation) {
332458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK_EQ(animation, &card_generated_animation_);
332558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DoFinishSubmit();
332658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
332758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
332858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::DoFinishSubmit() {
332958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (IsPayingWithWallet()) {
333058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    profile_->GetPrefs()->SetBoolean(::prefs::kAutofillDialogHasPaidWithWallet,
333158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                     true);
33327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
33337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
33342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FillOutputForSection(SECTION_CC);
33352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FillOutputForSection(SECTION_BILLING);
33362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FillOutputForSection(SECTION_CC_BILLING);
3337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
33382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ShouldUseBillingForShipping()) {
33392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FillOutputForSectionWithComparator(
33402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SECTION_BILLING,
33412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(DetailInputMatchesShippingField));
33422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FillOutputForSectionWithComparator(
33432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SECTION_CC,
33442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(DetailInputMatchesShippingField));
3345a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    FillOutputForSectionWithComparator(
3346a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        SECTION_CC_BILLING,
3347a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        base::Bind(DetailInputMatchesShippingField));
33482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
33492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FillOutputForSection(SECTION_SHIPPING);
33502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
33512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!IsPayingWithWallet()) {
335390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) {
335490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      DialogSection section = static_cast<DialogSection>(i);
335590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (!SectionIsActive(section))
335690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        continue;
335790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
335890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section);
335990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      std::string item_key = model->GetItemKeyForCheckedItem();
336090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (IsASuggestionItemKey(item_key) || item_key == kSameAsBillingKey) {
3361d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        PersistAutofillChoice(section, item_key);
3362d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      } else if (item_key == kAddNewItemKey && ShouldSaveDetailsLocally()) {
3363d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        DCHECK(newly_saved_data_model_guids_.count(section));
3364d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        PersistAutofillChoice(section, newly_saved_data_model_guids_[section]);
336590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      }
336690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
336758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
336858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    profile_->GetPrefs()->SetBoolean(::prefs::kAutofillDialogSaveData,
336958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                     view_->SaveDetailsLocally());
337090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
337190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3372868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // On a successful submit, if the user manually selected "pay without wallet",
3373868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // stop trying to pay with Wallet on future runs of the dialog. On the other
3374868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // hand, if there was an error that prevented the user from having the choice
3375868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // of using Wallet, leave the pref alone.
337658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!wallet_error_notification_ &&
3377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      account_chooser_model_.HasAccountsToChoose()) {
3378868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    profile_->GetPrefs()->SetBoolean(
3379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        ::prefs::kAutofillDialogPayWithoutWallet,
3380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        !account_chooser_model_.WalletIsSelected());
3381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
3382868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LogOnFinishSubmitMetrics();
3384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3385868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Callback should be called as late as possible.
3386d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  callback_.Run(&form_structure_);
3387bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  data_was_passed_back_ = true;
3388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // This might delete us.
339058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Hide();
33912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
33922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
339390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AutofillDialogControllerImpl::PersistAutofillChoice(
339490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    DialogSection section,
3395d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const std::string& guid) {
339690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(!IsPayingWithWallet());
339790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue());
339890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  value->SetString(kGuidPrefKey, guid);
339990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
340090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DictionaryPrefUpdate updater(profile()->GetPrefs(),
340190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                               ::prefs::kAutofillDialogAutofillDefault);
340290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::DictionaryValue* autofill_choice = updater.Get();
340390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  autofill_choice->Set(SectionToPrefString(section), value.release());
340490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
340590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
340690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AutofillDialogControllerImpl::GetDefaultAutofillChoice(
340790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    DialogSection section,
3408d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    std::string* guid) {
340990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(!IsPayingWithWallet());
341090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The default choice is the first thing in the menu that is a suggestion
341190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // item.
341290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section);
341390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  for (int i = 0; i < model->GetItemCount(); ++i) {
341490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (IsASuggestionItemKey(model->GetItemKeyAt(i))) {
341590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      *guid = model->GetItemKeyAt(i);
341690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      break;
341790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
341890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
341990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
342090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
342190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool AutofillDialogControllerImpl::GetAutofillChoice(DialogSection section,
3422d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                                     std::string* guid) {
342390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(!IsPayingWithWallet());
342490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const base::DictionaryValue* choices = profile()->GetPrefs()->GetDictionary(
342590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ::prefs::kAutofillDialogAutofillDefault);
342690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!choices)
342790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return false;
342890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
342990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const base::DictionaryValue* choice = NULL;
343090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!choices->GetDictionary(SectionToPrefString(section), &choice))
343190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return false;
343290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
343390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  choice->GetString(kGuidPrefKey, guid);
343490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return true;
343590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
343690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LogOnFinishSubmitMetrics() {
3438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetMetricLogger().LogDialogUiDuration(
3439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Time::Now() - dialog_shown_timestamp_,
3440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      AutofillMetrics::DIALOG_ACCEPTED);
3441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
344258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_ACCEPTED);
3443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillMetrics::DialogDismissalState dismissal_state;
3445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!IsManuallyEditingAnySection())
3446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dismissal_state = AutofillMetrics::DIALOG_ACCEPTED_EXISTING_DATA;
3447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else if (IsPayingWithWallet())
3448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dismissal_state = AutofillMetrics::DIALOG_ACCEPTED_SAVE_TO_WALLET;
3449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else if (ShouldSaveDetailsLocally())
3450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dismissal_state = AutofillMetrics::DIALOG_ACCEPTED_SAVE_TO_AUTOFILL;
3451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else
3452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dismissal_state = AutofillMetrics::DIALOG_ACCEPTED_NO_SAVE;
3453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
345458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogDismissalState(dismissal_state);
3455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LogOnCancelMetrics() {
345858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_CANCELED);
3459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillMetrics::DialogDismissalState dismissal_state;
34617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!signin_registrar_.IsEmpty())
34627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    dismissal_state = AutofillMetrics::DIALOG_CANCELED_DURING_SIGNIN;
34637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  else if (!IsManuallyEditingAnySection())
3464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dismissal_state = AutofillMetrics::DIALOG_CANCELED_NO_EDITS;
3465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else if (AllSectionsAreValid())
3466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dismissal_state = AutofillMetrics::DIALOG_CANCELED_NO_INVALID_FIELDS;
3467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else
3468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dismissal_state = AutofillMetrics::DIALOG_CANCELED_WITH_INVALID_FIELDS;
3469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
347058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogDismissalState(dismissal_state);
3471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetMetricLogger().LogDialogUiDuration(
3473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Time::Now() - dialog_shown_timestamp_,
3474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      AutofillMetrics::DIALOG_CANCELED);
3475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LogSuggestionItemSelectedMetric(
3478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const SuggestionsMenuModel& model) {
3479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DialogSection section = SectionForSuggestionsMenuModel(model);
3480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillMetrics::DialogUiEvent dialog_ui_event;
3482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (model.GetItemKeyForCheckedItem() == kAddNewItemKey) {
3483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Selected to add a new item.
3484ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    dialog_ui_event = common::DialogSectionToUiItemAddedEvent(section);
3485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else if (IsASuggestionItemKey(model.GetItemKeyForCheckedItem())) {
3486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Selected an existing item.
3487ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    dialog_ui_event = common::DialogSectionToUiSelectionChangedEvent(section);
3488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
3489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // TODO(estade): add logging for "Manage items" or "Use billing for
3490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // shipping"?
3491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
3492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
3493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
349458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  GetMetricLogger().LogDialogUiEvent(dialog_ui_event);
3495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LogDialogLatencyToShow() {
3498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (was_ui_latency_logged_)
3499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
3500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetMetricLogger().LogDialogLatencyToShow(
3502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Time::Now() - dialog_shown_timestamp_);
3503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  was_ui_latency_logged_ = true;
3504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
35062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutofillMetrics::DialogInitialUserStateMetric
35072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AutofillDialogControllerImpl::GetInitialUserState() const {
35082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Consider a user to be an Autofill user if the user has any credit cards
3509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // or addresses saved. Check that the item count is greater than 2 because
3510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // an "empty" menu still has the "add new" menu item and "manage" menu item.
35112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool has_autofill_profiles =
3512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      suggested_cc_.GetItemCount() > 2 ||
3513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      suggested_billing_.GetItemCount() > 2;
35142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (SignedInState() != SIGNED_IN) {
35162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Not signed in.
35172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return has_autofill_profiles ?
35182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AutofillMetrics::DIALOG_USER_NOT_SIGNED_IN_HAS_AUTOFILL :
35192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AutofillMetrics::DIALOG_USER_NOT_SIGNED_IN_NO_AUTOFILL;
35202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
35212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Signed in.
35232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (wallet_items_->instruments().empty()) {
35242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // No Wallet items.
35252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return has_autofill_profiles ?
35262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AutofillMetrics::DIALOG_USER_SIGNED_IN_NO_WALLET_HAS_AUTOFILL :
35272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AutofillMetrics::DIALOG_USER_SIGNED_IN_NO_WALLET_NO_AUTOFILL;
35282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
35292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Has Wallet items.
35312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return has_autofill_profiles ?
35322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AutofillMetrics::DIALOG_USER_SIGNED_IN_HAS_WALLET_HAS_AUTOFILL :
35332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AutofillMetrics::DIALOG_USER_SIGNED_IN_HAS_WALLET_NO_AUTOFILL;
35342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
35352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AutofillDialogControllerImpl::MaybeShowCreditCardBubble() {
3537bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  if (!data_was_passed_back_)
3538bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    return;
3539bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
35407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (newly_saved_card_) {
3541ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    scoped_ptr<AutofillProfile> billing_profile;
3542ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (IsManuallyEditingSection(SECTION_BILLING)) {
3543ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      // Scrape the view as the user's entering or updating information.
3544ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      DetailOutputMap outputs;
3545ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      view_->GetUserInput(SECTION_BILLING, &outputs);
3546ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      billing_profile.reset(new AutofillProfile);
3547ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      FillFormGroupFromOutputs(outputs, billing_profile.get());
3548ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    } else {
3549ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      // Just snag the currently suggested profile.
3550ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      std::string item_key = SuggestionsMenuModelForSection(SECTION_BILLING)->
3551ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          GetItemKeyForCheckedItem();
3552ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      AutofillProfile* profile = GetManager()->GetProfileByGUID(item_key);
3553ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      billing_profile.reset(new AutofillProfile(*profile));
3554ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
3555ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3556ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    ShowNewCreditCardBubble(newly_saved_card_.Pass(),
3557ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                            billing_profile.Pass());
35587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
35597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
35607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3561a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!full_wallet_ || !full_wallet_->billing_address())
3562a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return;
3563a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3564ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if !defined(OS_ANDROID)
3565ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GeneratedCreditCardBubbleController::Show(
3566ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      web_contents(),
3567424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      full_wallet_->TypeAndLastFourDigits(),
35688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      backing_card_last_four_);
3569ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif
35707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
35717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
357258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::OnSubmitButtonDelayEnd() {
357358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!view_)
357458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
357558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ScopedViewUpdates updates(view_.get());
357658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  view_->UpdateButtonStrip();
357758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
357858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
35794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AutofillDialogControllerImpl::FetchWalletCookieAndUserName() {
35804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  net::URLRequestContextGetter* request_context = profile_->GetRequestContext();
35814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  signin_helper_.reset(new wallet::WalletSigninHelper(this, request_context));
35824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  signin_helper_->StartWalletCookieValueFetch();
35834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
35844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  username_fetcher_.reset(
35854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      new wallet::WalletSigninHelper(this, request_context));
35864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  username_fetcher_->StartUserNameFetch();
35874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
35884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
35892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace autofill
3590