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(¶ms); 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