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