autofill_dialog_controller_impl.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/autofill/autofill_dialog_controller_impl.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm> 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <map> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "apps/shell_window.h" 12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "apps/shell_window_registry.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "apps/ui/native_app_window.h" 1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/base64.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/i18n/case_conversion.h" 177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/i18n/rtl.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/prefs/pref_registry_simple.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h" 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/rand_util.h" 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h" 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h" 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/autofill/personal_data_manager_factory.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/browser_process.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/autofill/autofill_dialog_common.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/autofill/autofill_dialog_view.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/autofill/data_model_wrapper.h" 34ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if !defined(OS_ANDROID) 35ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/autofill/generated_credit_card_bubble_controller.h" 36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/autofill/new_credit_card_bubble_controller.h" 37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h" 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_version_info.h" 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h" 44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/common/render_messages.h" 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/url_constants.h" 46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/risk/fingerprint.h" 47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/risk/proto/fingerprint.pb.h" 487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/content/browser/wallet/form_field_error.h" 49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/full_wallet.h" 50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/autofill/content/browser/wallet/gaia_account.h" 51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/instrument.h" 52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/wallet_address.h" 53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/wallet_items.h" 54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/wallet_service_url.h" 55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/wallet_signin_helper.h" 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_country.h" 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_data_model.h" 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_manager.h" 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_type.h" 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/personal_data_manager.h" 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/phone_number_i18n.h" 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/validation.h" 637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_data.h" 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/user_prefs/pref_registry_syncable.h" 6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/geolocation_provider.h" 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_controller.h" 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_details.h" 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_entry.h" 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_service.h" 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_types.h" 72ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/browser/render_view_host.h" 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h" 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_view.h" 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/url_constants.h" 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/chromium_strings.h" 777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "grit/component_strings.h" 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/generated_resources.h" 79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "grit/platform_locale_settings.h" 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/theme_resources.h" 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/webkit_resources.h" 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/cert_status_flags.h" 8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/base/base_window.h" 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/models/combobox_model.h" 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/canvas.h" 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/image/image_skia_operations.h" 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/skia_util.h" 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace autofill { 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kAddNewItemKey[] = "add-new-item"; 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kManageItemsKey[] = "manage-items"; 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kSameAsBillingKey[] = "same-as-billing"; 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// URLs for Wallet error messages. 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kBuyerLegalAddressStatusUrl[] = 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) "https://wallet.google.com/manage/settings"; 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kKnowYourCustomerStatusUrl[] = "https://wallet.google.com/kyc"; 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Keys for the kAutofillDialogAutofillDefault pref dictionary (do not change 10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// these values). 10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char kGuidPrefKey[] = "guid"; 10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This string is stored along with saved addresses and credit cards in the 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// WebDB, and hence should not be modified, so that it remains consistent over 11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// time. 11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char kAutofillDialogOrigin[] = "Chrome Autofill dialog"; 11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// HSL shift to gray out an image. 11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const color_utils::HSL kGrayImageShift = {-1, 0, 0.8}; 11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// Limit Wallet items refresh rate to at most once per minute. 11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int64 kWalletItemsRefreshRateSeconds = 60; 11958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// The number of milliseconds to delay enabling the submit button after showing 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// the dialog. This delay prevents users from accidentally clicking the submit 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// button on startup. 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const int kSubmitButtonDelayMs = 1000; 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// A helper class to make sure an AutofillDialogView knows when a series of 1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// updates is incoming. 1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class ScopedViewUpdates { 1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) explicit ScopedViewUpdates(AutofillDialogView* view) : view_(view) { 1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (view_) 1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) view_->UpdatesStarted(); 1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ~ScopedViewUpdates() { 1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (view_) 1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) view_->UpdatesFinished(); 1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private: 1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AutofillDialogView* view_; 1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedViewUpdates); 1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns true if |input| should be used to fill a site-requested |field| which 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is notated with a "shipping" tag, for use when the user has decided to use 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the billing address as the shipping address. 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DetailInputMatchesShippingField(const DetailInput& input, 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const AutofillField& field) { 150b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Equivalent billing field type is used to support UseBillingAsShipping 151b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // usecase. 1523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ServerFieldType field_type = 153bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch AutofillType::GetEquivalentBillingFieldType( 154bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch field.Type().GetStorableType()); 155b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return common::InputTypeMatchesFieldType(input, AutofillType(field_type)); 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Initializes |form_group| from user-entered data. 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void FillFormGroupFromOutputs(const FieldValueMap& detail_outputs, 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FormGroup* form_group) { 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (FieldValueMap::const_iterator iter = detail_outputs.begin(); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != detail_outputs.end(); ++iter) { 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ServerFieldType type = iter->first; 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!iter->second.empty()) { 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (type == ADDRESS_HOME_COUNTRY || type == ADDRESS_BILLING_COUNTRY) { 1673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch form_group->SetInfo(AutofillType(type), 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) iter->second, 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) g_browser_process->GetApplicationLocale()); 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 171424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) form_group->SetRawInfo( 172424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) AutofillType(type).GetStorableType(), iter->second); 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Get billing info from |output| and put it into |card|, |cvc|, and |profile|. 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These outparams are required because |card|/|profile| accept different types 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// of raw info, and CreditCard doesn't save CVCs. 181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void GetBillingInfoFromOutputs(const FieldValueMap& output, 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreditCard* card, 183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::string16* cvc, 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillProfile* profile) { 185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (FieldValueMap::const_iterator it = output.begin(); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != output.end(); ++it) { 187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const ServerFieldType type = it->first; 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::string16 trimmed; 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrimWhitespace(it->second, TRIM_ALL, &trimmed); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Special case CVC as CreditCard just swallows it. 192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (type == CREDIT_CARD_VERIFICATION_CODE) { 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (cvc) 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cvc->assign(trimmed); 195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else if (type == ADDRESS_HOME_COUNTRY || 196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) type == ADDRESS_BILLING_COUNTRY) { 1977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (profile) { 198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) profile->SetInfo(AutofillType(type), 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) trimmed, 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) g_browser_process->GetApplicationLocale()); 2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Copy the credit card name to |profile| in addition to |card| as 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // wallet::Instrument requires a recipient name for its billing address. 205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (card && type == NAME_FULL) 2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch card->SetRawInfo(CREDIT_CARD_NAME, trimmed); 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (common::IsCreditCardType(type)) { 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (card) 210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) card->SetRawInfo(type, trimmed); 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (profile) { 212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) profile->SetRawInfo(AutofillType(type).GetStorableType(), trimmed); 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Returns the containing window for the given |web_contents|. The containing 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// window might be a browser window for a Chrome tab, or it might be a shell 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// window for a platform app. 22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)ui::BaseWindow* GetBaseWindowForWebContents( 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::WebContents* web_contents) { 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* browser = chrome::FindBrowserWithWebContents(web_contents); 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (browser) 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return browser->window(); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeWindow native_window = 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetView()->GetTopLevelNativeWindow(); 229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch apps::ShellWindow* shell_window = 230ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch apps::ShellWindowRegistry:: 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetShellWindowForNativeWindowAnyProfile(native_window); 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return shell_window->GetBaseWindow(); 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Returns a string descriptor for a DialogSection, for use with prefs (do not 23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// change these values). 23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)std::string SectionToPrefString(DialogSection section) { 23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) switch (section) { 23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case SECTION_CC: 24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return "cc"; 24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case SECTION_BILLING: 24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return "billing"; 24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case SECTION_CC_BILLING: 24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The SECTION_CC_BILLING section isn't active when using Autofill. 24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NOTREACHED(); 24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return std::string(); 24990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case SECTION_SHIPPING: 25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return "shipping"; 25290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NOTREACHED(); 25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return std::string(); 25690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Check if a given MaskedInstrument is allowed for the purchase. 25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool IsInstrumentAllowed( 26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const wallet::WalletItems::MaskedInstrument& instrument) { 261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) switch (instrument.status()) { 262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case wallet::WalletItems::MaskedInstrument::VALID: 263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case wallet::WalletItems::MaskedInstrument::PENDING: 264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case wallet::WalletItems::MaskedInstrument::EXPIRED: 265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case wallet::WalletItems::MaskedInstrument::BILLING_INCOMPLETE: 266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) default: 268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Signals that the user has opted in to geolocation services. Factored out 27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// into a separate method because all interaction with the geolocation provider 27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// needs to happen on the IO thread, which is not the thread 2753240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch// AutofillDialogViewDelegate lives on. 27690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserDidOptIntoLocationServices() { 27790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::GeolocationProvider::GetInstance()->UserDidOptIntoLocationServices(); 27890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Returns whether |data_model| is complete, i.e. can fill out all the 28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// |requested_fields|, and verified, i.e. not just automatically aggregated. 28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Incomplete or unverifed data will not be displayed in the dropdown menu. 28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool HasCompleteAndVerifiedData(const AutofillDataModel& data_model, 28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const DetailInputs& requested_fields) { 28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!data_model.IsVerified()) 28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (size_t i = 0; i < requested_fields.size(); ++i) { 28958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ServerFieldType type = 29058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AutofillType(requested_fields[i].type).GetStorableType(); 29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (type != ADDRESS_HOME_LINE2 && 29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) type != CREDIT_CARD_VERIFICATION_CODE && 29358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) data_model.GetRawInfo(type).empty()) { 29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return true; 29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 30090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 301eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Returns true if |profile| has an invalid address, i.e. an invalid state, zip 30258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// code, phone number, or email address. Otherwise returns false. Profiles with 30358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// invalid addresses are not suggested in the dropdown menu for billing and 30458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// shipping addresses. 305eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool HasInvalidAddress(const AutofillProfile& profile) { 306eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return profile.IsPresentButInvalid(ADDRESS_HOME_STATE) || 307eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile.IsPresentButInvalid(ADDRESS_HOME_ZIP) || 308eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile.IsPresentButInvalid(PHONE_HOME_WHOLE_NUMBER); 309eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 310eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Loops through |addresses_| comparing to |address| ignoring ID. If a match 31290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// is not found, NULL is returned. 31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const wallet::Address* FindDuplicateAddress( 31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::vector<wallet::Address*>& addresses, 31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const wallet::Address& address) { 31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (size_t i = 0; i < addresses.size(); ++i) { 31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (addresses[i]->EqualsIgnoreID(address)) 31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return addresses[i]; 31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return NULL; 32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool IsCardHolderNameValidForWallet(const base::string16& name) { 32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::string16 whitespace_collapsed_name = CollapseWhitespace(name, true); 32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<base::string16> split_name; 32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::SplitString(whitespace_collapsed_name, ' ', &split_name); 32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return split_name.size() >= 2; 32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)DialogSection SectionFromLocation(wallet::FormFieldError::Location location) { 3317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) switch (location) { 3327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::FormFieldError::PAYMENT_INSTRUMENT: 3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::FormFieldError::LEGAL_ADDRESS: 3347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return SECTION_CC_BILLING; 3357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::FormFieldError::SHIPPING_ADDRESS: 3377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return SECTION_SHIPPING; 3387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::FormFieldError::UNKNOWN_LOCATION: 3407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NOTREACHED(); 3417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return SECTION_MAX; 3427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NOTREACHED(); 3457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return SECTION_MAX; 3467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 34858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)scoped_ptr<DialogNotification> GetWalletError( 34958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) wallet::WalletClient::ErrorType error_type) { 35058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::string16 text; 35158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GURL url; 35258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) switch (error_type) { 35458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case wallet::WalletClient::UNVERIFIED_KNOW_YOUR_CUSTOMER_STATUS: 35558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) text = l10n_util::GetStringUTF16( 35658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) IDS_AUTOFILL_WALLET_UNVERIFIED_KNOW_YOUR_CUSTOMER_STATUS); 35758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) url = GURL(kKnowYourCustomerStatusUrl); 35858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 3597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 360ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case wallet::WalletClient::BUYER_LEGAL_ADDRESS_NOT_SUPPORTED: 36158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) text = l10n_util::GetStringUTF16( 362ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch IDS_AUTOFILL_WALLET_BUYER_COUNTRY_NOT_SUPPORTED); 36358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) url = GURL(kBuyerLegalAddressStatusUrl); 36458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 365ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 36658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) default: 36758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The notification will not have a link; it's handled in the next 36858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // switch statement. 36958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 37058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 37158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 37258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!text.empty()) { 37358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<DialogNotification> notification(new DialogNotification( 37458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DialogNotification::WALLET_ERROR, 37558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) text)); 37658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) notification->set_link_url(url); 37758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return notification.Pass(); 37858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 37958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int error_ids = 0; 3814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int error_code = 0; 3824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 38358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (error_type) { 384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case wallet::WalletClient::UNSUPPORTED_MERCHANT: 3854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UNSUPPORTED_MERCHANT; 38658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 387ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 3887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::BAD_REQUEST: 3894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UPGRADE_CHROME_ERROR; 3904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 71; 39158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 392ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::INVALID_PARAMS: 3944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UPGRADE_CHROME_ERROR; 3954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 42; 39658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 397ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 39858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case wallet::WalletClient::BUYER_ACCOUNT_ERROR: 3994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_BUYER_ACCOUNT_ERROR; 4004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 12; 40158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 402ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 4037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::UNSUPPORTED_API_VERSION: 4044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UPGRADE_CHROME_ERROR; 4054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 43; 40658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 4077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::SERVICE_UNAVAILABLE: 4094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_SERVICE_UNAVAILABLE_ERROR; 4104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 61; 41158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 4127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::INTERNAL_ERROR: 4144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UNKNOWN_ERROR; 4154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 62; 41658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 417ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::MALFORMED_RESPONSE: 4194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UNKNOWN_ERROR; 4204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 72; 42158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 422ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::NETWORK_ERROR: 4244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UNKNOWN_ERROR; 4254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 73; 42658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 427ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::UNKNOWN_ERROR: 4294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UNKNOWN_ERROR; 4304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 74; 43158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 43258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 43358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) default: 43458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 4357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK_NE(0, error_ids); 43858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 43958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The other error types are strings of the form "XXX. You can pay without 44058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // wallet." 4414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<DialogNotification> notification(new DialogNotification( 44258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DialogNotification::WALLET_ERROR, 44358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) l10n_util::GetStringFUTF16(IDS_AUTOFILL_DIALOG_COMPLETE_WITHOUT_WALLET, 4444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) l10n_util::GetStringUTF16(error_ids)))); 4454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (error_code) { 4474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) notification->set_tooltip_text( 4484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) l10n_util::GetStringFUTF16(IDS_AUTOFILL_WALLET_ERROR_CODE_TOOLTIP, 4494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::IntToString16(error_code))); 4504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 4514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return notification.Pass(); 4537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 45558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Returns the ID of the address or instrument that should be selected in the 45658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// UI, given that the |default_id| is currently the default ID on the Wallet 45758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// server, |previous_default_id| was the default ID prior to re-fetching the 45858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Wallet data, and |previously_selected_id| was the ID of the item selected in 45958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// the dialog prior to re-fetching the Wallet data. 46058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)std::string GetIdToSelect(const std::string& default_id, 46158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& previous_default_id, 46258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& previously_selected_id) { 46358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // If the default ID changed since the last fetch of the Wallet data, select 46458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // it rather than the previously selected item, as the user's intention in 46558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // changing the default was probably to use it. 46658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (default_id != previous_default_id) 46758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return default_id; 46858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 46958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Otherwise, prefer the previously selected item, if there was one. 47058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return !previously_selected_id.empty() ? previously_selected_id : default_id; 47158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 47258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 47358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Generate a random card number in a user displayable format. 47458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)base::string16 GenerateRandomCardNumber() { 47558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string card_number; 47658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t i = 0; i < 4; ++i) { 47758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int part = base::RandInt(0, 10000); 47858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::StringAppendF(&card_number, "%04d ", part); 47958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 48058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return ASCIIToUTF16(card_number); 48158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 48258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 483d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)gfx::Image CreditCardIconForType(const std::string& credit_card_type) { 484d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const int input_card_idr = CreditCard::IconResourceId(credit_card_type); 485d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 486d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Image result = rb.GetImageNamed(input_card_idr); 487d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (input_card_idr == IDR_AUTOFILL_CC_GENERIC) { 488d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // When the credit card type is unknown, no image should be shown. However, 489d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // to simplify the view code on Mac, save space for the credit card image by 490d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // returning a transparent image of the appropriate size. 491d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) result = gfx::Image(gfx::ImageSkiaOperations::CreateTransparentImage( 492d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) result.AsImageSkia(), 0)); 493d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 494d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return result; 495d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 496d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 497d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)gfx::Image CvcIconForCreditCardType(const base::string16& credit_card_type) { 498d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 499d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (credit_card_type == l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_AMEX)) 500d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return rb.GetImageNamed(IDR_CREDIT_CARD_CVC_HINT_AMEX); 501d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 502d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return rb.GetImageNamed(IDR_CREDIT_CARD_CVC_HINT); 503d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 504d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5073240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochAutofillDialogViewDelegate::~AutofillDialogViewDelegate() {} 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutofillDialogControllerImpl::~AutofillDialogControllerImpl() { 5107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (popup_controller_) 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_controller_->Hide(); 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 51358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogInitialUserState(initial_user_state_); 514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::WeakPtr<AutofillDialogControllerImpl> 518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillDialogControllerImpl::Create( 519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::WebContents* contents, 520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const FormData& form_structure, 521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL& source_url, 522d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::Callback<void(const FormStructure*)>& callback) { 523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // AutofillDialogControllerImpl owns itself. 524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillDialogControllerImpl* autofill_dialog_controller = 525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new AutofillDialogControllerImpl(contents, 526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) form_structure, 527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_url, 528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback); 529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return autofill_dialog_controller->weak_ptr_factory_.GetWeakPtr(); 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 5330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogController::RegisterPrefs(PrefRegistrySimple* registry) { 5340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) registry->RegisterListPref(::prefs::kAutofillDialogWalletLocationAcceptance); 5350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 5360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 5370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// static 5380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogController::RegisterProfilePrefs( 539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable* registry) { 540868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) registry->RegisterBooleanPref( 541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ::prefs::kAutofillDialogPayWithoutWallet, 542868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) false, 543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 54490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) registry->RegisterDictionaryPref( 54590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ::prefs::kAutofillDialogAutofillDefault, 54690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 54758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) registry->RegisterBooleanPref( 54858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ::prefs::kAutofillDialogSaveData, 54958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) true, 55058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 553ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 554ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController> AutofillDialogController::Create( 555ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::WebContents* contents, 556ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FormData& form_structure, 557ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const GURL& source_url, 558d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::Callback<void(const FormStructure*)>& callback) { 559ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return AutofillDialogControllerImpl::Create(contents, 560ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch form_structure, 561ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch source_url, 562ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback); 563ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 564ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::Show() { 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_shown_timestamp_ = base::Time::Now(); 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 568f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The Autofill dialog is shown in response to a message from the renderer and 569f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // as such, it can only be made in the context of the current document. A call 570f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // to GetActiveEntry would return a pending entry, if there was one, which 571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // would be a security bug. Therefore, we use the last committed URL for the 572f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // access checks. 573f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GURL& current_url = web_contents()->GetLastCommittedURL(); 574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) invoked_from_same_origin_ = 575f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) current_url.GetOrigin() == source_url_.GetOrigin(); 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Log any relevant UI metrics and security exceptions. 57858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_SHOWN); 579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetMetricLogger().LogDialogSecurityMetric( 58158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AutofillMetrics::SECURITY_METRIC_DIALOG_SHOWN); 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 58368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Determine what field types should be included in the dialog. 58468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Note that RequestingCreditCardInfo() below relies on parsed field types. 58568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool has_types = false; 58668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool has_sections = false; 58768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) form_structure_.ParseFieldTypesFromAutocompleteAttributes( 58868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &has_types, &has_sections); 58968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (RequestingCreditCardInfo() && !TransmissionWillBeSecure()) { 591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetMetricLogger().LogDialogSecurityMetric( 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::SECURITY_METRIC_CREDIT_CARD_OVER_HTTP); 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!invoked_from_same_origin_) { 596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetMetricLogger().LogDialogSecurityMetric( 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::SECURITY_METRIC_CROSS_ORIGIN_FRAME); 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Fail if the author didn't specify autocomplete types. 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!has_types) { 602d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) callback_.Run(NULL); 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete this; 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 607ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch common::BuildInputsForSection(SECTION_CC, 608ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &requested_cc_fields_); 609ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch common::BuildInputsForSection(SECTION_BILLING, 610ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &requested_billing_fields_); 611ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch common::BuildInputsForSection(SECTION_CC_BILLING, 612ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &requested_cc_billing_fields_); 613ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch common::BuildInputsForSection(SECTION_SHIPPING, 614ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &requested_shipping_fields_); 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 616868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Test whether we need to show the shipping section. If filling that section 617868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // would be a no-op, don't show it. 618868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const DetailInputs& inputs = RequestedFieldsForSection(SECTION_SHIPPING); 619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EmptyDataModelWrapper empty_wrapper; 620868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) cares_about_shipping_ = empty_wrapper.FillFormStructure( 621868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) inputs, 622ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Bind(common::DetailInputMatchesField, SECTION_SHIPPING), 623868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &form_structure_); 624868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 625a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_.reset( 626a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new AccountChooserModel(this, 627a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) profile_, 628a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !ShouldShowAccountChooser(), 629a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) metric_logger_)); 63058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 631a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (account_chooser_model_->WalletIsSelected()) 632f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FetchWalletCookie(); 633f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(estade): don't show the dialog if the site didn't specify the right 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // fields. First we must figure out what the "right" fields are. 636a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SuggestionsUpdated(); 637a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SubmitButtonDelayBegin(); 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_.reset(CreateView()); 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->Show(); 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetManager()->AddObserver(this); 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!account_chooser_model_->WalletIsSelected()) 6437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LogDialogLatencyToShow(); 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::Hide() { 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_) 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->Hide(); 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 65158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid AutofillDialogControllerImpl::TabActivated() { 65258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // If the user switched away from this tab and then switched back, reload the 65358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // Wallet items, in case they've changed. 65468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int64 seconds_elapsed_since_last_refresh = 65558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch (base::TimeTicks::Now() - last_wallet_items_fetch_timestamp_).InSeconds(); 65658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch if (IsPayingWithWallet() && wallet_items_ && 65758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch seconds_elapsed_since_last_refresh >= kWalletItemsRefreshRateSeconds) { 65858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch GetWalletItems(); 65958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch } 66058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} 66158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 662eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTestableAutofillDialogView* AutofillDialogControllerImpl::GetTestableView() { 663eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return view_ ? view_->GetTestableView() : NULL; 664eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 665eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 66658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 66758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// AutofillDialogViewDelegate implementation. 668eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 669a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::DialogTitle() const { 67058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (ShouldShowSpinner()) 671a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return base::string16(); 6723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 67358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_TITLE); 674eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 675eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 676a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::AccountChooserText() const { 677a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!account_chooser_model_->WalletIsSelected()) 67858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PAYING_WITHOUT_WALLET); 679eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 68058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (SignedInState() == SIGNED_IN) 681a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return account_chooser_model_->GetActiveWalletAccountName(); 68258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 68358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // In this case, the account chooser should be showing the signin link. 684a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return base::string16(); 68590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 68690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 687a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::SignInLinkText() const { 6880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int ids = SignedInState() == NOT_CHECKED ? 6890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) IDS_AUTOFILL_DIALOG_USE_WALLET_LINK : 690f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ShouldShowSignInWebView() ? IDS_AUTOFILL_DIALOG_CANCEL_SIGN_IN : 691f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IDS_AUTOFILL_DIALOG_SIGN_IN; 6920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 6930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return l10n_util::GetStringUTF16(ids); 69458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 696a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::SpinnerText() const { 69758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_LOADING); 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 700a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::EditSuggestionText() const { 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_EDIT); 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 704a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::CancelButtonText() const { 705ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return l10n_util::GetStringUTF16(IDS_CANCEL); 706ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 707ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 708a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::ConfirmButtonText() const { 709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return l10n_util::GetStringUTF16(IsSubmitPausedOn(wallet::VERIFY_CVV) ? 710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IDS_AUTOFILL_DIALOG_VERIFY_BUTTON : IDS_AUTOFILL_DIALOG_SUBMIT_BUTTON); 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 713a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::SaveLocallyText() const { 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SAVE_LOCALLY_CHECKBOX); 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 717a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::SaveLocallyTooltip() const { 718bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SAVE_LOCALLY_TOOLTIP); 719bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 720bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 721a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::LegalDocumentsText() { 722f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!IsPayingWithWallet() || ShouldShowSignInWebView()) 723a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return base::string16(); 724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return legal_documents_text_; 726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldShowSpinner() const { 729f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return SignedInState() == REQUIRES_RESPONSE || 730f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SignedInState() == REQUIRES_PASSIVE_SIGN_IN; 731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 733a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool AutofillDialogControllerImpl::ShouldShowAccountChooser() const { 734a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return GetManager()->GetDefaultCountryCodeForNewAddress() == "US" && 735a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !ShouldShowSpinner(); 736a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 737a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 7381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool AutofillDialogControllerImpl::ShouldShowSignInWebView() const { 7391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return !signin_registrar_.IsEmpty(); 7401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 7411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 7421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)GURL AutofillDialogControllerImpl::SignInUrl() const { 7431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return wallet::GetSignInUrl(); 7441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 7451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldOfferToSaveInChrome() const { 747b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return !IsPayingWithWallet() && 748b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) !profile_->IsOffTheRecord() && 749b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) IsManuallyEditingAnySection() && 750ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch !ShouldShowSpinner(); 75190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 75290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 75358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldSaveInChrome() const { 75458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return profile_->GetPrefs()->GetBoolean(::prefs::kAutofillDialogSaveData); 75558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 75658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 75790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)int AutofillDialogControllerImpl::GetDialogButtons() const { 7584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (waiting_for_explicit_sign_in_response_) 7594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return ui::DIALOG_BUTTON_NONE; 7604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (ShouldShowSpinner() && !handling_use_wallet_link_click_) 76290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return ui::DIALOG_BUTTON_CANCEL; 76358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 76458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL; 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::IsDialogButtonEnabled( 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::DialogButton button) const { 769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (button == ui::DIALOG_BUTTON_OK) { 770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsSubmitPausedOn(wallet::VERIFY_CVV)) 771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 772ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 77358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (ShouldShowSpinner() || is_submitting_) 774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 775ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 77658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (submit_button_delay_timer_.IsRunning()) 77758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return false; 778ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(ui::DIALOG_BUTTON_CANCEL, button); 783ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return !is_submitting_ || IsSubmitPausedOn(wallet::VERIFY_CVV); 784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 78658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)DialogOverlayState AutofillDialogControllerImpl::GetDialogOverlay() { 7877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool show_wallet_interstitial = IsPayingWithWallet() && is_submitting_ && 78858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) !(full_wallet_ && !full_wallet_->required_actions().empty()); 78958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!show_wallet_interstitial) { 79058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) card_scrambling_delay_.Stop(); 79158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) card_scrambling_refresher_.Stop(); 7927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return DialogOverlayState(); 79358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 7947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 7957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 7967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DialogOverlayState state; 7974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) state.string.font = rb.GetFont(ui::ResourceBundle::BaseFont).DeriveFont(3); 7984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) state.string.text_color = SK_ColorDKGRAY; 79958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 80058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const SkColor start_top_color = SkColorSetRGB(0xD6, 0xD6, 0xD6); 80158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const SkColor start_bottom_color = SkColorSetRGB(0x98, 0x98, 0x98); 80258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const SkColor final_top_color = SkColorSetRGB(0x52, 0x9F, 0xF8); 80358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const SkColor final_bottom_color = SkColorSetRGB(0x22, 0x75, 0xE5); 8047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 8057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (full_wallet_ && full_wallet_->required_actions().empty()) { 80658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) card_scrambling_delay_.Stop(); 80758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) card_scrambling_refresher_.Stop(); 80858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 809a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 cc_number = 8103240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch full_wallet_->GetInfo(AutofillType(CREDIT_CARD_NUMBER)); 811f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK_GE(cc_number.size(), 4U); 8127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch state.image = GetGeneratedCardImage( 81358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASCIIToUTF16("XXXX XXXX XXXX ") + 81458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) cc_number.substr(cc_number.size() - 4), 81558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) full_wallet_->billing_address()->recipient_name(), 81658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) color_utils::AlphaBlend( 81758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) final_top_color, 81858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) start_top_color, 81958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 255 * card_generated_animation_.GetCurrentValue()), 82058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) color_utils::AlphaBlend( 82158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) final_bottom_color, 82258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) start_bottom_color, 82358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 255 * card_generated_animation_.GetCurrentValue())); 82458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) state.string.text = l10n_util::GetStringUTF16( 8267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDS_AUTOFILL_DIALOG_CARD_GENERATION_DONE); 8277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else { 82858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Start the refresher if it isn't running. Wait one second before pumping 82958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // updates to the view. 83058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!card_scrambling_delay_.IsRunning() && 83158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) !card_scrambling_refresher_.IsRunning()) { 83258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scrambled_card_number_ = GenerateRandomCardNumber(); 83358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) card_scrambling_delay_.Start( 83458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FROM_HERE, 83558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromSeconds(1), 83658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) this, 83758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &AutofillDialogControllerImpl::StartCardScramblingRefresher); 83858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 83958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 84058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(!scrambled_card_number_.empty()); 84158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) state.image = GetGeneratedCardImage( 84258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scrambled_card_number_, 84358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) submitted_cardholder_name_, 84458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) start_top_color, 84558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) start_bottom_color); 8467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 8477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // "Submitting" waiting page. 8484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) state.string.text = l10n_util::GetStringUTF16( 8497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDS_AUTOFILL_DIALOG_CARD_GENERATION_IN_PROGRESS); 8507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 8517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 8527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return state; 8537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 8547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 85558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const std::vector<gfx::Range>& AutofillDialogControllerImpl:: 856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LegalDocumentLinks() { 857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return legal_document_link_ranges_; 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::SectionIsActive(DialogSection section) 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const { 862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsSubmitPausedOn(wallet::VERIFY_CVV)) 863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return section == SECTION_CC_BILLING; 864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 865868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!FormStructureCaresAboutSection(section)) 866868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 867868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsPayingWithWallet()) 869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return section == SECTION_CC_BILLING || section == SECTION_SHIPPING; 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return section != SECTION_CC_BILLING; 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::GetWalletItems() { 8753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 876558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 8770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) wallet_items_requested_ = true; 878f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) wallet::WalletClient* wallet_client = GetWalletClient(); 879f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) wallet_client->CancelRequests(); 8800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 88158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previously_selected_instrument_id_.clear(); 88258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previously_selected_shipping_address_id_.clear(); 88358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch if (wallet_items_) { 88458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previous_default_instrument_id_ = wallet_items_->default_instrument_id(); 88558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previous_default_shipping_address_id_ = wallet_items_->default_address_id(); 88658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 88758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const wallet::WalletItems::MaskedInstrument* instrument = 88858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ActiveInstrument(); 88958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (instrument) 89058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previously_selected_instrument_id_ = instrument->object_id(); 891558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 892558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const wallet::Address* address = ActiveShippingAddress(); 893558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (address) 894558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch previously_selected_shipping_address_id_ = address->object_id(); 89558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch } 89658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 89758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch last_wallet_items_fetch_timestamp_ = base::TimeTicks::Now(); 898f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) passive_failed_ = false; 899eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch wallet_items_.reset(); 90058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 901eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The "Loading..." page should be showing now, which should cause the 902eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // account chooser to hide. 903eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch view_->UpdateAccountChooser(); 904f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) wallet_client->GetWalletItems(); 905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 907a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void AutofillDialogControllerImpl::HideSignIn() { 9083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 909a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) signin_registrar_.RemoveAll(); 910a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) view_->HideSignIn(); 911a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) view_->UpdateAccountChooser(); 912a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 913a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 91458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)AutofillDialogControllerImpl::DialogSignedInState 91558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AutofillDialogControllerImpl::SignedInState() const { 91658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (wallet_error_notification_) 91758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return SIGN_IN_DISABLED; 91858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (signin_helper_ || (wallet_items_requested_ && !wallet_items_)) 92058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return REQUIRES_RESPONSE; 92158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!wallet_items_requested_) 9230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return NOT_CHECKED; 9240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 925f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (wallet_items_->HasRequiredAction(wallet::GAIA_AUTH) || 926f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) passive_failed_) { 92758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return REQUIRES_SIGN_IN; 928f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 92958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 93058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (wallet_items_->HasRequiredAction(wallet::PASSIVE_GAIA_AUTH)) 93158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return REQUIRES_PASSIVE_SIGN_IN; 93258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 93358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return SIGNED_IN; 93458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 93558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::SignedInStateUpdated() { 9374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!ShouldShowSpinner()) 9384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) waiting_for_explicit_sign_in_response_ = false; 9394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (SignedInState()) { 941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case SIGNED_IN: 942f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LogDialogLatencyToShow(); 943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case REQUIRES_SIGN_IN: 9460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (handling_use_wallet_link_click_) 9470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SignInLinkClicked(); 9480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Fall through. 949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case SIGN_IN_DISABLED: 950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Switch to the local account and refresh the dialog. 9514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) signin_helper_.reset(); 952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnWalletSigninError(); 9530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) handling_use_wallet_link_click_ = false; 954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case REQUIRES_PASSIVE_SIGN_IN: 957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Attempt to passively sign in the user. 958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!signin_helper_); 959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) signin_helper_.reset(new wallet::WalletSigninHelper( 960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) this, 961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile_->GetRequestContext())); 962f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) signin_helper_->StartPassiveSignin(GetWalletClient()->user_index()); 963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) case NOT_CHECKED: 966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case REQUIRES_RESPONSE: 967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::OnWalletOrSigninUpdate() { 9723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SignedInStateUpdated(); 974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionsUpdated(); 975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateAccountChooserView(); 976b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 97758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (view_) { 978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->UpdateButtonStrip(); 97958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) view_->UpdateOverlay(); 98058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // On the first successful response, compute the initial user state metric. 983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (initial_user_state_ == AutofillMetrics::DIALOG_USER_STATE_UNKNOWN) 984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) initial_user_state_ = GetInitialUserState(); 985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void AutofillDialogControllerImpl::OnWalletFormFieldError( 9887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::vector<wallet::FormFieldError>& form_field_errors) { 9897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (form_field_errors.empty()) 9907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 9917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (std::vector<wallet::FormFieldError>::const_iterator it = 9937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) form_field_errors.begin(); 9947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) it != form_field_errors.end(); ++it) { 9957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (it->error_type() == wallet::FormFieldError::UNKNOWN_ERROR || 9967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) it->GetAutofillType() == MAX_VALID_FIELD_TYPE || 9977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) it->location() == wallet::FormFieldError::UNKNOWN_LOCATION) { 9987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) wallet_server_validation_recoverable_ = false; 9997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 10007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 10017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogSection section = SectionFromLocation(it->location()); 10027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) wallet_errors_[section][it->GetAutofillType()] = 10037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::make_pair(it->GetErrorMessage(), 10047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetValueFromSection(section, it->GetAutofillType())); 10057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 10067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Unrecoverable validation errors. 10087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!wallet_server_validation_recoverable_) 10097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DisableWallet(wallet::WalletClient::UNKNOWN_ERROR); 10107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1011eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateForErrors(); 10127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 10137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void AutofillDialogControllerImpl::ConstructLegalDocumentsText() { 10150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) legal_documents_text_.clear(); 10160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) legal_document_link_ranges_.clear(); 10170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 10180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!wallet_items_) 10190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return; 10200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 10210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PrefService* local_state = g_browser_process->local_state(); 10220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // List of users who have accepted location sharing for fraud protection 10230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // on this device. 10240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const base::ListValue* accepted = 10250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) local_state->GetList(::prefs::kAutofillDialogWalletLocationAcceptance); 10260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) bool has_accepted_location_sharing = 10270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) accepted->Find(base::StringValue( 1028a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_->GetActiveWalletAccountName())) != 10290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) accepted->end(); 10300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 10310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (wallet_items_->legal_documents().empty()) { 10320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!has_accepted_location_sharing) { 10330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) legal_documents_text_ = l10n_util::GetStringUTF16( 10340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) IDS_AUTOFILL_DIALOG_LOCATION_DISCLOSURE); 10350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 10360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 10380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 1039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::vector<wallet::WalletItems::LegalDocument*>& documents = 1041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wallet_items_->legal_documents(); 10421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // There should never be just one document because the privacy policy doc gets 10431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // tacked on the end of other documents. 1044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK_GE(documents.size(), 2U); 1045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::vector<base::string16> link_names; 10471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) for (size_t i = 0; i < documents.size(); ++i) { 10481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) link_names.push_back(documents[i]->display_name()); 10491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 10501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 10511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) int resource_id = 0; 10521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) switch (documents.size()) { 10531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 2U: 1054a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) resource_id = IDS_AUTOFILL_DIALOG_LEGAL_LINKS_2; 10551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 10561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 3U: 1057a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) resource_id = IDS_AUTOFILL_DIALOG_LEGAL_LINKS_3; 10581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 10591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 4U: 1060a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) resource_id = IDS_AUTOFILL_DIALOG_LEGAL_LINKS_4; 10611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 10621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 5U: 1063a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) resource_id = IDS_AUTOFILL_DIALOG_LEGAL_LINKS_5; 10641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 10651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 6U: 1066a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) resource_id = IDS_AUTOFILL_DIALOG_LEGAL_LINKS_6; 10671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 10681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) default: 10691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // We can only handle so many documents. For lack of a better way of 10701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // handling document overflow, just error out if there are too many. 10711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DisableWallet(wallet::WalletClient::UNKNOWN_ERROR); 10721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return; 1073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::vector<size_t> offsets; 1076a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 text = 1077a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) l10n_util::GetStringFUTF16(resource_id, link_names,&offsets); 10780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 10790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Tack on the location string if need be. 10800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) size_t base_offset = 0; 10810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!has_accepted_location_sharing) { 10820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) text = l10n_util::GetStringFUTF16( 10830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) IDS_AUTOFILL_DIALOG_LOCATION_DISCLOSURE_WITH_LEGAL_DOCS, 10840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) text, 10850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) &base_offset); 10860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 10870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < documents.size(); ++i) { 10890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) size_t link_start = offsets[i] + base_offset; 109058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) legal_document_link_ranges_.push_back(gfx::Range( 1091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) link_start, link_start + documents[i]->display_name().size())); 1092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) legal_documents_text_ = text; 1094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1096eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::ResetSectionInput(DialogSection section) { 1097868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SetEditingExistingData(section, false); 1098eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1099eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DetailInputs* inputs = MutableRequestedFieldsForSection(section); 1100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (DetailInputs::iterator it = inputs->begin(); it != inputs->end(); ++it) { 1101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) it->initial_value = common::GetHardcodedValueForType(it->type); 1102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::ShowEditUiIfBadSuggestion( 1106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DialogSection section) { 1107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // |CreateWrapper()| returns an empty wrapper if |IsEditingExistingData()|, so 1108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // get the wrapper before this potentially happens below. 110990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section); 1110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the chosen item in |model| yields an empty suggestion text, it is 1112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // invalid. In this case, show the edit UI and highlight invalid fields. 1113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 1114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 unused, unused2; 1115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsASuggestionItemKey(model->GetItemKeyForCheckedItem()) && 1116c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch !SuggestionTextForSection(section, &unused, &unused2)) { 1117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SetEditingExistingData(section, true); 1118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 112090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DetailInputs* inputs = MutableRequestedFieldsForSection(section); 1121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (wrapper && IsEditingExistingData(section)) 1122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch wrapper->FillInputs(inputs); 1123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 112490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerImpl::InputWasEdited(ServerFieldType type, 1126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::string16& value) { 1127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (value.empty()) 1128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 112990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // If this is a combobox at the default value, don't preserve it. 1131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ui::ComboboxModel* model = ComboboxModelForAutofillType(type); 1132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (model && model->GetItemAt(model->GetDefaultIndex()) == value) 1133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 1134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 1136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)FieldValueMap AutofillDialogControllerImpl::TakeUserInputSnapshot() { 1139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldValueMap snapshot; 1140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!view_) 1141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return snapshot; 1142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 1144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DialogSection section = static_cast<DialogSection>(i); 1145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 1146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (model->GetItemKeyForCheckedItem() != kAddNewItemKey) 1147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch continue; 1148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldValueMap outputs; 1150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch view_->GetUserInput(section, &outputs); 1151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Remove fields that are empty, at their default values, or invalid. 1152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (FieldValueMap::iterator it = outputs.begin(); it != outputs.end(); 1153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ++it) { 1154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (InputWasEdited(it->first, it->second) && 1155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InputValidityMessage(section, it->first, it->second).empty()) { 1156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch snapshot.insert(std::make_pair(it->first, it->second)); 1157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return snapshot; 1162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::RestoreUserInputFromSnapshot( 1165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const FieldValueMap& snapshot) { 1166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (snapshot.empty()) 1167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 1168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldMapWrapper wrapper(snapshot); 1170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 1171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DialogSection section = static_cast<DialogSection>(i); 1172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!SectionIsActive(section)) 1173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch continue; 1174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DetailInputs* inputs = MutableRequestedFieldsForSection(section); 1176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch wrapper.FillInputs(inputs); 1177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = 0; i < inputs->size(); ++i) { 1179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (InputWasEdited((*inputs)[i].type, (*inputs)[i].initial_value)) { 1180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SuggestionsMenuModelForSection(section)->SetCheckedItem(kAddNewItemKey); 1181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 1182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::UpdateSection(DialogSection section) { 1188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (view_) 1189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->UpdateSection(section); 1190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::UpdateForErrors() { 1193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!view_) 1194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 1195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Currently, the view should only need to be updated if there are 1197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // |wallet_errors_| or validating a suggestion that's based on existing data. 1198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool should_update = !wallet_errors_.empty(); 1199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!should_update) { 1200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 1201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsEditingExistingData(static_cast<DialogSection>(i))) { 1202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch should_update = true; 1203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 1204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (should_update) 1209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch view_->UpdateForErrors(); 1210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)gfx::Image AutofillDialogControllerImpl::GetGeneratedCardImage( 1213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::string16& card_number, 1214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::string16& name, 1215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const SkColor& gradient_top, 1216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const SkColor& gradient_bottom) { 1217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const int kCardWidthPx = 300; 1218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const int kCardHeightPx = 190; 1219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::Size size(kCardWidthPx, kCardHeightPx); 1220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ui::ScaleFactor scale_factor = ui::GetScaleFactorForNativeView( 1221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_contents()->GetView()->GetNativeView()); 1222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Canvas canvas(size, ui::GetImageScale(scale_factor), false); 1223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect display_rect(size); 1225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) skia::RefPtr<SkShader> shader = gfx::CreateGradientShader( 1227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 0, size.height(), gradient_top, gradient_bottom); 1228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SkPaint paint; 1229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) paint.setShader(shader.get()); 1230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) canvas.DrawRoundRect(display_rect, 8, paint); 1231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) display_rect.Inset(20, 0, 0, 0); 1233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Font font(l10n_util::GetStringUTF8(IDS_FIXED_FONT_FAMILY), 18); 1234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::FontList font_list(font); 1235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::ShadowValues shadows; 1236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) shadows.push_back(gfx::ShadowValue(gfx::Point(0, 1), 1.0, SK_ColorBLACK)); 1237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) canvas.DrawStringRectWithShadows( 1238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) card_number, 1239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) font_list, 1240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SK_ColorWHITE, 1241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) display_rect, 0, 0, shadows); 1242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::string16 capitalized_name = base::i18n::ToUpper(name); 1244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) display_rect.Inset(0, size.height() / 2, 0, 0); 1245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) canvas.DrawStringRectWithShadows( 1246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) capitalized_name, 1247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) font_list, 1248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SK_ColorWHITE, 1249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) display_rect, 0, 0, shadows); 1250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::ImageSkia skia(canvas.ExtractImageRep()); 1252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return gfx::Image(skia); 1253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 1254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 125558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::StartCardScramblingRefresher() { 125658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) RefreshCardScramblingOverlay(); 125758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) card_scrambling_refresher_.Start( 125858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FROM_HERE, 125958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(75), 126058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) this, 126158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &AutofillDialogControllerImpl::RefreshCardScramblingOverlay); 126258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 126358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 126458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::RefreshCardScramblingOverlay() { 126558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scrambled_card_number_ = GenerateRandomCardNumber(); 126658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PushOverlayUpdate(); 126758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 126858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 126958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::PushOverlayUpdate() { 127058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (view_) { 127158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ScopedViewUpdates updates(view_.get()); 127258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) view_->UpdateOverlay(); 127358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 127458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 127558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const DetailInputs& AutofillDialogControllerImpl::RequestedFieldsForSection( 12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialogSection section) const { 12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (section) { 12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_CC: 12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return requested_cc_fields_; 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_BILLING: 12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return requested_billing_fields_; 12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_CC_BILLING: 12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return requested_cc_billing_fields_; 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_SHIPPING: 12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return requested_shipping_fields_; 12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return requested_billing_fields_; 12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::ComboboxModel* AutofillDialogControllerImpl::ComboboxModelForAutofillType( 12943240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ServerFieldType type) { 1295bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch switch (type) { 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case CREDIT_CARD_EXP_MONTH: 12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &cc_exp_month_combobox_model_; 12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case CREDIT_CARD_EXP_4_DIGIT_YEAR: 13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &cc_exp_year_combobox_model_; 13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ADDRESS_HOME_COUNTRY: 1303bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch case ADDRESS_BILLING_COUNTRY: 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &country_combobox_model_; 13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::MenuModel* AutofillDialogControllerImpl::MenuModelForSection( 13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialogSection section) { 1313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 1314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The shipping section menu is special. It will always show because there is 1315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // a choice between "Use billing" and "enter new". 1316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (section == SECTION_SHIPPING) 1317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return model; 1318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // For other sections, only show a menu if there's at least one suggestion. 1320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (int i = 0; i < model->GetItemCount(); ++i) { 1321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsASuggestionItemKey(model->GetItemKeyAt(i))) 1322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return model; 1323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 1326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::MenuModel* AutofillDialogControllerImpl::MenuModelForAccountChooser() { 1329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If there were unrecoverable Wallet errors, or if there are choices other 1330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // than "Pay without the wallet", show the full menu. 13314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(estade): this can present a braindead menu (only 1 option) when 13324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // there's a wallet error. 133358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (wallet_error_notification_ || 13344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) (SignedInState() == SIGNED_IN && 1335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_->HasAccountsToChoose() && 1336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) !ShouldShowSignInWebView())) { 1337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return account_chooser_model_.get(); 1338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Otherwise, there is no menu, just a sign in link. 1341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Image AutofillDialogControllerImpl::AccountChooserImage() { 1345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!MenuModelForAccountChooser() && !ShouldShowSignInWebView()) { 1346f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return ui::ResourceBundle::GetSharedInstance().GetImageNamed( 1347f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) IDR_WALLET_ICON); 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return gfx::Image(); 13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochgfx::Image AutofillDialogControllerImpl::ButtonStripImage() const { 135458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (IsPayingWithWallet()) { 13552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return ui::ResourceBundle::GetSharedInstance().GetImageNamed( 13562385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch IDR_WALLET_LOGO); 13572385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 13582385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 13592385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return gfx::Image(); 13602385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 13612385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::LabelForSection( 1363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DialogSection section) const { 13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (section) { 13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_CC: 13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SECTION_CC); 13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_BILLING: 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_CC_BILLING: 13697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SECTION_BILLING); 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_SHIPPING: 13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SECTION_SHIPPING); 13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 137358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 1374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return base::string16(); 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SuggestionState AutofillDialogControllerImpl::SuggestionStateForSection( 1378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DialogSection section) { 1379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 vertically_compact, horizontally_compact; 1380c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch bool show_suggestion = SuggestionTextForSection(section, 1381c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch &vertically_compact, 1382c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch &horizontally_compact); 1383c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return SuggestionState(show_suggestion, 1384c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch vertically_compact, 1385c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch horizontally_compact, 1386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionIconForSection(section), 1387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtraSuggestionTextForSection(section), 13887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ExtraSuggestionIconForSection(section)); 1389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1391c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochbool AutofillDialogControllerImpl::SuggestionTextForSection( 1392c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch DialogSection section, 1393c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch base::string16* vertically_compact, 1394c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch base::string16* horizontally_compact) { 1395c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch base::string16 action_text = RequiredActionTextForSection(section); 1396c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch if (!action_text.empty()) { 1397c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch *vertically_compact = *horizontally_compact = action_text; 1398c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return true; 1399c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch } 1400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When the user has clicked 'edit' or a suggestion is somehow invalid (e.g. a 1402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // user selects a credit card that has expired), don't show a suggestion (even 1403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // though there is a profile selected in the model). 1404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (IsEditingExistingData(section)) 1405c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return false; 14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string item_key = model->GetItemKeyForCheckedItem(); 1409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (item_key == kSameAsBillingKey) { 1410c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch *vertically_compact = *horizontally_compact = l10n_util::GetStringUTF16( 1411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IDS_AUTOFILL_DIALOG_USING_BILLING_FOR_SHIPPING); 1412c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return true; 1413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!IsASuggestionItemKey(item_key)) 1416c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return false; 14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section); 1419c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return wrapper->GetDisplayText(vertically_compact, horizontally_compact); 1420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::RequiredActionTextForSection( 1423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DialogSection section) const { 1424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (section == SECTION_CC_BILLING && IsSubmitPausedOn(wallet::VERIFY_CVV)) { 1425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const wallet::WalletItems::MaskedInstrument* current_instrument = 1426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wallet_items_->GetInstrumentById(active_instrument_id_); 1427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (current_instrument) 1428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return current_instrument->TypeAndLastFourDigits(); 1429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1430f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldValueMap output; 1431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->GetUserInput(section, &output); 1432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreditCard card; 1433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetBillingInfoFromOutputs(output, &card, NULL, NULL); 1434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return card.TypeAndLastFourDigits(); 1435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return base::string16(); 1438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1440a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::ExtraSuggestionTextForSection( 1441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DialogSection section) const { 1442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (section == SECTION_CC || 1443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (section == SECTION_CC_BILLING && IsSubmitPausedOn(wallet::VERIFY_CVV))) { 1444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PLACEHOLDER_CVC); 1445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1447a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return base::string16(); 1448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1450868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const wallet::WalletItems::MaskedInstrument* AutofillDialogControllerImpl:: 1451868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ActiveInstrument() const { 1452868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!IsPayingWithWallet()) 1453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 1454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1455868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const SuggestionsMenuModel* model = 1456868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SuggestionsMenuModelForSection(SECTION_CC_BILLING); 1457868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string item_key = model->GetItemKeyForCheckedItem(); 1458868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!IsASuggestionItemKey(item_key)) 1459868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 1460868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1461868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int index; 1462868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!base::StringToInt(item_key, &index) || index < 0 || 1463868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static_cast<size_t>(index) >= wallet_items_->instruments().size()) { 1464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NOTREACHED(); 1465868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 1466868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1467868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1468868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return wallet_items_->instruments()[index]; 1469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1470868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const wallet::Address* AutofillDialogControllerImpl:: 1472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ActiveShippingAddress() const { 1473a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!IsPayingWithWallet() || !IsShippingAddressRequired()) 1474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 1475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const SuggestionsMenuModel* model = 1477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SuggestionsMenuModelForSection(SECTION_SHIPPING); 1478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string item_key = model->GetItemKeyForCheckedItem(); 1479868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!IsASuggestionItemKey(item_key)) 1480868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 1481868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1482868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int index; 1483868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!base::StringToInt(item_key, &index) || index < 0 || 1484868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static_cast<size_t>(index) >= wallet_items_->addresses().size()) { 1485868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NOTREACHED(); 1486868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 1487868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1488868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1489868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return wallet_items_->addresses()[index]; 1490868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1491868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<DataModelWrapper> AutofillDialogControllerImpl::CreateWrapper( 14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialogSection section) { 1494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsPayingWithWallet() && full_wallet_ && 1495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) full_wallet_->required_actions().empty()) { 14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (section == SECTION_CC_BILLING) { 14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<DataModelWrapper>( 14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new FullWalletBillingWrapper(full_wallet_.get())); 14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (section == SECTION_SHIPPING) { 15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<DataModelWrapper>( 15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new FullWalletShippingWrapper(full_wallet_.get())); 15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string item_key = model->GetItemKeyForCheckedItem(); 1508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!IsASuggestionItemKey(item_key) || IsManuallyEditingSection(section)) 15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<DataModelWrapper>(); 15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsPayingWithWallet()) { 15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (section == SECTION_CC_BILLING) { 15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<DataModelWrapper>( 1514868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new WalletInstrumentWrapper(ActiveInstrument())); 15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (section == SECTION_SHIPPING) { 1518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return scoped_ptr<DataModelWrapper>( 1519868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new WalletAddressWrapper(ActiveShippingAddress())); 1520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return scoped_ptr<DataModelWrapper>(); 15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (section == SECTION_CC) { 15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreditCard* card = GetManager()->GetCreditCardByGUID(item_key); 15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(card); 15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<DataModelWrapper>(new AutofillCreditCardWrapper(card)); 15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillProfile* profile = GetManager()->GetProfileByGUID(item_key); 15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(profile); 153358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (section == SECTION_SHIPPING) { 153458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return scoped_ptr<DataModelWrapper>( 1535d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) new AutofillShippingAddressWrapper(profile)); 153658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 153758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK_EQ(SECTION_BILLING, section); 15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<DataModelWrapper>( 1539d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) new AutofillProfileWrapper(profile)); 15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Image AutofillDialogControllerImpl::SuggestionIconForSection( 15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialogSection section) { 15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DataModelWrapper> model = CreateWrapper(section); 15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!model.get()) 15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Image(); 15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return model->GetIcon(); 15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Image AutofillDialogControllerImpl::ExtraSuggestionIconForSection( 1552d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DialogSection section) { 1553d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (section != SECTION_CC && section != SECTION_CC_BILLING) 1554d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return gfx::Image(); 1555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1556d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<DataModelWrapper> model = CreateWrapper(section); 1557d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!model.get()) 1558d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return gfx::Image(); 1559d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1560d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return CvcIconForCreditCardType( 1561d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) model->GetInfo(AutofillType(CREDIT_CARD_TYPE))); 1562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1564d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)FieldIconMap AutofillDialogControllerImpl::IconsForFields( 1565d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const FieldValueMap& user_inputs) const { 1566d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FieldIconMap result; 1567d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::string16 credit_card_type; 1568d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1569d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FieldValueMap::const_iterator credit_card_iter = 1570d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) user_inputs.find(CREDIT_CARD_NUMBER); 1571d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (credit_card_iter != user_inputs.end()) { 1572a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& number = credit_card_iter->second; 1573d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::string type = CreditCard::GetCreditCardType(number); 1574d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) credit_card_type = CreditCard::TypeForDisplay(type); 1575d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) result[CREDIT_CARD_NUMBER] = CreditCardIconForType(type); 1576d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 1577d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1578d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!user_inputs.count(CREDIT_CARD_VERIFICATION_CODE)) 1579d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return result; 1580d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1581d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) result[CREDIT_CARD_VERIFICATION_CODE] = 1582d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CvcIconForCreditCardType(credit_card_type); 1583d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1584d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return result; 1585d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 1586d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1587d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool AutofillDialogControllerImpl::FieldControlsIcons( 1588d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ServerFieldType type) const { 1589d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return type == CREDIT_CARD_NUMBER; 1590d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 1591d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1592a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::TooltipForField( 1593a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ServerFieldType type) const { 15944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (type == PHONE_HOME_WHOLE_NUMBER || type == PHONE_BILLING_WHOLE_NUMBER) 15954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_TOOLTIP_PHONE_NUMBER); 15964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1597a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return base::string16(); 15984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 15994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 16008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool AutofillDialogControllerImpl::InputIsEditable( 16018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const DetailInput& input, 16028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DialogSection section) { 16038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (section != SECTION_CC_BILLING) 16048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return true; 16058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 16068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (input.type == CREDIT_CARD_NUMBER) 16078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return !IsEditingExistingData(section); 16088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 16098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // For CVC, only require (allow) input if the user has edited some other 16108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // aspect of the card. 16118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (input.type == CREDIT_CARD_VERIFICATION_CODE && 16128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) IsEditingExistingData(section)) { 1613f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldValueMap output; 16148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) view_->GetUserInput(section, &output); 16158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) WalletInstrumentWrapper wrapper(ActiveInstrument()); 16168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1617f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (FieldValueMap::iterator iter = output.begin(); iter != output.end(); 16188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ++iter) { 1619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (iter->first == input.type) 16208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) continue; 16218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AutofillType type(iter->first); 16238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (type.group() == CREDIT_CARD && 16248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) iter->second != wrapper.GetInfo(type)) { 16258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return true; 16268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 16278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 16288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 16298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return false; 16308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 16318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 16328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return true; 16338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 16348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 16354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// TODO(groby): Add more tests. 1636a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::InputValidityMessage( 16377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogSection section, 16383240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ServerFieldType type, 1639a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& value) { 16407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // If the field is edited, clear any Wallet errors. 16417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (IsPayingWithWallet()) { 16427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WalletValidationErrors::iterator it = wallet_errors_.find(section); 16437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (it != wallet_errors_.end()) { 16447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TypeErrorInputMap::const_iterator iter = it->second.find(type); 16457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (iter != it->second.end()) { 16467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (iter->second.second == value) 16477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return iter->second.first; 16487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) it->second.erase(type); 16497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 16507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 16517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 16527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1653bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch switch (AutofillType(type).GetStorableType()) { 165490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case EMAIL_ADDRESS: 1655868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!value.empty() && !IsValidEmailAddress(value)) { 1656868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return l10n_util::GetStringUTF16( 1657868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_EMAIL_ADDRESS); 1658868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 165990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 166090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1661eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case CREDIT_CARD_NUMBER: { 1662eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!value.empty()) { 1663eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::string16 message = CreditCardNumberValidityMessage(value); 1664eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!message.empty()) 1665eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return message; 1666eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1667eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 1668eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 166990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 167090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case CREDIT_CARD_EXP_MONTH: 1671ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!InputWasEdited(CREDIT_CARD_EXP_MONTH, value)) { 1672ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return l10n_util::GetStringUTF16( 1673ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch IDS_AUTOFILL_DIALOG_VALIDATION_MISSING_VALUE); 1674ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 1675ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch break; 1676ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 167790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case CREDIT_CARD_EXP_4_DIGIT_YEAR: 1678ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!InputWasEdited(CREDIT_CARD_EXP_4_DIGIT_YEAR, value)) { 1679ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return l10n_util::GetStringUTF16( 1680ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch IDS_AUTOFILL_DIALOG_VALIDATION_MISSING_VALUE); 1681ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 168290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 168390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 168490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case CREDIT_CARD_VERIFICATION_CODE: 1685868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!value.empty() && !autofill::IsValidCreditCardSecurityCode(value)) { 1686868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return l10n_util::GetStringUTF16( 1687868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_SECURITY_CODE); 1688868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 168990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 169090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 169190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case ADDRESS_HOME_LINE1: 169290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 169490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case ADDRESS_HOME_LINE2: 169590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return base::string16(); // Line 2 is optional - always valid. 169690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 16977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case ADDRESS_HOME_CITY: 16987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case ADDRESS_HOME_COUNTRY: 16997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 17007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 170190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case ADDRESS_HOME_STATE: 17027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!value.empty() && !autofill::IsValidState(value)) { 17037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return l10n_util::GetStringUTF16( 17047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_REGION); 17057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 17065e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) break; 17075e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) 170890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case ADDRESS_HOME_ZIP: 17097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!value.empty() && !autofill::IsValidZip(value)) { 17107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return l10n_util::GetStringUTF16( 17117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_ZIP_CODE); 17127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 171390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 171490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 17157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case NAME_FULL: 17167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Wallet requires a first and last billing name. 17177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (section == SECTION_CC_BILLING && !value.empty() && 17187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch !IsCardHolderNameValidForWallet(value)) { 17197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(IsPayingWithWallet()); 17207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return l10n_util::GetStringUTF16( 17217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDS_AUTOFILL_DIALOG_VALIDATION_WALLET_REQUIRES_TWO_NAMES); 17227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 172390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case PHONE_HOME_WHOLE_NUMBER: // Used in shipping section. 1726868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) break; 1727868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case PHONE_BILLING_WHOLE_NUMBER: // Used in billing section. 172990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 173090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 173190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) default: 173290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NOTREACHED(); // Trying to validate unknown field. 173390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 173490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 173590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1736868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return value.empty() ? 1737868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_VALIDATION_MISSING_VALUE) : 1738868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::string16(); 17392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// TODO(groby): Also add tests. 17424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)ValidityMessages AutofillDialogControllerImpl::InputsAreValid( 17437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogSection section, 1744f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const FieldValueMap& inputs) { 17454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ValidityMessages messages; 1746a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::map<ServerFieldType, base::string16> field_values; 1747f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (FieldValueMap::const_iterator iter = inputs.begin(); 17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != inputs.end(); ++iter) { 1749f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const ServerFieldType type = iter->first; 1750ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 17514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::string16 text = InputValidityMessage(section, type, iter->second); 17524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1753ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Skip empty/unchanged fields in edit mode. Ignore country code as it 17544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // always has a value. If the individual field does not have validation 17554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // errors, assume it to be valid unless later proven otherwise. 17564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool sure = InputWasEdited(type, iter->second) || 17574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ComboboxModelForAutofillType(type) == &country_combobox_model_; 1758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 17594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Consider only individually valid fields for inter-field validation. 17604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (text.empty()) { 1761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) field_values[type] = iter->second; 17624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // If the field is valid but can be invalidated by inter-field validation, 17634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // assume it to be unsure. 17644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (type == CREDIT_CARD_EXP_4_DIGIT_YEAR || 17654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) type == CREDIT_CARD_EXP_MONTH || 17664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) type == CREDIT_CARD_VERIFICATION_CODE || 17674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) type == PHONE_HOME_WHOLE_NUMBER || 17684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) type == PHONE_BILLING_WHOLE_NUMBER) { 17694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) sure = false; 17704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 17714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 17724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) messages.Set(type, ValidityMessage(text, sure)); 17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Validate the date formed by month and year field. (Autofill dialog is 1776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // never supposed to have 2-digit years, so not checked). 1777868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (field_values.count(CREDIT_CARD_EXP_4_DIGIT_YEAR) && 1778868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) field_values.count(CREDIT_CARD_EXP_MONTH) && 1779ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch InputWasEdited(CREDIT_CARD_EXP_4_DIGIT_YEAR, 1780ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch field_values[CREDIT_CARD_EXP_4_DIGIT_YEAR]) && 1781ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch InputWasEdited(CREDIT_CARD_EXP_MONTH, 17824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) field_values[CREDIT_CARD_EXP_MONTH])) { 17834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ValidityMessage year_message(base::string16(), true); 17844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ValidityMessage month_message(base::string16(), true); 17854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!IsCreditCardExpirationValid(field_values[CREDIT_CARD_EXP_4_DIGIT_YEAR], 17864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) field_values[CREDIT_CARD_EXP_MONTH])) { 17874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The dialog shows the same error message for the month and year fields. 17884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) year_message.text = l10n_util::GetStringUTF16( 17894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_EXPIRATION_DATE); 17904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) month_message.text = l10n_util::GetStringUTF16( 17914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_EXPIRATION_DATE); 17924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 17934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) messages.Set(CREDIT_CARD_EXP_4_DIGIT_YEAR, year_message); 17944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) messages.Set(CREDIT_CARD_EXP_MONTH, month_message); 17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If there is a credit card number and a CVC, validate them together. 17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (field_values.count(CREDIT_CARD_NUMBER) && 17994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) field_values.count(CREDIT_CARD_VERIFICATION_CODE)) { 18004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ValidityMessage ccv_message(base::string16(), true); 18014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!autofill::IsValidCreditCardSecurityCode( 18024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) field_values[CREDIT_CARD_VERIFICATION_CODE], 18034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) field_values[CREDIT_CARD_NUMBER])) { 18044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ccv_message.text = l10n_util::GetStringUTF16( 18054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_SECURITY_CODE); 18064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 18074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) messages.Set(CREDIT_CARD_VERIFICATION_CODE, ccv_message); 18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1810868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Validate the shipping phone number against the country code of the address. 181190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (field_values.count(ADDRESS_HOME_COUNTRY) && 181290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) field_values.count(PHONE_HOME_WHOLE_NUMBER)) { 181390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) i18n::PhoneObject phone_object( 181490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) field_values[PHONE_HOME_WHOLE_NUMBER], 181590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AutofillCountry::GetCountryCode( 181690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) field_values[ADDRESS_HOME_COUNTRY], 181790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) g_browser_process->GetApplicationLocale())); 18184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ValidityMessage phone_message(base::string16(), true); 181990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!phone_object.IsValidNumber()) { 18204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) phone_message.text = l10n_util::GetStringUTF16( 1821868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_PHONE_NUMBER); 1822868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 18234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) messages.Set(PHONE_HOME_WHOLE_NUMBER, phone_message); 1824868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1825868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1826868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Validate the billing phone number against the country code of the address. 1827868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (field_values.count(ADDRESS_BILLING_COUNTRY) && 1828868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) field_values.count(PHONE_BILLING_WHOLE_NUMBER)) { 1829868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) i18n::PhoneObject phone_object( 1830868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) field_values[PHONE_BILLING_WHOLE_NUMBER], 1831868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AutofillCountry::GetCountryCode( 1832868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) field_values[ADDRESS_BILLING_COUNTRY], 1833868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) g_browser_process->GetApplicationLocale())); 18344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ValidityMessage phone_message(base::string16(), true); 1835868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!phone_object.IsValidNumber()) { 18364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) phone_message.text = l10n_util::GetStringUTF16( 1837868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_PHONE_NUMBER); 183890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 18394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) messages.Set(PHONE_BILLING_WHOLE_NUMBER, phone_message); 184090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 184190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 18424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return messages; 18432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 18442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::UserEditedOrActivatedInput( 18467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogSection section, 1847f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ServerFieldType type, 18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeView parent_view, 18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& content_bounds, 1850a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& field_contents, 18512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool was_edit) { 18522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the field is edited down to empty, don't show a popup. 18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (was_edit && field_contents.empty()) { 18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HidePopup(); 18552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the user clicks while the popup is already showing, be sure to hide 18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // it. 1860868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!was_edit && popup_controller_.get()) { 18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HidePopup(); 18622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<string16> popup_values, popup_labels, popup_icons; 1866f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (common::IsCreditCardType(type)) { 1867f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetManager()->GetCreditCardSuggestions(AutofillType(type), 18682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) field_contents, 18692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_values, 18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_labels, 18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_icons, 18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_guids_); 18732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 18743240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch std::vector<ServerFieldType> field_types; 1875d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const DetailInputs& inputs = RequestedFieldsForSection(section); 1876d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) for (DetailInputs::const_iterator iter = inputs.begin(); 1877d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) iter != inputs.end(); ++iter) { 18782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) field_types.push_back(iter->type); 18792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1880f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetManager()->GetProfileSuggestions(AutofillType(type), 18812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) field_contents, 18822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 18832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) field_types, 18842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_values, 18852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_labels, 18862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_icons, 18872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_guids_); 18882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (popup_values.empty()) { 1891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HidePopup(); 18922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1895f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // |input_showing_popup_| must be set before calling |Show()|. 1896f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const DetailInputs& inputs = RequestedFieldsForSection(section); 1897f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (DetailInputs::const_iterator iter = inputs.begin(); 1898f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) iter != inputs.end(); ++iter) { 1899f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (iter->type == type) { 1900f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) input_showing_popup_ = &(*iter); 1901f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) break; 1902f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1903f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1904f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1905f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!input_showing_popup_) 1906f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 1907f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(estade): do we need separators and control rows like 'Clear 19092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Form'? 19102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<int> popup_ids; 19112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < popup_guids_.size(); ++i) { 19122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_ids.push_back(i); 19132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_controller_ = AutofillPopupControllerImpl::GetOrCreate( 1916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) popup_controller_, 1917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 19180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) NULL, 1919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent_view, 19207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) content_bounds, 19217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::i18n::IsRTL() ? 19227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::i18n::RIGHT_TO_LEFT : base::i18n::LEFT_TO_RIGHT); 1923424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) popup_controller_->set_hide_on_outside_click(true); 19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_controller_->Show(popup_values, 19252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_labels, 19262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_icons, 19272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_ids); 19282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::FocusMoved() { 19312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HidePopup(); 19322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldShowErrorBubble() const { 19354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return !input_showing_popup_; 19364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 19374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 19382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::ViewClosed() { 19392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetManager()->RemoveObserver(this); 19402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Called from here rather than in ~AutofillDialogControllerImpl as this 19427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // relies on virtual methods that change to their base class in the dtor. 19437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MaybeShowCreditCardBubble(); 19447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 19452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete this; 19462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1948868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)std::vector<DialogNotification> AutofillDialogControllerImpl:: 1949868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CurrentNotifications() { 19502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<DialogNotification> notifications; 19512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 195258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(dbeam): figure out a way to dismiss this error after a while. 195358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (wallet_error_notification_) 195458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) notifications.push_back(*wallet_error_notification_); 1955eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsSubmitPausedOn(wallet::VERIFY_CVV)) { 1957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) notifications.push_back(DialogNotification( 1958868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DialogNotification::REQUIRED_ACTION, 1959868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_VERIFY_CVV))); 19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!wallet_server_validation_recoverable_) { 1963a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) notifications.push_back(DialogNotification( 1964a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DialogNotification::REQUIRED_ACTION, 19657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch l10n_util::GetStringUTF16( 19667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDS_AUTOFILL_DIALOG_FAILED_TO_SAVE_WALLET_DATA))); 1967a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 1968a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1969868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (choose_another_instrument_or_address_) { 1970868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) notifications.push_back(DialogNotification( 1971868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DialogNotification::REQUIRED_ACTION, 19727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch l10n_util::GetStringUTF16( 19737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDS_AUTOFILL_DIALOG_CHOOSE_DIFFERENT_WALLET_INSTRUMENT))); 1974868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1975868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1976d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (notifications.empty() && MenuModelForAccountChooser()) { 1977d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::string16 text = l10n_util::GetStringUTF16( 1978d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) IsManuallyEditingAnySection() ? 1979d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) IDS_AUTOFILL_DIALOG_SAVE_DETAILS_IN_WALLET : 1980d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) IDS_AUTOFILL_DIALOG_USE_WALLET); 1981d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DialogNotification notification( 1982d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DialogNotification::WALLET_USAGE_CONFIRMATION, 1983d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) text); 1984d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) notification.set_tooltip_text( 1985d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) l10n_util::GetStringUTF16( 1986d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) IDS_AUTOFILL_DIALOG_SAVE_IN_WALLET_TOOLTIP)); 1987d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) notification.set_checked(IsPayingWithWallet()); 1988d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) notifications.push_back(notification); 1989d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 1990d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1991d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (IsPayingWithWallet() && !wallet::IsUsingProd()) { 1992d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) notifications.push_back(DialogNotification( 1993d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DialogNotification::DEVELOPER_WARNING, 1994d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_NOT_PROD_WARNING))); 1995d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 1996d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1997d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (RequestingCreditCardInfo() && !TransmissionWillBeSecure()) { 1998d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) notifications.push_back(DialogNotification( 1999d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DialogNotification::SECURITY_WARNING, 2000d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SECURITY_WARNING))); 2001d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 2002d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2003d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!invoked_from_same_origin_) { 2004d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) notifications.push_back(DialogNotification( 2005d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DialogNotification::SECURITY_WARNING, 2006d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) l10n_util::GetStringFUTF16(IDS_AUTOFILL_DIALOG_SITE_WARNING, 2007d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) UTF8ToUTF16(source_url_.host())))); 2008eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2009eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 20102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return notifications; 20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 201358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::LinkClicked(const GURL& url) { 201458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) OpenTabWithUrl(url); 201558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 201658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2017a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void AutofillDialogControllerImpl::SignInLinkClicked() { 20183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 20193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 20200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (SignedInState() == NOT_CHECKED) { 20210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) handling_use_wallet_link_click_ = true; 2022a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_->SelectWalletAccount(0); 2023f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FetchWalletCookie(); 20240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) view_->UpdateAccountChooser(); 20250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } else if (signin_registrar_.IsEmpty()) { 2026a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Start sign in. 20274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) waiting_for_explicit_sign_in_response_ = true; 2028a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) content::Source<content::NavigationController> source(view_->ShowSignIn()); 2029a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) signin_registrar_.Add( 2030a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, source); 2031a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) view_->UpdateAccountChooser(); 20322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2033a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) GetMetricLogger().LogDialogUiEvent( 203458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AutofillMetrics::DIALOG_UI_SIGNIN_SHOWN); 2035a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } else { 20364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) waiting_for_explicit_sign_in_response_ = false; 2037a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) HideSignIn(); 2038a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::NotificationCheckboxStateChanged( 2042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DialogNotification::Type type, bool checked) { 2043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (type == DialogNotification::WALLET_USAGE_CONFIRMATION) { 2044f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (checked) { 2045a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_->SelectWalletAccount( 2046f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetWalletClient()->user_index()); 2047f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else { 2048a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_->SelectUseAutofill(); 2049f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 2050f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2051f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AccountChoiceChanged(); 20522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 20542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LegalDocumentLinkClicked( 205658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Range& range) { 2057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < legal_document_link_ranges_.size(); ++i) { 2058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (legal_document_link_ranges_[i] == range) { 2059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OpenTabWithUrl(wallet_items_->legal_documents()[i]->url()); 2060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 2061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 20622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2064c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 20652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2067ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool AutofillDialogControllerImpl::OnCancel() { 2068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HidePopup(); 206958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!is_submitting_) 20707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LogOnCancelMetrics(); 2071d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) callback_.Run(NULL); 2072ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return true; 2073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2075ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool AutofillDialogControllerImpl::OnAccept() { 20760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 2077868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) choose_another_instrument_or_address_ = false; 20787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) wallet_server_validation_recoverable_ = true; 2079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HidePopup(); 208058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 208158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // This must come before SetIsSubmitting(). 2082eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsPayingWithWallet()) { 20838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // In the VERIFY_CVV case, hold onto the previously submitted cardholder 20848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // name. 20858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!IsSubmitPausedOn(wallet::VERIFY_CVV)) { 20868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) submitted_cardholder_name_ = 20878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GetValueFromSection(SECTION_CC_BILLING, NAME_BILLING_FULL); 20888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 20898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Snag the last four digits of the backing card now as it could be wiped 20908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // out if a CVC challenge happens. 20918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (ActiveInstrument()) { 20928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) backing_card_last_four_ = ActiveInstrument()->TypeAndLastFourDigits(); 20938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } else { 2094f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldValueMap output; 20958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) view_->GetUserInput(SECTION_CC_BILLING, &output); 20968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) CreditCard card; 20978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GetBillingInfoFromOutputs(output, &card, NULL, NULL); 20988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) backing_card_last_four_ = card.TypeAndLastFourDigits(); 20998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 21008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 21018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(!submitted_cardholder_name_.empty()); 21028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(!backing_card_last_four_.empty()); 2103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetIsSubmitting(true); 210658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsSubmitPausedOn(wallet::VERIFY_CVV)) { 2108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!active_instrument_id_.empty()); 21090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) full_wallet_.reset(); 2110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetWalletClient()->AuthenticateInstrument( 2111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_instrument_id_, 2112ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UTF16ToUTF8(view_->GetCvc())); 21130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) view_->UpdateOverlay(); 2114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (IsPayingWithWallet()) { 21150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) AcceptLegalTerms(); 2116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 21172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FinishSubmit(); 2118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2119ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2120ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return false; 21212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Profile* AutofillDialogControllerImpl::profile() { 21242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return profile_; 21252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2127bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochcontent::WebContents* AutofillDialogControllerImpl::GetWebContents() { 2128bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return web_contents(); 21292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 21322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// AutofillPopupDelegate implementation. 21332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogControllerImpl::OnPopupShown() { 21354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ScopedViewUpdates update(view_.get()); 21364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) view_->UpdateErrorBubble(); 21374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 213858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogPopupEvent(AutofillMetrics::DIALOG_POPUP_SHOWN); 21392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogControllerImpl::OnPopupHidden() {} 2142424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 2143424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool AutofillDialogControllerImpl::ShouldRepostEvent( 2144424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const ui::MouseEvent& event) { 2145424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // If the event would be reposted inside |input_showing_popup_|, just ignore. 2146424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return !view_->HitTestInput(*input_showing_popup_, event.location()); 2147424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 21482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::DidSelectSuggestion(int identifier) { 21502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(estade): implement. 21512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void AutofillDialogControllerImpl::DidAcceptSuggestion( 2154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& value, 2155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int identifier) { 21563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 21572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PersonalDataManager::GUIDPair& pair = popup_guids_[identifier]; 21582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<DataModelWrapper> wrapper; 2160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (common::IsCreditCardType(input_showing_popup_->type)) { 2161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wrapper.reset(new AutofillCreditCardWrapper( 2162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetManager()->GetCreditCardByGUID(pair.first))); 2163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 2164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wrapper.reset(new AutofillProfileWrapper( 2165d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetManager()->GetProfileByGUID(pair.first), 2166d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) AutofillType(input_showing_popup_->type), 2167d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) pair.second)); 2168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 21692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 2171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DialogSection section = static_cast<DialogSection>(i); 2172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wrapper->FillInputs(MutableRequestedFieldsForSection(section)); 2173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->FillSection(section, *input_showing_popup_); 2174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 21752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetMetricLogger().LogDialogPopupEvent( 217758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AutofillMetrics::DIALOG_POPUP_FORM_FILLED); 21782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(estade): not sure why it's necessary to do this explicitly. 21802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HidePopup(); 21812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void AutofillDialogControllerImpl::RemoveSuggestion( 2184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& value, 2185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int identifier) { 21862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(estade): implement. 21872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::ClearPreviewedForm() { 21902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(estade): implement. 21912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 21942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// content::NotificationObserver implementation. 21952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::Observe( 21972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int type, 21982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationSource& source, 21992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) { 22002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(type, content::NOTIFICATION_NAV_ENTRY_COMMITTED); 22012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::LoadCommittedDetails* load_details = 22022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::Details<content::LoadCommittedDetails>(details).ptr(); 2203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) size_t user_index = 0; 2204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (IsSignInContinueUrl(load_details->entry->GetVirtualURL(), &user_index)) { 2205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetWalletClient()->set_user_index(user_index); 2206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FetchWalletCookie(); 22071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 22081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // NOTE: |HideSignIn()| may delete the WebContents which doesn't expect to 22091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // be deleted while committing a nav entry. Just call |HideSignIn()| later. 22101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 22111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::Bind(&AutofillDialogControllerImpl::HideSignIn, 22121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::Unretained(this))); 22132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 22172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// SuggestionsMenuModelDelegate implementation. 22182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AutofillDialogControllerImpl::SuggestionsMenuWillShow() { 22204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) HidePopup(); 22214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 22224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 22232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::SuggestionItemSelected( 2224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionsMenuModel* model, 2225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t index) { 22263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 22273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (model->GetItemKeyAt(index) == kManageItemsKey) { 222990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GURL url; 223090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!IsPayingWithWallet()) { 223190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GURL settings_url(chrome::kChromeUISettingsURL); 223290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) url = settings_url.Resolve(chrome::kAutofillSubPage); 223390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 223458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // Reset |last_wallet_items_fetch_timestamp_| to ensure that the Wallet 223558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // data is refreshed as soon as the user switches back to this tab after 223658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // potentially editing his data. 223758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch last_wallet_items_fetch_timestamp_ = base::TimeTicks(); 2238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) size_t user_index = GetWalletClient()->user_index(); 223990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) url = SectionForSuggestionsMenuModel(*model) == SECTION_SHIPPING ? 22404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallet::GetManageAddressesUrl(user_index) : 22414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallet::GetManageInstrumentsUrl(user_index); 224290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 224390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OpenTabWithUrl(url); 2245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 2246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) model->SetCheckedIndex(index); 2249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DialogSection section = SectionForSuggestionsMenuModel(*model); 2250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ResetSectionInput(section); 2251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ShowEditUiIfBadSuggestion(section); 2252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateSection(section); 2253d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) view_->UpdateNotificationArea(); 2254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateForErrors(); 2255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LogSuggestionItemSelectedMetric(*model); 22572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 22602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// wallet::WalletClientDelegate implementation. 22612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const AutofillMetrics& AutofillDialogControllerImpl::GetMetricLogger() const { 22632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return metric_logger_; 22642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string AutofillDialogControllerImpl::GetRiskData() const { 2267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(!risk_data_.empty()); 2268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return risk_data_; 22692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstd::string AutofillDialogControllerImpl::GetWalletCookieValue() const { 22727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return wallet_cookie_value_; 22737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 22747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool AutofillDialogControllerImpl::IsShippingAddressRequired() const { 2276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return cares_about_shipping_; 2277a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 2278a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 22792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidAcceptLegalDocuments() { 228090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(is_submitting_ && IsPayingWithWallet()); 228190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) has_accepted_legal_documents_ = true; 228290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LoadRiskFingerprintData(); 22832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidAuthenticateInstrument(bool success) { 2286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(is_submitting_ && IsPayingWithWallet()); 2287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 22884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(dbeam): use the returned full wallet. http://crbug.com/224992 2289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (success) { 22902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFullWallet(); 2291eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 22927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DisableWallet(wallet::WalletClient::UNKNOWN_ERROR); 2293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SuggestionsUpdated(); 2294eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 22952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidGetFullWallet( 22982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<wallet::FullWallet> full_wallet) { 2299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(is_submitting_ && IsPayingWithWallet()); 23003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 2301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 23022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) full_wallet_ = full_wallet.Pass(); 23032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (full_wallet_->required_actions().empty()) { 23052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FinishSubmit(); 2306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 2307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) switch (full_wallet_->required_actions()[0]) { 2310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case wallet::CHOOSE_ANOTHER_INSTRUMENT_OR_ADDRESS: 2311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) choose_another_instrument_or_address_ = true; 2312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SetIsSubmitting(false); 2313eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetWalletItems(); 2314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) break; 2315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2316868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case wallet::VERIFY_CVV: 2317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SuggestionsUpdated(); 2318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) break; 2319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) default: 23217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DisableWallet(wallet::WalletClient::UNKNOWN_ERROR); 23228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return; 2323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 23248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 23258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) view_->UpdateNotificationArea(); 23268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) view_->UpdateButtonStrip(); 23278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) view_->UpdateOverlay(); 2328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AutofillDialogControllerImpl::OnPassiveSigninSuccess() { 2331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FetchWalletCookie(); 2332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::OnPassiveSigninFailure( 2335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GoogleServiceAuthError& error) { 23364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) signin_helper_.reset(); 2337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) passive_failed_ = true; 2338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2339f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (handling_use_wallet_link_click_ || 2340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetWalletClient()->user_index() != 0) { 2341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(estade): When a secondary account is selected and fails passive 2342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // auth, we show a sign in page. Currently we show the generic add account 2343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // page, but we should instead show sign in for the selected account. 2344f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // http://crbug.com/323327 2345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SignInLinkClicked(); 2346f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) handling_use_wallet_link_click_ = false; 2347f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 2348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) OnWalletSigninError(); 2350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 23527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AutofillDialogControllerImpl::OnDidFetchWalletCookieValue( 23537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& cookie_value) { 23547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch wallet_cookie_value_ = cookie_value; 23557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch signin_helper_.reset(); 23567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetWalletItems(); 23572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidGetWalletItems( 23602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<wallet::WalletItems> wallet_items) { 2361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) legal_documents_text_.clear(); 2362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) legal_document_link_ranges_.clear(); 236390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) has_accepted_legal_documents_ = false; 23642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wallet_items_ = wallet_items.Pass(); 2366f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (wallet_items_ && !wallet_items_->ObfuscatedGaiaId().empty()) { 2368f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Making sure the user index is in sync shouldn't be necessary, but is an 2369f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // extra precaution. But if there is no active account (such as in the 2370f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // PASSIVE_AUTH case), stick with the old active account. 2371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetWalletClient()->set_user_index(wallet_items_->active_account_index()); 2372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<std::string> usernames; 2374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (size_t i = 0; i < wallet_items_->gaia_accounts().size(); ++i) { 2375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) usernames.push_back(wallet_items_->gaia_accounts()[i]->email_address()); 2376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 2377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_->SetWalletAccounts( 2378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) usernames, wallet_items_->active_account_index()); 2379f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 2380f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 23811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ConstructLegalDocumentsText(); 23820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) OnWalletOrSigninUpdate(); 23832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2385ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid AutofillDialogControllerImpl::OnDidSaveToWallet( 23862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& instrument_id, 2387ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::string& address_id, 23887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::vector<wallet::RequiredAction>& required_actions, 23897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::vector<wallet::FormFieldError>& form_field_errors) { 2390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(is_submitting_ && IsPayingWithWallet()); 2391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2392a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (required_actions.empty()) { 2393ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!address_id.empty()) 2394ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch active_address_id_ = address_id; 2395ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!instrument_id.empty()) 2396ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch active_instrument_id_ = instrument_id; 2397ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch GetFullWallet(); 2398a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } else { 23997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) OnWalletFormFieldError(form_field_errors); 2400a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) HandleSaveOrUpdateRequiredActions(required_actions); 2401a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 24022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnWalletError( 24052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallet::WalletClient::ErrorType error_type) { 24067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DisableWallet(error_type); 24072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 24102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// PersonalDataManagerObserver implementation. 24112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnPersonalDataChanged() { 241390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (is_submitting_) 241490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 241590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionsUpdated(); 24172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// AccountChooserModelDelegate implementation. 2421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AutofillDialogControllerImpl::AccountChooserWillShow() { 24234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) HidePopup(); 24244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 24254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 24262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::AccountChoiceChanged() { 24273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 24284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallet::WalletClient* client = GetWalletClient(); 24293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (is_submitting_) 24314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) client->CancelRequests(); 2432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetIsSubmitting(false); 2434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) size_t selected_user_index = 2436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_->GetActiveWalletAccountIndex(); 2437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (account_chooser_model_->WalletIsSelected() && 24384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) client->user_index() != selected_user_index) { 24394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) client->set_user_index(selected_user_index); 2440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Clear |wallet_items_| so we don't try to restore the selected instrument 2441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // and address. 2442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) wallet_items_.reset(); 24434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GetWalletItems(); 24444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 24454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SuggestionsUpdated(); 24464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateAccountChooserView(); 24474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 24492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AutofillDialogControllerImpl::AddAccount() { 2451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SignInLinkClicked(); 2452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::UpdateAccountChooserView() { 2455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (view_) { 24563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 2457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->UpdateAccountChooser(); 2458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->UpdateNotificationArea(); 24592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 24632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::HandleKeyPressEventInInput( 24652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NativeWebKeyboardEvent& event) { 2466868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (popup_controller_.get()) 24672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return popup_controller_->HandleKeyPressEvent(event); 24682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 24702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::RequestingCreditCardInfo() const { 24732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_GT(form_structure_.field_count(), 0U); 24742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < form_structure_.field_count(); ++i) { 2476bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch AutofillType type = form_structure_.field(i)->Type(); 2477ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (common::IsCreditCardType(type.GetStorableType())) 24782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 24792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 24822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::TransmissionWillBeSecure() const { 2485424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return source_url_.SchemeIs(content::kHttpsScheme); 24862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool AutofillDialogControllerImpl::IsSubmitPausedOn( 24898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) wallet::RequiredAction required_action) const { 24908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return full_wallet_ && full_wallet_->HasRequiredAction(required_action); 24918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 24928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2493ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerImpl::ShowNewCreditCardBubble( 2494ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<CreditCard> new_card, 2495ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<AutofillProfile> billing_profile) { 2496ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if !defined(OS_ANDROID) 24970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) NewCreditCardBubbleController::Show(web_contents(), 2498ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new_card.Pass(), 2499ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch billing_profile.Pass()); 2500ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif 2501ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 2502ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 250358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::SubmitButtonDelayBegin() { 250458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) submit_button_delay_timer_.Start( 250558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FROM_HERE, 250658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(kSubmitButtonDelayMs), 250758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) this, 250858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &AutofillDialogControllerImpl::OnSubmitButtonDelayEnd); 250958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 251058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 251158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::SubmitButtonDelayEndForTesting() { 251258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(submit_button_delay_timer_.IsRunning()); 251358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) submit_button_delay_timer_.user_task().Run(); 251458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) submit_button_delay_timer_.Stop(); 251558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 251658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 25174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AutofillDialogControllerImpl:: 25184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ClearLastWalletItemsFetchTimestampForTesting() { 25194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) last_wallet_items_fetch_timestamp_ = base::TimeTicks(); 25204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 25214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)AccountChooserModel* AutofillDialogControllerImpl:: 2523f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AccountChooserModelForTesting() { 2524a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return account_chooser_model_.get(); 25251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 25261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2527f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool AutofillDialogControllerImpl::IsSignInContinueUrl( 2528f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GURL& url, 2529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) size_t* user_index) const { 2530f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return wallet::IsSignInContinueUrl(url, user_index); 25311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 25321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)AutofillDialogControllerImpl::AutofillDialogControllerImpl( 2534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::WebContents* contents, 2535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const FormData& form_structure, 2536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL& source_url, 2537d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::Callback<void(const FormStructure*)>& callback) 2538bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch : WebContentsObserver(contents), 2539bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch profile_(Profile::FromBrowserContext(contents->GetBrowserContext())), 2540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) initial_user_state_(AutofillMetrics::DIALOG_USER_STATE_UNKNOWN), 254158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) form_structure_(form_structure), 2542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) invoked_from_same_origin_(true), 2543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_url_(source_url), 2544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback_(callback), 25454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallet_client_(profile_->GetRequestContext(), this, source_url), 25460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) wallet_items_requested_(false), 25470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) handling_use_wallet_link_click_(false), 2548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) passive_failed_(false), 25490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) country_combobox_model_(*GetManager()), 2550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_cc_(this), 2551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_billing_(this), 2552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_cc_billing_(this), 2553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_shipping_(this), 2554868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) cares_about_shipping_(true), 2555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) input_showing_popup_(NULL), 2556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) weak_ptr_factory_(this), 25574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) waiting_for_explicit_sign_in_response_(false), 255890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) has_accepted_legal_documents_(false), 2559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_submitting_(false), 2560868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) choose_another_instrument_or_address_(false), 25617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) wallet_server_validation_recoverable_(true), 2562bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch data_was_passed_back_(false), 2563ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch was_ui_latency_logged_(false), 256458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) card_generated_animation_(2000, 60, this) { 2565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(estade): remove duplicates from |form_structure|? 2566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!callback_.is_null()); 2567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutofillDialogView* AutofillDialogControllerImpl::CreateView() { 25702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return AutofillDialogView::Create(this); 25712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2573a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)PersonalDataManager* AutofillDialogControllerImpl::GetManager() const { 25742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PersonalDataManagerFactory::GetForProfile(profile_); 25752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2577f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const wallet::WalletClient* AutofillDialogControllerImpl::GetWalletClient() 2578f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const { 2579f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return const_cast<AutofillDialogControllerImpl*>(this)->GetWalletClient(); 2580f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2581f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 25822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)wallet::WalletClient* AutofillDialogControllerImpl::GetWalletClient() { 25832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &wallet_client_; 25842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::IsPayingWithWallet() const { 2587a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return account_chooser_model_->WalletIsSelected() && 2588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SignedInState() == SIGNED_IN; 25892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 259190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AutofillDialogControllerImpl::LoadRiskFingerprintData() { 259290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) risk_data_.clear(); 259390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 259490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint64 obfuscated_gaia_id = 0; 2595a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool success = base::StringToUint64(wallet_items_->ObfuscatedGaiaId(), 259690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &obfuscated_gaia_id); 259790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(success); 259890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 259990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect window_bounds; 260090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) window_bounds = GetBaseWindowForWebContents(web_contents())->GetBounds(); 260190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 260290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PrefService* user_prefs = profile_->GetPrefs(); 260390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string charset = user_prefs->GetString(::prefs::kDefaultCharset); 260490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string accept_languages = 260590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_prefs->GetString(::prefs::kAcceptLanguages); 260690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Time install_time = base::Time::FromTimeT( 260790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) g_browser_process->local_state()->GetInt64(::prefs::kInstallDate)); 260890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 260990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) risk::GetFingerprint( 261090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) obfuscated_gaia_id, window_bounds, *web_contents(), 261190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::VersionInfo().Version(), charset, accept_languages, install_time, 261258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) g_browser_process->GetApplicationLocale(), 261390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&AutofillDialogControllerImpl::OnDidLoadRiskFingerprintData, 261490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 261590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 261690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 261790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidLoadRiskFingerprintData( 261890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<risk::Fingerprint> fingerprint) { 261990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(AreLegalDocumentsCurrent()); 262090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 262190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string proto_data; 262290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fingerprint->SerializeToString(&proto_data); 2623a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Base64Encode(proto_data, &risk_data_); 262490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2625eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SubmitWithWallet(); 262690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 262790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::OpenTabWithUrl(const GURL& url) { 2629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::NavigateParams params( 2630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::FindBrowserWithWebContents(web_contents()), 2631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url, 2632f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::PAGE_TRANSITION_LINK); 2633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.disposition = NEW_FOREGROUND_TAB; 2634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::Navigate(¶ms); 26352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 26362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2637eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AutofillDialogControllerImpl::IsEditingExistingData( 2638eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DialogSection section) const { 2639eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return section_editing_state_.count(section) > 0; 2640eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 2641eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2642eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AutofillDialogControllerImpl::IsManuallyEditingSection( 2643eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DialogSection section) const { 2644eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return IsEditingExistingData(section) || 2645eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SuggestionsMenuModelForSection(section)-> 2646eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetItemKeyForCheckedItem() == kAddNewItemKey; 2647eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 2648eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2649868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void AutofillDialogControllerImpl::OnWalletSigninError() { 2650a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_->SetHadWalletSigninError(); 2651868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetWalletClient()->CancelRequests(); 2652868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LogDialogLatencyToShow(); 2653868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 2654868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 26557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void AutofillDialogControllerImpl::DisableWallet( 26567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) wallet::WalletClient::ErrorType error_type) { 2657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) signin_helper_.reset(); 2658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wallet_items_.reset(); 26597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) wallet_errors_.clear(); 266090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetWalletClient()->CancelRequests(); 2661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetIsSubmitting(false); 266258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) wallet_error_notification_ = GetWalletError(error_type); 2663a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_->SetHadWalletError(); 26642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 26652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::SuggestionsUpdated() { 26673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 26683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2669f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const FieldValueMap snapshot = TakeUserInputSnapshot(); 2670eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 26712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_cc_.Reset(); 26722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_billing_.Reset(); 26732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_cc_billing_.Reset(); 26742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_shipping_.Reset(); 2675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HidePopup(); 2676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_shipping_.AddKeyedItem( 2678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kSameAsBillingKey, 2679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_USE_BILLING_FOR_SHIPPING)); 26802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsPayingWithWallet()) { 2682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::vector<wallet::Address*>& addresses = 2683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wallet_items_->addresses(); 2684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < addresses.size(); ++i) { 2685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string key = base::IntToString(i); 268658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) suggested_shipping_.AddKeyedItemWithMinorText( 2687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) key, 2688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) addresses[i]->DisplayName(), 2689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) addresses[i]->DisplayNameDetail()); 2690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 269158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const std::string default_shipping_address_id = 269258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetIdToSelect(wallet_items_->default_address_id(), 269358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previous_default_shipping_address_id_, 269458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previously_selected_shipping_address_id_); 269558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch if (addresses[i]->object_id() == default_shipping_address_id) 2696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_shipping_.SetCheckedItem(key); 2697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 26982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!IsSubmitPausedOn(wallet::VERIFY_CVV)) { 27002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<wallet::WalletItems::MaskedInstrument*>& instruments = 27012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallet_items_->instruments(); 270290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string first_active_instrument_key; 270390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string default_instrument_key; 27042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < instruments.size(); ++i) { 270590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool allowed = IsInstrumentAllowed(*instruments[i]); 270690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Image icon = instruments[i]->CardIcon(); 270790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!allowed && !icon.IsEmpty()) { 270890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Create a grayed disabled icon. 270990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SkBitmap disabled_bitmap = SkBitmapOperations::CreateHSLShiftedBitmap( 271090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) *icon.ToSkBitmap(), kGrayImageShift); 271190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) icon = gfx::Image( 271290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::ImageSkia::CreateFrom1xBitmap(disabled_bitmap)); 271390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 2714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string key = base::IntToString(i); 271558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) suggested_cc_billing_.AddKeyedItemWithMinorTextAndIcon( 2716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) key, 27172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instruments[i]->DisplayName(), 27182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instruments[i]->DisplayNameDetail(), 271990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) icon); 272090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_cc_billing_.SetEnabled(key, allowed); 272190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 272290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (allowed) { 272390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (first_active_instrument_key.empty()) 272490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) first_active_instrument_key = key; 272558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 272658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const std::string default_instrument_id = 272758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetIdToSelect(wallet_items_->default_instrument_id(), 272858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previous_default_instrument_id_, 272958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previously_selected_instrument_id_); 273058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch if (instruments[i]->object_id() == default_instrument_id) 273190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) default_instrument_key = key; 2732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 27332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 27342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_cc_billing_.AddKeyedItem( 2736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kAddNewItemKey, 2737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_ADD_BILLING_DETAILS)); 273890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!wallet_items_->HasRequiredAction(wallet::SETUP_WALLET)) { 273958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) suggested_cc_billing_.AddKeyedItemWithMinorText( 274090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kManageItemsKey, 274190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) l10n_util::GetStringUTF16( 27427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDS_AUTOFILL_DIALOG_MANAGE_BILLING_DETAILS), 27434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UTF8ToUTF16(wallet::GetManageInstrumentsUrl(0U).host())); 274490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 274590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 274690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Determine which instrument item should be selected. 274790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!default_instrument_key.empty()) 274890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_cc_billing_.SetCheckedItem(default_instrument_key); 274990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) else if (!first_active_instrument_key.empty()) 275090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_cc_billing_.SetCheckedItem(first_active_instrument_key); 275190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) else 275290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_cc_billing_.SetCheckedItem(kAddNewItemKey); 2753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 27542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 27552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PersonalDataManager* manager = GetManager(); 2756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::vector<CreditCard*>& cards = manager->GetCreditCards(); 27572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 27582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < cards.size(); ++i) { 275990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!HasCompleteAndVerifiedData(*cards[i], requested_cc_fields_)) 276090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) continue; 276190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 27622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_cc_.AddKeyedItemWithIcon( 27632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cards[i]->guid(), 27642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cards[i]->Label(), 27657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) rb.GetImageNamed(CreditCard::IconResourceId(cards[i]->type()))); 27662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 27672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<AutofillProfile*>& profiles = manager->GetProfiles(); 2769f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<base::string16> labels; 2770f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AutofillProfile::CreateDifferentiatingLabels(profiles, &labels); 2771f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK_EQ(labels.size(), profiles.size()); 2772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string app_locale = g_browser_process->GetApplicationLocale(); 27732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < profiles.size(); ++i) { 277458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const AutofillProfile& profile = *profiles[i]; 277558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!HasCompleteAndVerifiedData(profile, requested_shipping_fields_) || 2776eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HasInvalidAddress(*profiles[i])) { 27772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 2778eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 27792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 278058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Don't add variants for addresses: name is part of credit card and we'll 278158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // just ignore email and phone number variants. 2782f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) suggested_shipping_.AddKeyedItem(profile.guid(), labels[i]); 278358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!profile.GetRawInfo(EMAIL_ADDRESS).empty() && 278458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) !profile.IsPresentButInvalid(EMAIL_ADDRESS)) { 2785f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) suggested_billing_.AddKeyedItem(profile.guid(), labels[i]); 27862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 27872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 27882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_cc_.AddKeyedItem( 2790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kAddNewItemKey, 27912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_ADD_CREDIT_CARD)); 2792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_cc_.AddKeyedItem( 2793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kManageItemsKey, 2794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_MANAGE_CREDIT_CARD)); 27952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_billing_.AddKeyedItem( 2796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kAddNewItemKey, 27972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_ADD_BILLING_ADDRESS)); 2798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_billing_.AddKeyedItem( 2799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kManageItemsKey, 2800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_MANAGE_BILLING_ADDRESS)); 28012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 28022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_shipping_.AddKeyedItem( 2804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kAddNewItemKey, 28052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_ADD_SHIPPING_ADDRESS)); 28067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!IsPayingWithWallet()) { 280790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_shipping_.AddKeyedItem( 280890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kManageItemsKey, 280990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_MANAGE_SHIPPING_ADDRESS)); 28107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else if (!wallet_items_->HasRequiredAction(wallet::SETUP_WALLET)) { 281158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) suggested_shipping_.AddKeyedItemWithMinorText( 28127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch kManageItemsKey, 28137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_MANAGE_SHIPPING_ADDRESS), 28144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UTF8ToUTF16(wallet::GetManageAddressesUrl(0U).host())); 281590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 2816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!IsPayingWithWallet()) { 281890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 281990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DialogSection section = static_cast<DialogSection>(i); 282090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!SectionIsActive(section)) 282190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) continue; 282290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 282390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Set the starting choice for the menu. First set to the default in case 282490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // the GUID saved in prefs refers to a profile that no longer exists. 282590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string guid; 2826d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetDefaultAutofillChoice(section, &guid); 282790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 2828d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) model->SetCheckedItem(guid); 2829d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (GetAutofillChoice(section, &guid)) 2830d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) model->SetCheckedItem(guid); 283190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 2832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (view_) 2835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->ModelChanged(); 2836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2837eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 2838eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ResetSectionInput(static_cast<DialogSection>(i)); 2839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2840eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2841eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RestoreUserInputFromSnapshot(snapshot); 2842eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2843eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 2844eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DialogSection section = static_cast<DialogSection>(i); 28454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!SectionIsActive(section)) 28464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) continue; 28474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2848eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ShowEditUiIfBadSuggestion(section); 2849eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateSection(section); 2850eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2851eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2852eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateForErrors(); 28532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 28542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::FillOutputForSectionWithComparator( 28562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialogSection section, 28572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const InputFieldComparator& compare) { 2858868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const DetailInputs& inputs = RequestedFieldsForSection(section); 2859868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 28602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!SectionIsActive(section)) 28612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 28622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section); 28642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (wrapper) { 28652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only fill in data that is associated with this section. 28662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DetailInputs& inputs = RequestedFieldsForSection(section); 28672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wrapper->FillFormStructure(inputs, compare, &form_structure_); 28682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // CVC needs special-casing because the CreditCard class doesn't store or 28702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // handle them. This isn't necessary when filling the combined CC and 28712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // billing section as CVC comes from |full_wallet_| in this case. 28722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (section == SECTION_CC) 287358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SetOutputForFieldsOfType(CREDIT_CARD_VERIFICATION_CODE, view_->GetCvc()); 287458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 287558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // When filling from Wallet data, use the email address associated with the 287658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // account. There is no other email address stored as part of a Wallet 287758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // address. 287858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (section == SECTION_CC_BILLING) { 287958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SetOutputForFieldsOfType( 2880a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EMAIL_ADDRESS, account_chooser_model_->GetActiveWalletAccountName()); 288158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 28822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 28832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The user manually input data. If using Autofill, save the info as new or 28842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // edited data. Always fill local data into |form_structure_|. 2885f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldValueMap output; 28862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->GetUserInput(section, &output); 28872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (section == SECTION_CC) { 28892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreditCard card; 289090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) card.set_origin(kAutofillDialogOrigin); 28912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillFormGroupFromOutputs(output, &card); 28922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The card holder name comes from the billing address section. 28947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch card.SetRawInfo(CREDIT_CARD_NAME, 28954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GetValueFromSection(SECTION_BILLING, NAME_BILLING_FULL)); 28967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 28977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (ShouldSaveDetailsLocally()) { 2898d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string guid = GetManager()->SaveImportedCreditCard(card); 2899d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) newly_saved_data_model_guids_[section] = guid; 29007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(!profile()->IsOffTheRecord()); 29017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch newly_saved_card_.reset(new CreditCard(card)); 29027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 29032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2904868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AutofillCreditCardWrapper card_wrapper(&card); 2905868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) card_wrapper.FillFormStructure(inputs, compare, &form_structure_); 29062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Again, CVC needs special-casing. Fill it in directly from |output|. 290858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SetOutputForFieldsOfType( 290958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CREDIT_CARD_VERIFICATION_CODE, 2910f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) output[CREDIT_CARD_VERIFICATION_CODE]); 29112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 29122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillProfile profile; 291390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) profile.set_origin(kAutofillDialogOrigin); 29142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillFormGroupFromOutputs(output, &profile); 29152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2916d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (ShouldSaveDetailsLocally()) { 2917d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string guid = GetManager()->SaveImportedProfile(profile); 2918d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) newly_saved_data_model_guids_[section] = guid; 2919d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 29202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2921d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) AutofillProfileWrapper profile_wrapper(&profile); 2922868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) profile_wrapper.FillFormStructure(inputs, compare, &form_structure_); 29232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::FillOutputForSection(DialogSection section) { 29287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FillOutputForSectionWithComparator( 2929ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch section, base::Bind(common::DetailInputMatchesField, section)); 29302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2932868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool AutofillDialogControllerImpl::FormStructureCaresAboutSection( 2933868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DialogSection section) const { 2934868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // For now, only SECTION_SHIPPING may be omitted due to a site not asking for 2935868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // any of the fields. 2936a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (section == SECTION_SHIPPING) 2937868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return cares_about_shipping_; 2938868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2939868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 29402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 294258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::SetOutputForFieldsOfType( 294358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ServerFieldType type, 294458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const base::string16& output) { 29452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < form_structure_.field_count(); ++i) { 29462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillField* field = form_structure_.field(i); 294758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (field->Type().GetStorableType() == type) 294858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) field->value = output; 29492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2952a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::GetValueFromSection( 295390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DialogSection section, 29543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ServerFieldType type) { 295590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(SectionIsActive(section)); 295690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 295790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section); 295890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (wrapper) 29593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return wrapper->GetInfo(AutofillType(type)); 2960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2961f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldValueMap output; 296290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) view_->GetUserInput(section, &output); 2963f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return output[type]; 296490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 296590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 29662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SuggestionsMenuModel* AutofillDialogControllerImpl:: 29672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SuggestionsMenuModelForSection(DialogSection section) { 29682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (section) { 29692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_CC: 29702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &suggested_cc_; 29712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_BILLING: 29722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &suggested_billing_; 29732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_SHIPPING: 29742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &suggested_shipping_; 29752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_CC_BILLING: 29762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &suggested_cc_billing_; 29772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 29802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 29812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const SuggestionsMenuModel* AutofillDialogControllerImpl:: 2984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionsMenuModelForSection(DialogSection section) const { 2985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return const_cast<AutofillDialogControllerImpl*>(this)-> 2986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionsMenuModelForSection(section); 2987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 29892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DialogSection AutofillDialogControllerImpl::SectionForSuggestionsMenuModel( 29902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SuggestionsMenuModel& model) { 29912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (&model == &suggested_cc_) 29922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SECTION_CC; 29932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (&model == &suggested_billing_) 29952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SECTION_BILLING; 29962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (&model == &suggested_cc_billing_) 29982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SECTION_CC_BILLING; 29992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(&model, &suggested_shipping_); 30012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SECTION_SHIPPING; 30022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DetailInputs* AutofillDialogControllerImpl::MutableRequestedFieldsForSection( 30052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialogSection section) { 30062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return const_cast<DetailInputs*>(&RequestedFieldsForSection(section)); 30072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::HidePopup() { 3010868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (popup_controller_.get()) 30112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_controller_->Hide(); 3012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) input_showing_popup_ = NULL; 30132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3015868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void AutofillDialogControllerImpl::SetEditingExistingData( 3016868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DialogSection section, bool editing) { 3017868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (editing) 3018868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) section_editing_state_.insert(section); 3019868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) else 3020868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) section_editing_state_.erase(section); 3021868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3022868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::IsASuggestionItemKey( 3024868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& key) const { 3025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return !key.empty() && 3026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) key != kAddNewItemKey && 3027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) key != kManageItemsKey && 3028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) key != kSameAsBillingKey; 3029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 30302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::IsManuallyEditingAnySection() const { 3032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t section = SECTION_MIN; section <= SECTION_MAX; ++section) { 3033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsManuallyEditingSection(static_cast<DialogSection>(section))) 3034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 3035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 30362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 30372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::CreditCardNumberValidityMessage( 30407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::string16& number) const { 30417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!number.empty() && !autofill::IsValidCreditCardNumber(number)) { 30427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return l10n_util::GetStringUTF16( 30437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_NUMBER); 30447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 30457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 30461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::string16 message; 30471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (IsPayingWithWallet() && !wallet_items_->SupportsCard(number, &message)) 30481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return message; 30497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 30507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Card number is good and supported. 30517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return base::string16(); 30527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 30537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 30547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool AutofillDialogControllerImpl::AllSectionsAreValid() { 3055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t section = SECTION_MIN; section <= SECTION_MAX; ++section) { 3056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!SectionIsValid(static_cast<DialogSection>(section))) 3057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 3058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 3060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::SectionIsValid( 30637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogSection section) { 3064c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!IsManuallyEditingSection(section)) 3065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 3066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3067f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldValueMap detail_outputs; 3068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->GetUserInput(section, &detail_outputs); 30694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return !InputsAreValid(section, detail_outputs).HasSureErrors(); 3070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3072868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool AutofillDialogControllerImpl::IsCreditCardExpirationValid( 3073868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::string16& year, 3074868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::string16& month) const { 3075868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // If the expiration is in the past as per the local clock, it's invalid. 3076868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Time now = base::Time::Now(); 3077868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!autofill::IsValidCreditCardExpirationDate(year, month, now)) 3078868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 3079868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3080868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (IsPayingWithWallet() && IsEditingExistingData(SECTION_CC_BILLING)) { 3081868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const wallet::WalletItems::MaskedInstrument* instrument = 3082868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ActiveInstrument(); 3083868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& locale = g_browser_process->GetApplicationLocale(); 3084868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int month_int; 3085868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (base::StringToInt(month, &month_int) && 3086868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) instrument->status() == 3087868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) wallet::WalletItems::MaskedInstrument::EXPIRED && 30883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch year == 30893240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch instrument->GetInfo( 30903240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch AutofillType(CREDIT_CARD_EXP_4_DIGIT_YEAR), locale) && 3091868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) month_int == instrument->expiration_month()) { 3092868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Otherwise, if the user is editing an instrument that's deemed expired 3093868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // by the Online Wallet server, mark it invalid on selection. 3094868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 3095868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3096868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3097868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3098868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 3099868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldUseBillingForShipping() { 3102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return SectionIsActive(SECTION_SHIPPING) && 3103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) suggested_shipping_.GetItemKeyForCheckedItem() == kSameAsBillingKey; 3104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 31062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldSaveDetailsLocally() { 31072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // It's possible that the user checked [X] Save details locally before 31082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // switching payment methods, so only ask the view whether to save details 31092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // locally if that checkbox is showing (currently if not paying with wallet). 3110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Also, if the user isn't editing any sections, there's no data to save 3111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // locally. 3112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return ShouldOfferToSaveInChrome() && view_->SaveDetailsLocally(); 3113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::SetIsSubmitting(bool submitting) { 3116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_submitting_ = submitting; 3117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 311890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!submitting) 311990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) full_wallet_.reset(); 312090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (view_) { 31223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 3123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->UpdateButtonStrip(); 312458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) view_->UpdateOverlay(); 3125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->UpdateNotificationArea(); 3126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 31272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool AutofillDialogControllerImpl::AreLegalDocumentsCurrent() const { 313090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return has_accepted_legal_documents_ || 313190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) (wallet_items_ && wallet_items_->legal_documents().empty()); 313290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 313390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 31340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void AutofillDialogControllerImpl::AcceptLegalTerms() { 313590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::BrowserThread::PostTask( 3136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::BrowserThread::IO, FROM_HERE, 3137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&UserDidOptIntoLocationServices)); 31380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PrefService* local_state = g_browser_process->local_state(); 31390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ListPrefUpdate accepted( 31400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) local_state, ::prefs::kAutofillDialogWalletLocationAcceptance); 31410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) accepted->AppendIfNotPresent(new base::StringValue( 3142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_->GetActiveWalletAccountName())); 314390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3144d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (AreLegalDocumentsCurrent()) { 314590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LoadRiskFingerprintData(); 3146d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } else { 3147d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetWalletClient()->AcceptLegalDocuments( 3148d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) wallet_items_->legal_documents(), 31494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallet_items_->google_transaction_id()); 3150d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 3151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 3152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::SubmitWithWallet() { 3154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch active_instrument_id_.clear(); 3155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch active_address_id_.clear(); 3156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch full_wallet_.reset(); 315790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const wallet::WalletItems::MaskedInstrument* active_instrument = 3159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ActiveInstrument(); 3160a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!IsManuallyEditingSection(SECTION_CC_BILLING)) { 3161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) active_instrument_id_ = active_instrument->object_id(); 3162a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DCHECK(!active_instrument_id_.empty()); 3163a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 31642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const wallet::Address* active_address = ActiveShippingAddress(); 3166a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!IsManuallyEditingSection(SECTION_SHIPPING) && 3167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) !ShouldUseBillingForShipping() && 3168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) IsShippingAddressRequired()) { 3169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) active_address_id_ = active_address->object_id(); 3170a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DCHECK(!active_address_id_.empty()); 31712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 31722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3173a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_ptr<wallet::Instrument> inputted_instrument = 3174a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) CreateTransientInstrument(); 3175ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (inputted_instrument && IsEditingExistingData(SECTION_CC_BILLING)) { 3176ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch inputted_instrument->set_object_id(active_instrument->object_id()); 3177ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DCHECK(!inputted_instrument->object_id().empty()); 3178ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 31792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3180a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_ptr<wallet::Address> inputted_address; 3181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (active_address_id_.empty() && IsShippingAddressRequired()) { 3182a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (ShouldUseBillingForShipping()) { 318390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const wallet::Address& address = inputted_instrument ? 3184ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch *inputted_instrument->address() : active_instrument->address(); 318590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Try to find an exact matched shipping address and use it for shipping, 318690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // otherwise save it as a new shipping address. http://crbug.com/225442 318790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const wallet::Address* duplicated_address = 318890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) FindDuplicateAddress(wallet_items_->addresses(), address); 318990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (duplicated_address) { 319090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) active_address_id_ = duplicated_address->object_id(); 319190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!active_address_id_.empty()); 319290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 319390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) inputted_address.reset(new wallet::Address(address)); 319490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(inputted_address->object_id().empty()); 319590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 3196a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } else { 3197a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) inputted_address = CreateTransientAddress(); 3198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (IsEditingExistingData(SECTION_SHIPPING)) { 3199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) inputted_address->set_object_id(active_address->object_id()); 3200a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DCHECK(!inputted_address->object_id().empty()); 3201a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 32022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 32032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 32042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 320590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // If there's neither an address nor instrument to save, |GetFullWallet()| 320690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // is called when the risk fingerprint is loaded. 3207a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!active_instrument_id_.empty() && 3208a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) (!active_address_id_.empty() || !IsShippingAddressRequired())) { 3209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetFullWallet(); 321090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 3211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 321290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3213ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch GetWalletClient()->SaveToWallet(inputted_instrument.Pass(), 32144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) inputted_address.Pass()); 32152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 32162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3217a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)scoped_ptr<wallet::Instrument> AutofillDialogControllerImpl:: 3218a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) CreateTransientInstrument() { 3219a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!active_instrument_id_.empty()) 3220a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return scoped_ptr<wallet::Instrument>(); 3221a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 3222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldValueMap output; 3223a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) view_->GetUserInput(SECTION_CC_BILLING, &output); 3224a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 3225a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) CreditCard card; 3226a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) AutofillProfile profile; 3227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 cvc; 3228a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) GetBillingInfoFromOutputs(output, &card, &cvc, &profile); 3229a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 3230a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return scoped_ptr<wallet::Instrument>( 3231a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) new wallet::Instrument(card, cvc, profile)); 3232a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 3233a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 3234a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)scoped_ptr<wallet::Address>AutofillDialogControllerImpl:: 3235a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) CreateTransientAddress() { 3236a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // If not using billing for shipping, just scrape the view. 3237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldValueMap output; 3238a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) view_->GetUserInput(SECTION_SHIPPING, &output); 3239a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 3240a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) AutofillProfile profile; 3241a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FillFormGroupFromOutputs(output, &profile); 3242a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 3243a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return scoped_ptr<wallet::Address>(new wallet::Address(profile)); 3244a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 3245a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 32462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::GetFullWallet() { 3247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(is_submitting_); 32482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(IsPayingWithWallet()); 32492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(wallet_items_); 32502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!active_instrument_id_.empty()); 3251a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(!active_address_id_.empty() || !IsShippingAddressRequired()); 32522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<wallet::WalletClient::RiskCapability> capabilities; 3254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) capabilities.push_back(wallet::WalletClient::VERIFY_CVC); 3255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 32562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetWalletClient()->GetFullWallet(wallet::WalletClient::FullWalletRequest( 32572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_instrument_id_, 32582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_address_id_, 32592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallet_items_->google_transaction_id(), 32603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) capabilities, 32613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) wallet_items_->HasRequiredAction(wallet::SETUP_WALLET))); 32622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 32632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3264a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void AutofillDialogControllerImpl::HandleSaveOrUpdateRequiredActions( 3265a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const std::vector<wallet::RequiredAction>& required_actions) { 3266a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DCHECK(!required_actions.empty()); 3267a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 32684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(ahutter): Investigate if we need to support more generic actions on 32697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // this call such as GAIA_AUTH. See crbug.com/243457. 3270a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) for (std::vector<wallet::RequiredAction>::const_iterator iter = 3271a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) required_actions.begin(); 3272a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) iter != required_actions.end(); ++iter) { 32737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (*iter != wallet::INVALID_FORM_FIELD) { 3274a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // TODO(dbeam): handle this more gracefully. 32757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DisableWallet(wallet::WalletClient::UNKNOWN_ERROR); 3276a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 3277a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 3278a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) SetIsSubmitting(false); 3279a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 3280a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 32812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::FinishSubmit() { 328258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (IsPayingWithWallet()) { 328358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ScopedViewUpdates updates(view_.get()); 328458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) view_->UpdateOverlay(); 328558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 328658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) card_generated_animation_.Start(); 328758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return; 328858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 328958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DoFinishSubmit(); 329058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 329158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 329258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::AnimationProgressed( 3293d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const gfx::Animation* animation) { 329458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK_EQ(animation, &card_generated_animation_); 329558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PushOverlayUpdate(); 329658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 329758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 329858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::AnimationEnded( 3299d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const gfx::Animation* animation) { 330058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK_EQ(animation, &card_generated_animation_); 330158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DoFinishSubmit(); 330258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 330358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 330458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::DoFinishSubmit() { 33052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillOutputForSection(SECTION_CC); 33062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillOutputForSection(SECTION_BILLING); 33072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillOutputForSection(SECTION_CC_BILLING); 3308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 33092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ShouldUseBillingForShipping()) { 33102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillOutputForSectionWithComparator( 33112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SECTION_BILLING, 33122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(DetailInputMatchesShippingField)); 33132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillOutputForSectionWithComparator( 33142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SECTION_CC, 33152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(DetailInputMatchesShippingField)); 3316a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FillOutputForSectionWithComparator( 3317a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) SECTION_CC_BILLING, 3318a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) base::Bind(DetailInputMatchesShippingField)); 33192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 33202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillOutputForSection(SECTION_SHIPPING); 33212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 33222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!IsPayingWithWallet()) { 332490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 332590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DialogSection section = static_cast<DialogSection>(i); 332690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!SectionIsActive(section)) 332790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) continue; 332890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 332990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 333090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string item_key = model->GetItemKeyForCheckedItem(); 333190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (IsASuggestionItemKey(item_key) || item_key == kSameAsBillingKey) { 3332d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PersistAutofillChoice(section, item_key); 3333d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } else if (item_key == kAddNewItemKey && ShouldSaveDetailsLocally()) { 3334d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(newly_saved_data_model_guids_.count(section)); 3335d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PersistAutofillChoice(section, newly_saved_data_model_guids_[section]); 333690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 333790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 333858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 333958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) profile_->GetPrefs()->SetBoolean(::prefs::kAutofillDialogSaveData, 334058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) view_->SaveDetailsLocally()); 334190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 334290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // On a successful submit, if the user manually selected "pay without wallet", 3344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // stop trying to pay with Wallet on future runs of the dialog. On the other 3345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // hand, if there was an error that prevented the user from having the choice 3346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // of using Wallet, leave the pref alone. 334758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!wallet_error_notification_ && 3348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) account_chooser_model_->HasAccountsToChoose()) { 3349868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) profile_->GetPrefs()->SetBoolean( 3350868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ::prefs::kAutofillDialogPayWithoutWallet, 3351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !account_chooser_model_->WalletIsSelected()); 3352868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LogOnFinishSubmitMetrics(); 3355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3356868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Callback should be called as late as possible. 3357d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) callback_.Run(&form_structure_); 3358bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch data_was_passed_back_ = true; 3359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3360868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // This might delete us. 336158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Hide(); 33622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 33632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 336490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AutofillDialogControllerImpl::PersistAutofillChoice( 336590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DialogSection section, 3366d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::string& guid) { 336790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!IsPayingWithWallet()); 336890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue()); 336990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) value->SetString(kGuidPrefKey, guid); 337090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 337190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DictionaryPrefUpdate updater(profile()->GetPrefs(), 337290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ::prefs::kAutofillDialogAutofillDefault); 337390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::DictionaryValue* autofill_choice = updater.Get(); 337490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) autofill_choice->Set(SectionToPrefString(section), value.release()); 337590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 337690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 337790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AutofillDialogControllerImpl::GetDefaultAutofillChoice( 337890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DialogSection section, 3379d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string* guid) { 338090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!IsPayingWithWallet()); 338190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The default choice is the first thing in the menu that is a suggestion 338290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // item. 338390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 338490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (int i = 0; i < model->GetItemCount(); ++i) { 338590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (IsASuggestionItemKey(model->GetItemKeyAt(i))) { 338690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) *guid = model->GetItemKeyAt(i); 338790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 338890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 338990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 339090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 339190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 339290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool AutofillDialogControllerImpl::GetAutofillChoice(DialogSection section, 3393d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string* guid) { 339490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!IsPayingWithWallet()); 339590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const base::DictionaryValue* choices = profile()->GetPrefs()->GetDictionary( 339690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ::prefs::kAutofillDialogAutofillDefault); 339790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!choices) 339890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 339990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 340090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const base::DictionaryValue* choice = NULL; 340190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!choices->GetDictionary(SectionToPrefString(section), &choice)) 340290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 340390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 340490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) choice->GetString(kGuidPrefKey, guid); 340590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return true; 340690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 340790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LogOnFinishSubmitMetrics() { 3409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetMetricLogger().LogDialogUiDuration( 3410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time::Now() - dialog_shown_timestamp_, 3411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillMetrics::DIALOG_ACCEPTED); 3412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 341358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_ACCEPTED); 3414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillMetrics::DialogDismissalState dismissal_state; 3416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!IsManuallyEditingAnySection()) 3417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dismissal_state = AutofillMetrics::DIALOG_ACCEPTED_EXISTING_DATA; 3418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else if (IsPayingWithWallet()) 3419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dismissal_state = AutofillMetrics::DIALOG_ACCEPTED_SAVE_TO_WALLET; 3420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else if (ShouldSaveDetailsLocally()) 3421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dismissal_state = AutofillMetrics::DIALOG_ACCEPTED_SAVE_TO_AUTOFILL; 3422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 3423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dismissal_state = AutofillMetrics::DIALOG_ACCEPTED_NO_SAVE; 3424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 342558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogDismissalState(dismissal_state); 3426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LogOnCancelMetrics() { 342958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_CANCELED); 3430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillMetrics::DialogDismissalState dismissal_state; 3432f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (ShouldShowSignInWebView()) 34337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch dismissal_state = AutofillMetrics::DIALOG_CANCELED_DURING_SIGNIN; 34347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch else if (!IsManuallyEditingAnySection()) 3435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dismissal_state = AutofillMetrics::DIALOG_CANCELED_NO_EDITS; 3436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else if (AllSectionsAreValid()) 3437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dismissal_state = AutofillMetrics::DIALOG_CANCELED_NO_INVALID_FIELDS; 3438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 3439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dismissal_state = AutofillMetrics::DIALOG_CANCELED_WITH_INVALID_FIELDS; 3440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 344158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogDismissalState(dismissal_state); 3442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetMetricLogger().LogDialogUiDuration( 3444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time::Now() - dialog_shown_timestamp_, 3445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillMetrics::DIALOG_CANCELED); 3446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LogSuggestionItemSelectedMetric( 3449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const SuggestionsMenuModel& model) { 3450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DialogSection section = SectionForSuggestionsMenuModel(model); 3451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillMetrics::DialogUiEvent dialog_ui_event; 3453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (model.GetItemKeyForCheckedItem() == kAddNewItemKey) { 3454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Selected to add a new item. 3455ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch dialog_ui_event = common::DialogSectionToUiItemAddedEvent(section); 3456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (IsASuggestionItemKey(model.GetItemKeyForCheckedItem())) { 3457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Selected an existing item. 3458ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch dialog_ui_event = common::DialogSectionToUiSelectionChangedEvent(section); 3459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 3460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(estade): add logging for "Manage items" or "Use billing for 3461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // shipping"? 3462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 3463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 346558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogUiEvent(dialog_ui_event); 3466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LogDialogLatencyToShow() { 3469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (was_ui_latency_logged_) 3470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 3471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetMetricLogger().LogDialogLatencyToShow( 3473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time::Now() - dialog_shown_timestamp_); 3474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) was_ui_latency_logged_ = true; 3475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutofillMetrics::DialogInitialUserStateMetric 34782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillDialogControllerImpl::GetInitialUserState() const { 34792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Consider a user to be an Autofill user if the user has any credit cards 3480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // or addresses saved. Check that the item count is greater than 2 because 3481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // an "empty" menu still has the "add new" menu item and "manage" menu item. 34822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const bool has_autofill_profiles = 3483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_cc_.GetItemCount() > 2 || 3484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_billing_.GetItemCount() > 2; 34852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (SignedInState() != SIGNED_IN) { 34872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Not signed in. 34882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return has_autofill_profiles ? 34892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::DIALOG_USER_NOT_SIGNED_IN_HAS_AUTOFILL : 34902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::DIALOG_USER_NOT_SIGNED_IN_NO_AUTOFILL; 34912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 34922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Signed in. 34942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (wallet_items_->instruments().empty()) { 34952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No Wallet items. 34962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return has_autofill_profiles ? 34972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::DIALOG_USER_SIGNED_IN_NO_WALLET_HAS_AUTOFILL : 34982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::DIALOG_USER_SIGNED_IN_NO_WALLET_NO_AUTOFILL; 34992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 35002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Has Wallet items. 35022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return has_autofill_profiles ? 35032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::DIALOG_USER_SIGNED_IN_HAS_WALLET_HAS_AUTOFILL : 35042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::DIALOG_USER_SIGNED_IN_HAS_WALLET_NO_AUTOFILL; 35052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 35062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AutofillDialogControllerImpl::MaybeShowCreditCardBubble() { 3508bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!data_was_passed_back_) 3509bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return; 3510bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 35117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (newly_saved_card_) { 3512ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<AutofillProfile> billing_profile; 3513ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (IsManuallyEditingSection(SECTION_BILLING)) { 3514ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Scrape the view as the user's entering or updating information. 3515f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FieldValueMap outputs; 3516ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch view_->GetUserInput(SECTION_BILLING, &outputs); 3517ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch billing_profile.reset(new AutofillProfile); 3518ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FillFormGroupFromOutputs(outputs, billing_profile.get()); 3519ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } else { 3520ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Just snag the currently suggested profile. 3521ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string item_key = SuggestionsMenuModelForSection(SECTION_BILLING)-> 3522ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetItemKeyForCheckedItem(); 3523ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillProfile* profile = GetManager()->GetProfileByGUID(item_key); 3524ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch billing_profile.reset(new AutofillProfile(*profile)); 3525ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 3526ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 3527ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ShowNewCreditCardBubble(newly_saved_card_.Pass(), 3528ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch billing_profile.Pass()); 35297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 35307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 35317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3532a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!full_wallet_ || !full_wallet_->billing_address()) 3533a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 3534a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3535ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if !defined(OS_ANDROID) 3536ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GeneratedCreditCardBubbleController::Show( 3537ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch web_contents(), 3538424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) full_wallet_->TypeAndLastFourDigits(), 35398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) backing_card_last_four_); 3540ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif 35417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 35427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 354358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::OnSubmitButtonDelayEnd() { 354458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!view_) 354558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return; 354658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ScopedViewUpdates updates(view_.get()); 354758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) view_->UpdateButtonStrip(); 354858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 354958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3550f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AutofillDialogControllerImpl::FetchWalletCookie() { 35514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::URLRequestContextGetter* request_context = profile_->GetRequestContext(); 35524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) signin_helper_.reset(new wallet::WalletSigninHelper(this, request_context)); 35534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) signin_helper_->StartWalletCookieValueFetch(); 35544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 35554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 35562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace autofill 3557