autofill_dialog_controller_impl.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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" 267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h" 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/autofill/personal_data_manager_factory.h" 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/autofill/validation_rules_storage_factory.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/browser_process.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/autofill/autofill_dialog_common.h" 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/autofill/autofill_dialog_i18n_input.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/autofill/autofill_dialog_view.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/autofill/data_model_wrapper.h" 37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/autofill/generated_credit_card_bubble_controller.h" 38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/autofill/new_credit_card_bubble_controller.h" 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_window.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" 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_country.h" 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_data_model.h" 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_manager.h" 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_type.h" 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/personal_data_manager.h" 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/phone_number_i18n.h" 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/autofill/core/browser/state_names.h" 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/validation.h" 657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_data.h" 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/user_prefs/pref_registry_syncable.h" 6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/geolocation_provider.h" 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_controller.h" 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_details.h" 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_entry.h" 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_service.h" 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_types.h" 74ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/browser/render_view_host.h" 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h" 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_view.h" 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/url_constants.h" 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/chromium_strings.h" 797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "grit/component_strings.h" 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/generated_resources.h" 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "grit/libaddressinput_strings.h" 82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "grit/platform_locale_settings.h" 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/theme_resources.h" 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/webkit_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" 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "third_party/libaddressinput/chromium/cpp/include/libaddressinput/address_data.h" 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "third_party/libaddressinput/chromium/cpp/include/libaddressinput/address_problem.h" 9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/base/base_window.h" 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/models/combobox_model.h" 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/canvas.h" 9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/image/image_skia_operations.h" 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/skia_util.h" 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using ::i18n::addressinput::AddressData; 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using ::i18n::addressinput::AddressField; 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using ::i18n::addressinput::AddressProblem; 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using ::i18n::addressinput::AddressProblemFilter; 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using ::i18n::addressinput::AddressProblems; 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using ::i18n::addressinput::AddressValidator; 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace autofill { 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kAddNewItemKey[] = "add-new-item"; 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kManageItemsKey[] = "manage-items"; 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kSameAsBillingKey[] = "same-as-billing"; 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// URLs for Wallet error messages. 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kBuyerLegalAddressStatusUrl[] = 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) "https://wallet.google.com/manage/settings"; 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kKnowYourCustomerStatusUrl[] = "https://wallet.google.com/kyc"; 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Keys for the kAutofillDialogAutofillDefault pref dictionary (do not change 12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// these values). 12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char kGuidPrefKey[] = "guid"; 12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This string is stored along with saved addresses and credit cards in the 12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// WebDB, and hence should not be modified, so that it remains consistent over 12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// time. 12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char kAutofillDialogOrigin[] = "Chrome Autofill dialog"; 12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// HSL shift to gray out an image. 12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const color_utils::HSL kGrayImageShift = {-1, 0, 0.8}; 13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 13158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// Limit Wallet items refresh rate to at most once per minute. 13268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int64 kWalletItemsRefreshRateSeconds = 60; 13358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// The number of milliseconds to delay enabling the submit button after showing 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// the dialog. This delay prevents users from accidentally clicking the submit 13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// button on startup. 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const int kSubmitButtonDelayMs = 1000; 13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// A helper class to make sure an AutofillDialogView knows when a series of 1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// updates is incoming. 1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class ScopedViewUpdates { 1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) explicit ScopedViewUpdates(AutofillDialogView* view) : view_(view) { 1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (view_) 1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) view_->UpdatesStarted(); 1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ~ScopedViewUpdates() { 1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (view_) 1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) view_->UpdatesFinished(); 1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private: 1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AutofillDialogView* view_; 1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedViewUpdates); 1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 NullGetInfo(const AutofillType& type) { 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::string16(); 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Extract |type| from |inputs| using |section| to determine whether the info 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// should be billing or shipping specific (for sections with address info). 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 GetInfoFromInputs(const FieldValueMap& inputs, 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DialogSection section, 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const AutofillType& type) { 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ServerFieldType field_type = type.GetStorableType(); 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (section != SECTION_SHIPPING) 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) field_type = AutofillType::GetEquivalentBillingFieldType(field_type); 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 info; 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FieldValueMap::const_iterator it = inputs.find(field_type); 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (it != inputs.end()) 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) info = it->second; 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!info.empty() && type.html_type() == HTML_TYPE_COUNTRY_CODE) { 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) info = base::ASCIIToUTF16(AutofillCountry::GetCountryCode( 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) info, g_browser_process->GetApplicationLocale())); 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return info; 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns true if |input| should be used to fill a site-requested |field| which 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is notated with a "shipping" tag, for use when the user has decided to use 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the billing address as the shipping address. 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ServerTypeMatchesShippingField(ServerFieldType type, 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const AutofillField& field) { 190b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Equivalent billing field type is used to support UseBillingAsShipping 191b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // usecase. 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return common::ServerTypeMatchesFieldType( 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) type, 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AutofillType(AutofillType::GetEquivalentBillingFieldType( 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) field.Type().GetStorableType()))); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Initializes |form_group| from user-entered data. 199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void FillFormGroupFromOutputs(const FieldValueMap& detail_outputs, 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FormGroup* form_group) { 201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (FieldValueMap::const_iterator iter = detail_outputs.begin(); 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != detail_outputs.end(); ++iter) { 203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ServerFieldType type = iter->first; 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!iter->second.empty()) { 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (type == ADDRESS_HOME_COUNTRY || type == ADDRESS_BILLING_COUNTRY) { 2063240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch form_group->SetInfo(AutofillType(type), 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) iter->second, 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) g_browser_process->GetApplicationLocale()); 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 210424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) form_group->SetRawInfo( 211424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) AutofillType(type).GetStorableType(), iter->second); 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 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; 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrimWhitespace(it->second, 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); 234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else if (type == ADDRESS_HOME_COUNTRY || 235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) type == ADDRESS_BILLING_COUNTRY) { 2367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (profile) { 237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) profile->SetInfo(AutofillType(type), 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) trimmed, 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) g_browser_process->GetApplicationLocale()); 2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Copy the credit card name to |profile| in addition to |card| as 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // wallet::Instrument requires a recipient name for its billing address. 244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (card && type == NAME_FULL) 2457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch card->SetRawInfo(CREDIT_CARD_NAME, trimmed); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (common::IsCreditCardType(type)) { 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (card) 249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) card->SetRawInfo(type, trimmed); 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (profile) { 251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) profile->SetRawInfo(AutofillType(type).GetStorableType(), trimmed); 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Returns the containing window for the given |web_contents|. The containing 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// window might be a browser window for a Chrome tab, or it might be an app 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// window for a platform app. 26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)ui::BaseWindow* GetBaseWindowForWebContents( 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::WebContents* web_contents) { 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* browser = chrome::FindBrowserWithWebContents(web_contents); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (browser) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return browser->window(); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeWindow native_window = 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetView()->GetTopLevelNativeWindow(); 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps::AppWindow* app_window = 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps::AppWindowRegistry::GetAppWindowForNativeWindowAnyProfile( 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) native_window); 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return app_window->GetBaseWindow(); 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Returns a string descriptor for a DialogSection, for use with prefs (do not 27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// change these values). 27690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)std::string SectionToPrefString(DialogSection section) { 27790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) switch (section) { 27890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case SECTION_CC: 27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return "cc"; 28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case SECTION_BILLING: 28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return "billing"; 28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case SECTION_CC_BILLING: 28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The SECTION_CC_BILLING section isn't active when using Autofill. 28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NOTREACHED(); 28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return std::string(); 28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case SECTION_SHIPPING: 29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return "shipping"; 29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NOTREACHED(); 29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return std::string(); 29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Check if a given MaskedInstrument is allowed for the purchase. 29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool IsInstrumentAllowed( 29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const wallet::WalletItems::MaskedInstrument& instrument) { 300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) switch (instrument.status()) { 301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case wallet::WalletItems::MaskedInstrument::VALID: 302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case wallet::WalletItems::MaskedInstrument::PENDING: 303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case wallet::WalletItems::MaskedInstrument::EXPIRED: 304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case wallet::WalletItems::MaskedInstrument::BILLING_INCOMPLETE: 305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) default: 307868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Signals that the user has opted in to geolocation services. Factored out 31290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// into a separate method because all interaction with the geolocation provider 31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// needs to happen on the IO thread, which is not the thread 3143240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch// AutofillDialogViewDelegate lives on. 31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserDidOptIntoLocationServices() { 31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::GeolocationProvider::GetInstance()->UserDidOptIntoLocationServices(); 31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Returns true if |profile| has an invalid address, i.e. an invalid state, zip 32058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// code, phone number, or email address. Otherwise returns false. Profiles with 32158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// invalid addresses are not suggested in the dropdown menu for billing and 32258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// shipping addresses. 323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool HasInvalidAddress(const AutofillProfile& profile) { 324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return profile.IsPresentButInvalid(ADDRESS_HOME_STATE) || 325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile.IsPresentButInvalid(ADDRESS_HOME_ZIP) || 326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile.IsPresentButInvalid(PHONE_HOME_WHOLE_NUMBER); 327eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 328eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Loops through |addresses_| comparing to |address| ignoring ID. If a match 33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// is not found, NULL is returned. 33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const wallet::Address* FindDuplicateAddress( 33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::vector<wallet::Address*>& addresses, 33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const wallet::Address& address) { 33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (size_t i = 0; i < addresses.size(); ++i) { 33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (addresses[i]->EqualsIgnoreID(address)) 33690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return addresses[i]; 33790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 33890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return NULL; 33990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 34090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 341a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool IsCardHolderNameValidForWallet(const base::string16& name) { 34290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::string16 whitespace_collapsed_name = CollapseWhitespace(name, true); 34390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<base::string16> split_name; 34490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::SplitString(whitespace_collapsed_name, ' ', &split_name); 34590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return split_name.size() >= 2; 34690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 34790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)DialogSection SectionFromLocation(wallet::FormFieldError::Location location) { 3497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) switch (location) { 3507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::FormFieldError::PAYMENT_INSTRUMENT: 3517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::FormFieldError::LEGAL_ADDRESS: 3527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return SECTION_CC_BILLING; 3537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::FormFieldError::SHIPPING_ADDRESS: 3557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return SECTION_SHIPPING; 3567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::FormFieldError::UNKNOWN_LOCATION: 3587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NOTREACHED(); 3597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return SECTION_MAX; 3607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NOTREACHED(); 3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return SECTION_MAX; 3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 36658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)scoped_ptr<DialogNotification> GetWalletError( 36758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) wallet::WalletClient::ErrorType error_type) { 36858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::string16 text; 36958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GURL url; 37058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) switch (error_type) { 37258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case wallet::WalletClient::UNVERIFIED_KNOW_YOUR_CUSTOMER_STATUS: 37358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) text = l10n_util::GetStringUTF16( 37458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) IDS_AUTOFILL_WALLET_UNVERIFIED_KNOW_YOUR_CUSTOMER_STATUS); 37558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) url = GURL(kKnowYourCustomerStatusUrl); 37658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 3777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 378ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case wallet::WalletClient::BUYER_LEGAL_ADDRESS_NOT_SUPPORTED: 37958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) text = l10n_util::GetStringUTF16( 380ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch IDS_AUTOFILL_WALLET_BUYER_COUNTRY_NOT_SUPPORTED); 38158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) url = GURL(kBuyerLegalAddressStatusUrl); 38258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 383ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 38458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) default: 38558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The notification will not have a link; it's handled in the next 38658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // switch statement. 38758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 38858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 38958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 39058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!text.empty()) { 39158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<DialogNotification> notification(new DialogNotification( 39258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DialogNotification::WALLET_ERROR, 39358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) text)); 39458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) notification->set_link_url(url); 39558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return notification.Pass(); 39658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 39758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int error_ids = 0; 3994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int error_code = 0; 4004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 40158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (error_type) { 402ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case wallet::WalletClient::UNSUPPORTED_MERCHANT: 4034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UNSUPPORTED_MERCHANT; 40458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 405ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 4067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::BAD_REQUEST: 4074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UPGRADE_CHROME_ERROR; 4084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 71; 40958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 410ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::INVALID_PARAMS: 4124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UPGRADE_CHROME_ERROR; 4134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 42; 41458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 415ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 41658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case wallet::WalletClient::BUYER_ACCOUNT_ERROR: 4174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_BUYER_ACCOUNT_ERROR; 4184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 12; 41958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 420ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 4217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::UNSUPPORTED_API_VERSION: 4224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UPGRADE_CHROME_ERROR; 4234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 43; 42458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 4257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::SERVICE_UNAVAILABLE: 4274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_SERVICE_UNAVAILABLE_ERROR; 4284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 61; 42958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 4307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::INTERNAL_ERROR: 4324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UNKNOWN_ERROR; 4334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 62; 43458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 435ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::MALFORMED_RESPONSE: 4374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UNKNOWN_ERROR; 4384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 72; 43958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 440ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::NETWORK_ERROR: 4424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UNKNOWN_ERROR; 4434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 73; 44458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 445ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::UNKNOWN_ERROR: 4474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UNKNOWN_ERROR; 4484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 74; 44958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 45058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 45158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) default: 45258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 4537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK_NE(0, error_ids); 45658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 45758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The other error types are strings of the form "XXX. You can pay without 45858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // wallet." 4594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<DialogNotification> notification(new DialogNotification( 46058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DialogNotification::WALLET_ERROR, 46158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) l10n_util::GetStringFUTF16(IDS_AUTOFILL_DIALOG_COMPLETE_WITHOUT_WALLET, 4624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) l10n_util::GetStringUTF16(error_ids)))); 4634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (error_code) { 4654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) notification->set_tooltip_text( 4664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) l10n_util::GetStringFUTF16(IDS_AUTOFILL_WALLET_ERROR_CODE_TOOLTIP, 4674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::IntToString16(error_code))); 4684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 4694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return notification.Pass(); 4717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 47358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Returns the ID of the address or instrument that should be selected in the 47458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// UI, given that the |default_id| is currently the default ID on the Wallet 47558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// server, |previous_default_id| was the default ID prior to re-fetching the 47658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Wallet data, and |previously_selected_id| was the ID of the item selected in 47758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// the dialog prior to re-fetching the Wallet data. 47858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)std::string GetIdToSelect(const std::string& default_id, 47958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& previous_default_id, 48058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& previously_selected_id) { 48158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // If the default ID changed since the last fetch of the Wallet data, select 48258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // it rather than the previously selected item, as the user's intention in 48358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // changing the default was probably to use it. 48458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (default_id != previous_default_id) 48558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return default_id; 48658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 48758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Otherwise, prefer the previously selected item, if there was one. 48858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return !previously_selected_id.empty() ? previously_selected_id : default_id; 48958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 49058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 49158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Generate a random card number in a user displayable format. 49258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)base::string16 GenerateRandomCardNumber() { 49358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string card_number; 49458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t i = 0; i < 4; ++i) { 49558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int part = base::RandInt(0, 10000); 49658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::StringAppendF(&card_number, "%04d ", part); 49758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::ASCIIToUTF16(card_number); 49958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 50058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 501d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)gfx::Image CreditCardIconForType(const std::string& credit_card_type) { 502d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const int input_card_idr = CreditCard::IconResourceId(credit_card_type); 503d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 504d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Image result = rb.GetImageNamed(input_card_idr); 505d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (input_card_idr == IDR_AUTOFILL_CC_GENERIC) { 506d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // When the credit card type is unknown, no image should be shown. However, 507d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // to simplify the view code on Mac, save space for the credit card image by 5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // returning a transparent image of the appropriate size. Not all credit 5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // card images are the same size, but none is larger than the Visa icon. 510d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) result = gfx::Image(gfx::ImageSkiaOperations::CreateTransparentImage( 5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rb.GetImageNamed(IDR_AUTOFILL_CC_VISA).AsImageSkia(), 0)); 512d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 513d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return result; 514d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 515d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 516d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)gfx::Image CvcIconForCreditCardType(const base::string16& credit_card_type) { 517d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 518d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (credit_card_type == l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_AMEX)) 519d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return rb.GetImageNamed(IDR_CREDIT_CARD_CVC_HINT_AMEX); 520d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 521d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return rb.GetImageNamed(IDR_CREDIT_CARD_CVC_HINT); 522d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 523d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ServerFieldType CountryTypeForSection(DialogSection section) { 5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return section == SECTION_SHIPPING ? ADDRESS_HOME_COUNTRY : 5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ADDRESS_BILLING_COUNTRY; 5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// profile.GetInfo() thunk. 5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 GetInfoFromProfile(const AutofillProfile& profile, 5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const AutofillType& type) { 5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return profile.GetInfo(type, g_browser_process->GetApplicationLocale()); 5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Attempts to canonicalize the administrative area name in |profile| using the 5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// rules in |validator|. 5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CanonicalizeState(const AddressValidator* validator, 5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AutofillProfile* profile) { 5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 administrative_area; 5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_EQ(!!validator, !!i18ninput::Enabled()); 5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (validator) { 5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddressData address_data; 5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) i18ninput::CreateAddressData(base::Bind(&GetInfoFromProfile, *profile), 5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &address_data); 5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) validator->CanonicalizeAdministrativeArea(&address_data); 5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) administrative_area = base::UTF8ToUTF16(address_data.administrative_area); 5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Temporary crutch for i18n-not-enabled case: works for US only. 5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) state_names::GetNameAndAbbreviation(profile->GetRawInfo(ADDRESS_HOME_STATE), 5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NULL, 5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &administrative_area); 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StringToUpperASCII(&administrative_area); 5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile->SetInfo(AutofillType(ADDRESS_HOME_STATE), 5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) administrative_area, 5575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) g_browser_process->GetApplicationLocale()); 5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochAutofillDialogViewDelegate::~AutofillDialogViewDelegate() {} 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutofillDialogControllerImpl::~AutofillDialogControllerImpl() { 5657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (popup_controller_) 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_controller_->Hide(); 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 56858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogInitialUserState(initial_user_state_); 569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::WeakPtr<AutofillDialogControllerImpl> 573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillDialogControllerImpl::Create( 574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::WebContents* contents, 575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const FormData& form_structure, 576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL& source_url, 577d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::Callback<void(const FormStructure*)>& callback) { 578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // AutofillDialogControllerImpl owns itself. 579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillDialogControllerImpl* autofill_dialog_controller = 580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new AutofillDialogControllerImpl(contents, 581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) form_structure, 582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_url, 583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback); 584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return autofill_dialog_controller->weak_ptr_factory_.GetWeakPtr(); 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 5880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogController::RegisterPrefs(PrefRegistrySimple* registry) { 5890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) registry->RegisterListPref(::prefs::kAutofillDialogWalletLocationAcceptance); 5900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 5910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 5920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// static 5930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogController::RegisterProfilePrefs( 594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable* registry) { 595868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) registry->RegisterBooleanPref( 596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ::prefs::kAutofillDialogPayWithoutWallet, 597868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) false, 598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 59990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) registry->RegisterDictionaryPref( 60090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ::prefs::kAutofillDialogAutofillDefault, 60190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 60258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) registry->RegisterBooleanPref( 60358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ::prefs::kAutofillDialogSaveData, 60458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) true, 60558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 6065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registry->RegisterBooleanPref( 6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ::prefs::kAutofillDialogWalletShippingSameAsBilling, 6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false, 6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 613ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController> AutofillDialogController::Create( 614ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::WebContents* contents, 615ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FormData& form_structure, 616ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const GURL& source_url, 617d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::Callback<void(const FormStructure*)>& callback) { 618ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return AutofillDialogControllerImpl::Create(contents, 619ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch form_structure, 620ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch source_url, 621ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback); 622ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 623ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::Show() { 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_shown_timestamp_ = base::Time::Now(); 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Determine what field types should be included in the dialog. 6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool has_types = false; 6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool has_sections = false; 6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) form_structure_.ParseFieldTypesFromAutocompleteAttributes( 6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &has_types, &has_sections); 6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Fail if the author didn't specify autocomplete types. 6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!has_types) { 6355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_.Run(NULL); 6365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delete this; 6375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 6385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Log any relevant UI metrics and security exceptions. 6415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_SHOWN); 6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetMetricLogger().LogDialogSecurityMetric( 6445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AutofillMetrics::SECURITY_METRIC_DIALOG_SHOWN); 6455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 646f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The Autofill dialog is shown in response to a message from the renderer and 647f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // as such, it can only be made in the context of the current document. A call 648f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // to GetActiveEntry would return a pending entry, if there was one, which 649f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // would be a security bug. Therefore, we use the last committed URL for the 650f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // access checks. 651f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GURL& current_url = web_contents()->GetLastCommittedURL(); 652f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) invoked_from_same_origin_ = 653f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) current_url.GetOrigin() == source_url_.GetOrigin(); 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!invoked_from_same_origin_) { 656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetMetricLogger().LogDialogSecurityMetric( 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::SECURITY_METRIC_CROSS_ORIGIN_FRAME); 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 6615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DialogSection section = static_cast<DialogSection>(i); 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string country_code; 6645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CountryComboboxModel* model = CountryComboboxModelForSection(section); 6655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (model) 6665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) country_code = model->GetDefaultCountryCode(); 6675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DetailInputs* inputs = MutableRequestedFieldsForSection(section); 6695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) common::BuildInputsForSection(section, country_code, inputs); 6705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Test whether we need to show the shipping section. If filling that section 673868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // would be a no-op, don't show it. 6745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cares_about_shipping_ = form_structure_.FillFields( 6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RequestedTypesForSection(SECTION_SHIPPING), 6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(common::ServerTypeMatchesField, SECTION_SHIPPING), 6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(NullGetInfo), 6785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) g_browser_process->GetApplicationLocale()); 679868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 680a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_.reset( 681a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new AccountChooserModel(this, 682a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) profile_, 683a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !ShouldShowAccountChooser(), 684a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) metric_logger_)); 68558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 686a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (account_chooser_model_->WalletIsSelected()) 687f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FetchWalletCookie(); 688f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (i18ninput::Enabled()) { 6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr< ::i18n::addressinput::Downloader> downloader( 6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new autofill::ChromeDownloaderImpl(profile_->GetRequestContext())); 6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) validator_ = AddressValidator::Build( 6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) downloader.Pass(), 6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ValidationRulesStorageFactory::CreateStorage(), 6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this); 6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetValidator()->LoadRules( 6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetManager()->GetDefaultCountryCodeForNewAddress()); 6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(estade): don't show the dialog if the site didn't specify the right 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // fields. First we must figure out what the "right" fields are. 702a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SuggestionsUpdated(); 703a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SubmitButtonDelayBegin(); 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_.reset(CreateView()); 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->Show(); 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetManager()->AddObserver(this); 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 708a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!account_chooser_model_->WalletIsSelected()) 7097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LogDialogLatencyToShow(); 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::Hide() { 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_) 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->Hide(); 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 71758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid AutofillDialogControllerImpl::TabActivated() { 71858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // If the user switched away from this tab and then switched back, reload the 71958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // Wallet items, in case they've changed. 72068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int64 seconds_elapsed_since_last_refresh = 72158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch (base::TimeTicks::Now() - last_wallet_items_fetch_timestamp_).InSeconds(); 72258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch if (IsPayingWithWallet() && wallet_items_ && 72358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch seconds_elapsed_since_last_refresh >= kWalletItemsRefreshRateSeconds) { 72458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch GetWalletItems(); 72558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch } 72658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} 72758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 72858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 72958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// AutofillDialogViewDelegate implementation. 730eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 731a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::DialogTitle() const { 73258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (ShouldShowSpinner()) 733a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return base::string16(); 7343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 73558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_TITLE); 736eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 737eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 738a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::AccountChooserText() const { 739a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!account_chooser_model_->WalletIsSelected()) 74058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PAYING_WITHOUT_WALLET); 741eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 74258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (SignedInState() == SIGNED_IN) 743a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return account_chooser_model_->GetActiveWalletAccountName(); 74458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 74558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // In this case, the account chooser should be showing the signin link. 746a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return base::string16(); 74790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 74890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 749a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::SignInLinkText() const { 7500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int ids = SignedInState() == NOT_CHECKED ? 7510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) IDS_AUTOFILL_DIALOG_USE_WALLET_LINK : 752f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ShouldShowSignInWebView() ? IDS_AUTOFILL_DIALOG_CANCEL_SIGN_IN : 753f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IDS_AUTOFILL_DIALOG_SIGN_IN; 7540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 7550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return l10n_util::GetStringUTF16(ids); 75658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 758a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::SpinnerText() const { 75958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_LOADING); 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::EditSuggestionText() const { 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_EDIT); 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 766a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::CancelButtonText() const { 767ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return l10n_util::GetStringUTF16(IDS_CANCEL); 768ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 769ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 770a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::ConfirmButtonText() const { 771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return l10n_util::GetStringUTF16(IsSubmitPausedOn(wallet::VERIFY_CVV) ? 772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IDS_AUTOFILL_DIALOG_VERIFY_BUTTON : IDS_AUTOFILL_DIALOG_SUBMIT_BUTTON); 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 775a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::SaveLocallyText() const { 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SAVE_LOCALLY_CHECKBOX); 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 779a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::SaveLocallyTooltip() const { 780bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SAVE_LOCALLY_TOOLTIP); 781bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 782bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 783a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::LegalDocumentsText() { 784f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!IsPayingWithWallet() || ShouldShowSignInWebView()) 785a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return base::string16(); 786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return legal_documents_text_; 788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldShowSpinner() const { 791f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return SignedInState() == REQUIRES_RESPONSE || 792f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SignedInState() == REQUIRES_PASSIVE_SIGN_IN; 793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 795a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool AutofillDialogControllerImpl::ShouldShowAccountChooser() const { 7965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return !ShouldShowSpinner() && GetManager()->IsCountryOfInterest("US"); 797a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 798a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 7991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool AutofillDialogControllerImpl::ShouldShowSignInWebView() const { 8001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return !signin_registrar_.IsEmpty(); 8011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 8021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 8031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)GURL AutofillDialogControllerImpl::SignInUrl() const { 8041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return wallet::GetSignInUrl(); 8051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 8061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldOfferToSaveInChrome() const { 808b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return !IsPayingWithWallet() && 809b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) !profile_->IsOffTheRecord() && 810b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) IsManuallyEditingAnySection() && 811ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch !ShouldShowSpinner(); 81290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 81390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 81458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldSaveInChrome() const { 81558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return profile_->GetPrefs()->GetBoolean(::prefs::kAutofillDialogSaveData); 81658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 81758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 81890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)int AutofillDialogControllerImpl::GetDialogButtons() const { 8194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (waiting_for_explicit_sign_in_response_) 8204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return ui::DIALOG_BUTTON_NONE; 8214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (ShouldShowSpinner() && !handling_use_wallet_link_click_) 82390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return ui::DIALOG_BUTTON_CANCEL; 82458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 82558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL; 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::IsDialogButtonEnabled( 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::DialogButton button) const { 830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (button == ui::DIALOG_BUTTON_OK) { 831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsSubmitPausedOn(wallet::VERIFY_CVV)) 832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 833ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 83458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (ShouldShowSpinner() || is_submitting_) 835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 836ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 83758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (submit_button_delay_timer_.IsRunning()) 83858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return false; 839ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 840c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(ui::DIALOG_BUTTON_CANCEL, button); 844ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return !is_submitting_ || IsSubmitPausedOn(wallet::VERIFY_CVV); 845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 84758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)DialogOverlayState AutofillDialogControllerImpl::GetDialogOverlay() { 8487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool show_wallet_interstitial = IsPayingWithWallet() && is_submitting_ && 84958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) !(full_wallet_ && !full_wallet_->required_actions().empty()); 85058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!show_wallet_interstitial) { 85158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) card_scrambling_delay_.Stop(); 85258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) card_scrambling_refresher_.Stop(); 8537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return DialogOverlayState(); 85458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 8557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 8565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); 8577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DialogOverlayState state; 8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) state.string.font_list = rb->GetFontList(ui::ResourceBundle::MediumFont); 85958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 86058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const SkColor start_top_color = SkColorSetRGB(0xD6, 0xD6, 0xD6); 86158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const SkColor start_bottom_color = SkColorSetRGB(0x98, 0x98, 0x98); 86258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const SkColor final_top_color = SkColorSetRGB(0x52, 0x9F, 0xF8); 86358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const SkColor final_bottom_color = SkColorSetRGB(0x22, 0x75, 0xE5); 8647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 8657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (full_wallet_ && full_wallet_->required_actions().empty()) { 86658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) card_scrambling_delay_.Stop(); 86758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) card_scrambling_refresher_.Stop(); 86858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 cc_number = base::ASCIIToUTF16(full_wallet_->GetPan()); 870f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK_GE(cc_number.size(), 4U); 8717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch state.image = GetGeneratedCardImage( 8725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ASCIIToUTF16("XXXX XXXX XXXX ") + 87358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) cc_number.substr(cc_number.size() - 4), 87458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) full_wallet_->billing_address()->recipient_name(), 87558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) color_utils::AlphaBlend( 87658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) final_top_color, 87758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) start_top_color, 87858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 255 * card_generated_animation_.GetCurrentValue()), 87958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) color_utils::AlphaBlend( 88058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) final_bottom_color, 88158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) start_bottom_color, 88258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 255 * card_generated_animation_.GetCurrentValue())); 88358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) state.string.text = l10n_util::GetStringUTF16( 8857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDS_AUTOFILL_DIALOG_CARD_GENERATION_DONE); 8867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else { 88758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Start the refresher if it isn't running. Wait one second before pumping 88858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // updates to the view. 88958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!card_scrambling_delay_.IsRunning() && 89058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) !card_scrambling_refresher_.IsRunning()) { 89158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scrambled_card_number_ = GenerateRandomCardNumber(); 89258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) card_scrambling_delay_.Start( 89358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FROM_HERE, 89458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromSeconds(1), 89558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) this, 89658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &AutofillDialogControllerImpl::StartCardScramblingRefresher); 89758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 89858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 89958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(!scrambled_card_number_.empty()); 90058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) state.image = GetGeneratedCardImage( 90158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scrambled_card_number_, 90258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) submitted_cardholder_name_, 90358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) start_top_color, 90458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) start_bottom_color); 9057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // "Submitting" waiting page. 9074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) state.string.text = l10n_util::GetStringUTF16( 9087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDS_AUTOFILL_DIALOG_CARD_GENERATION_IN_PROGRESS); 9097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 9107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return state; 9127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 9137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 91458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const std::vector<gfx::Range>& AutofillDialogControllerImpl:: 915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LegalDocumentLinks() { 916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return legal_document_link_ranges_; 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::SectionIsActive(DialogSection section) 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const { 921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsSubmitPausedOn(wallet::VERIFY_CVV)) 922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return section == SECTION_CC_BILLING; 923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 924868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!FormStructureCaresAboutSection(section)) 925868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 926868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsPayingWithWallet()) 928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return section == SECTION_CC_BILLING || section == SECTION_SHIPPING; 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return section != SECTION_CC_BILLING; 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::GetWalletItems() { 9343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 935558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 9360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) wallet_items_requested_ = true; 937f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) wallet::WalletClient* wallet_client = GetWalletClient(); 9385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) wallet_client->CancelRequest(); 9390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 94058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previously_selected_instrument_id_.clear(); 94158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previously_selected_shipping_address_id_.clear(); 94258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch if (wallet_items_) { 94358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previous_default_instrument_id_ = wallet_items_->default_instrument_id(); 94458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previous_default_shipping_address_id_ = wallet_items_->default_address_id(); 94558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 94658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const wallet::WalletItems::MaskedInstrument* instrument = 94758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ActiveInstrument(); 94858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (instrument) 94958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previously_selected_instrument_id_ = instrument->object_id(); 950558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 951558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const wallet::Address* address = ActiveShippingAddress(); 952558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (address) 953558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch previously_selected_shipping_address_id_ = address->object_id(); 95458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch } 95558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 95658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch last_wallet_items_fetch_timestamp_ = base::TimeTicks::Now(); 957f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) passive_failed_ = false; 958eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch wallet_items_.reset(); 95958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 960eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The "Loading..." page should be showing now, which should cause the 961eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // account chooser to hide. 962eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch view_->UpdateAccountChooser(); 963f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) wallet_client->GetWalletItems(); 964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 966a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void AutofillDialogControllerImpl::HideSignIn() { 9673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 968a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) signin_registrar_.RemoveAll(); 969a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) view_->HideSignIn(); 970a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) view_->UpdateAccountChooser(); 971a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 972a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 97358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)AutofillDialogControllerImpl::DialogSignedInState 97458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AutofillDialogControllerImpl::SignedInState() const { 97558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (wallet_error_notification_) 97658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return SIGN_IN_DISABLED; 97758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (signin_helper_ || (wallet_items_requested_ && !wallet_items_)) 97958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return REQUIRES_RESPONSE; 98058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!wallet_items_requested_) 9820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return NOT_CHECKED; 9830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 984f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (wallet_items_->HasRequiredAction(wallet::GAIA_AUTH) || 985f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) passive_failed_) { 98658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return REQUIRES_SIGN_IN; 987f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 98858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 98958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (wallet_items_->HasRequiredAction(wallet::PASSIVE_GAIA_AUTH)) 99058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return REQUIRES_PASSIVE_SIGN_IN; 99158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 99258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return SIGNED_IN; 99358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 99458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::SignedInStateUpdated() { 9964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!ShouldShowSpinner()) 9974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) waiting_for_explicit_sign_in_response_ = false; 9984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (SignedInState()) { 1000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case SIGNED_IN: 1001f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LogDialogLatencyToShow(); 1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case REQUIRES_SIGN_IN: 10050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (handling_use_wallet_link_click_) 10060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SignInLinkClicked(); 10070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Fall through. 1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case SIGN_IN_DISABLED: 1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Switch to the local account and refresh the dialog. 10104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) signin_helper_.reset(); 1011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnWalletSigninError(); 10120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) handling_use_wallet_link_click_ = false; 1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case REQUIRES_PASSIVE_SIGN_IN: 1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Attempt to passively sign in the user. 1017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!signin_helper_); 1018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) signin_helper_.reset(new wallet::WalletSigninHelper( 1019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) this, 1020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile_->GetRequestContext())); 1021f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) signin_helper_->StartPassiveSignin(GetWalletClient()->user_index()); 1022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) case NOT_CHECKED: 1025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case REQUIRES_RESPONSE: 1026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::OnWalletOrSigninUpdate() { 10313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 1032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SignedInStateUpdated(); 1033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionsUpdated(); 1034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateAccountChooserView(); 1035b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 103658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (view_) { 1037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->UpdateButtonStrip(); 103858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) view_->UpdateOverlay(); 103958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 1040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // On the first successful response, compute the initial user state metric. 1042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (initial_user_state_ == AutofillMetrics::DIALOG_USER_STATE_UNKNOWN) 1043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) initial_user_state_ = GetInitialUserState(); 1044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void AutofillDialogControllerImpl::OnWalletFormFieldError( 10477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::vector<wallet::FormFieldError>& form_field_errors) { 10487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (form_field_errors.empty()) 10497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 10507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (std::vector<wallet::FormFieldError>::const_iterator it = 10527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) form_field_errors.begin(); 10537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) it != form_field_errors.end(); ++it) { 10547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (it->error_type() == wallet::FormFieldError::UNKNOWN_ERROR || 10557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) it->GetAutofillType() == MAX_VALID_FIELD_TYPE || 10567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) it->location() == wallet::FormFieldError::UNKNOWN_LOCATION) { 10577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) wallet_server_validation_recoverable_ = false; 10587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 10597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 10607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogSection section = SectionFromLocation(it->location()); 10617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) wallet_errors_[section][it->GetAutofillType()] = 10627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::make_pair(it->GetErrorMessage(), 10637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetValueFromSection(section, it->GetAutofillType())); 10647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 10657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Unrecoverable validation errors. 10677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!wallet_server_validation_recoverable_) 10687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DisableWallet(wallet::WalletClient::UNKNOWN_ERROR); 10697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1070eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateForErrors(); 10717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 10727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void AutofillDialogControllerImpl::ConstructLegalDocumentsText() { 10740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) legal_documents_text_.clear(); 10750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) legal_document_link_ranges_.clear(); 10760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 10770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!wallet_items_) 10780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return; 10790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 10800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PrefService* local_state = g_browser_process->local_state(); 10810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // List of users who have accepted location sharing for fraud protection 10820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // on this device. 10830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const base::ListValue* accepted = 10840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) local_state->GetList(::prefs::kAutofillDialogWalletLocationAcceptance); 10850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) bool has_accepted_location_sharing = 10860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) accepted->Find(base::StringValue( 1087a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_->GetActiveWalletAccountName())) != 10880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) accepted->end(); 10890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 10900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (wallet_items_->legal_documents().empty()) { 10910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!has_accepted_location_sharing) { 10920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) legal_documents_text_ = l10n_util::GetStringUTF16( 10930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) IDS_AUTOFILL_DIALOG_LOCATION_DISCLOSURE); 10940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 10950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 10970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 1098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::vector<wallet::WalletItems::LegalDocument*>& documents = 1100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wallet_items_->legal_documents(); 11011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // There should never be just one document because the privacy policy doc gets 11021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // tacked on the end of other documents. 1103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK_GE(documents.size(), 2U); 1104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::vector<base::string16> link_names; 11061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) for (size_t i = 0; i < documents.size(); ++i) { 11071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) link_names.push_back(documents[i]->display_name()); 11081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 11091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 11101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) int resource_id = 0; 11111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) switch (documents.size()) { 11121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 2U: 1113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) resource_id = IDS_AUTOFILL_DIALOG_LEGAL_LINKS_2; 11141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 11151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 3U: 1116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) resource_id = IDS_AUTOFILL_DIALOG_LEGAL_LINKS_3; 11171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 11181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 4U: 1119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) resource_id = IDS_AUTOFILL_DIALOG_LEGAL_LINKS_4; 11201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 11211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 5U: 1122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) resource_id = IDS_AUTOFILL_DIALOG_LEGAL_LINKS_5; 11231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 11241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 6U: 1125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) resource_id = IDS_AUTOFILL_DIALOG_LEGAL_LINKS_6; 11261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 11271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) default: 11281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // We can only handle so many documents. For lack of a better way of 11291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // handling document overflow, just error out if there are too many. 11301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DisableWallet(wallet::WalletClient::UNKNOWN_ERROR); 11311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return; 1132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::vector<size_t> offsets; 1135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 text = 1136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) l10n_util::GetStringFUTF16(resource_id, link_names,&offsets); 11370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 11380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Tack on the location string if need be. 11390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) size_t base_offset = 0; 11400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!has_accepted_location_sharing) { 11410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) text = l10n_util::GetStringFUTF16( 11420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) IDS_AUTOFILL_DIALOG_LOCATION_DISCLOSURE_WITH_LEGAL_DOCS, 11430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) text, 11440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) &base_offset); 11450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 11460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < documents.size(); ++i) { 11480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) size_t link_start = offsets[i] + base_offset; 114958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) legal_document_link_ranges_.push_back(gfx::Range( 1150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) link_start, link_start + documents[i]->display_name().size())); 1151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) legal_documents_text_ = text; 1153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::ResetSectionInput(DialogSection section) { 1156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SetEditingExistingData(section, false); 11575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) needs_validation_.erase(section); 11585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (i18ninput::Enabled()) { 11605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CountryComboboxModel* model = CountryComboboxModelForSection(section); 11615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (model) { 11625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 country = model->GetItemAt(model->GetDefaultIndex()); 11635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RebuildInputsForCountry(section, country, false); 11645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DetailInputs* inputs = MutableRequestedFieldsForSection(section); 11685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (DetailInputs::iterator it = inputs->begin(); 11695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) it != inputs->end(); ++it) { 11705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (it->length != DetailInput::NONE) 11715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) it->initial_value = common::GetHardcodedValueForType(it->type); 1172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::ShowEditUiIfBadSuggestion( 1176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DialogSection section) { 1177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // |CreateWrapper()| returns an empty wrapper if |IsEditingExistingData()|, so 1178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // get the wrapper before this potentially happens below. 117990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section); 1180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the chosen item in |model| yields an empty suggestion text, it is 1182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // invalid. In this case, show the edit UI and highlight invalid fields. 1183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 1184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 unused, unused2; 1185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsASuggestionItemKey(model->GetItemKeyForCheckedItem()) && 1186c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch !SuggestionTextForSection(section, &unused, &unused2)) { 1187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SetEditingExistingData(section, true); 1188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (wrapper && IsEditingExistingData(section)) { 11915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 country = 11925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) wrapper->GetInfo(AutofillType(CountryTypeForSection(section))); 11935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!country.empty()) { 11945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // There's no user input to restore here as this is only called after 11955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // resetting all section input. 11965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (RebuildInputsForCountry(section, country, false)) 11975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateSection(section); 11985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 11995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) wrapper->FillInputs(MutableRequestedFieldsForSection(section)); 12005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 120290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1203ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerImpl::InputWasEdited(ServerFieldType type, 1204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::string16& value) { 1205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (value.empty()) 1206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 120790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1208ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // If this is a combobox at the default value, don't preserve it. 1209ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ui::ComboboxModel* model = ComboboxModelForAutofillType(type); 1210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (model && model->GetItemAt(model->GetDefaultIndex()) == value) 1211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 1212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 1214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)FieldValueMap AutofillDialogControllerImpl::TakeUserInputSnapshot() { 1217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldValueMap snapshot; 1218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!view_) 1219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return snapshot; 1220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 1222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DialogSection section = static_cast<DialogSection>(i); 1223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 1224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (model->GetItemKeyForCheckedItem() != kAddNewItemKey) 1225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch continue; 1226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldValueMap outputs; 1228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch view_->GetUserInput(section, &outputs); 1229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Remove fields that are empty, at their default values, or invalid. 1230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (FieldValueMap::iterator it = outputs.begin(); it != outputs.end(); 1231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ++it) { 1232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (InputWasEdited(it->first, it->second) && 1233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InputValidityMessage(section, it->first, it->second).empty()) { 1234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch snapshot.insert(std::make_pair(it->first, it->second)); 1235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return snapshot; 1240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::RestoreUserInputFromSnapshot( 1243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const FieldValueMap& snapshot) { 1244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (snapshot.empty()) 1245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 1246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 1248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DialogSection section = static_cast<DialogSection>(i); 1249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!SectionIsActive(section)) 1250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch continue; 1251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DetailInputs* inputs = MutableRequestedFieldsForSection(section); 1253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = 0; i < inputs->size(); ++i) { 12545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DetailInput* input = &(*inputs)[i]; 12555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (input->length != DetailInput::NONE) { 12565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) input->initial_value = 12575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetInfoFromInputs(snapshot, section, AutofillType(input->type)); 1258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 12595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (InputWasEdited(input->type, input->initial_value)) 12605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SuggestionsMenuModelForSection(section)->SetCheckedItem(kAddNewItemKey); 1261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1263eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::UpdateSection(DialogSection section) { 1266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (view_) 1267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->UpdateSection(section); 1268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1270eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::UpdateForErrors() { 1271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!view_) 1272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 1273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Currently, the view should only need to be updated if there are 1275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // |wallet_errors_| or validating a suggestion that's based on existing data. 1276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool should_update = !wallet_errors_.empty(); 1277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!should_update) { 1278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 1279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsEditingExistingData(static_cast<DialogSection>(i))) { 1280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch should_update = true; 1281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 1282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (should_update) 1287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch view_->UpdateForErrors(); 1288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)gfx::Image AutofillDialogControllerImpl::GetGeneratedCardImage( 1291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::string16& card_number, 1292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::string16& name, 1293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const SkColor& gradient_top, 1294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const SkColor& gradient_bottom) { 1295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const int kCardWidthPx = 300; 1296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const int kCardHeightPx = 190; 1297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::Size size(kCardWidthPx, kCardHeightPx); 1298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ui::ScaleFactor scale_factor = ui::GetScaleFactorForNativeView( 1299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_contents()->GetView()->GetNativeView()); 1300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Canvas canvas(size, ui::GetImageScale(scale_factor), false); 1301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect display_rect(size); 1303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) skia::RefPtr<SkShader> shader = gfx::CreateGradientShader( 1305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 0, size.height(), gradient_top, gradient_bottom); 1306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SkPaint paint; 1307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) paint.setShader(shader.get()); 1308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) canvas.DrawRoundRect(display_rect, 8, paint); 1309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) display_rect.Inset(20, 0, 0, 0); 1311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Font font(l10n_util::GetStringUTF8(IDS_FIXED_FONT_FAMILY), 18); 1312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::FontList font_list(font); 1313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::ShadowValues shadows; 1314f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) shadows.push_back(gfx::ShadowValue(gfx::Point(0, 1), 1.0, SK_ColorBLACK)); 1315f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) canvas.DrawStringRectWithShadows( 1316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) card_number, 1317f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) font_list, 1318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SK_ColorWHITE, 1319f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) display_rect, 0, 0, shadows); 1320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::string16 capitalized_name = base::i18n::ToUpper(name); 1322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) display_rect.Inset(0, size.height() / 2, 0, 0); 1323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) canvas.DrawStringRectWithShadows( 1324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) capitalized_name, 1325f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) font_list, 1326f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SK_ColorWHITE, 1327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) display_rect, 0, 0, shadows); 1328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1329f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::ImageSkia skia(canvas.ExtractImageRep()); 1330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return gfx::Image(skia); 1331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 1332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 133358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::StartCardScramblingRefresher() { 133458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) RefreshCardScramblingOverlay(); 133558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) card_scrambling_refresher_.Start( 133658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FROM_HERE, 133758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(75), 133858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) this, 133958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &AutofillDialogControllerImpl::RefreshCardScramblingOverlay); 134058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 134158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 134258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::RefreshCardScramblingOverlay() { 134358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scrambled_card_number_ = GenerateRandomCardNumber(); 134458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PushOverlayUpdate(); 134558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 134658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 134758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::PushOverlayUpdate() { 134858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (view_) { 134958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ScopedViewUpdates updates(view_.get()); 135058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) view_->UpdateOverlay(); 135158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 135258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 135358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const DetailInputs& AutofillDialogControllerImpl::RequestedFieldsForSection( 13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialogSection section) const { 13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (section) { 13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_CC: 13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return requested_cc_fields_; 13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_BILLING: 13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return requested_billing_fields_; 13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_CC_BILLING: 13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return requested_cc_billing_fields_; 13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_SHIPPING: 13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return requested_shipping_fields_; 13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return requested_billing_fields_; 13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::ComboboxModel* AutofillDialogControllerImpl::ComboboxModelForAutofillType( 13723240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ServerFieldType type) { 1373bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch switch (type) { 13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case CREDIT_CARD_EXP_MONTH: 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &cc_exp_month_combobox_model_; 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case CREDIT_CARD_EXP_4_DIGIT_YEAR: 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &cc_exp_year_combobox_model_; 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1380bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch case ADDRESS_BILLING_COUNTRY: 13815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return &billing_country_combobox_model_; 13825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ADDRESS_HOME_COUNTRY: 13845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return &shipping_country_combobox_model_; 13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::MenuModel* AutofillDialogControllerImpl::MenuModelForSection( 13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialogSection section) { 1393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 1394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The shipping section menu is special. It will always show because there is 1395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // a choice between "Use billing" and "enter new". 1396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (section == SECTION_SHIPPING) 1397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return model; 1398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // For other sections, only show a menu if there's at least one suggestion. 1400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (int i = 0; i < model->GetItemCount(); ++i) { 1401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsASuggestionItemKey(model->GetItemKeyAt(i))) 1402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return model; 1403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 1406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::MenuModel* AutofillDialogControllerImpl::MenuModelForAccountChooser() { 1409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If there were unrecoverable Wallet errors, or if there are choices other 1410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // than "Pay without the wallet", show the full menu. 14114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(estade): this can present a braindead menu (only 1 option) when 14124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // there's a wallet error. 141358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (wallet_error_notification_ || 14144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) (SignedInState() == SIGNED_IN && 1415a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_->HasAccountsToChoose() && 1416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) !ShouldShowSignInWebView())) { 1417a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return account_chooser_model_.get(); 1418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Otherwise, there is no menu, just a sign in link. 1421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Image AutofillDialogControllerImpl::AccountChooserImage() { 1425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!MenuModelForAccountChooser() && !ShouldShowSignInWebView()) { 1426f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return ui::ResourceBundle::GetSharedInstance().GetImageNamed( 1427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IDR_WALLET_ICON); 14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1430f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return gfx::Image(); 14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14332385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochgfx::Image AutofillDialogControllerImpl::ButtonStripImage() const { 143458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (IsPayingWithWallet()) { 14352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return ui::ResourceBundle::GetSharedInstance().GetImageNamed( 14362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch IDR_WALLET_LOGO); 14372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 14382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 14392385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return gfx::Image(); 14402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 14412385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1442a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::LabelForSection( 1443a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DialogSection section) const { 14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (section) { 14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_CC: 14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SECTION_CC); 14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_BILLING: 14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_CC_BILLING: 14497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SECTION_BILLING); 14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_SHIPPING: 14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SECTION_SHIPPING); 14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 145358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 1454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return base::string16(); 14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SuggestionState AutofillDialogControllerImpl::SuggestionStateForSection( 1458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DialogSection section) { 1459a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 vertically_compact, horizontally_compact; 1460c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch bool show_suggestion = SuggestionTextForSection(section, 1461c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch &vertically_compact, 1462c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch &horizontally_compact); 1463c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return SuggestionState(show_suggestion, 1464c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch vertically_compact, 1465c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch horizontally_compact, 1466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionIconForSection(section), 1467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtraSuggestionTextForSection(section), 14687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ExtraSuggestionIconForSection(section)); 1469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1471c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochbool AutofillDialogControllerImpl::SuggestionTextForSection( 1472c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch DialogSection section, 1473c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch base::string16* vertically_compact, 1474c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch base::string16* horizontally_compact) { 1475c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch base::string16 action_text = RequiredActionTextForSection(section); 1476c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch if (!action_text.empty()) { 1477c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch *vertically_compact = *horizontally_compact = action_text; 1478c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return true; 1479c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch } 1480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When the user has clicked 'edit' or a suggestion is somehow invalid (e.g. a 1482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // user selects a credit card that has expired), don't show a suggestion (even 1483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // though there is a profile selected in the model). 1484868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (IsEditingExistingData(section)) 1485c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return false; 14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string item_key = model->GetItemKeyForCheckedItem(); 1489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (item_key == kSameAsBillingKey) { 1490c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch *vertically_compact = *horizontally_compact = l10n_util::GetStringUTF16( 1491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IDS_AUTOFILL_DIALOG_USING_BILLING_FOR_SHIPPING); 1492c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return true; 1493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!IsASuggestionItemKey(item_key)) 1496c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return false; 14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section); 1499c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return wrapper->GetDisplayText(vertically_compact, horizontally_compact); 1500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::RequiredActionTextForSection( 1503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DialogSection section) const { 1504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (section == SECTION_CC_BILLING && IsSubmitPausedOn(wallet::VERIFY_CVV)) { 1505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const wallet::WalletItems::MaskedInstrument* current_instrument = 1506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wallet_items_->GetInstrumentById(active_instrument_id_); 1507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (current_instrument) 1508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return current_instrument->TypeAndLastFourDigits(); 1509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldValueMap output; 1511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->GetUserInput(section, &output); 1512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreditCard card; 1513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetBillingInfoFromOutputs(output, &card, NULL, NULL); 1514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return card.TypeAndLastFourDigits(); 1515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1517a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return base::string16(); 1518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1520a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::ExtraSuggestionTextForSection( 1521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DialogSection section) const { 1522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (section == SECTION_CC || 1523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (section == SECTION_CC_BILLING && IsSubmitPausedOn(wallet::VERIFY_CVV))) { 1524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PLACEHOLDER_CVC); 1525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1527a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return base::string16(); 1528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1530868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const wallet::WalletItems::MaskedInstrument* AutofillDialogControllerImpl:: 1531868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ActiveInstrument() const { 1532868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!IsPayingWithWallet()) 1533868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 1534868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1535868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const SuggestionsMenuModel* model = 1536868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SuggestionsMenuModelForSection(SECTION_CC_BILLING); 1537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string item_key = model->GetItemKeyForCheckedItem(); 1538868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!IsASuggestionItemKey(item_key)) 1539868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 1540868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1541868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int index; 1542868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!base::StringToInt(item_key, &index) || index < 0 || 1543868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static_cast<size_t>(index) >= wallet_items_->instruments().size()) { 1544868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NOTREACHED(); 1545868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 1546868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1547868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1548868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return wallet_items_->instruments()[index]; 1549868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1550868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1551868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const wallet::Address* AutofillDialogControllerImpl:: 1552868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ActiveShippingAddress() const { 1553a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!IsPayingWithWallet() || !IsShippingAddressRequired()) 1554868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 1555868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1556868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const SuggestionsMenuModel* model = 1557868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SuggestionsMenuModelForSection(SECTION_SHIPPING); 1558868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string item_key = model->GetItemKeyForCheckedItem(); 1559868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!IsASuggestionItemKey(item_key)) 1560868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 1561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int index; 1563868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!base::StringToInt(item_key, &index) || index < 0 || 1564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static_cast<size_t>(index) >= wallet_items_->addresses().size()) { 1565868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NOTREACHED(); 1566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 1567868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1568868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1569868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return wallet_items_->addresses()[index]; 1570868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1571868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<DataModelWrapper> AutofillDialogControllerImpl::CreateWrapper( 15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialogSection section) { 1574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsPayingWithWallet() && full_wallet_ && 1575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) full_wallet_->required_actions().empty()) { 15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (section == SECTION_CC_BILLING) { 15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<DataModelWrapper>( 15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new FullWalletBillingWrapper(full_wallet_.get())); 15792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (section == SECTION_SHIPPING) { 15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<DataModelWrapper>( 15822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new FullWalletShippingWrapper(full_wallet_.get())); 15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string item_key = model->GetItemKeyForCheckedItem(); 1588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!IsASuggestionItemKey(item_key) || IsManuallyEditingSection(section)) 15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<DataModelWrapper>(); 15902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsPayingWithWallet()) { 15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (section == SECTION_CC_BILLING) { 15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<DataModelWrapper>( 1594868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new WalletInstrumentWrapper(ActiveInstrument())); 15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (section == SECTION_SHIPPING) { 1598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return scoped_ptr<DataModelWrapper>( 1599868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new WalletAddressWrapper(ActiveShippingAddress())); 1600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return scoped_ptr<DataModelWrapper>(); 16032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (section == SECTION_CC) { 16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreditCard* card = GetManager()->GetCreditCardByGUID(item_key); 16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(card); 16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<DataModelWrapper>(new AutofillCreditCardWrapper(card)); 16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillProfile* profile = GetManager()->GetProfileByGUID(item_key); 16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(profile); 161358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (section == SECTION_SHIPPING) { 161458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return scoped_ptr<DataModelWrapper>( 1615d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) new AutofillShippingAddressWrapper(profile)); 161658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 161758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK_EQ(SECTION_BILLING, section); 16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<DataModelWrapper>( 1619d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) new AutofillProfileWrapper(profile)); 16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Image AutofillDialogControllerImpl::SuggestionIconForSection( 16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialogSection section) { 16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DataModelWrapper> model = CreateWrapper(section); 16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!model.get()) 16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Image(); 16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return model->GetIcon(); 16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Image AutofillDialogControllerImpl::ExtraSuggestionIconForSection( 1632d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DialogSection section) { 1633d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (section != SECTION_CC && section != SECTION_CC_BILLING) 1634d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return gfx::Image(); 1635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1636d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<DataModelWrapper> model = CreateWrapper(section); 1637d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!model.get()) 1638d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return gfx::Image(); 1639d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1640d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return CvcIconForCreditCardType( 1641d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) model->GetInfo(AutofillType(CREDIT_CARD_TYPE))); 1642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1644d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)FieldIconMap AutofillDialogControllerImpl::IconsForFields( 1645d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const FieldValueMap& user_inputs) const { 1646d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FieldIconMap result; 1647d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::string16 credit_card_type; 1648d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1649d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FieldValueMap::const_iterator credit_card_iter = 1650d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) user_inputs.find(CREDIT_CARD_NUMBER); 1651d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (credit_card_iter != user_inputs.end()) { 1652a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& number = credit_card_iter->second; 1653d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::string type = CreditCard::GetCreditCardType(number); 1654d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) credit_card_type = CreditCard::TypeForDisplay(type); 1655d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) result[CREDIT_CARD_NUMBER] = CreditCardIconForType(type); 1656d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 1657d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1658d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!user_inputs.count(CREDIT_CARD_VERIFICATION_CODE)) 1659d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return result; 1660d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1661d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) result[CREDIT_CARD_VERIFICATION_CODE] = 1662d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CvcIconForCreditCardType(credit_card_type); 1663d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1664d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return result; 1665d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 1666d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1667d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool AutofillDialogControllerImpl::FieldControlsIcons( 1668d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ServerFieldType type) const { 1669d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return type == CREDIT_CARD_NUMBER; 1670d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 1671d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1672a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::TooltipForField( 1673a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ServerFieldType type) const { 16744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (type == PHONE_HOME_WHOLE_NUMBER || type == PHONE_BILLING_WHOLE_NUMBER) 16754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_TOOLTIP_PHONE_NUMBER); 16764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1677a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return base::string16(); 16784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 16794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 16808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool AutofillDialogControllerImpl::InputIsEditable( 16818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const DetailInput& input, 16828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DialogSection section) { 16838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (section != SECTION_CC_BILLING) 16848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return true; 16858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 16868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (input.type == CREDIT_CARD_NUMBER) 16878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return !IsEditingExistingData(section); 16888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 16898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // For CVC, only require (allow) input if the user has edited some other 16908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // aspect of the card. 16918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (input.type == CREDIT_CARD_VERIFICATION_CODE && 16928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) IsEditingExistingData(section)) { 1693f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldValueMap output; 16948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) view_->GetUserInput(section, &output); 16958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) WalletInstrumentWrapper wrapper(ActiveInstrument()); 16968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1697f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (FieldValueMap::iterator iter = output.begin(); iter != output.end(); 16988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ++iter) { 1699f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (iter->first == input.type) 17008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) continue; 17018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1702f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AutofillType type(iter->first); 17038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (type.group() == CREDIT_CARD && 17048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) iter->second != wrapper.GetInfo(type)) { 17058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return true; 17068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 17078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 17088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 17098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return false; 17108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 17118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 17128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return true; 17138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 17148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 17154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// TODO(groby): Add more tests. 1716a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::InputValidityMessage( 17177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogSection section, 17183240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ServerFieldType type, 1719a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& value) { 17207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // If the field is edited, clear any Wallet errors. 17217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (IsPayingWithWallet()) { 17227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WalletValidationErrors::iterator it = wallet_errors_.find(section); 17237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (it != wallet_errors_.end()) { 17247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TypeErrorInputMap::const_iterator iter = it->second.find(type); 17257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (iter != it->second.end()) { 17267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (iter->second.second == value) 17277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return iter->second.first; 17287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) it->second.erase(type); 17297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 17307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 17317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 17327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 17335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AutofillType autofill_type(type); 17345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (i18ninput::Enabled() && 17355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (autofill_type.group() == ADDRESS_HOME || 17365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) autofill_type.group() == ADDRESS_BILLING)) { 17375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(dbeam): delete all US-specific address validation when 17385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // --enable-autofill-address-i18n is removed. 17395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::string16(); 17405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 17415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 17425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (autofill_type.GetStorableType()) { 174390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case EMAIL_ADDRESS: 1744868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!value.empty() && !IsValidEmailAddress(value)) { 1745868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return l10n_util::GetStringUTF16( 1746868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_EMAIL_ADDRESS); 1747868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 174890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 174990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1750eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case CREDIT_CARD_NUMBER: { 1751eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!value.empty()) { 1752eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::string16 message = CreditCardNumberValidityMessage(value); 1753eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!message.empty()) 1754eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return message; 1755eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1756eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 1757eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 175890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 175990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case CREDIT_CARD_EXP_MONTH: 1760ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!InputWasEdited(CREDIT_CARD_EXP_MONTH, value)) { 1761ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return l10n_util::GetStringUTF16( 17625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IDS_LIBADDRESSINPUT_I18N_MISSING_REQUIRED_FIELD); 1763ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 1764ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch break; 1765ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 176690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case CREDIT_CARD_EXP_4_DIGIT_YEAR: 1767ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!InputWasEdited(CREDIT_CARD_EXP_4_DIGIT_YEAR, value)) { 1768ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return l10n_util::GetStringUTF16( 17695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IDS_LIBADDRESSINPUT_I18N_MISSING_REQUIRED_FIELD); 1770ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 177190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 177290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 177390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case CREDIT_CARD_VERIFICATION_CODE: 1774868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!value.empty() && !autofill::IsValidCreditCardSecurityCode(value)) { 1775868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return l10n_util::GetStringUTF16( 1776868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_SECURITY_CODE); 1777868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 177890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 177990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 178090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case ADDRESS_HOME_LINE1: 178190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 17822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 178390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case ADDRESS_HOME_LINE2: 17845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ADDRESS_HOME_DEPENDENT_LOCALITY: 17855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ADDRESS_HOME_SORTING_CODE: 17865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::string16(); // Optional until we have better validation. 178790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 17887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case ADDRESS_HOME_CITY: 17897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case ADDRESS_HOME_COUNTRY: 17907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 17917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 179290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case ADDRESS_HOME_STATE: 17935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!value.empty() &&!autofill::IsValidState(value) && 17945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CountryCodeForSection(section) == "US") { 17955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!i18ninput::Enabled()); 17967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return l10n_util::GetStringUTF16( 17977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_REGION); 17987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 17995e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) break; 18005e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) 180190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case ADDRESS_HOME_ZIP: 18025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!value.empty() && !autofill::IsValidZip(value) && 18035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CountryCodeForSection(section) == "US") { 18045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!i18ninput::Enabled()); 18057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return l10n_util::GetStringUTF16( 18067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_ZIP_CODE); 18077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 180890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 180990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 18107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case NAME_FULL: 18117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Wallet requires a first and last billing name. 18127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (section == SECTION_CC_BILLING && !value.empty() && 18137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch !IsCardHolderNameValidForWallet(value)) { 18147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(IsPayingWithWallet()); 18157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return l10n_util::GetStringUTF16( 18167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDS_AUTOFILL_DIALOG_VALIDATION_WALLET_REQUIRES_TWO_NAMES); 18177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 181890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 18192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1820868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case PHONE_HOME_WHOLE_NUMBER: // Used in shipping section. 1821868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) break; 1822868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1823868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case PHONE_BILLING_WHOLE_NUMBER: // Used in billing section. 182490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 182590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 182690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) default: 182790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NOTREACHED(); // Trying to validate unknown field. 182890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 182990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 183090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 18315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return value.empty() ? l10n_util::GetStringUTF16( 18325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IDS_LIBADDRESSINPUT_I18N_MISSING_REQUIRED_FIELD) : 18335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16(); 18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// TODO(groby): Also add tests. 18374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)ValidityMessages AutofillDialogControllerImpl::InputsAreValid( 18387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogSection section, 1839f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const FieldValueMap& inputs) { 18404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ValidityMessages messages; 18415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (inputs.empty()) 18425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return messages; 18435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddressValidator::Status status = AddressValidator::SUCCESS; 18455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (i18ninput::Enabled() && section != SECTION_CC) { 18465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AutofillProfile profile; 18475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FillFormGroupFromOutputs(inputs, &profile); 18485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddressData address_data; 18495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) i18ninput::CreateAddressData(base::Bind(&GetInfoFromProfile, profile), 18505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &address_data); 18515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddressProblems problems; 18535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) status = GetValidator()->ValidateAddress(address_data, 18545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddressProblemFilter(), 18555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &problems); 18565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) common::AddressType address_type = section == SECTION_SHIPPING ? 18575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) common::ADDRESS_TYPE_SHIPPING : common::ADDRESS_TYPE_BILLING; 18585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < problems.size(); ++i) { 18595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const AddressProblem& problem = problems[i]; 18605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool sure = problem.type != AddressProblem::MISSING_REQUIRED_FIELD; 18615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 text = l10n_util::GetStringUTF16(problem.description_id); 18625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) messages.Set(i18ninput::TypeForField(problem.field, address_type), 18635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ValidityMessage(text, sure)); 18645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 18655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 18665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1867f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (FieldValueMap::const_iterator iter = inputs.begin(); 18682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != inputs.end(); ++iter) { 1869f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const ServerFieldType type = iter->first; 18704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::string16 text = InputValidityMessage(section, type, iter->second); 18714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 18725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Skip empty/unchanged fields in edit mode. If the individual field does 18735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // not have validation errors, assume it to be valid unless later proven 18745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // otherwise. 18755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool sure = InputWasEdited(type, iter->second); 18765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (sure && status == AddressValidator::RULES_NOT_READY && 18785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !ComboboxModelForAutofillType(type) && 18795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (AutofillType(type).group() == ADDRESS_HOME || 18805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AutofillType(type).group() == ADDRESS_BILLING)) { 18815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(text.empty()); 18825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(estade): string translation or remove this (sweet) hack. 18835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) text = l10n_util::GetStringUTF16( 18845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_WAITING_FOR_RULES); 18855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sure = false; 18865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) needs_validation_.insert(section); 18874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 18885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) messages.Set(type, ValidityMessage(text, sure)); 18902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // For the convenience of using operator[]. 18935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FieldValueMap& field_values = const_cast<FieldValueMap&>(inputs); 1894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Validate the date formed by month and year field. (Autofill dialog is 1895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // never supposed to have 2-digit years, so not checked). 1896868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (field_values.count(CREDIT_CARD_EXP_4_DIGIT_YEAR) && 1897868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) field_values.count(CREDIT_CARD_EXP_MONTH) && 1898ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch InputWasEdited(CREDIT_CARD_EXP_4_DIGIT_YEAR, 1899ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch field_values[CREDIT_CARD_EXP_4_DIGIT_YEAR]) && 1900ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch InputWasEdited(CREDIT_CARD_EXP_MONTH, 19014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) field_values[CREDIT_CARD_EXP_MONTH])) { 19024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ValidityMessage year_message(base::string16(), true); 19034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ValidityMessage month_message(base::string16(), true); 19044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!IsCreditCardExpirationValid(field_values[CREDIT_CARD_EXP_4_DIGIT_YEAR], 19054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) field_values[CREDIT_CARD_EXP_MONTH])) { 19064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The dialog shows the same error message for the month and year fields. 19074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) year_message.text = l10n_util::GetStringUTF16( 19084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_EXPIRATION_DATE); 19094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) month_message.text = l10n_util::GetStringUTF16( 19104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_EXPIRATION_DATE); 19114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 19124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) messages.Set(CREDIT_CARD_EXP_4_DIGIT_YEAR, year_message); 19134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) messages.Set(CREDIT_CARD_EXP_MONTH, month_message); 19142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If there is a credit card number and a CVC, validate them together. 19172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (field_values.count(CREDIT_CARD_NUMBER) && 19184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) field_values.count(CREDIT_CARD_VERIFICATION_CODE)) { 19194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ValidityMessage ccv_message(base::string16(), true); 19204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!autofill::IsValidCreditCardSecurityCode( 19214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) field_values[CREDIT_CARD_VERIFICATION_CODE], 19224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) field_values[CREDIT_CARD_NUMBER])) { 19234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ccv_message.text = l10n_util::GetStringUTF16( 19244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_SECURITY_CODE); 19254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 19264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) messages.Set(CREDIT_CARD_VERIFICATION_CODE, ccv_message); 19272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1929868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Validate the shipping phone number against the country code of the address. 193090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (field_values.count(ADDRESS_HOME_COUNTRY) && 193190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) field_values.count(PHONE_HOME_WHOLE_NUMBER)) { 193290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) i18n::PhoneObject phone_object( 193390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) field_values[PHONE_HOME_WHOLE_NUMBER], 193490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AutofillCountry::GetCountryCode( 193590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) field_values[ADDRESS_HOME_COUNTRY], 193690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) g_browser_process->GetApplicationLocale())); 19374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ValidityMessage phone_message(base::string16(), true); 193890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!phone_object.IsValidNumber()) { 19394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) phone_message.text = l10n_util::GetStringUTF16( 1940868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_PHONE_NUMBER); 1941868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 19424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) messages.Set(PHONE_HOME_WHOLE_NUMBER, phone_message); 1943868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1944868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1945868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Validate the billing phone number against the country code of the address. 1946868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (field_values.count(ADDRESS_BILLING_COUNTRY) && 1947868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) field_values.count(PHONE_BILLING_WHOLE_NUMBER)) { 1948868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) i18n::PhoneObject phone_object( 1949868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) field_values[PHONE_BILLING_WHOLE_NUMBER], 1950868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AutofillCountry::GetCountryCode( 1951868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) field_values[ADDRESS_BILLING_COUNTRY], 1952868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) g_browser_process->GetApplicationLocale())); 19534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ValidityMessage phone_message(base::string16(), true); 1954868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!phone_object.IsValidNumber()) { 19554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) phone_message.text = l10n_util::GetStringUTF16( 1956868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_PHONE_NUMBER); 195790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 19584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) messages.Set(PHONE_BILLING_WHOLE_NUMBER, phone_message); 195990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 196090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 19614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return messages; 19622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::UserEditedOrActivatedInput( 19657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogSection section, 1966f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ServerFieldType type, 19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeView parent_view, 19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& content_bounds, 1969a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& field_contents, 19702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool was_edit) { 19715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 19725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 19735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (type == ADDRESS_BILLING_COUNTRY || type == ADDRESS_HOME_COUNTRY) { 19745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(i18ninput::Enabled()); 19755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 19765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const FieldValueMap snapshot = TakeUserInputSnapshot(); 19775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 19785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Clobber the inputs because the view's already been updated. 19795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RebuildInputsForCountry(section, field_contents, true); 19805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RestoreUserInputFromSnapshot(snapshot); 19815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateSection(section); 19825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 19835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetValidator()->LoadRules(AutofillCountry::GetCountryCode( 19845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) field_contents, g_browser_process->GetApplicationLocale())); 19855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 19865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 19875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The rest of this method applies only to textfields. If a combobox, bail. 19885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (ComboboxModelForAutofillType(type)) 19895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 19905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 19912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the field is edited down to empty, don't show a popup. 19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (was_edit && field_contents.empty()) { 19932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HidePopup(); 19942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 19952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the user clicks while the popup is already showing, be sure to hide 19982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // it. 1999868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!was_edit && popup_controller_.get()) { 20002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HidePopup(); 20012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 20022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<base::string16> popup_values, popup_labels, popup_icons; 2005f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (common::IsCreditCardType(type)) { 2006f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetManager()->GetCreditCardSuggestions(AutofillType(type), 20072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) field_contents, 20082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_values, 20092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_labels, 20102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_icons, 20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_guids_); 20122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 20135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<ServerFieldType> field_types = 20145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RequestedTypesForSection(section); 2015f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetManager()->GetProfileSuggestions(AutofillType(type), 20162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) field_contents, 20172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 20182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) field_types, 20192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_values, 20202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_labels, 20212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_icons, 20222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_guids_); 20232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (popup_values.empty()) { 2026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HidePopup(); 20272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 20292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |popup_input_type_| must be set before calling |Show()|. 20315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) popup_input_type_ = type; 2032f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 20332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(estade): do we need separators and control rows like 'Clear 20342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Form'? 20352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<int> popup_ids; 20362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < popup_guids_.size(); ++i) { 20372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_ids.push_back(i); 20382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_controller_ = AutofillPopupControllerImpl::GetOrCreate( 2041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) popup_controller_, 2042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 20430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) NULL, 2044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent_view, 20457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) content_bounds, 20467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::i18n::IsRTL() ? 20477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::i18n::RIGHT_TO_LEFT : base::i18n::LEFT_TO_RIGHT); 2048424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) popup_controller_->set_hide_on_outside_click(true); 20492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_controller_->Show(popup_values, 20502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_labels, 20512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_icons, 20522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_ids); 20532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::FocusMoved() { 20562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HidePopup(); 20572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldShowErrorBubble() const { 20605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return popup_input_type_ == UNKNOWN_TYPE; 20614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 20624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 20632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::ViewClosed() { 20642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetManager()->RemoveObserver(this); 20652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Called from here rather than in ~AutofillDialogControllerImpl as this 20677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // relies on virtual methods that change to their base class in the dtor. 20687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MaybeShowCreditCardBubble(); 20697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 20702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete this; 20712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2073868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)std::vector<DialogNotification> AutofillDialogControllerImpl:: 2074868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CurrentNotifications() { 20752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<DialogNotification> notifications; 20762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 207758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(dbeam): figure out a way to dismiss this error after a while. 207858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (wallet_error_notification_) 207958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) notifications.push_back(*wallet_error_notification_); 2080eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2081c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsSubmitPausedOn(wallet::VERIFY_CVV)) { 2082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) notifications.push_back(DialogNotification( 2083868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DialogNotification::REQUIRED_ACTION, 2084868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_VERIFY_CVV))); 20852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!wallet_server_validation_recoverable_) { 2088a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) notifications.push_back(DialogNotification( 2089a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DialogNotification::REQUIRED_ACTION, 20907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch l10n_util::GetStringUTF16( 20917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDS_AUTOFILL_DIALOG_FAILED_TO_SAVE_WALLET_DATA))); 2092a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 2093a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 2094868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (choose_another_instrument_or_address_) { 2095868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) notifications.push_back(DialogNotification( 2096868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DialogNotification::REQUIRED_ACTION, 20977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch l10n_util::GetStringUTF16( 20987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDS_AUTOFILL_DIALOG_CHOOSE_DIFFERENT_WALLET_INSTRUMENT))); 2099868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 2100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (notifications.empty() && MenuModelForAccountChooser()) { 2102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::string16 text = l10n_util::GetStringUTF16( 2103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) IsManuallyEditingAnySection() ? 2104d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) IDS_AUTOFILL_DIALOG_SAVE_DETAILS_IN_WALLET : 2105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) IDS_AUTOFILL_DIALOG_USE_WALLET); 2106d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DialogNotification notification( 2107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DialogNotification::WALLET_USAGE_CONFIRMATION, 2108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) text); 2109d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) notification.set_tooltip_text( 2110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) l10n_util::GetStringUTF16( 2111d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) IDS_AUTOFILL_DIALOG_SAVE_IN_WALLET_TOOLTIP)); 2112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) notification.set_checked(IsPayingWithWallet()); 2113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) notifications.push_back(notification); 2114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 2115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (IsPayingWithWallet() && !wallet::IsUsingProd()) { 2117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) notifications.push_back(DialogNotification( 2118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DialogNotification::DEVELOPER_WARNING, 2119d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_NOT_PROD_WARNING))); 2120d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 2121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2122d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!invoked_from_same_origin_) { 2123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) notifications.push_back(DialogNotification( 2124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DialogNotification::SECURITY_WARNING, 2125d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) l10n_util::GetStringFUTF16(IDS_AUTOFILL_DIALOG_SITE_WARNING, 21265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(source_url_.host())))); 2127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 21292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return notifications; 21302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 213258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::LinkClicked(const GURL& url) { 213358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) OpenTabWithUrl(url); 213458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 213558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2136a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void AutofillDialogControllerImpl::SignInLinkClicked() { 21373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 21383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 21390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (SignedInState() == NOT_CHECKED) { 21400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) handling_use_wallet_link_click_ = true; 2141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_->SelectWalletAccount(0); 2142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FetchWalletCookie(); 21430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } else if (signin_registrar_.IsEmpty()) { 2144a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Start sign in. 21454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) waiting_for_explicit_sign_in_response_ = true; 2146a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) content::Source<content::NavigationController> source(view_->ShowSignIn()); 2147a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) signin_registrar_.Add( 2148a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, source); 21492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2150a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) GetMetricLogger().LogDialogUiEvent( 215158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AutofillMetrics::DIALOG_UI_SIGNIN_SHOWN); 2152a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } else { 21534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) waiting_for_explicit_sign_in_response_ = false; 2154a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) HideSignIn(); 2155a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 21565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) view_->UpdateAccountChooser(); 21585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) view_->UpdateButtonStrip(); 21592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::NotificationCheckboxStateChanged( 2162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DialogNotification::Type type, bool checked) { 2163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (type == DialogNotification::WALLET_USAGE_CONFIRMATION) { 2164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (checked) { 2165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_->SelectWalletAccount( 2166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetWalletClient()->user_index()); 2167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else { 2168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_->SelectUseAutofill(); 2169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 2170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AccountChoiceChanged(); 21722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 21742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LegalDocumentLinkClicked( 217658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Range& range) { 2177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < legal_document_link_ranges_.size(); ++i) { 2178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (legal_document_link_ranges_[i] == range) { 2179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OpenTabWithUrl(wallet_items_->legal_documents()[i]->url()); 2180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 2181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 21822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 21852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2187ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool AutofillDialogControllerImpl::OnCancel() { 2188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HidePopup(); 218958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!is_submitting_) 21907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LogOnCancelMetrics(); 2191d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) callback_.Run(NULL); 2192ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return true; 2193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2195ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool AutofillDialogControllerImpl::OnAccept() { 21960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 2197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) choose_another_instrument_or_address_ = false; 21987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) wallet_server_validation_recoverable_ = true; 2199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HidePopup(); 220058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 220158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // This must come before SetIsSubmitting(). 2202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsPayingWithWallet()) { 22038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // In the VERIFY_CVV case, hold onto the previously submitted cardholder 22048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // name. 22058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!IsSubmitPausedOn(wallet::VERIFY_CVV)) { 22068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) submitted_cardholder_name_ = 22078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GetValueFromSection(SECTION_CC_BILLING, NAME_BILLING_FULL); 22088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 22098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Snag the last four digits of the backing card now as it could be wiped 22108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // out if a CVC challenge happens. 22118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (ActiveInstrument()) { 22128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) backing_card_last_four_ = ActiveInstrument()->TypeAndLastFourDigits(); 22138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } else { 2214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldValueMap output; 22158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) view_->GetUserInput(SECTION_CC_BILLING, &output); 22168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) CreditCard card; 22178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GetBillingInfoFromOutputs(output, &card, NULL, NULL); 22188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) backing_card_last_four_ = card.TypeAndLastFourDigits(); 22198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 22208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 22218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(!submitted_cardholder_name_.empty()); 22228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(!backing_card_last_four_.empty()); 2223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetIsSubmitting(true); 222658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsSubmitPausedOn(wallet::VERIFY_CVV)) { 2228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!active_instrument_id_.empty()); 22290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) full_wallet_.reset(); 2230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetWalletClient()->AuthenticateInstrument( 2231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_instrument_id_, 22325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF16ToUTF8(view_->GetCvc())); 22330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) view_->UpdateOverlay(); 2234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (IsPayingWithWallet()) { 22350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) AcceptLegalTerms(); 2236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 22372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FinishSubmit(); 2238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2239ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2240ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return false; 22412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Profile* AutofillDialogControllerImpl::profile() { 22442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return profile_; 22452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2247bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochcontent::WebContents* AutofillDialogControllerImpl::GetWebContents() { 2248bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return web_contents(); 22492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 22522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// AutofillPopupDelegate implementation. 22532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogControllerImpl::OnPopupShown() { 22554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ScopedViewUpdates update(view_.get()); 22564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) view_->UpdateErrorBubble(); 22574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 225858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogPopupEvent(AutofillMetrics::DIALOG_POPUP_SHOWN); 22592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogControllerImpl::OnPopupHidden() {} 2262424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 2263424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool AutofillDialogControllerImpl::ShouldRepostEvent( 2264424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const ui::MouseEvent& event) { 22655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_NE(UNKNOWN_TYPE, popup_input_type_); 22665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If the event would be reposted inside the input showing an Autofill popup, 22675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // just ignore. 22685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return !view_->HitTestInput(popup_input_type_, event.location()); 2269424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 22702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::DidSelectSuggestion(int identifier) { 22722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(estade): implement. 22732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void AutofillDialogControllerImpl::DidAcceptSuggestion( 2276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& value, 2277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int identifier) { 22785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_NE(UNKNOWN_TYPE, popup_input_type_); 22795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Because |HidePopup()| can be called from |UpdateSection()|, remember the 22805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // type of the input for later here. 22815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ServerFieldType popup_input_type = popup_input_type_; 22825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 22842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PersonalDataManager::GUIDPair& pair = popup_guids_[identifier]; 22852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<DataModelWrapper> wrapper; 22875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (common::IsCreditCardType(popup_input_type)) { 2288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wrapper.reset(new AutofillCreditCardWrapper( 2289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetManager()->GetCreditCardByGUID(pair.first))); 2290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 2291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wrapper.reset(new AutofillProfileWrapper( 2292d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetManager()->GetProfileByGUID(pair.first), 22935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AutofillType(popup_input_type), 2294d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) pair.second)); 2295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 22962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (i18ninput::Enabled()) { 22985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If the user hasn't switched away from the default country and |wrapper|'s 22995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // country differs from the |view_|'s, rebuild inputs and restore user data. 23005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const FieldValueMap snapshot = TakeUserInputSnapshot(); 23015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool billing_rebuilt = false, shipping_rebuilt = false; 23025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 billing_country = 23045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) wrapper->GetInfo(AutofillType(ADDRESS_BILLING_COUNTRY)); 23055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!snapshot.count(ADDRESS_BILLING_COUNTRY) && 23065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !billing_country.empty()) { 23075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) billing_rebuilt = RebuildInputsForCountry( 23085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ActiveBillingSection(), billing_country, false); 23095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 23105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 shipping_country = 23125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) wrapper->GetInfo(AutofillType(ADDRESS_HOME_COUNTRY)); 23135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!snapshot.count(ADDRESS_HOME_COUNTRY) && 23145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !shipping_country.empty()) { 23155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shipping_rebuilt = RebuildInputsForCountry( 23165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SECTION_SHIPPING, shipping_country, false); 23175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 23185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (billing_rebuilt || shipping_rebuilt) { 23205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RestoreUserInputFromSnapshot(snapshot); 23215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (billing_rebuilt) 23225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateSection(ActiveBillingSection()); 23235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (shipping_rebuilt) 23245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UpdateSection(SECTION_SHIPPING); 23255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 23265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 23275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 2329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DialogSection section = static_cast<DialogSection>(i); 23305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!SectionIsActive(section)) 23315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) continue; 23325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wrapper->FillInputs(MutableRequestedFieldsForSection(section)); 23345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) view_->FillSection(section, popup_input_type); 2335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 23362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetMetricLogger().LogDialogPopupEvent( 233858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AutofillMetrics::DIALOG_POPUP_FORM_FILLED); 23392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(estade): not sure why it's necessary to do this explicitly. 23412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HidePopup(); 23422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void AutofillDialogControllerImpl::RemoveSuggestion( 2345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& value, 2346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int identifier) { 23472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(estade): implement. 23482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::ClearPreviewedForm() { 23512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(estade): implement. 23522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 23552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// content::NotificationObserver implementation. 23562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::Observe( 23582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int type, 23592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationSource& source, 23602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) { 23612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(type, content::NOTIFICATION_NAV_ENTRY_COMMITTED); 23622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::LoadCommittedDetails* load_details = 23632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::Details<content::LoadCommittedDetails>(details).ptr(); 2364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) size_t user_index = 0; 2365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (IsSignInContinueUrl(load_details->entry->GetVirtualURL(), &user_index)) { 23665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetWalletClient()->SetUserIndex(user_index); 2367f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FetchWalletCookie(); 23681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 23691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // NOTE: |HideSignIn()| may delete the WebContents which doesn't expect to 23701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // be deleted while committing a nav entry. Just call |HideSignIn()| later. 23711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 23721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::Bind(&AutofillDialogControllerImpl::HideSignIn, 23731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::Unretained(this))); 23742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 23782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// SuggestionsMenuModelDelegate implementation. 23792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AutofillDialogControllerImpl::SuggestionsMenuWillShow() { 23814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) HidePopup(); 23824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 23834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 23842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::SuggestionItemSelected( 2385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionsMenuModel* model, 2386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t index) { 23873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 23883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (model->GetItemKeyAt(index) == kManageItemsKey) { 239090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GURL url; 239190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!IsPayingWithWallet()) { 239290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GURL settings_url(chrome::kChromeUISettingsURL); 239390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) url = settings_url.Resolve(chrome::kAutofillSubPage); 239490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 239558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // Reset |last_wallet_items_fetch_timestamp_| to ensure that the Wallet 239658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // data is refreshed as soon as the user switches back to this tab after 239758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // potentially editing his data. 239858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch last_wallet_items_fetch_timestamp_ = base::TimeTicks(); 2399f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) size_t user_index = GetWalletClient()->user_index(); 240090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) url = SectionForSuggestionsMenuModel(*model) == SECTION_SHIPPING ? 24014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallet::GetManageAddressesUrl(user_index) : 24024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallet::GetManageInstrumentsUrl(user_index); 240390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 240490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OpenTabWithUrl(url); 2406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 2407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) model->SetCheckedIndex(index); 2410eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DialogSection section = SectionForSuggestionsMenuModel(*model); 24115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ResetSectionInput(section); 2413eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ShowEditUiIfBadSuggestion(section); 2414eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateSection(section); 2415d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) view_->UpdateNotificationArea(); 2416eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateForErrors(); 2417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LogSuggestionItemSelectedMetric(*model); 24192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 24222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// wallet::WalletClientDelegate implementation. 24232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const AutofillMetrics& AutofillDialogControllerImpl::GetMetricLogger() const { 24252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return metric_logger_; 24262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string AutofillDialogControllerImpl::GetRiskData() const { 2429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(!risk_data_.empty()); 2430eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return risk_data_; 24312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstd::string AutofillDialogControllerImpl::GetWalletCookieValue() const { 24347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return wallet_cookie_value_; 24357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 24367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2437a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool AutofillDialogControllerImpl::IsShippingAddressRequired() const { 2438a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return cares_about_shipping_; 2439a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 2440a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 24412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidAcceptLegalDocuments() { 244290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(is_submitting_ && IsPayingWithWallet()); 244390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) has_accepted_legal_documents_ = true; 244490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LoadRiskFingerprintData(); 24452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidAuthenticateInstrument(bool success) { 2448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(is_submitting_ && IsPayingWithWallet()); 2449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(dbeam): use the returned full wallet. http://crbug.com/224992 2451eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (success) { 24522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFullWallet(); 2453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 24547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DisableWallet(wallet::WalletClient::UNKNOWN_ERROR); 2455eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SuggestionsUpdated(); 2456eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 24572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidGetFullWallet( 24602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<wallet::FullWallet> full_wallet) { 2461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(is_submitting_ && IsPayingWithWallet()); 24623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 2463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) full_wallet_ = full_wallet.Pass(); 24652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (full_wallet_->required_actions().empty()) { 24672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FinishSubmit(); 2468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 2469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) switch (full_wallet_->required_actions()[0]) { 2472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case wallet::CHOOSE_ANOTHER_INSTRUMENT_OR_ADDRESS: 2473868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) choose_another_instrument_or_address_ = true; 2474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SetIsSubmitting(false); 2475eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetWalletItems(); 2476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) break; 2477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case wallet::VERIFY_CVV: 2479868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SuggestionsUpdated(); 2480868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) break; 2481868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2482868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) default: 24837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DisableWallet(wallet::WalletClient::UNKNOWN_ERROR); 24848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return; 2485868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 24868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 24878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) view_->UpdateNotificationArea(); 24888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) view_->UpdateButtonStrip(); 24898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) view_->UpdateOverlay(); 2490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AutofillDialogControllerImpl::OnPassiveSigninSuccess() { 2493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FetchWalletCookie(); 2494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::OnPassiveSigninFailure( 2497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GoogleServiceAuthError& error) { 24984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) signin_helper_.reset(); 2499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) passive_failed_ = true; 2500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (handling_use_wallet_link_click_ || 2502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetWalletClient()->user_index() != 0) { 2503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(estade): When a secondary account is selected and fails passive 2504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // auth, we show a sign in page. Currently we show the generic add account 2505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // page, but we should instead show sign in for the selected account. 2506f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // http://crbug.com/323327 2507f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SignInLinkClicked(); 2508f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) handling_use_wallet_link_click_ = false; 2509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 2510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2511f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) OnWalletSigninError(); 2512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AutofillDialogControllerImpl::OnDidFetchWalletCookieValue( 25157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& cookie_value) { 25167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch wallet_cookie_value_ = cookie_value; 25177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch signin_helper_.reset(); 25187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetWalletItems(); 25192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidGetWalletItems( 25222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<wallet::WalletItems> wallet_items) { 2523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) legal_documents_text_.clear(); 2524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) legal_document_link_ranges_.clear(); 252590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) has_accepted_legal_documents_ = false; 25262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wallet_items_ = wallet_items.Pass(); 2528f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2529a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (wallet_items_ && !wallet_items_->ObfuscatedGaiaId().empty()) { 2530f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Making sure the user index is in sync shouldn't be necessary, but is an 2531f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // extra precaution. But if there is no active account (such as in the 2532f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // PASSIVE_AUTH case), stick with the old active account. 25335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetWalletClient()->SetUserIndex(wallet_items_->active_account_index()); 2534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2535a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<std::string> usernames; 2536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (size_t i = 0; i < wallet_items_->gaia_accounts().size(); ++i) { 2537a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) usernames.push_back(wallet_items_->gaia_accounts()[i]->email_address()); 2538a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 2539a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_->SetWalletAccounts( 2540a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) usernames, wallet_items_->active_account_index()); 2541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 2542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 25431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ConstructLegalDocumentsText(); 25440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) OnWalletOrSigninUpdate(); 25452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2547ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid AutofillDialogControllerImpl::OnDidSaveToWallet( 25482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& instrument_id, 2549ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::string& address_id, 25507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::vector<wallet::RequiredAction>& required_actions, 25517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::vector<wallet::FormFieldError>& form_field_errors) { 2552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(is_submitting_ && IsPayingWithWallet()); 2553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2554a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (required_actions.empty()) { 2555ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!address_id.empty()) 2556ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch active_address_id_ = address_id; 2557ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!instrument_id.empty()) 2558ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch active_instrument_id_ = instrument_id; 2559ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch GetFullWallet(); 2560a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } else { 25617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) OnWalletFormFieldError(form_field_errors); 2562a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) HandleSaveOrUpdateRequiredActions(required_actions); 2563a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 25642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnWalletError( 25672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallet::WalletClient::ErrorType error_type) { 25687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DisableWallet(error_type); 25692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 25722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// PersonalDataManagerObserver implementation. 25732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnPersonalDataChanged() { 257590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (is_submitting_) 257690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 257790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionsUpdated(); 25792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// AccountChooserModelDelegate implementation. 2583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AutofillDialogControllerImpl::AccountChooserWillShow() { 25854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) HidePopup(); 25864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 25874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 25882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::AccountChoiceChanged() { 25893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 25904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallet::WalletClient* client = GetWalletClient(); 25913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (is_submitting_) 25935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) client->CancelRequest(); 2594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetIsSubmitting(false); 2596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) size_t selected_user_index = 2598a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_->GetActiveWalletAccountIndex(); 2599a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (account_chooser_model_->WalletIsSelected() && 26004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) client->user_index() != selected_user_index) { 26015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) client->SetUserIndex(selected_user_index); 2602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Clear |wallet_items_| so we don't try to restore the selected instrument 2603f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // and address. 2604f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) wallet_items_.reset(); 26054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GetWalletItems(); 26064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 26074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SuggestionsUpdated(); 26084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateAccountChooserView(); 26094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 26112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2612f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AutofillDialogControllerImpl::AddAccount() { 2613f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SignInLinkClicked(); 2614f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2615f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::UpdateAccountChooserView() { 2617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (view_) { 26183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 2619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->UpdateAccountChooser(); 2620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->UpdateNotificationArea(); 26212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 26222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 26232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 26252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::HandleKeyPressEventInInput( 26272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NativeWebKeyboardEvent& event) { 2628868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (popup_controller_.get()) 26292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return popup_controller_->HandleKeyPressEvent(event); 26302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 26322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 26332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool AutofillDialogControllerImpl::IsSubmitPausedOn( 26358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) wallet::RequiredAction required_action) const { 26368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return full_wallet_ && full_wallet_->HasRequiredAction(required_action); 26378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 26388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2639ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerImpl::ShowNewCreditCardBubble( 2640ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<CreditCard> new_card, 2641ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<AutofillProfile> billing_profile) { 26420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) NewCreditCardBubbleController::Show(web_contents(), 2643ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new_card.Pass(), 2644ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch billing_profile.Pass()); 2645ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 2646ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 264758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::SubmitButtonDelayBegin() { 264858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) submit_button_delay_timer_.Start( 264958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FROM_HERE, 265058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(kSubmitButtonDelayMs), 265158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) this, 265258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &AutofillDialogControllerImpl::OnSubmitButtonDelayEnd); 265358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 265458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 265558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::SubmitButtonDelayEndForTesting() { 265658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(submit_button_delay_timer_.IsRunning()); 265758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) submit_button_delay_timer_.user_task().Run(); 265858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) submit_button_delay_timer_.Stop(); 265958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 266058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 26614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AutofillDialogControllerImpl:: 26624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ClearLastWalletItemsFetchTimestampForTesting() { 26634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) last_wallet_items_fetch_timestamp_ = base::TimeTicks(); 26644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 26654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2666f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)AccountChooserModel* AutofillDialogControllerImpl:: 2667f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AccountChooserModelForTesting() { 2668a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return account_chooser_model_.get(); 26691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 26701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2671f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool AutofillDialogControllerImpl::IsSignInContinueUrl( 2672f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GURL& url, 2673f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) size_t* user_index) const { 2674f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return wallet::IsSignInContinueUrl(url, user_index); 26751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 26761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)AutofillDialogControllerImpl::AutofillDialogControllerImpl( 2678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::WebContents* contents, 2679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const FormData& form_structure, 2680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL& source_url, 2681d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::Callback<void(const FormStructure*)>& callback) 2682bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch : WebContentsObserver(contents), 2683bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch profile_(Profile::FromBrowserContext(contents->GetBrowserContext())), 2684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) initial_user_state_(AutofillMetrics::DIALOG_USER_STATE_UNKNOWN), 268558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) form_structure_(form_structure), 2686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) invoked_from_same_origin_(true), 2687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_url_(source_url), 2688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback_(callback), 26894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallet_client_(profile_->GetRequestContext(), this, source_url), 26900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) wallet_items_requested_(false), 26910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) handling_use_wallet_link_click_(false), 2692f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) passive_failed_(false), 26935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) billing_country_combobox_model_(*GetManager()), 26945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shipping_country_combobox_model_(*GetManager()), 2695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_cc_(this), 2696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_billing_(this), 2697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_cc_billing_(this), 2698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_shipping_(this), 2699868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) cares_about_shipping_(true), 27005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) popup_input_type_(UNKNOWN_TYPE), 27014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) waiting_for_explicit_sign_in_response_(false), 270290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) has_accepted_legal_documents_(false), 2703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_submitting_(false), 2704868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) choose_another_instrument_or_address_(false), 27057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) wallet_server_validation_recoverable_(true), 2706bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch data_was_passed_back_(false), 2707ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch was_ui_latency_logged_(false), 27085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) card_generated_animation_(2000, 60, this), 27095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) weak_ptr_factory_(this) { 2710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(estade): remove duplicates from |form_structure|? 2711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!callback_.is_null()); 2712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 27142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutofillDialogView* AutofillDialogControllerImpl::CreateView() { 27152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return AutofillDialogView::Create(this); 27162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 27172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2718a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)PersonalDataManager* AutofillDialogControllerImpl::GetManager() const { 27192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PersonalDataManagerFactory::GetForProfile(profile_); 27202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 27212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)AddressValidator* AutofillDialogControllerImpl::GetValidator() { 27235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return validator_.get(); 27245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 27255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const wallet::WalletClient* AutofillDialogControllerImpl::GetWalletClient() 2727f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const { 2728f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return const_cast<AutofillDialogControllerImpl*>(this)->GetWalletClient(); 2729f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2730f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 27312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)wallet::WalletClient* AutofillDialogControllerImpl::GetWalletClient() { 27322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &wallet_client_; 27332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 27342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::IsPayingWithWallet() const { 2736a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return account_chooser_model_->WalletIsSelected() && 2737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SignedInState() == SIGNED_IN; 27382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 27392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 274090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AutofillDialogControllerImpl::LoadRiskFingerprintData() { 274190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) risk_data_.clear(); 274290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 274390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint64 obfuscated_gaia_id = 0; 2744a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool success = base::StringToUint64(wallet_items_->ObfuscatedGaiaId(), 274590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &obfuscated_gaia_id); 274690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(success); 274790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 274890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect window_bounds; 274990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) window_bounds = GetBaseWindowForWebContents(web_contents())->GetBounds(); 275090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 275190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PrefService* user_prefs = profile_->GetPrefs(); 275290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string charset = user_prefs->GetString(::prefs::kDefaultCharset); 275390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string accept_languages = 275490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_prefs->GetString(::prefs::kAcceptLanguages); 275590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Time install_time = base::Time::FromTimeT( 275690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) g_browser_process->local_state()->GetInt64(::prefs::kInstallDate)); 275790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 275890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) risk::GetFingerprint( 275990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) obfuscated_gaia_id, window_bounds, *web_contents(), 276090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::VersionInfo().Version(), charset, accept_languages, install_time, 276158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) g_browser_process->GetApplicationLocale(), 276290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&AutofillDialogControllerImpl::OnDidLoadRiskFingerprintData, 276390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 276490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 276590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 276690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidLoadRiskFingerprintData( 276790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<risk::Fingerprint> fingerprint) { 276890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(AreLegalDocumentsCurrent()); 276990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 277090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string proto_data; 277190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fingerprint->SerializeToString(&proto_data); 2772a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Base64Encode(proto_data, &risk_data_); 277390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2774eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SubmitWithWallet(); 277590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 277690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::OpenTabWithUrl(const GURL& url) { 2778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::NavigateParams params( 2779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::FindBrowserWithWebContents(web_contents()), 2780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url, 2781f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::PAGE_TRANSITION_LINK); 2782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.disposition = NEW_FOREGROUND_TAB; 2783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::Navigate(¶ms); 27842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 27852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DialogSection AutofillDialogControllerImpl::ActiveBillingSection() const { 27875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return IsPayingWithWallet() ? SECTION_CC_BILLING : SECTION_BILLING; 27885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 27895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2790eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AutofillDialogControllerImpl::IsEditingExistingData( 2791eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DialogSection section) const { 2792eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return section_editing_state_.count(section) > 0; 2793eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 2794eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2795eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AutofillDialogControllerImpl::IsManuallyEditingSection( 2796eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DialogSection section) const { 2797eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return IsEditingExistingData(section) || 2798eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SuggestionsMenuModelForSection(section)-> 2799eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetItemKeyForCheckedItem() == kAddNewItemKey; 2800eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 2801eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2802868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void AutofillDialogControllerImpl::OnWalletSigninError() { 2803a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_->SetHadWalletSigninError(); 28045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetWalletClient()->CancelRequest(); 2805868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LogDialogLatencyToShow(); 2806868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 2807868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 28087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void AutofillDialogControllerImpl::DisableWallet( 28097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) wallet::WalletClient::ErrorType error_type) { 2810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) signin_helper_.reset(); 2811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wallet_items_.reset(); 28127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) wallet_errors_.clear(); 28135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetWalletClient()->CancelRequest(); 2814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetIsSubmitting(false); 281558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) wallet_error_notification_ = GetWalletError(error_type); 2816a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_->SetHadWalletError(); 28172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 28182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::SuggestionsUpdated() { 28203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 28213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2822f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const FieldValueMap snapshot = TakeUserInputSnapshot(); 2823eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 28242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_cc_.Reset(); 28252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_billing_.Reset(); 28262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_cc_billing_.Reset(); 28272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_shipping_.Reset(); 2828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HidePopup(); 2829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_shipping_.AddKeyedItem( 2831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kSameAsBillingKey, 2832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_USE_BILLING_FOR_SHIPPING)); 28332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsPayingWithWallet()) { 2835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::vector<wallet::Address*>& addresses = 2836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wallet_items_->addresses(); 28375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 28385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool shipping_same_as_billing = profile_->GetPrefs()->GetBoolean( 28395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ::prefs::kAutofillDialogWalletShippingSameAsBilling); 28405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 28415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (shipping_same_as_billing) 28425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) suggested_shipping_.SetCheckedItem(kSameAsBillingKey); 28435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < addresses.size(); ++i) { 2845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string key = base::IntToString(i); 284658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) suggested_shipping_.AddKeyedItemWithMinorText( 2847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) key, 2848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) addresses[i]->DisplayName(), 2849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) addresses[i]->DisplayNameDetail()); 2850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 28515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(scr): Move this assignment outside the loop or comment why it 28525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // can't be there. 285358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const std::string default_shipping_address_id = 285458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetIdToSelect(wallet_items_->default_address_id(), 285558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previous_default_shipping_address_id_, 285658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previously_selected_shipping_address_id_); 28575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 28585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!shipping_same_as_billing && 28595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) addresses[i]->object_id() == default_shipping_address_id) { 2860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_shipping_.SetCheckedItem(key); 28615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 28632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!IsSubmitPausedOn(wallet::VERIFY_CVV)) { 28652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<wallet::WalletItems::MaskedInstrument*>& instruments = 28662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallet_items_->instruments(); 286790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string first_active_instrument_key; 286890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string default_instrument_key; 28692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < instruments.size(); ++i) { 287090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool allowed = IsInstrumentAllowed(*instruments[i]); 287190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Image icon = instruments[i]->CardIcon(); 287290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!allowed && !icon.IsEmpty()) { 287390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Create a grayed disabled icon. 287490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SkBitmap disabled_bitmap = SkBitmapOperations::CreateHSLShiftedBitmap( 287590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) *icon.ToSkBitmap(), kGrayImageShift); 287690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) icon = gfx::Image( 287790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::ImageSkia::CreateFrom1xBitmap(disabled_bitmap)); 287890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 2879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string key = base::IntToString(i); 288058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) suggested_cc_billing_.AddKeyedItemWithMinorTextAndIcon( 2881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) key, 28822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instruments[i]->DisplayName(), 28832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instruments[i]->DisplayNameDetail(), 288490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) icon); 288590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_cc_billing_.SetEnabled(key, allowed); 288690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 288790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (allowed) { 288890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (first_active_instrument_key.empty()) 288990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) first_active_instrument_key = key; 289058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 289158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const std::string default_instrument_id = 289258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetIdToSelect(wallet_items_->default_instrument_id(), 289358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previous_default_instrument_id_, 289458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previously_selected_instrument_id_); 289558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch if (instruments[i]->object_id() == default_instrument_id) 289690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) default_instrument_key = key; 2897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 28982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 28992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_cc_billing_.AddKeyedItem( 2901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kAddNewItemKey, 2902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_ADD_BILLING_DETAILS)); 290390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!wallet_items_->HasRequiredAction(wallet::SETUP_WALLET)) { 290458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) suggested_cc_billing_.AddKeyedItemWithMinorText( 290590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kManageItemsKey, 290690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) l10n_util::GetStringUTF16( 29077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDS_AUTOFILL_DIALOG_MANAGE_BILLING_DETAILS), 29085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(wallet::GetManageInstrumentsUrl(0U).host())); 290990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 291090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 291190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Determine which instrument item should be selected. 291290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!default_instrument_key.empty()) 291390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_cc_billing_.SetCheckedItem(default_instrument_key); 291490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) else if (!first_active_instrument_key.empty()) 291590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_cc_billing_.SetCheckedItem(first_active_instrument_key); 291690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) else 291790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_cc_billing_.SetCheckedItem(kAddNewItemKey); 2918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 29192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 29202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PersonalDataManager* manager = GetManager(); 2921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::vector<CreditCard*>& cards = manager->GetCreditCards(); 29222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 29232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < cards.size(); ++i) { 29245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!i18ninput::CardHasCompleteAndVerifiedData(*cards[i])) 292590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) continue; 292690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 29272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_cc_.AddKeyedItemWithIcon( 29282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cards[i]->guid(), 29292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cards[i]->Label(), 29307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) rb.GetImageNamed(CreditCard::IconResourceId(cards[i]->type()))); 29312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<AutofillProfile*>& profiles = manager->GetProfiles(); 2934f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<base::string16> labels; 2935f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AutofillProfile::CreateDifferentiatingLabels(profiles, &labels); 2936f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK_EQ(labels.size(), profiles.size()); 29372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < profiles.size(); ++i) { 293858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const AutofillProfile& profile = *profiles[i]; 29395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!i18ninput::AddressHasCompleteAndVerifiedData(profile) || 29405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (!i18ninput::Enabled() && HasInvalidAddress(*profiles[i]))) { 29412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 2942eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 29432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 294458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Don't add variants for addresses: name is part of credit card and we'll 294558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // just ignore email and phone number variants. 2946f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) suggested_shipping_.AddKeyedItem(profile.guid(), labels[i]); 294758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!profile.GetRawInfo(EMAIL_ADDRESS).empty() && 294858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) !profile.IsPresentButInvalid(EMAIL_ADDRESS)) { 2949f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) suggested_billing_.AddKeyedItem(profile.guid(), labels[i]); 29502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_cc_.AddKeyedItem( 2954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kAddNewItemKey, 29552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_ADD_CREDIT_CARD)); 2956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_cc_.AddKeyedItem( 2957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kManageItemsKey, 2958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_MANAGE_CREDIT_CARD)); 29592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_billing_.AddKeyedItem( 2960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kAddNewItemKey, 29612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_ADD_BILLING_ADDRESS)); 2962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_billing_.AddKeyedItem( 2963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kManageItemsKey, 2964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_MANAGE_BILLING_ADDRESS)); 29652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_shipping_.AddKeyedItem( 2968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kAddNewItemKey, 29692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_ADD_SHIPPING_ADDRESS)); 29707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!IsPayingWithWallet()) { 297190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_shipping_.AddKeyedItem( 297290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kManageItemsKey, 297390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_MANAGE_SHIPPING_ADDRESS)); 29747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else if (!wallet_items_->HasRequiredAction(wallet::SETUP_WALLET)) { 297558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) suggested_shipping_.AddKeyedItemWithMinorText( 29767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch kManageItemsKey, 29777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_MANAGE_SHIPPING_ADDRESS), 29785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(wallet::GetManageAddressesUrl(0U).host())); 297990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 2980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!IsPayingWithWallet()) { 298290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 298390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DialogSection section = static_cast<DialogSection>(i); 298490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!SectionIsActive(section)) 298590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) continue; 298690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 298790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Set the starting choice for the menu. First set to the default in case 298890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // the GUID saved in prefs refers to a profile that no longer exists. 298990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string guid; 2990d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetDefaultAutofillChoice(section, &guid); 299190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 2992d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) model->SetCheckedItem(guid); 2993d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (GetAutofillChoice(section, &guid)) 2994d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) model->SetCheckedItem(guid); 299590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 2996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (view_) 2999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->ModelChanged(); 3000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3001eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 3002eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ResetSectionInput(static_cast<DialogSection>(i)); 3003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3004eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 30055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FieldValueMap::const_iterator billing_it = 30065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) snapshot.find(ADDRESS_BILLING_COUNTRY); 30075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (billing_it != snapshot.end()) 30085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RebuildInputsForCountry(ActiveBillingSection(), billing_it->second, true); 30095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 30105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FieldValueMap::const_iterator shipping_it = 30115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) snapshot.find(ADDRESS_HOME_COUNTRY); 30125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (shipping_it != snapshot.end()) 30135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RebuildInputsForCountry(SECTION_SHIPPING, shipping_it->second, true); 30145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3015eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RestoreUserInputFromSnapshot(snapshot); 3016eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3017eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 3018eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DialogSection section = static_cast<DialogSection>(i); 30194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!SectionIsActive(section)) 30204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) continue; 30214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3022eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ShowEditUiIfBadSuggestion(section); 3023eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateSection(section); 3024eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 3025eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3026eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateForErrors(); 30272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::FillOutputForSectionWithComparator( 30302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialogSection section, 30315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const FormStructure::InputFieldComparator& compare) { 30322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!SectionIsActive(section)) 30332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 30342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DetailInputs inputs; 30365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string country_code = CountryCodeForSection(section); 30375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) common::BuildInputsForSection(section, country_code, &inputs); 30385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<ServerFieldType> types = common::TypesFromInputs(inputs); 30395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 30402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section); 30412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (wrapper) { 30422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only fill in data that is associated with this section. 30435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) wrapper->FillFormStructure(types, compare, &form_structure_); 30442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // CVC needs special-casing because the CreditCard class doesn't store or 30462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // handle them. This isn't necessary when filling the combined CC and 30472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // billing section as CVC comes from |full_wallet_| in this case. 30482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (section == SECTION_CC) 304958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SetOutputForFieldsOfType(CREDIT_CARD_VERIFICATION_CODE, view_->GetCvc()); 305058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 305158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // When filling from Wallet data, use the email address associated with the 305258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // account. There is no other email address stored as part of a Wallet 305358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // address. 305458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (section == SECTION_CC_BILLING) { 305558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SetOutputForFieldsOfType( 3056a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EMAIL_ADDRESS, account_chooser_model_->GetActiveWalletAccountName()); 305758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 30582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 30592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The user manually input data. If using Autofill, save the info as new or 30602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // edited data. Always fill local data into |form_structure_|. 3061f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldValueMap output; 30622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->GetUserInput(section, &output); 30632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (section == SECTION_CC) { 30652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreditCard card; 30662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillFormGroupFromOutputs(output, &card); 30672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The card holder name comes from the billing address section. 30697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch card.SetRawInfo(CREDIT_CARD_NAME, 30704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GetValueFromSection(SECTION_BILLING, NAME_BILLING_FULL)); 30717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 30727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (ShouldSaveDetailsLocally()) { 30735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only save new profiles as verified if validation rules are loaded. 30745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) card.set_origin(RulesAreLoaded(section) ? 30755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kAutofillDialogOrigin : source_url_.GetOrigin().spec()); 30765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3077d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string guid = GetManager()->SaveImportedCreditCard(card); 3078d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) newly_saved_data_model_guids_[section] = guid; 30797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(!profile()->IsOffTheRecord()); 30807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch newly_saved_card_.reset(new CreditCard(card)); 30817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 30822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3083868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AutofillCreditCardWrapper card_wrapper(&card); 30845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) card_wrapper.FillFormStructure(types, compare, &form_structure_); 30852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Again, CVC needs special-casing. Fill it in directly from |output|. 308758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SetOutputForFieldsOfType( 308858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CREDIT_CARD_VERIFICATION_CODE, 3089f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) output[CREDIT_CARD_VERIFICATION_CODE]); 30902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 30912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillProfile profile; 30922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillFormGroupFromOutputs(output, &profile); 30932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3094d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (ShouldSaveDetailsLocally()) { 30955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile.set_origin(RulesAreLoaded(section) ? 30965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kAutofillDialogOrigin : source_url_.GetOrigin().spec()); 30975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3098d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string guid = GetManager()->SaveImportedProfile(profile); 3099d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) newly_saved_data_model_guids_[section] = guid; 3100d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 31012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) AutofillProfileWrapper profile_wrapper(&profile); 31035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile_wrapper.FillFormStructure(types, compare, &form_structure_); 31042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 31052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 31062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::FillOutputForSection(DialogSection section) { 31097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FillOutputForSectionWithComparator( 31105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) section, base::Bind(common::ServerTypeMatchesField, section)); 31112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool AutofillDialogControllerImpl::FormStructureCaresAboutSection( 3114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DialogSection section) const { 3115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // For now, only SECTION_SHIPPING may be omitted due to a site not asking for 3116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // any of the fields. 3117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (section == SECTION_SHIPPING) 3118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return cares_about_shipping_; 3119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 31212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::SetOutputForFieldsOfType( 312458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ServerFieldType type, 312558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const base::string16& output) { 31262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < form_structure_.field_count(); ++i) { 31272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillField* field = form_structure_.field(i); 312858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (field->Type().GetStorableType() == type) 312958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) field->value = output; 31302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 31312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::GetValueFromSection( 313490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DialogSection section, 31353240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ServerFieldType type) { 313690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(SectionIsActive(section)); 313790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 313890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section); 313990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (wrapper) 31403240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return wrapper->GetInfo(AutofillType(type)); 3141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldValueMap output; 314390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) view_->GetUserInput(section, &output); 3144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return output[type]; 314590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 314690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 31472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SuggestionsMenuModel* AutofillDialogControllerImpl:: 31482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SuggestionsMenuModelForSection(DialogSection section) { 31492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (section) { 31502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_CC: 31512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &suggested_cc_; 31522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_BILLING: 31532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &suggested_billing_; 31542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_SHIPPING: 31552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &suggested_shipping_; 31562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_CC_BILLING: 31572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &suggested_cc_billing_; 31582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 31592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 31612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 31622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const SuggestionsMenuModel* AutofillDialogControllerImpl:: 3165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionsMenuModelForSection(DialogSection section) const { 3166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return const_cast<AutofillDialogControllerImpl*>(this)-> 3167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionsMenuModelForSection(section); 3168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 31702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DialogSection AutofillDialogControllerImpl::SectionForSuggestionsMenuModel( 31712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SuggestionsMenuModel& model) { 31722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (&model == &suggested_cc_) 31732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SECTION_CC; 31742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (&model == &suggested_billing_) 31762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SECTION_BILLING; 31772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (&model == &suggested_cc_billing_) 31792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SECTION_CC_BILLING; 31802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(&model, &suggested_shipping_); 31822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SECTION_SHIPPING; 31832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)CountryComboboxModel* AutofillDialogControllerImpl:: 31865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CountryComboboxModelForSection(DialogSection section) { 31875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (section == SECTION_BILLING) 31885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return &billing_country_combobox_model_; 31895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 31905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (section == SECTION_SHIPPING) 31915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return &shipping_country_combobox_model_; 31925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 31935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 31945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 31955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 31962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DetailInputs* AutofillDialogControllerImpl::MutableRequestedFieldsForSection( 31972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialogSection section) { 31982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return const_cast<DetailInputs*>(&RequestedFieldsForSection(section)); 31992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 32002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::vector<ServerFieldType> AutofillDialogControllerImpl:: 32025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RequestedTypesForSection(DialogSection section) const { 32035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return common::TypesFromInputs(RequestedFieldsForSection(section)); 32045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 32055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string AutofillDialogControllerImpl::CountryCodeForSection( 32075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DialogSection section) { 32085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 country; 32095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section); 32115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (wrapper) { 32125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) country = wrapper->GetInfo(AutofillType(CountryTypeForSection(section))); 32135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 32145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FieldValueMap outputs; 32155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) view_->GetUserInput(section, &outputs); 32165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) country = outputs[CountryTypeForSection(section)]; 32175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 32185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return AutofillCountry::GetCountryCode( 32205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) country, g_browser_process->GetApplicationLocale()); 32215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 32225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool AutofillDialogControllerImpl::RebuildInputsForCountry( 32245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DialogSection section, 32255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& country_name, 32265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool should_clobber) { 32275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_NE(SECTION_CC, section); 32285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (view_ && !should_clobber) { 32305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FieldValueMap outputs; 32315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) view_->GetUserInput(section, &outputs); 32325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If |country_name| is the same as the view, no-op and let the caller know. 32345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (outputs[CountryTypeForSection(section)] == country_name) 32355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 32365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 32375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DetailInputs* inputs = MutableRequestedFieldsForSection(section); 32395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) inputs->clear(); 32405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string country_code = AutofillCountry::GetCountryCode( 32425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) country_name, g_browser_process->GetApplicationLocale()); 32435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) common::BuildInputsForSection(section, country_code, inputs); 32445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 32455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 32465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 32472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::HidePopup() { 3248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (popup_controller_.get()) 32492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_controller_->Hide(); 32505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) popup_input_type_ = UNKNOWN_TYPE; 32512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 32522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void AutofillDialogControllerImpl::SetEditingExistingData( 3254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DialogSection section, bool editing) { 3255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (editing) 3256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) section_editing_state_.insert(section); 3257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) else 3258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) section_editing_state_.erase(section); 3259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::IsASuggestionItemKey( 3262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& key) const { 3263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return !key.empty() && 3264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) key != kAddNewItemKey && 3265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) key != kManageItemsKey && 3266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) key != kSameAsBillingKey; 3267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 32682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::IsManuallyEditingAnySection() const { 3270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t section = SECTION_MIN; section <= SECTION_MAX; ++section) { 3271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsManuallyEditingSection(static_cast<DialogSection>(section))) 3272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 3273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 32742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 32752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 32762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::CreditCardNumberValidityMessage( 32787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::string16& number) const { 32797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!number.empty() && !autofill::IsValidCreditCardNumber(number)) { 32807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return l10n_util::GetStringUTF16( 32817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_NUMBER); 32827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 32837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 32841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::string16 message; 32851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (IsPayingWithWallet() && !wallet_items_->SupportsCard(number, &message)) 32861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return message; 32877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 32887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Card number is good and supported. 32897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return base::string16(); 32907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 32917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 32927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool AutofillDialogControllerImpl::AllSectionsAreValid() { 3293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t section = SECTION_MIN; section <= SECTION_MAX; ++section) { 3294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!SectionIsValid(static_cast<DialogSection>(section))) 3295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 3296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 3298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::SectionIsValid( 33017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogSection section) { 3302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!IsManuallyEditingSection(section)) 3303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 3304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldValueMap detail_outputs; 3306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->GetUserInput(section, &detail_outputs); 33074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return !InputsAreValid(section, detail_outputs).HasSureErrors(); 3308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 33105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool AutofillDialogControllerImpl::RulesAreLoaded(DialogSection section) { 33115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!i18ninput::Enabled()) 33125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 33135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddressData address_data; 33155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) address_data.country_code = CountryCodeForSection(section); 33165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddressValidator::Status status = GetValidator()->ValidateAddress( 33175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) address_data, AddressProblemFilter(), NULL); 33185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return status == AddressValidator::SUCCESS; 33195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 33205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3321868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool AutofillDialogControllerImpl::IsCreditCardExpirationValid( 3322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::string16& year, 3323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::string16& month) const { 3324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // If the expiration is in the past as per the local clock, it's invalid. 3325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Time now = base::Time::Now(); 3326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!autofill::IsValidCreditCardExpirationDate(year, month, now)) 3327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 3328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 33295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const wallet::WalletItems::MaskedInstrument* instrument = 33305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ActiveInstrument(); 33315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (instrument) { 3332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& locale = g_browser_process->GetApplicationLocale(); 3333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int month_int; 3334868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (base::StringToInt(month, &month_int) && 3335868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) instrument->status() == 3336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) wallet::WalletItems::MaskedInstrument::EXPIRED && 33373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch year == 33383240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch instrument->GetInfo( 33393240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch AutofillType(CREDIT_CARD_EXP_4_DIGIT_YEAR), locale) && 3340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) month_int == instrument->expiration_month()) { 3341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Otherwise, if the user is editing an instrument that's deemed expired 3342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // by the Online Wallet server, mark it invalid on selection. 3343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 3344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 3348868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3349868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldUseBillingForShipping() { 3351868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return SectionIsActive(SECTION_SHIPPING) && 3352868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) suggested_shipping_.GetItemKeyForCheckedItem() == kSameAsBillingKey; 3353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 33552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldSaveDetailsLocally() { 33562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // It's possible that the user checked [X] Save details locally before 33572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // switching payment methods, so only ask the view whether to save details 33582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // locally if that checkbox is showing (currently if not paying with wallet). 3359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Also, if the user isn't editing any sections, there's no data to save 3360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // locally. 3361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return ShouldOfferToSaveInChrome() && view_->SaveDetailsLocally(); 3362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::SetIsSubmitting(bool submitting) { 3365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_submitting_ = submitting; 3366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 336790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!submitting) 336890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) full_wallet_.reset(); 336990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (view_) { 33713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 3372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->UpdateButtonStrip(); 337358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) view_->UpdateOverlay(); 3374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->UpdateNotificationArea(); 3375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 33762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 33772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 337890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool AutofillDialogControllerImpl::AreLegalDocumentsCurrent() const { 337990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return has_accepted_legal_documents_ || 338090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) (wallet_items_ && wallet_items_->legal_documents().empty()); 338190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 338290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 33830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogControllerImpl::AcceptLegalTerms() { 338490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::BrowserThread::PostTask( 3385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::BrowserThread::IO, FROM_HERE, 3386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&UserDidOptIntoLocationServices)); 33870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PrefService* local_state = g_browser_process->local_state(); 33880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ListPrefUpdate accepted( 33890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) local_state, ::prefs::kAutofillDialogWalletLocationAcceptance); 33900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) accepted->AppendIfNotPresent(new base::StringValue( 3391a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_->GetActiveWalletAccountName())); 339290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3393d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (AreLegalDocumentsCurrent()) { 339490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LoadRiskFingerprintData(); 3395d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } else { 3396d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetWalletClient()->AcceptLegalDocuments( 3397d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) wallet_items_->legal_documents(), 33984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallet_items_->google_transaction_id()); 3399d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 3400eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 3401eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::SubmitWithWallet() { 3403eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch active_instrument_id_.clear(); 3404eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch active_address_id_.clear(); 3405eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch full_wallet_.reset(); 340690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const wallet::WalletItems::MaskedInstrument* active_instrument = 3408868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ActiveInstrument(); 3409a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!IsManuallyEditingSection(SECTION_CC_BILLING)) { 3410868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) active_instrument_id_ = active_instrument->object_id(); 3411a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DCHECK(!active_instrument_id_.empty()); 3412a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 34132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const wallet::Address* active_address = ActiveShippingAddress(); 3415a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!IsManuallyEditingSection(SECTION_SHIPPING) && 3416a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) !ShouldUseBillingForShipping() && 3417a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) IsShippingAddressRequired()) { 3418868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) active_address_id_ = active_address->object_id(); 3419a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DCHECK(!active_address_id_.empty()); 34202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 34212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3422a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_ptr<wallet::Instrument> inputted_instrument = 3423a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) CreateTransientInstrument(); 34242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3425a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_ptr<wallet::Address> inputted_address; 3426a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (active_address_id_.empty() && IsShippingAddressRequired()) { 3427a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (ShouldUseBillingForShipping()) { 342890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const wallet::Address& address = inputted_instrument ? 3429ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch *inputted_instrument->address() : active_instrument->address(); 343090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Try to find an exact matched shipping address and use it for shipping, 343190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // otherwise save it as a new shipping address. http://crbug.com/225442 343290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const wallet::Address* duplicated_address = 343390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) FindDuplicateAddress(wallet_items_->addresses(), address); 343490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (duplicated_address) { 343590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) active_address_id_ = duplicated_address->object_id(); 343690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!active_address_id_.empty()); 343790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 343890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) inputted_address.reset(new wallet::Address(address)); 343990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(inputted_address->object_id().empty()); 344090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 3441a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } else { 3442a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) inputted_address = CreateTransientAddress(); 34432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 34442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 34452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 344690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // If there's neither an address nor instrument to save, |GetFullWallet()| 344790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // is called when the risk fingerprint is loaded. 3448a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!active_instrument_id_.empty() && 3449a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) (!active_address_id_.empty() || !IsShippingAddressRequired())) { 3450eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetFullWallet(); 345190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 3452eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 345390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 34545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetWalletClient()->SaveToWallet( 34555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) inputted_instrument.Pass(), 34565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) inputted_address.Pass(), 34575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IsEditingExistingData(SECTION_CC_BILLING) ? active_instrument : NULL, 34585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IsEditingExistingData(SECTION_SHIPPING) ? active_address : NULL); 34592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 34602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3461a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)scoped_ptr<wallet::Instrument> AutofillDialogControllerImpl:: 3462a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) CreateTransientInstrument() { 3463a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!active_instrument_id_.empty()) 3464a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return scoped_ptr<wallet::Instrument>(); 3465a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 3466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldValueMap output; 3467a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) view_->GetUserInput(SECTION_CC_BILLING, &output); 3468a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 3469a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) CreditCard card; 3470a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) AutofillProfile profile; 3471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 cvc; 3472a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) GetBillingInfoFromOutputs(output, &card, &cvc, &profile); 34735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CanonicalizeState(validator_.get(), &profile); 3474a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 3475a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return scoped_ptr<wallet::Instrument>( 3476a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) new wallet::Instrument(card, cvc, profile)); 3477a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 3478a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 3479a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)scoped_ptr<wallet::Address>AutofillDialogControllerImpl:: 3480a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) CreateTransientAddress() { 3481a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // If not using billing for shipping, just scrape the view. 3482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldValueMap output; 3483a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) view_->GetUserInput(SECTION_SHIPPING, &output); 3484a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 3485a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) AutofillProfile profile; 3486a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FillFormGroupFromOutputs(output, &profile); 34875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CanonicalizeState(validator_.get(), &profile); 3488a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 3489a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return scoped_ptr<wallet::Address>(new wallet::Address(profile)); 3490a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 3491a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 34922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::GetFullWallet() { 3493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(is_submitting_); 34942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(IsPayingWithWallet()); 34952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(wallet_items_); 34962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!active_instrument_id_.empty()); 3497a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(!active_address_id_.empty() || !IsShippingAddressRequired()); 34982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<wallet::WalletClient::RiskCapability> capabilities; 3500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) capabilities.push_back(wallet::WalletClient::VERIFY_CVC); 3501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 35022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetWalletClient()->GetFullWallet(wallet::WalletClient::FullWalletRequest( 35032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_instrument_id_, 35042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_address_id_, 35052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallet_items_->google_transaction_id(), 35063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) capabilities, 35073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) wallet_items_->HasRequiredAction(wallet::SETUP_WALLET))); 35082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 35092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3510a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void AutofillDialogControllerImpl::HandleSaveOrUpdateRequiredActions( 3511a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const std::vector<wallet::RequiredAction>& required_actions) { 3512a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DCHECK(!required_actions.empty()); 3513a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 35144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(ahutter): Investigate if we need to support more generic actions on 35157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // this call such as GAIA_AUTH. See crbug.com/243457. 3516a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) for (std::vector<wallet::RequiredAction>::const_iterator iter = 3517a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) required_actions.begin(); 3518a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) iter != required_actions.end(); ++iter) { 35197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (*iter != wallet::INVALID_FORM_FIELD) { 3520a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // TODO(dbeam): handle this more gracefully. 35217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DisableWallet(wallet::WalletClient::UNKNOWN_ERROR); 3522a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 3523a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 3524a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) SetIsSubmitting(false); 3525a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 3526a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 35272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::FinishSubmit() { 352858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (IsPayingWithWallet()) { 352958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ScopedViewUpdates updates(view_.get()); 353058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) view_->UpdateOverlay(); 353158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 353258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) card_generated_animation_.Start(); 353358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return; 353458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 353558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DoFinishSubmit(); 353658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 353758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 353858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::AnimationProgressed( 3539d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const gfx::Animation* animation) { 354058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK_EQ(animation, &card_generated_animation_); 354158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PushOverlayUpdate(); 354258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 354358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 354458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::AnimationEnded( 3545d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const gfx::Animation* animation) { 354658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK_EQ(animation, &card_generated_animation_); 354758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DoFinishSubmit(); 354858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 354958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 35505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AutofillDialogControllerImpl::OnAddressValidationRulesLoaded( 35515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& country_code, 35525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool success) { 35535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(dbeam): should we retry on failure? 35545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 35555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DialogSection section = static_cast<DialogSection>(i); 35565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!SectionIsActive(section) || !IsManuallyEditingSection(section)) 35575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) continue; 35585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 35595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (needs_validation_.count(section) && 35605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CountryCodeForSection(section) == country_code) { 35615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) view_->ValidateSection(section); 35625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) needs_validation_.erase(section); 35635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 35645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 35655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 35665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 356758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::DoFinishSubmit() { 35682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillOutputForSection(SECTION_CC); 35692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillOutputForSection(SECTION_BILLING); 35702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillOutputForSection(SECTION_CC_BILLING); 3571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 35722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ShouldUseBillingForShipping()) { 35732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillOutputForSectionWithComparator( 35742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SECTION_BILLING, 35755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(ServerTypeMatchesShippingField)); 35762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillOutputForSectionWithComparator( 35772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SECTION_CC, 35785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(ServerTypeMatchesShippingField)); 3579a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FillOutputForSectionWithComparator( 3580a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) SECTION_CC_BILLING, 35815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(ServerTypeMatchesShippingField)); 35822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 35832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillOutputForSection(SECTION_SHIPPING); 35842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 35852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (IsPayingWithWallet()) { 35875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (SectionIsActive(SECTION_SHIPPING)) { 35885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile_->GetPrefs()->SetBoolean( 35895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ::prefs::kAutofillDialogWalletShippingSameAsBilling, 35905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) suggested_shipping_.GetItemKeyForCheckedItem() == kSameAsBillingKey); 35915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 35925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 359390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 359490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DialogSection section = static_cast<DialogSection>(i); 359590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!SectionIsActive(section)) 359690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) continue; 359790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 359890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 359990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string item_key = model->GetItemKeyForCheckedItem(); 360090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (IsASuggestionItemKey(item_key) || item_key == kSameAsBillingKey) { 3601d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PersistAutofillChoice(section, item_key); 3602d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } else if (item_key == kAddNewItemKey && ShouldSaveDetailsLocally()) { 3603d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(newly_saved_data_model_guids_.count(section)); 3604d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PersistAutofillChoice(section, newly_saved_data_model_guids_[section]); 360590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 360690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 360758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 360858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) profile_->GetPrefs()->SetBoolean(::prefs::kAutofillDialogSaveData, 360958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) view_->SaveDetailsLocally()); 361090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 361190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3612868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // On a successful submit, if the user manually selected "pay without wallet", 3613868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // stop trying to pay with Wallet on future runs of the dialog. On the other 3614868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // hand, if there was an error that prevented the user from having the choice 3615868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // of using Wallet, leave the pref alone. 361658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!wallet_error_notification_ && 3617a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_->HasAccountsToChoose()) { 3618868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) profile_->GetPrefs()->SetBoolean( 3619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ::prefs::kAutofillDialogPayWithoutWallet, 3620a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !account_chooser_model_->WalletIsSelected()); 3621868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3622868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LogOnFinishSubmitMetrics(); 3624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3625868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Callback should be called as late as possible. 3626d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) callback_.Run(&form_structure_); 3627bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch data_was_passed_back_ = true; 3628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3629868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // This might delete us. 363058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Hide(); 36312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 36322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 363390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AutofillDialogControllerImpl::PersistAutofillChoice( 363490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DialogSection section, 3635d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::string& guid) { 363690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!IsPayingWithWallet()); 363790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue()); 363890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) value->SetString(kGuidPrefKey, guid); 363990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 364090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DictionaryPrefUpdate updater(profile()->GetPrefs(), 364190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ::prefs::kAutofillDialogAutofillDefault); 364290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::DictionaryValue* autofill_choice = updater.Get(); 364390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) autofill_choice->Set(SectionToPrefString(section), value.release()); 364490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 364590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 364690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AutofillDialogControllerImpl::GetDefaultAutofillChoice( 364790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DialogSection section, 3648d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string* guid) { 364990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!IsPayingWithWallet()); 365090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The default choice is the first thing in the menu that is a suggestion 365190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // item. 365290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 365390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (int i = 0; i < model->GetItemCount(); ++i) { 365490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (IsASuggestionItemKey(model->GetItemKeyAt(i))) { 365590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) *guid = model->GetItemKeyAt(i); 365690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 365790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 365890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 365990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 366090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 366190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool AutofillDialogControllerImpl::GetAutofillChoice(DialogSection section, 3662d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string* guid) { 366390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!IsPayingWithWallet()); 366490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const base::DictionaryValue* choices = profile()->GetPrefs()->GetDictionary( 366590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ::prefs::kAutofillDialogAutofillDefault); 366690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!choices) 366790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 366890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 366990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const base::DictionaryValue* choice = NULL; 367090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!choices->GetDictionary(SectionToPrefString(section), &choice)) 367190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 367290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 367390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) choice->GetString(kGuidPrefKey, guid); 367490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return true; 367590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 367690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LogOnFinishSubmitMetrics() { 3678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetMetricLogger().LogDialogUiDuration( 3679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time::Now() - dialog_shown_timestamp_, 3680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillMetrics::DIALOG_ACCEPTED); 3681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 368258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_ACCEPTED); 3683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillMetrics::DialogDismissalState dismissal_state; 3685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!IsManuallyEditingAnySection()) 3686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dismissal_state = AutofillMetrics::DIALOG_ACCEPTED_EXISTING_DATA; 3687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else if (IsPayingWithWallet()) 3688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dismissal_state = AutofillMetrics::DIALOG_ACCEPTED_SAVE_TO_WALLET; 3689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else if (ShouldSaveDetailsLocally()) 3690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dismissal_state = AutofillMetrics::DIALOG_ACCEPTED_SAVE_TO_AUTOFILL; 3691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 3692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dismissal_state = AutofillMetrics::DIALOG_ACCEPTED_NO_SAVE; 3693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 369458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogDismissalState(dismissal_state); 3695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LogOnCancelMetrics() { 369858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_CANCELED); 3699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillMetrics::DialogDismissalState dismissal_state; 3701f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (ShouldShowSignInWebView()) 37027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch dismissal_state = AutofillMetrics::DIALOG_CANCELED_DURING_SIGNIN; 37037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch else if (!IsManuallyEditingAnySection()) 3704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dismissal_state = AutofillMetrics::DIALOG_CANCELED_NO_EDITS; 3705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else if (AllSectionsAreValid()) 3706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dismissal_state = AutofillMetrics::DIALOG_CANCELED_NO_INVALID_FIELDS; 3707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 3708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dismissal_state = AutofillMetrics::DIALOG_CANCELED_WITH_INVALID_FIELDS; 3709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 371058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogDismissalState(dismissal_state); 3711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetMetricLogger().LogDialogUiDuration( 3713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time::Now() - dialog_shown_timestamp_, 3714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillMetrics::DIALOG_CANCELED); 3715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LogSuggestionItemSelectedMetric( 3718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const SuggestionsMenuModel& model) { 3719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DialogSection section = SectionForSuggestionsMenuModel(model); 3720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillMetrics::DialogUiEvent dialog_ui_event; 3722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (model.GetItemKeyForCheckedItem() == kAddNewItemKey) { 3723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Selected to add a new item. 3724ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch dialog_ui_event = common::DialogSectionToUiItemAddedEvent(section); 3725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (IsASuggestionItemKey(model.GetItemKeyForCheckedItem())) { 3726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Selected an existing item. 3727ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch dialog_ui_event = common::DialogSectionToUiSelectionChangedEvent(section); 3728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 3729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(estade): add logging for "Manage items" or "Use billing for 3730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // shipping"? 3731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 3732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 373458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogUiEvent(dialog_ui_event); 3735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LogDialogLatencyToShow() { 3738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (was_ui_latency_logged_) 3739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 3740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetMetricLogger().LogDialogLatencyToShow( 3742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time::Now() - dialog_shown_timestamp_); 3743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) was_ui_latency_logged_ = true; 3744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 37462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutofillMetrics::DialogInitialUserStateMetric 37472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillDialogControllerImpl::GetInitialUserState() const { 37482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Consider a user to be an Autofill user if the user has any credit cards 3749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // or addresses saved. Check that the item count is greater than 2 because 3750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // an "empty" menu still has the "add new" menu item and "manage" menu item. 37512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const bool has_autofill_profiles = 3752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_cc_.GetItemCount() > 2 || 3753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_billing_.GetItemCount() > 2; 37542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 37552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (SignedInState() != SIGNED_IN) { 37562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Not signed in. 37572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return has_autofill_profiles ? 37582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::DIALOG_USER_NOT_SIGNED_IN_HAS_AUTOFILL : 37592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::DIALOG_USER_NOT_SIGNED_IN_NO_AUTOFILL; 37602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 37612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 37622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Signed in. 37632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (wallet_items_->instruments().empty()) { 37642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No Wallet items. 37652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return has_autofill_profiles ? 37662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::DIALOG_USER_SIGNED_IN_NO_WALLET_HAS_AUTOFILL : 37672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::DIALOG_USER_SIGNED_IN_NO_WALLET_NO_AUTOFILL; 37682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 37692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 37702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Has Wallet items. 37712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return has_autofill_profiles ? 37722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::DIALOG_USER_SIGNED_IN_HAS_WALLET_HAS_AUTOFILL : 37732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::DIALOG_USER_SIGNED_IN_HAS_WALLET_NO_AUTOFILL; 37742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 37752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 37767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AutofillDialogControllerImpl::MaybeShowCreditCardBubble() { 3777bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!data_was_passed_back_) 3778bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return; 3779bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 37807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (newly_saved_card_) { 3781ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<AutofillProfile> billing_profile; 3782ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (IsManuallyEditingSection(SECTION_BILLING)) { 3783ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Scrape the view as the user's entering or updating information. 3784f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldValueMap outputs; 3785ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch view_->GetUserInput(SECTION_BILLING, &outputs); 3786ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch billing_profile.reset(new AutofillProfile); 3787ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FillFormGroupFromOutputs(outputs, billing_profile.get()); 3788ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } else { 3789ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Just snag the currently suggested profile. 3790ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string item_key = SuggestionsMenuModelForSection(SECTION_BILLING)-> 3791ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetItemKeyForCheckedItem(); 3792ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillProfile* profile = GetManager()->GetProfileByGUID(item_key); 3793ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch billing_profile.reset(new AutofillProfile(*profile)); 3794ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 3795ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 3796ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ShowNewCreditCardBubble(newly_saved_card_.Pass(), 3797ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch billing_profile.Pass()); 37987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 37997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 38007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3801a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!full_wallet_ || !full_wallet_->billing_address()) 3802a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 3803a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3804ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GeneratedCreditCardBubbleController::Show( 3805ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch web_contents(), 3806424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) full_wallet_->TypeAndLastFourDigits(), 38078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) backing_card_last_four_); 38087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 38097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 381058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::OnSubmitButtonDelayEnd() { 381158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!view_) 381258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return; 381358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ScopedViewUpdates updates(view_.get()); 381458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) view_->UpdateButtonStrip(); 381558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 381658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3817f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AutofillDialogControllerImpl::FetchWalletCookie() { 38184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::URLRequestContextGetter* request_context = profile_->GetRequestContext(); 38194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) signin_helper_.reset(new wallet::WalletSigninHelper(this, request_context)); 38204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) signin_helper_->StartWalletCookieValueFetch(); 38214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 38224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 38232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace autofill 3824