autofill_dialog_controller_impl.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
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" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h" 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/rand_util.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h" 247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h" 25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/autofill/personal_data_manager_factory.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/browser_process.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/autofill/autofill_dialog_common.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/autofill/autofill_dialog_view.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/autofill/data_model_wrapper.h" 33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if !defined(OS_ANDROID) 34ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/autofill/generated_credit_card_bubble_controller.h" 35ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/ui/autofill/new_credit_card_bubble_controller.h" 36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h" 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_version_info.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h" 43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/common/render_messages.h" 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/url_constants.h" 45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/risk/fingerprint.h" 46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/risk/proto/fingerprint.pb.h" 477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/content/browser/wallet/form_field_error.h" 48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/full_wallet.h" 49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/instrument.h" 50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/wallet_address.h" 51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/wallet_items.h" 52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/wallet_service_url.h" 53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/browser/wallet/wallet_signin_helper.h" 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_country.h" 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_data_model.h" 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_manager.h" 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_type.h" 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/personal_data_manager.h" 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/phone_number_i18n.h" 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/validation.h" 617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_data.h" 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/user_prefs/pref_registry_syncable.h" 6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/geolocation_provider.h" 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_controller.h" 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_details.h" 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_entry.h" 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_service.h" 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_types.h" 70ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/browser/render_view_host.h" 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h" 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_view.h" 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/url_constants.h" 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/chromium_strings.h" 757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "grit/component_strings.h" 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/generated_resources.h" 77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "grit/platform_locale_settings.h" 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/theme_resources.h" 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/webkit_resources.h" 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/cert_status_flags.h" 8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/base/base_window.h" 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/models/combobox_model.h" 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/canvas.h" 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/image/image_skia_operations.h" 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/skia_util.h" 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace autofill { 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kAddNewItemKey[] = "add-new-item"; 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kManageItemsKey[] = "manage-items"; 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kSameAsBillingKey[] = "same-as-billing"; 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// URLs for Wallet error messages. 9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kBuyerLegalAddressStatusUrl[] = 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) "https://wallet.google.com/manage/settings"; 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kKnowYourCustomerStatusUrl[] = "https://wallet.google.com/kyc"; 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Keys for the kAutofillDialogAutofillDefault pref dictionary (do not change 10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// these values). 10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char kGuidPrefKey[] = "guid"; 10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This string is stored along with saved addresses and credit cards in the 10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// WebDB, and hence should not be modified, so that it remains consistent over 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// time. 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char kAutofillDialogOrigin[] = "Chrome Autofill dialog"; 11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// HSL shift to gray out an image. 11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const color_utils::HSL kGrayImageShift = {-1, 0, 0.8}; 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// Limit Wallet items refresh rate to at most once per minute. 11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int64 kWalletItemsRefreshRateSeconds = 60; 11758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// The number of milliseconds to delay enabling the submit button after showing 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// the dialog. This delay prevents users from accidentally clicking the submit 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// button on startup. 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const int kSubmitButtonDelayMs = 1000; 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// A helper class to make sure an AutofillDialogView knows when a series of 1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// updates is incoming. 1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class ScopedViewUpdates { 1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) explicit ScopedViewUpdates(AutofillDialogView* view) : view_(view) { 1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (view_) 1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) view_->UpdatesStarted(); 1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ~ScopedViewUpdates() { 1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (view_) 1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) view_->UpdatesFinished(); 1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private: 1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AutofillDialogView* view_; 1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedViewUpdates); 1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns true if |input| should be used to fill a site-requested |field| which 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is notated with a "shipping" tag, for use when the user has decided to use 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the billing address as the shipping address. 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DetailInputMatchesShippingField(const DetailInput& input, 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const AutofillField& field) { 148b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Equivalent billing field type is used to support UseBillingAsShipping 149b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // usecase. 1503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ServerFieldType field_type = 151bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch AutofillType::GetEquivalentBillingFieldType( 152bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch field.Type().GetStorableType()); 153b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return common::InputTypeMatchesFieldType(input, AutofillType(field_type)); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Initializes |form_group| from user-entered data. 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FillFormGroupFromOutputs(const DetailOutputMap& detail_outputs, 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FormGroup* form_group) { 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (DetailOutputMap::const_iterator iter = detail_outputs.begin(); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != detail_outputs.end(); ++iter) { 1623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ServerFieldType type = iter->first->type; 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!iter->second.empty()) { 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (type == ADDRESS_HOME_COUNTRY || type == ADDRESS_BILLING_COUNTRY) { 1653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch form_group->SetInfo(AutofillType(type), 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) iter->second, 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) g_browser_process->GetApplicationLocale()); 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 169424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) form_group->SetRawInfo( 170424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) AutofillType(type).GetStorableType(), iter->second); 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Get billing info from |output| and put it into |card|, |cvc|, and |profile|. 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These outparams are required because |card|/|profile| accept different types 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// of raw info, and CreditCard doesn't save CVCs. 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GetBillingInfoFromOutputs(const DetailOutputMap& output, 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreditCard* card, 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16* cvc, 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillProfile* profile) { 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (DetailOutputMap::const_iterator it = output.begin(); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != output.end(); ++it) { 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 trimmed; 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrimWhitespace(it->second, TRIM_ALL, &trimmed); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Special case CVC as CreditCard just swallows it. 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (it->first->type == CREDIT_CARD_VERIFICATION_CODE) { 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (cvc) 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) cvc->assign(trimmed); 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (it->first->type == ADDRESS_HOME_COUNTRY || 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) it->first->type == ADDRESS_BILLING_COUNTRY) { 1947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (profile) { 1953240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch profile->SetInfo(AutofillType(it->first->type), 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) trimmed, 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) g_browser_process->GetApplicationLocale()); 1987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Copy the credit card name to |profile| in addition to |card| as 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // wallet::Instrument requires a recipient name for its billing address. 2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (card && it->first->type == NAME_FULL) 2037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch card->SetRawInfo(CREDIT_CARD_NAME, trimmed); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (common::IsCreditCardType(it->first->type)) { 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (card) 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) card->SetRawInfo(it->first->type, trimmed); 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (profile) { 209424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) profile->SetRawInfo( 210424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) AutofillType(it->first->type).GetStorableType(), trimmed); 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Returns the containing window for the given |web_contents|. The containing 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// window might be a browser window for a Chrome tab, or it might be a shell 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// window for a platform app. 21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)ui::BaseWindow* GetBaseWindowForWebContents( 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::WebContents* web_contents) { 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* browser = chrome::FindBrowserWithWebContents(web_contents); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (browser) 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return browser->window(); 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeWindow native_window = 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetView()->GetTopLevelNativeWindow(); 227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch apps::ShellWindow* shell_window = 228ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch apps::ShellWindowRegistry:: 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetShellWindowForNativeWindowAnyProfile(native_window); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return shell_window->GetBaseWindow(); 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Extracts the string value of a field with |type| from |output|. This is 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// useful when you only need the value of 1 input from a section of view inputs. 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)string16 GetValueForType(const DetailOutputMap& output, 2363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ServerFieldType type) { 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (DetailOutputMap::const_iterator it = output.begin(); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != output.end(); ++it) { 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (it->first->type == type) 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return it->second; 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return string16(); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Returns a string descriptor for a DialogSection, for use with prefs (do not 24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// change these values). 24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)std::string SectionToPrefString(DialogSection section) { 24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) switch (section) { 24990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case SECTION_CC: 25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return "cc"; 25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 25290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case SECTION_BILLING: 25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return "billing"; 25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case SECTION_CC_BILLING: 25690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The SECTION_CC_BILLING section isn't active when using Autofill. 25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NOTREACHED(); 25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return std::string(); 25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case SECTION_SHIPPING: 26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return "shipping"; 26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NOTREACHED(); 26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return std::string(); 26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Check if a given MaskedInstrument is allowed for the purchase. 26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool IsInstrumentAllowed( 27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const wallet::WalletItems::MaskedInstrument& instrument) { 271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) switch (instrument.status()) { 272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case wallet::WalletItems::MaskedInstrument::VALID: 273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case wallet::WalletItems::MaskedInstrument::PENDING: 274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case wallet::WalletItems::MaskedInstrument::EXPIRED: 275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case wallet::WalletItems::MaskedInstrument::BILLING_INCOMPLETE: 276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) default: 278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Signals that the user has opted in to geolocation services. Factored out 28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// into a separate method because all interaction with the geolocation provider 28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// needs to happen on the IO thread, which is not the thread 2853240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch// AutofillDialogViewDelegate lives on. 28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserDidOptIntoLocationServices() { 28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::GeolocationProvider::GetInstance()->UserDidOptIntoLocationServices(); 28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Returns whether |data_model| is complete, i.e. can fill out all the 29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// |requested_fields|, and verified, i.e. not just automatically aggregated. 29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Incomplete or unverifed data will not be displayed in the dropdown menu. 29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool HasCompleteAndVerifiedData(const AutofillDataModel& data_model, 29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const DetailInputs& requested_fields) { 29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!data_model.IsVerified()) 29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (size_t i = 0; i < requested_fields.size(); ++i) { 29958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ServerFieldType type = 30058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AutofillType(requested_fields[i].type).GetStorableType(); 30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (type != ADDRESS_HOME_LINE2 && 30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) type != CREDIT_CARD_VERIFICATION_CODE && 30358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) data_model.GetRawInfo(type).empty()) { 30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return true; 30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 311eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Returns true if |profile| has an invalid address, i.e. an invalid state, zip 31258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// code, phone number, or email address. Otherwise returns false. Profiles with 31358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// invalid addresses are not suggested in the dropdown menu for billing and 31458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// shipping addresses. 315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool HasInvalidAddress(const AutofillProfile& profile) { 316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return profile.IsPresentButInvalid(ADDRESS_HOME_STATE) || 317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile.IsPresentButInvalid(ADDRESS_HOME_ZIP) || 318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile.IsPresentButInvalid(PHONE_HOME_WHOLE_NUMBER); 319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 320eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Loops through |addresses_| comparing to |address| ignoring ID. If a match 32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// is not found, NULL is returned. 32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const wallet::Address* FindDuplicateAddress( 32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::vector<wallet::Address*>& addresses, 32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const wallet::Address& address) { 32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (size_t i = 0; i < addresses.size(); ++i) { 32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (addresses[i]->EqualsIgnoreID(address)) 32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return addresses[i]; 32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return NULL; 33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool IsCardHolderNameValidForWallet(const string16& name) { 33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::string16 whitespace_collapsed_name = CollapseWhitespace(name, true); 33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<base::string16> split_name; 33690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::SplitString(whitespace_collapsed_name, ' ', &split_name); 33790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return split_name.size() >= 2; 33890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 33990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)DialogSection SectionFromLocation(wallet::FormFieldError::Location location) { 3417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) switch (location) { 3427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::FormFieldError::PAYMENT_INSTRUMENT: 3437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::FormFieldError::LEGAL_ADDRESS: 3447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return SECTION_CC_BILLING; 3457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::FormFieldError::SHIPPING_ADDRESS: 3477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return SECTION_SHIPPING; 3487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::FormFieldError::UNKNOWN_LOCATION: 3507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NOTREACHED(); 3517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return SECTION_MAX; 3527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NOTREACHED(); 3557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return SECTION_MAX; 3567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 35858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)scoped_ptr<DialogNotification> GetWalletError( 35958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) wallet::WalletClient::ErrorType error_type) { 36058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::string16 text; 36158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GURL url; 36258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) switch (error_type) { 36458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case wallet::WalletClient::UNVERIFIED_KNOW_YOUR_CUSTOMER_STATUS: 36558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) text = l10n_util::GetStringUTF16( 36658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) IDS_AUTOFILL_WALLET_UNVERIFIED_KNOW_YOUR_CUSTOMER_STATUS); 36758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) url = GURL(kKnowYourCustomerStatusUrl); 36858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 3697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 370ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case wallet::WalletClient::BUYER_LEGAL_ADDRESS_NOT_SUPPORTED: 37158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) text = l10n_util::GetStringUTF16( 372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch IDS_AUTOFILL_WALLET_BUYER_COUNTRY_NOT_SUPPORTED); 37358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) url = GURL(kBuyerLegalAddressStatusUrl); 37458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 375ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 37658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) default: 37758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The notification will not have a link; it's handled in the next 37858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // switch statement. 37958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 38058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 38158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 38258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!text.empty()) { 38358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<DialogNotification> notification(new DialogNotification( 38458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DialogNotification::WALLET_ERROR, 38558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) text)); 38658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) notification->set_link_url(url); 38758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return notification.Pass(); 38858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 38958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int error_ids = 0; 3914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int error_code = 0; 3924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 39358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (error_type) { 394ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case wallet::WalletClient::UNSUPPORTED_MERCHANT: 3954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UNSUPPORTED_MERCHANT; 39658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 397ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 3987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::BAD_REQUEST: 3994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UPGRADE_CHROME_ERROR; 4004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 71; 40158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 402ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::INVALID_PARAMS: 4044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UPGRADE_CHROME_ERROR; 4054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 42; 40658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 407ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 40858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case wallet::WalletClient::BUYER_ACCOUNT_ERROR: 4094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_BUYER_ACCOUNT_ERROR; 4104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 12; 41158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 412ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 4137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::UNSUPPORTED_API_VERSION: 4144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UPGRADE_CHROME_ERROR; 4154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 43; 41658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 4177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::SERVICE_UNAVAILABLE: 4194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_SERVICE_UNAVAILABLE_ERROR; 4204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 61; 42158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 4227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::INTERNAL_ERROR: 4244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UNKNOWN_ERROR; 4254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 62; 42658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 427ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::MALFORMED_RESPONSE: 4294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UNKNOWN_ERROR; 4304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 72; 43158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 432ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::NETWORK_ERROR: 4344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UNKNOWN_ERROR; 4354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 73; 43658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 437ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case wallet::WalletClient::UNKNOWN_ERROR: 4394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_ids = IDS_AUTOFILL_WALLET_UNKNOWN_ERROR; 4404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) error_code = 74; 44158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 44258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 44358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) default: 44458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 4457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK_NE(0, error_ids); 44858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 44958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The other error types are strings of the form "XXX. You can pay without 45058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // wallet." 4514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<DialogNotification> notification(new DialogNotification( 45258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DialogNotification::WALLET_ERROR, 45358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) l10n_util::GetStringFUTF16(IDS_AUTOFILL_DIALOG_COMPLETE_WITHOUT_WALLET, 4544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) l10n_util::GetStringUTF16(error_ids)))); 4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (error_code) { 4574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) notification->set_tooltip_text( 4584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) l10n_util::GetStringFUTF16(IDS_AUTOFILL_WALLET_ERROR_CODE_TOOLTIP, 4594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::IntToString16(error_code))); 4604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 4614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return notification.Pass(); 4637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 46558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)gfx::Image GetGeneratedCardImage(const base::string16& card_number, 46658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const base::string16& name, 46758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const SkColor& gradient_top, 46858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const SkColor& gradient_bottom) { 46958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const int kCardWidthPx = 300; 47058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const int kCardHeightPx = 190; 47158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Size size(kCardWidthPx, kCardHeightPx); 47268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::Canvas canvas(size, 1.0f, false); 47358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 47458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Rect display_rect(size); 47558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 47658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) skia::RefPtr<SkShader> shader = gfx::CreateGradientShader( 47758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 0, size.height(), gradient_top, gradient_bottom); 47858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SkPaint paint; 47958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) paint.setShader(shader.get()); 48058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) canvas.DrawRoundRect(display_rect, 8, paint); 48158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 48258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) display_rect.Inset(20, 0, 0, 0); 4834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Font font(l10n_util::GetStringUTF8(IDS_FIXED_FONT_FAMILY), 18); 4844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::FontList font_list(font); 4857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch gfx::ShadowValues shadows; 48658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shadows.push_back(gfx::ShadowValue(gfx::Point(0, 1), 1.0, SK_ColorBLACK)); 4874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) canvas.DrawStringRectWithShadows( 4887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch card_number, 4894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) font_list, 49058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SK_ColorWHITE, 49158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) display_rect, 0, 0, shadows); 49258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 49358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::string16 capitalized_name = base::i18n::ToUpper(name); 49458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) display_rect.Inset(0, size.height() / 2, 0, 0); 4954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) canvas.DrawStringRectWithShadows( 49658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) capitalized_name, 4974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) font_list, 4987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SK_ColorWHITE, 4997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch display_rect, 0, 0, shadows); 5007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch gfx::ImageSkia skia(canvas.ExtractImageRep()); 5027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return gfx::Image(skia); 5037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 5047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 50558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Returns the ID of the address or instrument that should be selected in the 50658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// UI, given that the |default_id| is currently the default ID on the Wallet 50758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// server, |previous_default_id| was the default ID prior to re-fetching the 50858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Wallet data, and |previously_selected_id| was the ID of the item selected in 50958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// the dialog prior to re-fetching the Wallet data. 51058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)std::string GetIdToSelect(const std::string& default_id, 51158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& previous_default_id, 51258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& previously_selected_id) { 51358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // If the default ID changed since the last fetch of the Wallet data, select 51458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // it rather than the previously selected item, as the user's intention in 51558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // changing the default was probably to use it. 51658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (default_id != previous_default_id) 51758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return default_id; 51858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 51958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Otherwise, prefer the previously selected item, if there was one. 52058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return !previously_selected_id.empty() ? previously_selected_id : default_id; 52158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 52258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 52358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Generate a random card number in a user displayable format. 52458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)base::string16 GenerateRandomCardNumber() { 52558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string card_number; 52658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t i = 0; i < 4; ++i) { 52758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int part = base::RandInt(0, 10000); 52858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::StringAppendF(&card_number, "%04d ", part); 52958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 53058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return ASCIIToUTF16(card_number); 53158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 53258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 533d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)gfx::Image CreditCardIconForType(const std::string& credit_card_type) { 534d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const int input_card_idr = CreditCard::IconResourceId(credit_card_type); 535d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 536d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Image result = rb.GetImageNamed(input_card_idr); 537d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (input_card_idr == IDR_AUTOFILL_CC_GENERIC) { 538d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // When the credit card type is unknown, no image should be shown. However, 539d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // to simplify the view code on Mac, save space for the credit card image by 540d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // returning a transparent image of the appropriate size. 541d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) result = gfx::Image(gfx::ImageSkiaOperations::CreateTransparentImage( 542d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) result.AsImageSkia(), 0)); 543d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 544d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return result; 545d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 546d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 547d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)gfx::Image CvcIconForCreditCardType(const base::string16& credit_card_type) { 548d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 549d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (credit_card_type == l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_AMEX)) 550d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return rb.GetImageNamed(IDR_CREDIT_CARD_CVC_HINT_AMEX); 551d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 552d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return rb.GetImageNamed(IDR_CREDIT_CARD_CVC_HINT); 553d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 554d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochAutofillDialogViewDelegate::~AutofillDialogViewDelegate() {} 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutofillDialogControllerImpl::~AutofillDialogControllerImpl() { 5607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (popup_controller_) 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_controller_->Hide(); 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 56358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogInitialUserState(initial_user_state_); 564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::WeakPtr<AutofillDialogControllerImpl> 568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillDialogControllerImpl::Create( 569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::WebContents* contents, 570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const FormData& form_structure, 571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL& source_url, 572d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::Callback<void(const FormStructure*)>& callback) { 573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // AutofillDialogControllerImpl owns itself. 574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillDialogControllerImpl* autofill_dialog_controller = 575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new AutofillDialogControllerImpl(contents, 576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) form_structure, 577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_url, 578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback); 579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return autofill_dialog_controller->weak_ptr_factory_.GetWeakPtr(); 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 5837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AutofillDialogControllerImpl::RegisterProfilePrefs( 584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable* registry) { 585d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // TODO(estade): this pref is no longer used, but may prove to be valuable. 586d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Remove it if we don't wind up using it at some point. 5877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) registry->RegisterIntegerPref( 5887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ::prefs::kAutofillDialogShowCount, 5897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 0, 5907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 591d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // TODO(estade): this pref is no longer used, but may prove to be valuable. 592d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Remove it if we don't wind up using it at some point. 593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterBooleanPref( 594868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ::prefs::kAutofillDialogHasPaidWithWallet, 595868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) false, 596868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 597868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) registry->RegisterBooleanPref( 598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ::prefs::kAutofillDialogPayWithoutWallet, 599868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) false, 600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 60190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) registry->RegisterDictionaryPref( 60290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ::prefs::kAutofillDialogAutofillDefault, 60390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 60458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) registry->RegisterBooleanPref( 60558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ::prefs::kAutofillDialogSaveData, 60658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) true, 60758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 610ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 611ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::WeakPtr<AutofillDialogController> AutofillDialogController::Create( 612ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch content::WebContents* contents, 613ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FormData& form_structure, 614ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const GURL& source_url, 615d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::Callback<void(const FormStructure*)>& callback) { 616ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return AutofillDialogControllerImpl::Create(contents, 617ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch form_structure, 618ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch source_url, 619ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback); 620ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 621ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 622ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static 623ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogController::RegisterProfilePrefs( 624ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch user_prefs::PrefRegistrySyncable* registry) { 625ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillDialogControllerImpl::RegisterProfilePrefs(registry); 626ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 627ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::Show() { 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_shown_timestamp_ = base::Time::Now(); 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 631bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch content::NavigationEntry* entry = 632bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch web_contents()->GetController().GetActiveEntry(); 633bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const GURL& active_url = entry ? entry->GetURL() : web_contents()->GetURL(); 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) invoked_from_same_origin_ = active_url.GetOrigin() == source_url_.GetOrigin(); 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Log any relevant UI metrics and security exceptions. 63758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_SHOWN); 638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetMetricLogger().LogDialogSecurityMetric( 64058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AutofillMetrics::SECURITY_METRIC_DIALOG_SHOWN); 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 64268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Determine what field types should be included in the dialog. 64368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Note that RequestingCreditCardInfo() below relies on parsed field types. 64468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool has_types = false; 64568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool has_sections = false; 64668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) form_structure_.ParseFieldTypesFromAutocompleteAttributes( 64768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &has_types, &has_sections); 64868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (RequestingCreditCardInfo() && !TransmissionWillBeSecure()) { 650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetMetricLogger().LogDialogSecurityMetric( 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::SECURITY_METRIC_CREDIT_CARD_OVER_HTTP); 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!invoked_from_same_origin_) { 655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetMetricLogger().LogDialogSecurityMetric( 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::SECURITY_METRIC_CROSS_ORIGIN_FRAME); 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Fail if the author didn't specify autocomplete types. 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!has_types) { 661d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) callback_.Run(NULL); 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete this; 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 666ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch common::BuildInputsForSection(SECTION_CC, 667ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &requested_cc_fields_); 668ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch common::BuildInputsForSection(SECTION_BILLING, 669ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &requested_billing_fields_); 670ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch common::BuildInputsForSection(SECTION_CC_BILLING, 671ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &requested_cc_billing_fields_); 672ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch common::BuildInputsForSection(SECTION_SHIPPING, 673ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &requested_shipping_fields_); 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 675868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Test whether we need to show the shipping section. If filling that section 676868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // would be a no-op, don't show it. 677868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const DetailInputs& inputs = RequestedFieldsForSection(SECTION_SHIPPING); 678868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EmptyDataModelWrapper empty_wrapper; 679868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) cares_about_shipping_ = empty_wrapper.FillFormStructure( 680868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) inputs, 681ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Bind(common::DetailInputMatchesField, SECTION_SHIPPING), 682868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &form_structure_); 683868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionsUpdated(); 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int show_count = 6877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) profile_->GetPrefs()->GetInteger(::prefs::kAutofillDialogShowCount); 6887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) profile_->GetPrefs()->SetInteger(::prefs::kAutofillDialogShowCount, 6897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) show_count + 1); 6907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 69158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SubmitButtonDelayBegin(); 69258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(estade): don't show the dialog if the site didn't specify the right 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // fields. First we must figure out what the "right" fields are. 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_.reset(CreateView()); 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->Show(); 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetManager()->AddObserver(this); 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 699868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Try to see if the user is already signed-in. If signed-in, fetch the user's 700868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Wallet data. Otherwise, see if the user could be signed in passively. 701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(aruslan): UMA metrics for sign-in. 7024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FetchWalletCookieAndUserName(); 70390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 70490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!account_chooser_model_.WalletIsSelected()) 7057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LogDialogLatencyToShow(); 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::Hide() { 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_) 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->Hide(); 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 71358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid AutofillDialogControllerImpl::TabActivated() { 71458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // If the user switched away from this tab and then switched back, reload the 71558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // Wallet items, in case they've changed. 71668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int64 seconds_elapsed_since_last_refresh = 71758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch (base::TimeTicks::Now() - last_wallet_items_fetch_timestamp_).InSeconds(); 71858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch if (IsPayingWithWallet() && wallet_items_ && 71958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch seconds_elapsed_since_last_refresh >= kWalletItemsRefreshRateSeconds) { 72058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch GetWalletItems(); 72158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch } 72258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} 72358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 724eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTestableAutofillDialogView* AutofillDialogControllerImpl::GetTestableView() { 725eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return view_ ? view_->GetTestableView() : NULL; 726eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 727eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 72858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 72958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// AutofillDialogViewDelegate implementation. 730eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 73158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)string16 AutofillDialogControllerImpl::DialogTitle() const { 73258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (ShouldShowSpinner()) 73358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return string16(); 7343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 73558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_TITLE); 736eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 737eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 73858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)string16 AutofillDialogControllerImpl::AccountChooserText() const { 73958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!account_chooser_model_.WalletIsSelected()) 74058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PAYING_WITHOUT_WALLET); 741eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 74258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (SignedInState() == SIGNED_IN) 7434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return account_chooser_model_.GetActiveWalletAccountName(); 74458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 74558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // In this case, the account chooser should be showing the signin link. 74658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return string16(); 74790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 74890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 74958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)string16 AutofillDialogControllerImpl::SignInLinkText() const { 75058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return l10n_util::GetStringUTF16( 75158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) signin_registrar_.IsEmpty() ? IDS_AUTOFILL_DIALOG_SIGN_IN : 75258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) IDS_AUTOFILL_DIALOG_CANCEL_SIGN_IN); 75358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 75558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)string16 AutofillDialogControllerImpl::SpinnerText() const { 75658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_LOADING); 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)string16 AutofillDialogControllerImpl::EditSuggestionText() const { 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_EDIT); 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)string16 AutofillDialogControllerImpl::CancelButtonText() const { 764ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return l10n_util::GetStringUTF16(IDS_CANCEL); 765ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 766ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 767ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstring16 AutofillDialogControllerImpl::ConfirmButtonText() const { 768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return l10n_util::GetStringUTF16(IsSubmitPausedOn(wallet::VERIFY_CVV) ? 769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IDS_AUTOFILL_DIALOG_VERIFY_BUTTON : IDS_AUTOFILL_DIALOG_SUBMIT_BUTTON); 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)string16 AutofillDialogControllerImpl::SaveLocallyText() const { 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SAVE_LOCALLY_CHECKBOX); 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 776bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochstring16 AutofillDialogControllerImpl::SaveLocallyTooltip() const { 777bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SAVE_LOCALLY_TOOLTIP); 778bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 779bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)string16 AutofillDialogControllerImpl::LegalDocumentsText() { 78158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!IsPayingWithWallet()) 782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return string16(); 783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return legal_documents_text_; 785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 78758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldDisableSignInLink() const { 78858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return SignedInState() == REQUIRES_RESPONSE; 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldShowSpinner() const { 792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return account_chooser_model_.WalletIsSelected() && 793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SignedInState() == REQUIRES_RESPONSE; 794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool AutofillDialogControllerImpl::ShouldShowSignInWebView() const { 7971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return !signin_registrar_.IsEmpty(); 7981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 7991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 8001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)GURL AutofillDialogControllerImpl::SignInUrl() const { 8011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return wallet::GetSignInUrl(); 8021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 8031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldOfferToSaveInChrome() const { 805b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return !IsPayingWithWallet() && 806b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) !profile_->IsOffTheRecord() && 807b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) IsManuallyEditingAnySection() && 808ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch !ShouldShowSpinner(); 80990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 81090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 81158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldSaveInChrome() const { 81258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return profile_->GetPrefs()->GetBoolean(::prefs::kAutofillDialogSaveData); 81358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 81458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 81590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)int AutofillDialogControllerImpl::GetDialogButtons() const { 8164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (waiting_for_explicit_sign_in_response_) 8174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return ui::DIALOG_BUTTON_NONE; 8184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 81958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (ShouldShowSpinner()) 82090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return ui::DIALOG_BUTTON_CANCEL; 82158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 82258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL; 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::IsDialogButtonEnabled( 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::DialogButton button) const { 827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (button == ui::DIALOG_BUTTON_OK) { 828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsSubmitPausedOn(wallet::VERIFY_CVV)) 829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 830ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 83158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (ShouldShowSpinner() || is_submitting_) 832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 833ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 83458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (submit_button_delay_timer_.IsRunning()) 83558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return false; 836ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(ui::DIALOG_BUTTON_CANCEL, button); 841ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return !is_submitting_ || IsSubmitPausedOn(wallet::VERIFY_CVV); 842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 84458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)DialogOverlayState AutofillDialogControllerImpl::GetDialogOverlay() { 8457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool show_wallet_interstitial = IsPayingWithWallet() && is_submitting_ && 84658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) !(full_wallet_ && !full_wallet_->required_actions().empty()); 84758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!show_wallet_interstitial) { 84858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) card_scrambling_delay_.Stop(); 84958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) card_scrambling_refresher_.Stop(); 8507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return DialogOverlayState(); 85158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 8527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 8537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 8547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DialogOverlayState state; 8554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) state.string.font = rb.GetFont(ui::ResourceBundle::BaseFont).DeriveFont(3); 8564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) state.string.text_color = SK_ColorDKGRAY; 85758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 85858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const SkColor start_top_color = SkColorSetRGB(0xD6, 0xD6, 0xD6); 85958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const SkColor start_bottom_color = SkColorSetRGB(0x98, 0x98, 0x98); 86058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const SkColor final_top_color = SkColorSetRGB(0x52, 0x9F, 0xF8); 86158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const SkColor final_bottom_color = SkColorSetRGB(0x22, 0x75, 0xE5); 8627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 8637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // First-run, post-submit, Wallet expository page. 8647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (full_wallet_ && full_wallet_->required_actions().empty()) { 86558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) card_scrambling_delay_.Stop(); 86658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) card_scrambling_refresher_.Stop(); 86758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8683240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch string16 cc_number = 8693240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch full_wallet_->GetInfo(AutofillType(CREDIT_CARD_NUMBER)); 8707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK_EQ(16U, cc_number.size()); 8717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch state.image = GetGeneratedCardImage( 87258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASCIIToUTF16("XXXX XXXX XXXX ") + 87358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) cc_number.substr(cc_number.size() - 4), 87458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) full_wallet_->billing_address()->recipient_name(), 87558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) color_utils::AlphaBlend( 87658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) final_top_color, 87758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) start_top_color, 87858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 255 * card_generated_animation_.GetCurrentValue()), 87958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) color_utils::AlphaBlend( 88058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) final_bottom_color, 88158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) start_bottom_color, 88258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 255 * card_generated_animation_.GetCurrentValue())); 88358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) state.string.text = l10n_util::GetStringUTF16( 8857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDS_AUTOFILL_DIALOG_CARD_GENERATION_DONE); 8867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else { 88758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Start the refresher if it isn't running. Wait one second before pumping 88858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // updates to the view. 88958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!card_scrambling_delay_.IsRunning() && 89058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) !card_scrambling_refresher_.IsRunning()) { 89158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scrambled_card_number_ = GenerateRandomCardNumber(); 89258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) card_scrambling_delay_.Start( 89358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FROM_HERE, 89458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromSeconds(1), 89558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) this, 89658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &AutofillDialogControllerImpl::StartCardScramblingRefresher); 89758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 89858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 89958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(!scrambled_card_number_.empty()); 90058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) state.image = GetGeneratedCardImage( 90158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scrambled_card_number_, 90258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) submitted_cardholder_name_, 90358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) start_top_color, 90458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) start_bottom_color); 9057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // "Submitting" waiting page. 9074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) state.string.text = l10n_util::GetStringUTF16( 9087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDS_AUTOFILL_DIALOG_CARD_GENERATION_IN_PROGRESS); 9097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 9107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return state; 9127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 9137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 91458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const std::vector<gfx::Range>& AutofillDialogControllerImpl:: 915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LegalDocumentLinks() { 916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return legal_document_link_ranges_; 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::SectionIsActive(DialogSection section) 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const { 921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsSubmitPausedOn(wallet::VERIFY_CVV)) 922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return section == SECTION_CC_BILLING; 923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 924868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!FormStructureCaresAboutSection(section)) 925868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 926868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsPayingWithWallet()) 928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return section == SECTION_CC_BILLING || section == SECTION_SHIPPING; 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return section != SECTION_CC_BILLING; 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::GetWalletItems() { 9343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 935558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 93658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previously_selected_instrument_id_.clear(); 93758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previously_selected_shipping_address_id_.clear(); 93858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch if (wallet_items_) { 93958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previous_default_instrument_id_ = wallet_items_->default_instrument_id(); 94058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previous_default_shipping_address_id_ = wallet_items_->default_address_id(); 94158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 94258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const wallet::WalletItems::MaskedInstrument* instrument = 94358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ActiveInstrument(); 94458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (instrument) 94558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previously_selected_instrument_id_ = instrument->object_id(); 946558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 947558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const wallet::Address* address = ActiveShippingAddress(); 948558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (address) 949558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch previously_selected_shipping_address_id_ = address->object_id(); 95058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch } 95158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 95258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch last_wallet_items_fetch_timestamp_ = base::TimeTicks::Now(); 953eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch wallet_items_.reset(); 95458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 955eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The "Loading..." page should be showing now, which should cause the 956eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // account chooser to hide. 957eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch view_->UpdateAccountChooser(); 9584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GetWalletClient()->GetWalletItems(); 959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 961a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void AutofillDialogControllerImpl::HideSignIn() { 9623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 963a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) signin_registrar_.RemoveAll(); 964a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) view_->HideSignIn(); 965a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) view_->UpdateAccountChooser(); 966a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 967a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 96858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)AutofillDialogControllerImpl::DialogSignedInState 96958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AutofillDialogControllerImpl::SignedInState() const { 97058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (wallet_error_notification_) 97158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return SIGN_IN_DISABLED; 97258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 97358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (signin_helper_ || !wallet_items_) 97458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return REQUIRES_RESPONSE; 97558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 97658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (wallet_items_->HasRequiredAction(wallet::GAIA_AUTH)) 97758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return REQUIRES_SIGN_IN; 97858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 97958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (wallet_items_->HasRequiredAction(wallet::PASSIVE_GAIA_AUTH)) 98058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return REQUIRES_PASSIVE_SIGN_IN; 98158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Since the username can be pre-fetched as a performance optimization, Wallet 9834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // required actions take precedence over a pending username fetch. 9844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (username_fetcher_) 9854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return REQUIRES_RESPONSE; 9864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 98758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return SIGNED_IN; 98858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 98958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::SignedInStateUpdated() { 9914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!ShouldShowSpinner()) 9924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) waiting_for_explicit_sign_in_response_ = false; 9934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (SignedInState()) { 995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case SIGNED_IN: 996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Start fetching the user name if we don't know it yet. 9974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!account_chooser_model_.HasAccountsToChoose()) { 9984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(!username_fetcher_); 9994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) username_fetcher_.reset(new wallet::WalletSigninHelper( 1000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) this, profile_->GetRequestContext())); 10014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) username_fetcher_->StartUserNameFetch(); 1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 1003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LogDialogLatencyToShow(); 1004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case REQUIRES_SIGN_IN: 1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case SIGN_IN_DISABLED: 1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Switch to the local account and refresh the dialog. 10104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) signin_helper_.reset(); 10114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) username_fetcher_.reset(); 1012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnWalletSigninError(); 1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case REQUIRES_PASSIVE_SIGN_IN: 10164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Cancel any pending username fetch and clear any stale username data. 10174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) username_fetcher_.reset(); 10184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) account_chooser_model_.ClearWalletAccounts(); 10194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Attempt to passively sign in the user. 1021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!signin_helper_); 1022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) signin_helper_.reset(new wallet::WalletSigninHelper( 1023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) this, 1024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile_->GetRequestContext())); 1025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) signin_helper_->StartPassiveSignin(); 1026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case REQUIRES_RESPONSE: 1029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 1030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::OnWalletOrSigninUpdate() { 10343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 1035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SignedInStateUpdated(); 1036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionsUpdated(); 1037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateAccountChooserView(); 1038b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 103958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (view_) { 1040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->UpdateButtonStrip(); 104158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) view_->UpdateOverlay(); 104258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 1043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // On the first successful response, compute the initial user state metric. 1045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (initial_user_state_ == AutofillMetrics::DIALOG_USER_STATE_UNKNOWN) 1046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) initial_user_state_ = GetInitialUserState(); 1047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void AutofillDialogControllerImpl::OnWalletFormFieldError( 10507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::vector<wallet::FormFieldError>& form_field_errors) { 10517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (form_field_errors.empty()) 10527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 10537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (std::vector<wallet::FormFieldError>::const_iterator it = 10557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) form_field_errors.begin(); 10567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) it != form_field_errors.end(); ++it) { 10577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (it->error_type() == wallet::FormFieldError::UNKNOWN_ERROR || 10587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) it->GetAutofillType() == MAX_VALID_FIELD_TYPE || 10597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) it->location() == wallet::FormFieldError::UNKNOWN_LOCATION) { 10607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) wallet_server_validation_recoverable_ = false; 10617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 10627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 10637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogSection section = SectionFromLocation(it->location()); 10647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) wallet_errors_[section][it->GetAutofillType()] = 10657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::make_pair(it->GetErrorMessage(), 10667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetValueFromSection(section, it->GetAutofillType())); 10677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 10687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Unrecoverable validation errors. 10707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!wallet_server_validation_recoverable_) 10717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DisableWallet(wallet::WalletClient::UNKNOWN_ERROR); 10727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1073eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateForErrors(); 10747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 10757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 10761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void AutofillDialogControllerImpl::ConstructLegalDocumentsText() { 1077c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!wallet_items_ || wallet_items_->legal_documents().empty()) 1078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 10791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NOTIMPLEMENTED(); 1080c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1081c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::vector<wallet::WalletItems::LegalDocument*>& documents = 1082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wallet_items_->legal_documents(); 10831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // There should never be just one document because the privacy policy doc gets 10841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // tacked on the end of other documents. 1085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK_GE(documents.size(), 2U); 1086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::vector<base::string16> link_names; 10881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) for (size_t i = 0; i < documents.size(); ++i) { 10891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) link_names.push_back(documents[i]->display_name()); 10901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 10911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 10921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const bool new_user = wallet_items_->HasRequiredAction(wallet::SETUP_WALLET); 10931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) int resource_id = 0; 10941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) switch (documents.size()) { 10951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 2U: 10961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) resource_id = new_user ? IDS_AUTOFILL_DIALOG_LEGAL_LINKS_NEW_2 : 10971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) IDS_AUTOFILL_DIALOG_LEGAL_LINKS_UPDATED_2; 10981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 10991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 3U: 11001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) resource_id = new_user ? IDS_AUTOFILL_DIALOG_LEGAL_LINKS_NEW_3 : 11011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) IDS_AUTOFILL_DIALOG_LEGAL_LINKS_UPDATED_3; 11021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 11031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 4U: 11041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) resource_id = new_user ? IDS_AUTOFILL_DIALOG_LEGAL_LINKS_NEW_4 : 11051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) IDS_AUTOFILL_DIALOG_LEGAL_LINKS_UPDATED_4; 11061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 11071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 5U: 11081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) resource_id = new_user ? IDS_AUTOFILL_DIALOG_LEGAL_LINKS_NEW_5 : 11091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) IDS_AUTOFILL_DIALOG_LEGAL_LINKS_UPDATED_5; 11101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 11111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) case 6U: 11121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) resource_id = new_user ? IDS_AUTOFILL_DIALOG_LEGAL_LINKS_NEW_6 : 11131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) IDS_AUTOFILL_DIALOG_LEGAL_LINKS_UPDATED_6; 11141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 11151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) default: 11161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // We can only handle so many documents. For lack of a better way of 11171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // handling document overflow, just error out if there are too many. 11181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DisableWallet(wallet::WalletClient::UNKNOWN_ERROR); 11191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return; 1120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::vector<size_t> offsets; 11231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) string16 text = l10n_util::GetStringFUTF16(resource_id, link_names, &offsets); 1124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) legal_document_link_ranges_.clear(); 1125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < documents.size(); ++i) { 11261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) size_t link_start = offsets[i]; 112758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) legal_document_link_ranges_.push_back(gfx::Range( 1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) link_start, link_start + documents[i]->display_name().size())); 1129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) legal_documents_text_ = text; 1131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::ResetSectionInput(DialogSection section) { 1134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SetEditingExistingData(section, false); 1135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DetailInputs* inputs = MutableRequestedFieldsForSection(section); 1137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (DetailInputs::iterator it = inputs->begin(); it != inputs->end(); ++it) { 1138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch it->initial_value.clear(); 1139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::ShowEditUiIfBadSuggestion( 1143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DialogSection section) { 1144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // |CreateWrapper()| returns an empty wrapper if |IsEditingExistingData()|, so 1145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // get the wrapper before this potentially happens below. 114690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section); 1147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the chosen item in |model| yields an empty suggestion text, it is 1149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // invalid. In this case, show the edit UI and highlight invalid fields. 1150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 1151c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch string16 unused, unused2; 1152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsASuggestionItemKey(model->GetItemKeyForCheckedItem()) && 1153c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch !SuggestionTextForSection(section, &unused, &unused2)) { 1154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SetEditingExistingData(section, true); 1155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 115790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DetailInputs* inputs = MutableRequestedFieldsForSection(section); 1158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (wrapper && IsEditingExistingData(section)) 1159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch wrapper->FillInputs(inputs); 1160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 116190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1162ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool AutofillDialogControllerImpl::InputWasEdited(ServerFieldType type, 1163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::string16& value) { 1164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (value.empty()) 1165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 116690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1167ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // If this is a combobox at the default value, don't preserve it. 1168ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ui::ComboboxModel* model = ComboboxModelForAutofillType(type); 1169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (model && model->GetItemAt(model->GetDefaultIndex()) == value) 1170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 1171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 1173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochDetailOutputMap AutofillDialogControllerImpl::TakeUserInputSnapshot() { 1176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DetailOutputMap snapshot; 1177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!view_) 1178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return snapshot; 1179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 1181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DialogSection section = static_cast<DialogSection>(i); 1182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 1183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (model->GetItemKeyForCheckedItem() != kAddNewItemKey) 1184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch continue; 1185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DetailOutputMap outputs; 1187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch view_->GetUserInput(section, &outputs); 1188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Remove fields that are empty, at their default values, or invalid. 1189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (DetailOutputMap::iterator it = outputs.begin(); it != outputs.end(); 1190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ++it) { 1191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (InputWasEdited(it->first->type, it->second) && 1192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch InputValidityMessage(section, it->first->type, it->second).empty()) { 1193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch snapshot.insert(std::make_pair(it->first, it->second)); 1194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return snapshot; 1199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::RestoreUserInputFromSnapshot( 1202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const DetailOutputMap& snapshot) { 1203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (snapshot.empty()) 1204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 1205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DetailOutputWrapper wrapper(snapshot); 1207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 1208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DialogSection section = static_cast<DialogSection>(i); 1209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!SectionIsActive(section)) 1210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch continue; 1211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DetailInputs* inputs = MutableRequestedFieldsForSection(section); 1213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch wrapper.FillInputs(inputs); 1214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = 0; i < inputs->size(); ++i) { 1216ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (InputWasEdited((*inputs)[i].type, (*inputs)[i].initial_value)) { 1217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SuggestionsMenuModelForSection(section)->SetCheckedItem(kAddNewItemKey); 1218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 1219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::UpdateSection(DialogSection section) { 1225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (view_) 1226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->UpdateSection(section); 1227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::UpdateForErrors() { 1230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!view_) 1231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 1232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Currently, the view should only need to be updated if there are 1234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // |wallet_errors_| or validating a suggestion that's based on existing data. 1235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool should_update = !wallet_errors_.empty(); 1236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!should_update) { 1237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 1238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsEditingExistingData(static_cast<DialogSection>(i))) { 1239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch should_update = true; 1240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 1241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (should_update) 1246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch view_->UpdateForErrors(); 1247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 124958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::StartCardScramblingRefresher() { 125058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) RefreshCardScramblingOverlay(); 125158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) card_scrambling_refresher_.Start( 125258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FROM_HERE, 125358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(75), 125458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) this, 125558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &AutofillDialogControllerImpl::RefreshCardScramblingOverlay); 125658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 125758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 125858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::RefreshCardScramblingOverlay() { 125958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scrambled_card_number_ = GenerateRandomCardNumber(); 126058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PushOverlayUpdate(); 126158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 126258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 126358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::PushOverlayUpdate() { 126458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (view_) { 126558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ScopedViewUpdates updates(view_.get()); 126658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) view_->UpdateOverlay(); 126758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 126858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 126958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const DetailInputs& AutofillDialogControllerImpl::RequestedFieldsForSection( 12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialogSection section) const { 12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (section) { 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_CC: 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return requested_cc_fields_; 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_BILLING: 12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return requested_billing_fields_; 12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_CC_BILLING: 12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return requested_cc_billing_fields_; 12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_SHIPPING: 12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return requested_shipping_fields_; 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return requested_billing_fields_; 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::ComboboxModel* AutofillDialogControllerImpl::ComboboxModelForAutofillType( 12883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ServerFieldType type) { 1289bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch switch (type) { 12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case CREDIT_CARD_EXP_MONTH: 12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &cc_exp_month_combobox_model_; 12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case CREDIT_CARD_EXP_4_DIGIT_YEAR: 12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &cc_exp_year_combobox_model_; 12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ADDRESS_HOME_COUNTRY: 1297bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch case ADDRESS_BILLING_COUNTRY: 12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &country_combobox_model_; 12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::MenuModel* AutofillDialogControllerImpl::MenuModelForSection( 13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialogSection section) { 1307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 1308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The shipping section menu is special. It will always show because there is 1309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // a choice between "Use billing" and "enter new". 1310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (section == SECTION_SHIPPING) 1311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return model; 1312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // For other sections, only show a menu if there's at least one suggestion. 1314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (int i = 0; i < model->GetItemCount(); ++i) { 1315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsASuggestionItemKey(model->GetItemKeyAt(i))) 1316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return model; 1317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 1320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::MenuModel* AutofillDialogControllerImpl::MenuModelForAccountChooser() { 1323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If there were unrecoverable Wallet errors, or if there are choices other 1324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // than "Pay without the wallet", show the full menu. 13254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(estade): this can present a braindead menu (only 1 option) when 13264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // there's a wallet error. 132758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (wallet_error_notification_ || 13284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) (SignedInState() == SIGNED_IN && 13294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) account_chooser_model_.HasAccountsToChoose())) { 1330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return &account_chooser_model_; 1331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Otherwise, there is no menu, just a sign in link. 1334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Image AutofillDialogControllerImpl::AccountChooserImage() { 13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!MenuModelForAccountChooser()) { 1339a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (signin_registrar_.IsEmpty()) { 1340a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return ui::ResourceBundle::GetSharedInstance().GetImageNamed( 1341a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) IDR_WALLET_ICON); 1342a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 1343a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1344a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return gfx::Image(); 13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Image icon; 1348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) account_chooser_model_.GetIconAt( 1349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) account_chooser_model_.GetIndexOfCommandId( 1350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) account_chooser_model_.checked_item()), 1351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &icon); 13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return icon; 13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochgfx::Image AutofillDialogControllerImpl::ButtonStripImage() const { 135658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (IsPayingWithWallet()) { 13572385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return ui::ResourceBundle::GetSharedInstance().GetImageNamed( 13582385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch IDR_WALLET_LOGO); 13592385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 13602385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 13612385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return gfx::Image(); 13622385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 13632385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)string16 AutofillDialogControllerImpl::LabelForSection(DialogSection section) 13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const { 13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (section) { 13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_CC: 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SECTION_CC); 13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_BILLING: 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_CC_BILLING: 13717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SECTION_BILLING); 13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_SHIPPING: 13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SECTION_SHIPPING); 13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 137558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 137658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return string16(); 13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SuggestionState AutofillDialogControllerImpl::SuggestionStateForSection( 1380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DialogSection section) { 1381c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch string16 vertically_compact, horizontally_compact; 1382c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch bool show_suggestion = SuggestionTextForSection(section, 1383c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch &vertically_compact, 1384c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch &horizontally_compact); 1385c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return SuggestionState(show_suggestion, 1386c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch vertically_compact, 1387c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch horizontally_compact, 1388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionIconForSection(section), 1389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtraSuggestionTextForSection(section), 13907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ExtraSuggestionIconForSection(section)); 1391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1393c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochbool AutofillDialogControllerImpl::SuggestionTextForSection( 1394c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch DialogSection section, 1395c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch base::string16* vertically_compact, 1396c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch base::string16* horizontally_compact) { 1397c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch base::string16 action_text = RequiredActionTextForSection(section); 1398c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch if (!action_text.empty()) { 1399c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch *vertically_compact = *horizontally_compact = action_text; 1400c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return true; 1401c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch } 1402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When the user has clicked 'edit' or a suggestion is somehow invalid (e.g. a 1404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // user selects a credit card that has expired), don't show a suggestion (even 1405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // though there is a profile selected in the model). 1406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (IsEditingExistingData(section)) 1407c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return false; 14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string item_key = model->GetItemKeyForCheckedItem(); 1411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (item_key == kSameAsBillingKey) { 1412c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch *vertically_compact = *horizontally_compact = l10n_util::GetStringUTF16( 1413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IDS_AUTOFILL_DIALOG_USING_BILLING_FOR_SHIPPING); 1414c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return true; 1415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!IsASuggestionItemKey(item_key)) 1418c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return false; 14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section); 1421c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return wrapper->GetDisplayText(vertically_compact, horizontally_compact); 1422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)string16 AutofillDialogControllerImpl::RequiredActionTextForSection( 1425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DialogSection section) const { 1426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (section == SECTION_CC_BILLING && IsSubmitPausedOn(wallet::VERIFY_CVV)) { 1427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const wallet::WalletItems::MaskedInstrument* current_instrument = 1428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wallet_items_->GetInstrumentById(active_instrument_id_); 1429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (current_instrument) 1430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return current_instrument->TypeAndLastFourDigits(); 1431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DetailOutputMap output; 1433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->GetUserInput(section, &output); 1434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreditCard card; 1435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetBillingInfoFromOutputs(output, &card, NULL, NULL); 1436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return card.TypeAndLastFourDigits(); 1437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return string16(); 1440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)string16 AutofillDialogControllerImpl::ExtraSuggestionTextForSection( 1443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DialogSection section) const { 1444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (section == SECTION_CC || 1445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (section == SECTION_CC_BILLING && IsSubmitPausedOn(wallet::VERIFY_CVV))) { 1446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PLACEHOLDER_CVC); 1447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return string16(); 1450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1452868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const wallet::WalletItems::MaskedInstrument* AutofillDialogControllerImpl:: 1453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ActiveInstrument() const { 1454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!IsPayingWithWallet()) 1455868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 1456868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1457868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const SuggestionsMenuModel* model = 1458868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SuggestionsMenuModelForSection(SECTION_CC_BILLING); 1459868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string item_key = model->GetItemKeyForCheckedItem(); 1460868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!IsASuggestionItemKey(item_key)) 1461868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 1462868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1463868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int index; 1464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!base::StringToInt(item_key, &index) || index < 0 || 1465868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static_cast<size_t>(index) >= wallet_items_->instruments().size()) { 1466868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NOTREACHED(); 1467868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 1468868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1470868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return wallet_items_->instruments()[index]; 1471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1473868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const wallet::Address* AutofillDialogControllerImpl:: 1474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ActiveShippingAddress() const { 1475a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!IsPayingWithWallet() || !IsShippingAddressRequired()) 1476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 1477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const SuggestionsMenuModel* model = 1479868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SuggestionsMenuModelForSection(SECTION_SHIPPING); 1480868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string item_key = model->GetItemKeyForCheckedItem(); 1481868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!IsASuggestionItemKey(item_key)) 1482868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 1483868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1484868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int index; 1485868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!base::StringToInt(item_key, &index) || index < 0 || 1486868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static_cast<size_t>(index) >= wallet_items_->addresses().size()) { 1487868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NOTREACHED(); 1488868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 1489868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1490868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1491868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return wallet_items_->addresses()[index]; 1492868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1493868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<DataModelWrapper> AutofillDialogControllerImpl::CreateWrapper( 14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialogSection section) { 1496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsPayingWithWallet() && full_wallet_ && 1497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) full_wallet_->required_actions().empty()) { 14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (section == SECTION_CC_BILLING) { 14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<DataModelWrapper>( 15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new FullWalletBillingWrapper(full_wallet_.get())); 15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (section == SECTION_SHIPPING) { 15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<DataModelWrapper>( 15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new FullWalletShippingWrapper(full_wallet_.get())); 15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string item_key = model->GetItemKeyForCheckedItem(); 1510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!IsASuggestionItemKey(item_key) || IsManuallyEditingSection(section)) 15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<DataModelWrapper>(); 15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsPayingWithWallet()) { 15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (section == SECTION_CC_BILLING) { 15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<DataModelWrapper>( 1516868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new WalletInstrumentWrapper(ActiveInstrument())); 15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (section == SECTION_SHIPPING) { 1520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return scoped_ptr<DataModelWrapper>( 1521868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new WalletAddressWrapper(ActiveShippingAddress())); 1522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return scoped_ptr<DataModelWrapper>(); 15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (section == SECTION_CC) { 15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreditCard* card = GetManager()->GetCreditCardByGUID(item_key); 15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(card); 15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<DataModelWrapper>(new AutofillCreditCardWrapper(card)); 15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillProfile* profile = GetManager()->GetProfileByGUID(item_key); 15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(profile); 153558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (section == SECTION_SHIPPING) { 153658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return scoped_ptr<DataModelWrapper>( 1537d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) new AutofillShippingAddressWrapper(profile)); 153858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 153958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK_EQ(SECTION_BILLING, section); 15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<DataModelWrapper>( 1541d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) new AutofillProfileWrapper(profile)); 15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Image AutofillDialogControllerImpl::SuggestionIconForSection( 15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialogSection section) { 15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DataModelWrapper> model = CreateWrapper(section); 15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!model.get()) 15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Image(); 15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return model->GetIcon(); 15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Image AutofillDialogControllerImpl::ExtraSuggestionIconForSection( 1554d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DialogSection section) { 1555d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (section != SECTION_CC && section != SECTION_CC_BILLING) 1556d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return gfx::Image(); 1557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1558d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<DataModelWrapper> model = CreateWrapper(section); 1559d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!model.get()) 1560d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return gfx::Image(); 1561d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1562d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return CvcIconForCreditCardType( 1563d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) model->GetInfo(AutofillType(CREDIT_CARD_TYPE))); 1564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1566d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)FieldIconMap AutofillDialogControllerImpl::IconsForFields( 1567d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const FieldValueMap& user_inputs) const { 1568d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FieldIconMap result; 1569d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::string16 credit_card_type; 1570d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1571d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FieldValueMap::const_iterator credit_card_iter = 1572d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) user_inputs.find(CREDIT_CARD_NUMBER); 1573d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (credit_card_iter != user_inputs.end()) { 1574d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const string16& number = credit_card_iter->second; 1575d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::string type = CreditCard::GetCreditCardType(number); 1576d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) credit_card_type = CreditCard::TypeForDisplay(type); 1577d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) result[CREDIT_CARD_NUMBER] = CreditCardIconForType(type); 1578d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 1579d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1580d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!user_inputs.count(CREDIT_CARD_VERIFICATION_CODE)) 1581d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return result; 1582d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1583d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) result[CREDIT_CARD_VERIFICATION_CODE] = 1584d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CvcIconForCreditCardType(credit_card_type); 1585d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1586d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return result; 1587d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 1588d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1589d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool AutofillDialogControllerImpl::FieldControlsIcons( 1590d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ServerFieldType type) const { 1591d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return type == CREDIT_CARD_NUMBER; 1592d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 1593d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 15944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)string16 AutofillDialogControllerImpl::TooltipForField(ServerFieldType type) 15954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const { 15964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (type == PHONE_HOME_WHOLE_NUMBER || type == PHONE_BILLING_WHOLE_NUMBER) 15974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_TOOLTIP_PHONE_NUMBER); 15984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 15994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return string16(); 16004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 16014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 16028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool AutofillDialogControllerImpl::InputIsEditable( 16038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const DetailInput& input, 16048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DialogSection section) { 16058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (section != SECTION_CC_BILLING) 16068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return true; 16078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 16088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (input.type == CREDIT_CARD_NUMBER) 16098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return !IsEditingExistingData(section); 16108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 16118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // For CVC, only require (allow) input if the user has edited some other 16128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // aspect of the card. 16138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (input.type == CREDIT_CARD_VERIFICATION_CODE && 16148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) IsEditingExistingData(section)) { 16158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DetailOutputMap output; 16168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) view_->GetUserInput(section, &output); 16178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) WalletInstrumentWrapper wrapper(ActiveInstrument()); 16188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 16198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) for (DetailOutputMap::iterator iter = output.begin(); iter != output.end(); 16208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ++iter) { 16218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (iter->first->type == input.type) 16228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) continue; 16238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 16248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) AutofillType type(iter->first->type); 16258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (type.group() == CREDIT_CARD && 16268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) iter->second != wrapper.GetInfo(type)) { 16278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return true; 16288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 16298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 16308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 16318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return false; 16328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 16338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 16348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return true; 16358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 16368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 16374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// TODO(groby): Add more tests. 1638a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)string16 AutofillDialogControllerImpl::InputValidityMessage( 16397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogSection section, 16403240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ServerFieldType type, 16417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const string16& value) { 16427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // If the field is edited, clear any Wallet errors. 16437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (IsPayingWithWallet()) { 16447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WalletValidationErrors::iterator it = wallet_errors_.find(section); 16457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (it != wallet_errors_.end()) { 16467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TypeErrorInputMap::const_iterator iter = it->second.find(type); 16477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (iter != it->second.end()) { 16487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (iter->second.second == value) 16497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return iter->second.first; 16507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) it->second.erase(type); 16517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 16527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 16537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 16547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1655bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch switch (AutofillType(type).GetStorableType()) { 165690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case EMAIL_ADDRESS: 1657868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!value.empty() && !IsValidEmailAddress(value)) { 1658868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return l10n_util::GetStringUTF16( 1659868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_EMAIL_ADDRESS); 1660868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 166190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 166290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1663eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case CREDIT_CARD_NUMBER: { 1664eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!value.empty()) { 1665eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::string16 message = CreditCardNumberValidityMessage(value); 1666eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!message.empty()) 1667eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return message; 1668eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1669eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 1670eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 167190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 167290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case CREDIT_CARD_EXP_MONTH: 1673ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!InputWasEdited(CREDIT_CARD_EXP_MONTH, value)) { 1674ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return l10n_util::GetStringUTF16( 1675ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch IDS_AUTOFILL_DIALOG_VALIDATION_MISSING_VALUE); 1676ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 1677ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch break; 1678ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 167990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case CREDIT_CARD_EXP_4_DIGIT_YEAR: 1680ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!InputWasEdited(CREDIT_CARD_EXP_4_DIGIT_YEAR, value)) { 1681ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return l10n_util::GetStringUTF16( 1682ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch IDS_AUTOFILL_DIALOG_VALIDATION_MISSING_VALUE); 1683ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 168490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 168590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 168690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case CREDIT_CARD_VERIFICATION_CODE: 1687868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!value.empty() && !autofill::IsValidCreditCardSecurityCode(value)) { 1688868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return l10n_util::GetStringUTF16( 1689868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_SECURITY_CODE); 1690868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 169190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 169290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 169390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case ADDRESS_HOME_LINE1: 169490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 169690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case ADDRESS_HOME_LINE2: 169790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return base::string16(); // Line 2 is optional - always valid. 169890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 16997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case ADDRESS_HOME_CITY: 17007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case ADDRESS_HOME_COUNTRY: 17017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 17027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 170390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case ADDRESS_HOME_STATE: 17047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!value.empty() && !autofill::IsValidState(value)) { 17057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return l10n_util::GetStringUTF16( 17067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_REGION); 17077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 17085e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) break; 17095e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) 171090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case ADDRESS_HOME_ZIP: 17117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!value.empty() && !autofill::IsValidZip(value)) { 17127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return l10n_util::GetStringUTF16( 17137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_ZIP_CODE); 17147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 171590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 171690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 17177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case NAME_FULL: 17187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Wallet requires a first and last billing name. 17197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (section == SECTION_CC_BILLING && !value.empty() && 17207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch !IsCardHolderNameValidForWallet(value)) { 17217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(IsPayingWithWallet()); 17227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return l10n_util::GetStringUTF16( 17237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDS_AUTOFILL_DIALOG_VALIDATION_WALLET_REQUIRES_TWO_NAMES); 17247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 172590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1727868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case PHONE_HOME_WHOLE_NUMBER: // Used in shipping section. 1728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) break; 1729868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1730868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case PHONE_BILLING_WHOLE_NUMBER: // Used in billing section. 173190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 173290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 173390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) default: 173490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NOTREACHED(); // Trying to validate unknown field. 173590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 173690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 173790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1738868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return value.empty() ? 1739868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_VALIDATION_MISSING_VALUE) : 1740868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::string16(); 17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// TODO(groby): Also add tests. 17444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)ValidityMessages AutofillDialogControllerImpl::InputsAreValid( 17457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogSection section, 17464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const DetailOutputMap& inputs) { 17474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ValidityMessages messages; 17483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch std::map<ServerFieldType, string16> field_values; 17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (DetailOutputMap::const_iterator iter = inputs.begin(); 17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != inputs.end(); ++iter) { 1751ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const ServerFieldType type = iter->first->type; 1752ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 17534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::string16 text = InputValidityMessage(section, type, iter->second); 17544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1755ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Skip empty/unchanged fields in edit mode. Ignore country code as it 17564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // always has a value. If the individual field does not have validation 17574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // errors, assume it to be valid unless later proven otherwise. 17584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool sure = InputWasEdited(type, iter->second) || 17594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ComboboxModelForAutofillType(type) == &country_combobox_model_; 1760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 17614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Consider only individually valid fields for inter-field validation. 17624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (text.empty()) { 1763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) field_values[type] = iter->second; 17644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // If the field is valid but can be invalidated by inter-field validation, 17654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // assume it to be unsure. 17664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (type == CREDIT_CARD_EXP_4_DIGIT_YEAR || 17674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) type == CREDIT_CARD_EXP_MONTH || 17684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) type == CREDIT_CARD_VERIFICATION_CODE || 17694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) type == PHONE_HOME_WHOLE_NUMBER || 17704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) type == PHONE_BILLING_WHOLE_NUMBER) { 17714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) sure = false; 17724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 17734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 17744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) messages.Set(type, ValidityMessage(text, sure)); 17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Validate the date formed by month and year field. (Autofill dialog is 1778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // never supposed to have 2-digit years, so not checked). 1779868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (field_values.count(CREDIT_CARD_EXP_4_DIGIT_YEAR) && 1780868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) field_values.count(CREDIT_CARD_EXP_MONTH) && 1781ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch InputWasEdited(CREDIT_CARD_EXP_4_DIGIT_YEAR, 1782ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch field_values[CREDIT_CARD_EXP_4_DIGIT_YEAR]) && 1783ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch InputWasEdited(CREDIT_CARD_EXP_MONTH, 17844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) field_values[CREDIT_CARD_EXP_MONTH])) { 17854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ValidityMessage year_message(base::string16(), true); 17864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ValidityMessage month_message(base::string16(), true); 17874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!IsCreditCardExpirationValid(field_values[CREDIT_CARD_EXP_4_DIGIT_YEAR], 17884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) field_values[CREDIT_CARD_EXP_MONTH])) { 17894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The dialog shows the same error message for the month and year fields. 17904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) year_message.text = l10n_util::GetStringUTF16( 17914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_EXPIRATION_DATE); 17924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) month_message.text = l10n_util::GetStringUTF16( 17934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_EXPIRATION_DATE); 17944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 17954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) messages.Set(CREDIT_CARD_EXP_4_DIGIT_YEAR, year_message); 17964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) messages.Set(CREDIT_CARD_EXP_MONTH, month_message); 17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If there is a credit card number and a CVC, validate them together. 18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (field_values.count(CREDIT_CARD_NUMBER) && 18014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) field_values.count(CREDIT_CARD_VERIFICATION_CODE)) { 18024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ValidityMessage ccv_message(base::string16(), true); 18034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!autofill::IsValidCreditCardSecurityCode( 18044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) field_values[CREDIT_CARD_VERIFICATION_CODE], 18054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) field_values[CREDIT_CARD_NUMBER])) { 18064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ccv_message.text = l10n_util::GetStringUTF16( 18074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_SECURITY_CODE); 18084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 18094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) messages.Set(CREDIT_CARD_VERIFICATION_CODE, ccv_message); 18102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1812868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Validate the shipping phone number against the country code of the address. 181390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (field_values.count(ADDRESS_HOME_COUNTRY) && 181490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) field_values.count(PHONE_HOME_WHOLE_NUMBER)) { 181590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) i18n::PhoneObject phone_object( 181690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) field_values[PHONE_HOME_WHOLE_NUMBER], 181790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AutofillCountry::GetCountryCode( 181890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) field_values[ADDRESS_HOME_COUNTRY], 181990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) g_browser_process->GetApplicationLocale())); 18204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ValidityMessage phone_message(base::string16(), true); 182190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!phone_object.IsValidNumber()) { 18224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) phone_message.text = l10n_util::GetStringUTF16( 1823868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_PHONE_NUMBER); 1824868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 18254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) messages.Set(PHONE_HOME_WHOLE_NUMBER, phone_message); 1826868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1827868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1828868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Validate the billing phone number against the country code of the address. 1829868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (field_values.count(ADDRESS_BILLING_COUNTRY) && 1830868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) field_values.count(PHONE_BILLING_WHOLE_NUMBER)) { 1831868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) i18n::PhoneObject phone_object( 1832868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) field_values[PHONE_BILLING_WHOLE_NUMBER], 1833868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AutofillCountry::GetCountryCode( 1834868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) field_values[ADDRESS_BILLING_COUNTRY], 1835868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) g_browser_process->GetApplicationLocale())); 18364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ValidityMessage phone_message(base::string16(), true); 1837868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!phone_object.IsValidNumber()) { 18384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) phone_message.text = l10n_util::GetStringUTF16( 1839868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_PHONE_NUMBER); 184090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 18414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) messages.Set(PHONE_BILLING_WHOLE_NUMBER, phone_message); 184290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 184390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 18444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return messages; 18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 18462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::UserEditedOrActivatedInput( 18487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogSection section, 18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DetailInput* input, 18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeView parent_view, 18512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& content_bounds, 18522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16& field_contents, 18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool was_edit) { 18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the field is edited down to empty, don't show a popup. 18552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (was_edit && field_contents.empty()) { 18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HidePopup(); 18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the user clicks while the popup is already showing, be sure to hide 18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // it. 1862868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!was_edit && popup_controller_.get()) { 18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HidePopup(); 18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<string16> popup_values, popup_labels, popup_icons; 1868ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (common::IsCreditCardType(input->type)) { 18693240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch GetManager()->GetCreditCardSuggestions(AutofillType(input->type), 18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) field_contents, 18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_values, 18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_labels, 18732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_icons, 18742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_guids_); 18752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 18763240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch std::vector<ServerFieldType> field_types; 1877d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const DetailInputs& inputs = RequestedFieldsForSection(section); 1878d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) for (DetailInputs::const_iterator iter = inputs.begin(); 1879d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) iter != inputs.end(); ++iter) { 18802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) field_types.push_back(iter->type); 18812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18823240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch GetManager()->GetProfileSuggestions(AutofillType(input->type), 18832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) field_contents, 18842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 18852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) field_types, 18862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_values, 18872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_labels, 18882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_icons, 18892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &popup_guids_); 18902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (popup_values.empty()) { 1893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HidePopup(); 18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(estade): do we need separators and control rows like 'Clear 18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Form'? 18992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<int> popup_ids; 19002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < popup_guids_.size(); ++i) { 19012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_ids.push_back(i); 19022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_controller_ = AutofillPopupControllerImpl::GetOrCreate( 1905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) popup_controller_, 1906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 1907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parent_view, 19087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) content_bounds, 19097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::i18n::IsRTL() ? 19107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::i18n::RIGHT_TO_LEFT : base::i18n::LEFT_TO_RIGHT); 1911424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) popup_controller_->set_hide_on_outside_click(true); 19124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 19134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // |input_showing_popup_| must be set before calling |Show()|. 19144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) input_showing_popup_ = input; 19154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 19162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_controller_->Show(popup_values, 19172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_labels, 19182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_icons, 19192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_ids); 19202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::FocusMoved() { 19232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HidePopup(); 19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldShowErrorBubble() const { 19274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return !input_showing_popup_; 19284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 19294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 19302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::ViewClosed() { 19312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetManager()->RemoveObserver(this); 19322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Called from here rather than in ~AutofillDialogControllerImpl as this 19347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // relies on virtual methods that change to their base class in the dtor. 19357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MaybeShowCreditCardBubble(); 19367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 19372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete this; 19382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1940868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)std::vector<DialogNotification> AutofillDialogControllerImpl:: 1941868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CurrentNotifications() { 19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<DialogNotification> notifications; 19432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 194458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(dbeam): figure out a way to dismiss this error after a while. 194558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (wallet_error_notification_) 194658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) notifications.push_back(*wallet_error_notification_); 1947eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsSubmitPausedOn(wallet::VERIFY_CVV)) { 1949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) notifications.push_back(DialogNotification( 1950868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DialogNotification::REQUIRED_ACTION, 1951868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_VERIFY_CVV))); 19522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!wallet_server_validation_recoverable_) { 1955a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) notifications.push_back(DialogNotification( 1956a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DialogNotification::REQUIRED_ACTION, 19577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch l10n_util::GetStringUTF16( 19587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDS_AUTOFILL_DIALOG_FAILED_TO_SAVE_WALLET_DATA))); 1959a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 1960a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1961868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (choose_another_instrument_or_address_) { 1962868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) notifications.push_back(DialogNotification( 1963868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DialogNotification::REQUIRED_ACTION, 19647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch l10n_util::GetStringUTF16( 19657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDS_AUTOFILL_DIALOG_CHOOSE_DIFFERENT_WALLET_INSTRUMENT))); 1966868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1967868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1968d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (notifications.empty() && MenuModelForAccountChooser()) { 1969d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::string16 text = l10n_util::GetStringUTF16( 1970d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) IsManuallyEditingAnySection() ? 1971d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) IDS_AUTOFILL_DIALOG_SAVE_DETAILS_IN_WALLET : 1972d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) IDS_AUTOFILL_DIALOG_USE_WALLET); 1973d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DialogNotification notification( 1974d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DialogNotification::WALLET_USAGE_CONFIRMATION, 1975d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) text); 1976d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) notification.set_tooltip_text( 1977d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) l10n_util::GetStringUTF16( 1978d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) IDS_AUTOFILL_DIALOG_SAVE_IN_WALLET_TOOLTIP)); 1979d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) notification.set_checked(IsPayingWithWallet()); 1980d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) notifications.push_back(notification); 1981d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 1982d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1983d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (IsPayingWithWallet() && !wallet::IsUsingProd()) { 1984d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) notifications.push_back(DialogNotification( 1985d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DialogNotification::DEVELOPER_WARNING, 1986d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_NOT_PROD_WARNING))); 1987d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 1988d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1989d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (RequestingCreditCardInfo() && !TransmissionWillBeSecure()) { 1990d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) notifications.push_back(DialogNotification( 1991d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DialogNotification::SECURITY_WARNING, 1992d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_SECURITY_WARNING))); 1993d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 1994d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1995d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!invoked_from_same_origin_) { 1996d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) notifications.push_back(DialogNotification( 1997d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DialogNotification::SECURITY_WARNING, 1998d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) l10n_util::GetStringFUTF16(IDS_AUTOFILL_DIALOG_SITE_WARNING, 1999d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) UTF8ToUTF16(source_url_.host())))); 2000eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2001eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 20022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return notifications; 20032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 200558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::LinkClicked(const GURL& url) { 200658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) OpenTabWithUrl(url); 200758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 200858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2009a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void AutofillDialogControllerImpl::SignInLinkClicked() { 20103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 20113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2012a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (signin_registrar_.IsEmpty()) { 2013a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Start sign in. 2014a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DCHECK(!IsPayingWithWallet()); 2015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) waiting_for_explicit_sign_in_response_ = true; 2017a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) content::Source<content::NavigationController> source(view_->ShowSignIn()); 2018a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) signin_registrar_.Add( 2019a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, source); 2020a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) view_->UpdateAccountChooser(); 20212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2022a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) GetMetricLogger().LogDialogUiEvent( 202358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AutofillMetrics::DIALOG_UI_SIGNIN_SHOWN); 2024a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } else { 20254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) waiting_for_explicit_sign_in_response_ = false; 2026a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) HideSignIn(); 2027a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 20282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::NotificationCheckboxStateChanged( 2031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DialogNotification::Type type, bool checked) { 2032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (type == DialogNotification::WALLET_USAGE_CONFIRMATION) { 2033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (checked) 2034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) account_chooser_model_.SelectActiveWalletAccount(); 2035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 2036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) account_chooser_model_.SelectUseAutofill(); 20372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LegalDocumentLinkClicked( 204158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Range& range) { 2042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < legal_document_link_ranges_.size(); ++i) { 2043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (legal_document_link_ranges_[i] == range) { 2044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OpenTabWithUrl(wallet_items_->legal_documents()[i]->url()); 2045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 2046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 20472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 20502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2052ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool AutofillDialogControllerImpl::OnCancel() { 2053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HidePopup(); 205458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!is_submitting_) 20557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LogOnCancelMetrics(); 2056d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) callback_.Run(NULL); 2057ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return true; 2058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2059c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2060ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool AutofillDialogControllerImpl::OnAccept() { 2061868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) choose_another_instrument_or_address_ = false; 20627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) wallet_server_validation_recoverable_ = true; 2063c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HidePopup(); 206458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 206558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // This must come before SetIsSubmitting(). 2066eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsPayingWithWallet()) { 20678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // In the VERIFY_CVV case, hold onto the previously submitted cardholder 20688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // name. 20698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!IsSubmitPausedOn(wallet::VERIFY_CVV)) { 20708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) submitted_cardholder_name_ = 20718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GetValueFromSection(SECTION_CC_BILLING, NAME_BILLING_FULL); 20728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 20738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Snag the last four digits of the backing card now as it could be wiped 20748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // out if a CVC challenge happens. 20758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (ActiveInstrument()) { 20768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) backing_card_last_four_ = ActiveInstrument()->TypeAndLastFourDigits(); 20778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } else { 20788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DetailOutputMap output; 20798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) view_->GetUserInput(SECTION_CC_BILLING, &output); 20808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) CreditCard card; 20818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GetBillingInfoFromOutputs(output, &card, NULL, NULL); 20828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) backing_card_last_four_ = card.TypeAndLastFourDigits(); 20838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 20848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 20858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(!submitted_cardholder_name_.empty()); 20868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(!backing_card_last_four_.empty()); 2087eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2088eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetIsSubmitting(true); 209058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsSubmitPausedOn(wallet::VERIFY_CVV)) { 2092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!active_instrument_id_.empty()); 2093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetWalletClient()->AuthenticateInstrument( 2094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_instrument_id_, 2095ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UTF16ToUTF8(view_->GetCvc())); 2096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (IsPayingWithWallet()) { 2097eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AcceptLegalDocuments(); 2098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 20992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FinishSubmit(); 2100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2101ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2102ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return false; 21032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Profile* AutofillDialogControllerImpl::profile() { 21062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return profile_; 21072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2109bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochcontent::WebContents* AutofillDialogControllerImpl::GetWebContents() { 2110bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return web_contents(); 21112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 21142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// AutofillPopupDelegate implementation. 21152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnPopupShown( 2117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) content::RenderWidgetHost::KeyPressEventCallback* callback) { 21184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ScopedViewUpdates update(view_.get()); 21194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) view_->UpdateErrorBubble(); 21204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 212158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogPopupEvent(AutofillMetrics::DIALOG_POPUP_SHOWN); 21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnPopupHidden( 2125424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) content::RenderWidgetHost::KeyPressEventCallback* callback) {} 2126424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 2127424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool AutofillDialogControllerImpl::ShouldRepostEvent( 2128424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const ui::MouseEvent& event) { 2129424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // If the event would be reposted inside |input_showing_popup_|, just ignore. 2130424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return !view_->HitTestInput(*input_showing_popup_, event.location()); 2131424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 21322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::DidSelectSuggestion(int identifier) { 21342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(estade): implement. 21352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::DidAcceptSuggestion(const string16& value, 21382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int identifier) { 21393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 21402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PersonalDataManager::GUIDPair& pair = popup_guids_[identifier]; 21412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<DataModelWrapper> wrapper; 2143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (common::IsCreditCardType(input_showing_popup_->type)) { 2144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wrapper.reset(new AutofillCreditCardWrapper( 2145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetManager()->GetCreditCardByGUID(pair.first))); 2146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 2147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wrapper.reset(new AutofillProfileWrapper( 2148d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetManager()->GetProfileByGUID(pair.first), 2149d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) AutofillType(input_showing_popup_->type), 2150d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) pair.second)); 2151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 21522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 2154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DialogSection section = static_cast<DialogSection>(i); 2155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wrapper->FillInputs(MutableRequestedFieldsForSection(section)); 2156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->FillSection(section, *input_showing_popup_); 2157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 21582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetMetricLogger().LogDialogPopupEvent( 216058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AutofillMetrics::DIALOG_POPUP_FORM_FILLED); 21612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(estade): not sure why it's necessary to do this explicitly. 21632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HidePopup(); 21642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::RemoveSuggestion(const string16& value, 21672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int identifier) { 21682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(estade): implement. 21692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::ClearPreviewedForm() { 21722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(estade): implement. 21732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 21762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// content::NotificationObserver implementation. 21772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::Observe( 21792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int type, 21802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationSource& source, 21812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) { 21822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(type, content::NOTIFICATION_NAV_ENTRY_COMMITTED); 21832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::LoadCommittedDetails* load_details = 21842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::Details<content::LoadCommittedDetails>(details).ptr(); 21851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (IsSignInContinueUrl(load_details->entry->GetVirtualURL())) { 21864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(estade): will need to update this when we fix <crbug.com/247755>. 2187b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) account_chooser_model_.SelectActiveWalletAccount(); 21884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FetchWalletCookieAndUserName(); 21891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 21901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // NOTE: |HideSignIn()| may delete the WebContents which doesn't expect to 21911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // be deleted while committing a nav entry. Just call |HideSignIn()| later. 21921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 21931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::Bind(&AutofillDialogControllerImpl::HideSignIn, 21941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::Unretained(this))); 21952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 21992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// SuggestionsMenuModelDelegate implementation. 22002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AutofillDialogControllerImpl::SuggestionsMenuWillShow() { 22024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) HidePopup(); 22034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 22044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 22052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::SuggestionItemSelected( 2206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionsMenuModel* model, 2207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t index) { 22083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 22093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (model->GetItemKeyAt(index) == kManageItemsKey) { 221190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GURL url; 221290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!IsPayingWithWallet()) { 221390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GURL settings_url(chrome::kChromeUISettingsURL); 221490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) url = settings_url.Resolve(chrome::kAutofillSubPage); 221590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 221658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // Reset |last_wallet_items_fetch_timestamp_| to ensure that the Wallet 221758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // data is refreshed as soon as the user switches back to this tab after 221858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // potentially editing his data. 221958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch last_wallet_items_fetch_timestamp_ = base::TimeTicks(); 22204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) size_t user_index = account_chooser_model_.GetActiveWalletAccountIndex(); 222190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) url = SectionForSuggestionsMenuModel(*model) == SECTION_SHIPPING ? 22224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallet::GetManageAddressesUrl(user_index) : 22234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallet::GetManageInstrumentsUrl(user_index); 222490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 222590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OpenTabWithUrl(url); 2227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 2228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) model->SetCheckedIndex(index); 2231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DialogSection section = SectionForSuggestionsMenuModel(*model); 2232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ResetSectionInput(section); 2233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ShowEditUiIfBadSuggestion(section); 2234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateSection(section); 2235d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) view_->UpdateNotificationArea(); 2236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateForErrors(); 2237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LogSuggestionItemSelectedMetric(*model); 22392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 22422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// wallet::WalletClientDelegate implementation. 22432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const AutofillMetrics& AutofillDialogControllerImpl::GetMetricLogger() const { 22452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return metric_logger_; 22462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string AutofillDialogControllerImpl::GetRiskData() const { 2249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(!risk_data_.empty()); 2250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return risk_data_; 22512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstd::string AutofillDialogControllerImpl::GetWalletCookieValue() const { 22547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return wallet_cookie_value_; 22557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 22567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2257a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool AutofillDialogControllerImpl::IsShippingAddressRequired() const { 2258a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return cares_about_shipping_; 2259a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 2260a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 22612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidAcceptLegalDocuments() { 226290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(is_submitting_ && IsPayingWithWallet()); 226390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) has_accepted_legal_documents_ = true; 226490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LoadRiskFingerprintData(); 22652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidAuthenticateInstrument(bool success) { 2268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(is_submitting_ && IsPayingWithWallet()); 2269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 22704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(dbeam): use the returned full wallet. http://crbug.com/224992 2271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (success) { 22722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFullWallet(); 2273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 22747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DisableWallet(wallet::WalletClient::UNKNOWN_ERROR); 2275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SuggestionsUpdated(); 2276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 22772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 22782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidGetFullWallet( 22802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<wallet::FullWallet> full_wallet) { 2281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(is_submitting_ && IsPayingWithWallet()); 22823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 2283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 22842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) full_wallet_ = full_wallet.Pass(); 22852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (full_wallet_->required_actions().empty()) { 22872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FinishSubmit(); 2288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 2289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) switch (full_wallet_->required_actions()[0]) { 2292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case wallet::CHOOSE_ANOTHER_INSTRUMENT_OR_ADDRESS: 2293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) choose_another_instrument_or_address_ = true; 2294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SetIsSubmitting(false); 2295eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetWalletItems(); 2296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) break; 2297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case wallet::VERIFY_CVV: 2299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SuggestionsUpdated(); 2300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) break; 2301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) default: 23037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DisableWallet(wallet::WalletClient::UNKNOWN_ERROR); 23048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return; 2305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 23068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 23078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) view_->UpdateNotificationArea(); 23088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) view_->UpdateButtonStrip(); 23098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) view_->UpdateOverlay(); 2310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::OnPassiveSigninSuccess( 23134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::vector<std::string>& usernames) { 23144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(estade): for now, we still only support single user login. 23154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::vector<std::string> username; 23164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!usernames.empty()) 23174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) username.push_back(usernames[0]); 23184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) account_chooser_model_.SetWalletAccounts(username); 23197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch signin_helper_->StartWalletCookieValueFetch(); 2320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::OnUserNameFetchSuccess( 23234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::vector<std::string>& usernames) { 23243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 23254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 23264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(estade): for now, we still only support single user login. 23274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::vector<std::string> username; 23284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!usernames.empty()) 23294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) username.push_back(usernames[0]); 23304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 23314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) account_chooser_model_.SetWalletAccounts(username); 23324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) username_fetcher_.reset(); 2333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnWalletOrSigninUpdate(); 2334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::OnPassiveSigninFailure( 2337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GoogleServiceAuthError& error) { 2338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(aruslan): report an error. 2339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG(ERROR) << "failed to passively sign in: " << error.ToString(); 23404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) signin_helper_.reset(); 2341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnWalletSigninError(); 2342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::OnUserNameFetchFailure( 2345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GoogleServiceAuthError& error) { 2346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(aruslan): report an error. 2347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG(ERROR) << "failed to fetch the user account name: " << error.ToString(); 23484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) username_fetcher_.reset(); 23494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Only treat the failed fetch as an error if the user is known to already be 23504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // signed in. Attempting to fetch the username prior to loading the 23514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // |wallet_items_| is purely a performance optimization that shouldn't be 23524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // treated as an error if it fails. 23534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (wallet_items_) 23544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) OnWalletSigninError(); 2355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 23577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AutofillDialogControllerImpl::OnDidFetchWalletCookieValue( 23587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& cookie_value) { 23597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch wallet_cookie_value_ = cookie_value; 23607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch signin_helper_.reset(); 23617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetWalletItems(); 23622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidGetWalletItems( 23652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<wallet::WalletItems> wallet_items) { 2366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) legal_documents_text_.clear(); 2367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) legal_document_link_ranges_.clear(); 236890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) has_accepted_legal_documents_ = false; 23692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wallet_items_ = wallet_items.Pass(); 2371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnWalletOrSigninUpdate(); 23721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ConstructLegalDocumentsText(); 23732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2375ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid AutofillDialogControllerImpl::OnDidSaveToWallet( 23762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& instrument_id, 2377ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::string& address_id, 23787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::vector<wallet::RequiredAction>& required_actions, 23797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::vector<wallet::FormFieldError>& form_field_errors) { 2380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(is_submitting_ && IsPayingWithWallet()); 2381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2382a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (required_actions.empty()) { 2383ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!address_id.empty()) 2384ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch active_address_id_ = address_id; 2385ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!instrument_id.empty()) 2386ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch active_instrument_id_ = instrument_id; 2387ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch GetFullWallet(); 2388a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } else { 23897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) OnWalletFormFieldError(form_field_errors); 2390a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) HandleSaveOrUpdateRequiredActions(required_actions); 2391a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 23922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnWalletError( 23952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallet::WalletClient::ErrorType error_type) { 23967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DisableWallet(error_type); 23972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 23982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 24002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// PersonalDataManagerObserver implementation. 24012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::OnPersonalDataChanged() { 240390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (is_submitting_) 240490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 240590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionsUpdated(); 24072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// AccountChooserModelDelegate implementation. 2411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AutofillDialogControllerImpl::AccountChooserWillShow() { 24134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) HidePopup(); 24144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 24154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 24162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::AccountChoiceChanged() { 24173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 24184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallet::WalletClient* client = GetWalletClient(); 24193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (is_submitting_) 24214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) client->CancelRequests(); 2422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetIsSubmitting(false); 2424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) size_t selected_user_index = 24264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) account_chooser_model_.GetActiveWalletAccountIndex(); 24274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (account_chooser_model_.WalletIsSelected() && 24284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) client->user_index() != selected_user_index) { 24294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) client->CancelRequests(); 24304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) client->set_user_index(selected_user_index); 24314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GetWalletItems(); 24324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 24334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SuggestionsUpdated(); 24344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateAccountChooserView(); 24354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 24372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::UpdateAccountChooserView() { 2439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (view_) { 24403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 2441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->UpdateAccountChooser(); 2442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->UpdateNotificationArea(); 24432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 24472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::HandleKeyPressEventInInput( 24492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NativeWebKeyboardEvent& event) { 2450868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (popup_controller_.get()) 24512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return popup_controller_->HandleKeyPressEvent(event); 24522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 24542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::RequestingCreditCardInfo() const { 24572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_GT(form_structure_.field_count(), 0U); 24582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < form_structure_.field_count(); ++i) { 2460bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch AutofillType type = form_structure_.field(i)->Type(); 2461ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (common::IsCreditCardType(type.GetStorableType())) 24622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 24632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 24642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 24662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::TransmissionWillBeSecure() const { 2469424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return source_url_.SchemeIs(content::kHttpsScheme); 24702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 24712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool AutofillDialogControllerImpl::IsSubmitPausedOn( 24738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) wallet::RequiredAction required_action) const { 24748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return full_wallet_ && full_wallet_->HasRequiredAction(required_action); 24758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 24768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2477ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid AutofillDialogControllerImpl::ShowNewCreditCardBubble( 2478ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<CreditCard> new_card, 2479ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<AutofillProfile> billing_profile) { 2480ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if !defined(OS_ANDROID) 2481ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch NewCreditCardBubbleController::Show(profile(), 2482ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new_card.Pass(), 2483ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch billing_profile.Pass()); 2484ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif 2485ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 2486ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 248758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::SubmitButtonDelayBegin() { 248858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) submit_button_delay_timer_.Start( 248958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FROM_HERE, 249058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta::FromMilliseconds(kSubmitButtonDelayMs), 249158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) this, 249258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &AutofillDialogControllerImpl::OnSubmitButtonDelayEnd); 249358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 249458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 249558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::SubmitButtonDelayEndForTesting() { 249658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(submit_button_delay_timer_.IsRunning()); 249758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) submit_button_delay_timer_.user_task().Run(); 249858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) submit_button_delay_timer_.Stop(); 249958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 250058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 25014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AutofillDialogControllerImpl:: 25024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ClearLastWalletItemsFetchTimestampForTesting() { 25034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) last_wallet_items_fetch_timestamp_ = base::TimeTicks(); 25044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 25054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 25061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)const AccountChooserModel& AutofillDialogControllerImpl:: 25071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AccountChooserModelForTesting() const { 25081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return account_chooser_model_; 25091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 25101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 25111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool AutofillDialogControllerImpl::IsSignInContinueUrl(const GURL& url) const { 25121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return wallet::IsSignInContinueUrl(url); 25131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 25141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)AutofillDialogControllerImpl::AutofillDialogControllerImpl( 2516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::WebContents* contents, 2517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const FormData& form_structure, 2518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL& source_url, 2519d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::Callback<void(const FormStructure*)>& callback) 2520bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch : WebContentsObserver(contents), 2521bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch profile_(Profile::FromBrowserContext(contents->GetBrowserContext())), 2522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) initial_user_state_(AutofillMetrics::DIALOG_USER_STATE_UNKNOWN), 252358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) form_structure_(form_structure), 2524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) invoked_from_same_origin_(true), 2525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) source_url_(source_url), 2526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback_(callback), 252758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) account_chooser_model_(this, profile_->GetPrefs(), metric_logger_), 25284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallet_client_(profile_->GetRequestContext(), this, source_url), 2529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_cc_(this), 2530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_billing_(this), 2531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_cc_billing_(this), 2532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_shipping_(this), 2533868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) cares_about_shipping_(true), 2534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) input_showing_popup_(NULL), 2535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) weak_ptr_factory_(this), 25364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) waiting_for_explicit_sign_in_response_(false), 253790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) has_accepted_legal_documents_(false), 2538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_submitting_(false), 2539868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) choose_another_instrument_or_address_(false), 25407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) wallet_server_validation_recoverable_(true), 2541bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch data_was_passed_back_(false), 2542ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch was_ui_latency_logged_(false), 254358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) card_generated_animation_(2000, 60, this) { 2544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(estade): remove duplicates from |form_structure|? 2545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!callback_.is_null()); 2546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutofillDialogView* AutofillDialogControllerImpl::CreateView() { 25492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return AutofillDialogView::Create(this); 25502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PersonalDataManager* AutofillDialogControllerImpl::GetManager() { 25532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PersonalDataManagerFactory::GetForProfile(profile_); 25542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)wallet::WalletClient* AutofillDialogControllerImpl::GetWalletClient() { 25572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &wallet_client_; 25582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::IsPayingWithWallet() const { 2561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return account_chooser_model_.WalletIsSelected() && 2562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SignedInState() == SIGNED_IN; 25632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 256590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AutofillDialogControllerImpl::LoadRiskFingerprintData() { 256690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) risk_data_.clear(); 256790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 256890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint64 obfuscated_gaia_id = 0; 256990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool success = base::StringToUint64(wallet_items_->obfuscated_gaia_id(), 257090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &obfuscated_gaia_id); 257190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(success); 257290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 257390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect window_bounds; 257490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) window_bounds = GetBaseWindowForWebContents(web_contents())->GetBounds(); 257590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 257690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PrefService* user_prefs = profile_->GetPrefs(); 257790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string charset = user_prefs->GetString(::prefs::kDefaultCharset); 257890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string accept_languages = 257990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_prefs->GetString(::prefs::kAcceptLanguages); 258090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Time install_time = base::Time::FromTimeT( 258190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) g_browser_process->local_state()->GetInt64(::prefs::kInstallDate)); 258290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 258390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) risk::GetFingerprint( 258490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) obfuscated_gaia_id, window_bounds, *web_contents(), 258590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::VersionInfo().Version(), charset, accept_languages, install_time, 258658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) g_browser_process->GetApplicationLocale(), 258790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&AutofillDialogControllerImpl::OnDidLoadRiskFingerprintData, 258890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 258990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 259090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 259190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AutofillDialogControllerImpl::OnDidLoadRiskFingerprintData( 259290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<risk::Fingerprint> fingerprint) { 259390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(AreLegalDocumentsCurrent()); 259490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 259590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string proto_data; 259690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fingerprint->SerializeToString(&proto_data); 259790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool success = base::Base64Encode(proto_data, &risk_data_); 259890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(success); 259990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2600eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SubmitWithWallet(); 260190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 260290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::OpenTabWithUrl(const GURL& url) { 2604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::NavigateParams params( 2605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::FindBrowserWithWebContents(web_contents()), 2606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url, 2607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::PAGE_TRANSITION_AUTO_BOOKMARK); 2608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.disposition = NEW_FOREGROUND_TAB; 2609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::Navigate(¶ms); 26102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 26112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2612eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AutofillDialogControllerImpl::IsEditingExistingData( 2613eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DialogSection section) const { 2614eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return section_editing_state_.count(section) > 0; 2615eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 2616eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2617eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AutofillDialogControllerImpl::IsManuallyEditingSection( 2618eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DialogSection section) const { 2619eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return IsEditingExistingData(section) || 2620eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SuggestionsMenuModelForSection(section)-> 2621eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetItemKeyForCheckedItem() == kAddNewItemKey; 2622eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 2623eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2624868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void AutofillDialogControllerImpl::OnWalletSigninError() { 2625868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) account_chooser_model_.SetHadWalletSigninError(); 2626868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetWalletClient()->CancelRequests(); 2627868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LogDialogLatencyToShow(); 2628868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 2629868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 26307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void AutofillDialogControllerImpl::DisableWallet( 26317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) wallet::WalletClient::ErrorType error_type) { 2632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) signin_helper_.reset(); 26334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) username_fetcher_.reset(); 2634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wallet_items_.reset(); 26357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) wallet_errors_.clear(); 263690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetWalletClient()->CancelRequests(); 2637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetIsSubmitting(false); 263858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) wallet_error_notification_ = GetWalletError(error_type); 263958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) account_chooser_model_.SetHadWalletError(); 26402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 26412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::SuggestionsUpdated() { 26433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 26443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2645eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const DetailOutputMap snapshot = TakeUserInputSnapshot(); 2646eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 26472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_cc_.Reset(); 26482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_billing_.Reset(); 26492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_cc_billing_.Reset(); 26502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_shipping_.Reset(); 2651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HidePopup(); 2652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_shipping_.AddKeyedItem( 2654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kSameAsBillingKey, 2655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_USE_BILLING_FOR_SHIPPING)); 26562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsPayingWithWallet()) { 2658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::vector<wallet::Address*>& addresses = 2659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) wallet_items_->addresses(); 2660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < addresses.size(); ++i) { 2661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string key = base::IntToString(i); 266258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) suggested_shipping_.AddKeyedItemWithMinorText( 2663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) key, 2664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) addresses[i]->DisplayName(), 2665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) addresses[i]->DisplayNameDetail()); 2666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 266758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const std::string default_shipping_address_id = 266858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetIdToSelect(wallet_items_->default_address_id(), 266958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previous_default_shipping_address_id_, 267058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previously_selected_shipping_address_id_); 267158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch if (addresses[i]->object_id() == default_shipping_address_id) 2672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_shipping_.SetCheckedItem(key); 2673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 26742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!IsSubmitPausedOn(wallet::VERIFY_CVV)) { 26762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<wallet::WalletItems::MaskedInstrument*>& instruments = 26772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallet_items_->instruments(); 267890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string first_active_instrument_key; 267990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string default_instrument_key; 26802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < instruments.size(); ++i) { 268190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool allowed = IsInstrumentAllowed(*instruments[i]); 268290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Image icon = instruments[i]->CardIcon(); 268390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!allowed && !icon.IsEmpty()) { 268490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Create a grayed disabled icon. 268590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SkBitmap disabled_bitmap = SkBitmapOperations::CreateHSLShiftedBitmap( 268690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) *icon.ToSkBitmap(), kGrayImageShift); 268790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) icon = gfx::Image( 268890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::ImageSkia::CreateFrom1xBitmap(disabled_bitmap)); 268990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 2690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string key = base::IntToString(i); 269158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) suggested_cc_billing_.AddKeyedItemWithMinorTextAndIcon( 2692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) key, 26932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instruments[i]->DisplayName(), 26942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instruments[i]->DisplayNameDetail(), 269590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) icon); 269690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_cc_billing_.SetEnabled(key, allowed); 269790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 269890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (allowed) { 269990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (first_active_instrument_key.empty()) 270090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) first_active_instrument_key = key; 270158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 270258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const std::string default_instrument_id = 270358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetIdToSelect(wallet_items_->default_instrument_id(), 270458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previous_default_instrument_id_, 270558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) previously_selected_instrument_id_); 270658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch if (instruments[i]->object_id() == default_instrument_id) 270790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) default_instrument_key = key; 2708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 27092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 27102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_cc_billing_.AddKeyedItem( 2712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kAddNewItemKey, 2713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_ADD_BILLING_DETAILS)); 271490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!wallet_items_->HasRequiredAction(wallet::SETUP_WALLET)) { 271558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) suggested_cc_billing_.AddKeyedItemWithMinorText( 271690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kManageItemsKey, 271790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) l10n_util::GetStringUTF16( 27187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDS_AUTOFILL_DIALOG_MANAGE_BILLING_DETAILS), 27194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UTF8ToUTF16(wallet::GetManageInstrumentsUrl(0U).host())); 272090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 272190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 272290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Determine which instrument item should be selected. 272390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!default_instrument_key.empty()) 272490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_cc_billing_.SetCheckedItem(default_instrument_key); 272590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) else if (!first_active_instrument_key.empty()) 272690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_cc_billing_.SetCheckedItem(first_active_instrument_key); 272790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) else 272890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_cc_billing_.SetCheckedItem(kAddNewItemKey); 2729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 27302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 27312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PersonalDataManager* manager = GetManager(); 2732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::vector<CreditCard*>& cards = manager->GetCreditCards(); 27332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 27342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < cards.size(); ++i) { 273590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!HasCompleteAndVerifiedData(*cards[i], requested_cc_fields_)) 273690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) continue; 273790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 27382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_cc_.AddKeyedItemWithIcon( 27392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cards[i]->guid(), 27402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cards[i]->Label(), 27417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) rb.GetImageNamed(CreditCard::IconResourceId(cards[i]->type()))); 27422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 27432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<AutofillProfile*>& profiles = manager->GetProfiles(); 2745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string app_locale = g_browser_process->GetApplicationLocale(); 27462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < profiles.size(); ++i) { 274758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const AutofillProfile& profile = *profiles[i]; 274858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!HasCompleteAndVerifiedData(profile, requested_shipping_fields_) || 2749eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HasInvalidAddress(*profiles[i])) { 27502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 2751eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 27522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 275358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Don't add variants for addresses: name is part of credit card and we'll 275458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // just ignore email and phone number variants. 275558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) suggested_shipping_.AddKeyedItem(profile.guid(), profile.Label()); 275658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!profile.GetRawInfo(EMAIL_ADDRESS).empty() && 275758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) !profile.IsPresentButInvalid(EMAIL_ADDRESS)) { 275858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) suggested_billing_.AddKeyedItem(profile.guid(), profile.Label()); 27592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 27602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 27612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_cc_.AddKeyedItem( 2763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kAddNewItemKey, 27642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_ADD_CREDIT_CARD)); 2765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_cc_.AddKeyedItem( 2766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kManageItemsKey, 2767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_MANAGE_CREDIT_CARD)); 27682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_billing_.AddKeyedItem( 2769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kAddNewItemKey, 27702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_ADD_BILLING_ADDRESS)); 2771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_billing_.AddKeyedItem( 2772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kManageItemsKey, 2773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_MANAGE_BILLING_ADDRESS)); 27742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 27752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) suggested_shipping_.AddKeyedItem( 2777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kAddNewItemKey, 27782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_ADD_SHIPPING_ADDRESS)); 27797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!IsPayingWithWallet()) { 278090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) suggested_shipping_.AddKeyedItem( 278190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kManageItemsKey, 278290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_MANAGE_SHIPPING_ADDRESS)); 27837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else if (!wallet_items_->HasRequiredAction(wallet::SETUP_WALLET)) { 278458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) suggested_shipping_.AddKeyedItemWithMinorText( 27857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch kManageItemsKey, 27867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_MANAGE_SHIPPING_ADDRESS), 27874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UTF8ToUTF16(wallet::GetManageAddressesUrl(0U).host())); 278890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 2789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!IsPayingWithWallet()) { 279190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 279290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DialogSection section = static_cast<DialogSection>(i); 279390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!SectionIsActive(section)) 279490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) continue; 279590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 279690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Set the starting choice for the menu. First set to the default in case 279790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // the GUID saved in prefs refers to a profile that no longer exists. 279890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string guid; 2799d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetDefaultAutofillChoice(section, &guid); 280090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 2801d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) model->SetCheckedItem(guid); 2802d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (GetAutofillChoice(section, &guid)) 2803d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) model->SetCheckedItem(guid); 280490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 2805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (view_) 2808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->ModelChanged(); 2809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2810eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 2811eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ResetSectionInput(static_cast<DialogSection>(i)); 2812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2813eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2814eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RestoreUserInputFromSnapshot(snapshot); 2815eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2816eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 2817eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DialogSection section = static_cast<DialogSection>(i); 28184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!SectionIsActive(section)) 28194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) continue; 28204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2821eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ShowEditUiIfBadSuggestion(section); 2822eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateSection(section); 2823eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2824eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2825eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateForErrors(); 28262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 28272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::FillOutputForSectionWithComparator( 28292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialogSection section, 28302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const InputFieldComparator& compare) { 2831868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const DetailInputs& inputs = RequestedFieldsForSection(section); 2832868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 28332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!SectionIsActive(section)) 28342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 28352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section); 28372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (wrapper) { 28382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only fill in data that is associated with this section. 28392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DetailInputs& inputs = RequestedFieldsForSection(section); 28402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wrapper->FillFormStructure(inputs, compare, &form_structure_); 28412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // CVC needs special-casing because the CreditCard class doesn't store or 28432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // handle them. This isn't necessary when filling the combined CC and 28442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // billing section as CVC comes from |full_wallet_| in this case. 28452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (section == SECTION_CC) 284658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SetOutputForFieldsOfType(CREDIT_CARD_VERIFICATION_CODE, view_->GetCvc()); 284758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 284858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // When filling from Wallet data, use the email address associated with the 284958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // account. There is no other email address stored as part of a Wallet 285058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // address. 285158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (section == SECTION_CC_BILLING) { 285258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SetOutputForFieldsOfType( 28534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EMAIL_ADDRESS, account_chooser_model_.GetActiveWalletAccountName()); 285458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 28552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 28562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The user manually input data. If using Autofill, save the info as new or 28572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // edited data. Always fill local data into |form_structure_|. 28582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DetailOutputMap output; 28592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->GetUserInput(section, &output); 28602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (section == SECTION_CC) { 28622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreditCard card; 286390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) card.set_origin(kAutofillDialogOrigin); 28642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillFormGroupFromOutputs(output, &card); 28652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The card holder name comes from the billing address section. 28677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch card.SetRawInfo(CREDIT_CARD_NAME, 28684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GetValueFromSection(SECTION_BILLING, NAME_BILLING_FULL)); 28697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 28707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (ShouldSaveDetailsLocally()) { 2871d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string guid = GetManager()->SaveImportedCreditCard(card); 2872d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) newly_saved_data_model_guids_[section] = guid; 28737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(!profile()->IsOffTheRecord()); 28747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch newly_saved_card_.reset(new CreditCard(card)); 28757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 28762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2877868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AutofillCreditCardWrapper card_wrapper(&card); 2878868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) card_wrapper.FillFormStructure(inputs, compare, &form_structure_); 28792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Again, CVC needs special-casing. Fill it in directly from |output|. 288158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SetOutputForFieldsOfType( 288258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CREDIT_CARD_VERIFICATION_CODE, 288358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetValueForType(output, CREDIT_CARD_VERIFICATION_CODE)); 28842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 28852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillProfile profile; 288690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) profile.set_origin(kAutofillDialogOrigin); 28872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillFormGroupFromOutputs(output, &profile); 28882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2889d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (ShouldSaveDetailsLocally()) { 2890d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string guid = GetManager()->SaveImportedProfile(profile); 2891d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) newly_saved_data_model_guids_[section] = guid; 2892d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 28932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2894d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) AutofillProfileWrapper profile_wrapper(&profile); 2895868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) profile_wrapper.FillFormStructure(inputs, compare, &form_structure_); 28962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 28972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 28982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 28992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::FillOutputForSection(DialogSection section) { 29017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FillOutputForSectionWithComparator( 2902ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch section, base::Bind(common::DetailInputMatchesField, section)); 29032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2905868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool AutofillDialogControllerImpl::FormStructureCaresAboutSection( 2906868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DialogSection section) const { 2907868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // For now, only SECTION_SHIPPING may be omitted due to a site not asking for 2908868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // any of the fields. 2909a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (section == SECTION_SHIPPING) 2910868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return cares_about_shipping_; 2911868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2912868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 29132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 291558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::SetOutputForFieldsOfType( 291658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ServerFieldType type, 291758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const base::string16& output) { 29182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < form_structure_.field_count(); ++i) { 29192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillField* field = form_structure_.field(i); 292058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (field->Type().GetStorableType() == type) 292158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) field->value = output; 29222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)string16 AutofillDialogControllerImpl::GetValueFromSection( 292690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DialogSection section, 29273240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch ServerFieldType type) { 292890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(SectionIsActive(section)); 292990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 293090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<DataModelWrapper> wrapper = CreateWrapper(section); 293190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (wrapper) 29323240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return wrapper->GetInfo(AutofillType(type)); 2933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 293490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DetailOutputMap output; 293590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) view_->GetUserInput(section, &output); 29368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return GetValueForType(output, type); 293790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 293890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 29392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SuggestionsMenuModel* AutofillDialogControllerImpl:: 29402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SuggestionsMenuModelForSection(DialogSection section) { 29412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (section) { 29422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_CC: 29432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &suggested_cc_; 29442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_BILLING: 29452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &suggested_billing_; 29462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_SHIPPING: 29472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &suggested_shipping_; 29482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case SECTION_CC_BILLING: 29492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &suggested_cc_billing_; 29502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 29532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 29542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const SuggestionsMenuModel* AutofillDialogControllerImpl:: 2957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionsMenuModelForSection(DialogSection section) const { 2958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return const_cast<AutofillDialogControllerImpl*>(this)-> 2959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SuggestionsMenuModelForSection(section); 2960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 29622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DialogSection AutofillDialogControllerImpl::SectionForSuggestionsMenuModel( 29632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SuggestionsMenuModel& model) { 29642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (&model == &suggested_cc_) 29652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SECTION_CC; 29662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (&model == &suggested_billing_) 29682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SECTION_BILLING; 29692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (&model == &suggested_cc_billing_) 29712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SECTION_CC_BILLING; 29722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(&model, &suggested_shipping_); 29742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SECTION_SHIPPING; 29752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DetailInputs* AutofillDialogControllerImpl::MutableRequestedFieldsForSection( 29782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialogSection section) { 29792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return const_cast<DetailInputs*>(&RequestedFieldsForSection(section)); 29802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::HidePopup() { 2983868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (popup_controller_.get()) 29842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) popup_controller_->Hide(); 2985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) input_showing_popup_ = NULL; 29862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 29872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2988868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void AutofillDialogControllerImpl::SetEditingExistingData( 2989868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DialogSection section, bool editing) { 2990868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (editing) 2991868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) section_editing_state_.insert(section); 2992868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) else 2993868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) section_editing_state_.erase(section); 2994868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 2995868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::IsASuggestionItemKey( 2997868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& key) const { 2998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return !key.empty() && 2999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) key != kAddNewItemKey && 3000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) key != kManageItemsKey && 3001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) key != kSameAsBillingKey; 3002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 30032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::IsManuallyEditingAnySection() const { 3005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t section = SECTION_MIN; section <= SECTION_MAX; ++section) { 3006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsManuallyEditingSection(static_cast<DialogSection>(section))) 3007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 3008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 30092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 30102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 30112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)base::string16 AutofillDialogControllerImpl::CreditCardNumberValidityMessage( 30137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::string16& number) const { 30147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!number.empty() && !autofill::IsValidCreditCardNumber(number)) { 30157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return l10n_util::GetStringUTF16( 30167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) IDS_AUTOFILL_DIALOG_VALIDATION_INVALID_CREDIT_CARD_NUMBER); 30177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 30187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 30191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::string16 message; 30201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (IsPayingWithWallet() && !wallet_items_->SupportsCard(number, &message)) 30211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return message; 30227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 30237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Card number is good and supported. 30247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return base::string16(); 30257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 30267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 30277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool AutofillDialogControllerImpl::AllSectionsAreValid() { 3028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t section = SECTION_MIN; section <= SECTION_MAX; ++section) { 3029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!SectionIsValid(static_cast<DialogSection>(section))) 3030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 3031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 3033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::SectionIsValid( 30367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DialogSection section) { 3037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!IsManuallyEditingSection(section)) 3038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 3039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DetailOutputMap detail_outputs; 3041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->GetUserInput(section, &detail_outputs); 30424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return !InputsAreValid(section, detail_outputs).HasSureErrors(); 3043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3045868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool AutofillDialogControllerImpl::IsCreditCardExpirationValid( 3046868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::string16& year, 3047868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::string16& month) const { 3048868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // If the expiration is in the past as per the local clock, it's invalid. 3049868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Time now = base::Time::Now(); 3050868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!autofill::IsValidCreditCardExpirationDate(year, month, now)) 3051868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 3052868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3053868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (IsPayingWithWallet() && IsEditingExistingData(SECTION_CC_BILLING)) { 3054868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const wallet::WalletItems::MaskedInstrument* instrument = 3055868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ActiveInstrument(); 3056868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& locale = g_browser_process->GetApplicationLocale(); 3057868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int month_int; 3058868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (base::StringToInt(month, &month_int) && 3059868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) instrument->status() == 3060868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) wallet::WalletItems::MaskedInstrument::EXPIRED && 30613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch year == 30623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch instrument->GetInfo( 30633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch AutofillType(CREDIT_CARD_EXP_4_DIGIT_YEAR), locale) && 3064868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) month_int == instrument->expiration_month()) { 3065868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Otherwise, if the user is editing an instrument that's deemed expired 3066868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // by the Online Wallet server, mark it invalid on selection. 3067868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 3068868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3069868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3070868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3071868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 3072868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 3073868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldUseBillingForShipping() { 3075868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return SectionIsActive(SECTION_SHIPPING) && 3076868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) suggested_shipping_.GetItemKeyForCheckedItem() == kSameAsBillingKey; 3077c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 30792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AutofillDialogControllerImpl::ShouldSaveDetailsLocally() { 30802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // It's possible that the user checked [X] Save details locally before 30812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // switching payment methods, so only ask the view whether to save details 30822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // locally if that checkbox is showing (currently if not paying with wallet). 3083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Also, if the user isn't editing any sections, there's no data to save 3084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // locally. 3085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return ShouldOfferToSaveInChrome() && view_->SaveDetailsLocally(); 3086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::SetIsSubmitting(bool submitting) { 3089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_submitting_ = submitting; 3090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 309190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!submitting) 309290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) full_wallet_.reset(); 309390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (view_) { 30953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScopedViewUpdates updates(view_.get()); 3096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->UpdateButtonStrip(); 309758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) view_->UpdateOverlay(); 3098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->UpdateNotificationArea(); 3099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 31002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 310290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool AutofillDialogControllerImpl::AreLegalDocumentsCurrent() const { 310390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return has_accepted_legal_documents_ || 310490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) (wallet_items_ && wallet_items_->legal_documents().empty()); 310590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 310690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::AcceptLegalDocuments() { 310890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::BrowserThread::PostTask( 3109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::BrowserThread::IO, FROM_HERE, 3110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&UserDidOptIntoLocationServices)); 311190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (AreLegalDocumentsCurrent()) { 311390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LoadRiskFingerprintData(); 3114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } else { 3115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetWalletClient()->AcceptLegalDocuments( 3116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) wallet_items_->legal_documents(), 31174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallet_items_->google_transaction_id()); 3118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 3119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 3120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutofillDialogControllerImpl::SubmitWithWallet() { 3122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch active_instrument_id_.clear(); 3123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch active_address_id_.clear(); 3124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch full_wallet_.reset(); 312590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const wallet::WalletItems::MaskedInstrument* active_instrument = 3127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ActiveInstrument(); 3128a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!IsManuallyEditingSection(SECTION_CC_BILLING)) { 3129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) active_instrument_id_ = active_instrument->object_id(); 3130a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DCHECK(!active_instrument_id_.empty()); 3131a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 31322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const wallet::Address* active_address = ActiveShippingAddress(); 3134a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!IsManuallyEditingSection(SECTION_SHIPPING) && 3135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) !ShouldUseBillingForShipping() && 3136a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) IsShippingAddressRequired()) { 3137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) active_address_id_ = active_address->object_id(); 3138a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DCHECK(!active_address_id_.empty()); 31392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 31402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3141a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_ptr<wallet::Instrument> inputted_instrument = 3142a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) CreateTransientInstrument(); 3143ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (inputted_instrument && IsEditingExistingData(SECTION_CC_BILLING)) { 3144ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch inputted_instrument->set_object_id(active_instrument->object_id()); 3145ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DCHECK(!inputted_instrument->object_id().empty()); 3146ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 31472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3148a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_ptr<wallet::Address> inputted_address; 3149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (active_address_id_.empty() && IsShippingAddressRequired()) { 3150a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (ShouldUseBillingForShipping()) { 315190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const wallet::Address& address = inputted_instrument ? 3152ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch *inputted_instrument->address() : active_instrument->address(); 315390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Try to find an exact matched shipping address and use it for shipping, 315490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // otherwise save it as a new shipping address. http://crbug.com/225442 315590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const wallet::Address* duplicated_address = 315690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) FindDuplicateAddress(wallet_items_->addresses(), address); 315790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (duplicated_address) { 315890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) active_address_id_ = duplicated_address->object_id(); 315990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!active_address_id_.empty()); 316090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } else { 316190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) inputted_address.reset(new wallet::Address(address)); 316290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(inputted_address->object_id().empty()); 316390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 3164a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } else { 3165a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) inputted_address = CreateTransientAddress(); 3166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (IsEditingExistingData(SECTION_SHIPPING)) { 3167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) inputted_address->set_object_id(active_address->object_id()); 3168a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DCHECK(!inputted_address->object_id().empty()); 3169a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 31702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 31712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 31722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 317390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // If there's neither an address nor instrument to save, |GetFullWallet()| 317490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // is called when the risk fingerprint is loaded. 3175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!active_instrument_id_.empty() && 3176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) (!active_address_id_.empty() || !IsShippingAddressRequired())) { 3177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetFullWallet(); 317890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 3179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 318090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3181ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch GetWalletClient()->SaveToWallet(inputted_instrument.Pass(), 31824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) inputted_address.Pass()); 31832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 31842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3185a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)scoped_ptr<wallet::Instrument> AutofillDialogControllerImpl:: 3186a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) CreateTransientInstrument() { 3187a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!active_instrument_id_.empty()) 3188a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return scoped_ptr<wallet::Instrument>(); 3189a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 3190a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DetailOutputMap output; 3191a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) view_->GetUserInput(SECTION_CC_BILLING, &output); 3192a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 3193a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) CreditCard card; 3194a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) AutofillProfile profile; 3195a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) string16 cvc; 3196a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) GetBillingInfoFromOutputs(output, &card, &cvc, &profile); 3197a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 3198a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return scoped_ptr<wallet::Instrument>( 3199a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) new wallet::Instrument(card, cvc, profile)); 3200a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 3201a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 3202a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)scoped_ptr<wallet::Address>AutofillDialogControllerImpl:: 3203a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) CreateTransientAddress() { 3204a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // If not using billing for shipping, just scrape the view. 3205a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DetailOutputMap output; 3206a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) view_->GetUserInput(SECTION_SHIPPING, &output); 3207a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 3208a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) AutofillProfile profile; 3209a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FillFormGroupFromOutputs(output, &profile); 3210a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 3211a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return scoped_ptr<wallet::Address>(new wallet::Address(profile)); 3212a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 3213a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 32142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::GetFullWallet() { 3215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(is_submitting_); 32162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(IsPayingWithWallet()); 32172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(wallet_items_); 32182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!active_instrument_id_.empty()); 3219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(!active_address_id_.empty() || !IsShippingAddressRequired()); 32202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<wallet::WalletClient::RiskCapability> capabilities; 3222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) capabilities.push_back(wallet::WalletClient::VERIFY_CVC); 3223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 32242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetWalletClient()->GetFullWallet(wallet::WalletClient::FullWalletRequest( 32252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_instrument_id_, 32262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_address_id_, 32272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallet_items_->google_transaction_id(), 32283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) capabilities, 32293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) wallet_items_->HasRequiredAction(wallet::SETUP_WALLET))); 32302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 32312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3232a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void AutofillDialogControllerImpl::HandleSaveOrUpdateRequiredActions( 3233a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const std::vector<wallet::RequiredAction>& required_actions) { 3234a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DCHECK(!required_actions.empty()); 3235a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 32364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(ahutter): Investigate if we need to support more generic actions on 32377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // this call such as GAIA_AUTH. See crbug.com/243457. 3238a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) for (std::vector<wallet::RequiredAction>::const_iterator iter = 3239a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) required_actions.begin(); 3240a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) iter != required_actions.end(); ++iter) { 32417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (*iter != wallet::INVALID_FORM_FIELD) { 3242a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // TODO(dbeam): handle this more gracefully. 32437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DisableWallet(wallet::WalletClient::UNKNOWN_ERROR); 3244a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 3245a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 3246a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) SetIsSubmitting(false); 3247a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 3248a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 32492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AutofillDialogControllerImpl::FinishSubmit() { 325058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (IsPayingWithWallet()) { 325158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // To get past this point, the view must call back OverlayButtonPressed. 325258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ScopedViewUpdates updates(view_.get()); 325358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) view_->UpdateOverlay(); 325458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 325558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) card_generated_animation_.Start(); 325658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return; 325758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 325858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DoFinishSubmit(); 325958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 326058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 326158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::AnimationProgressed( 3262d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const gfx::Animation* animation) { 326358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK_EQ(animation, &card_generated_animation_); 326458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PushOverlayUpdate(); 326558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 326658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 326758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::AnimationEnded( 3268d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const gfx::Animation* animation) { 326958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK_EQ(animation, &card_generated_animation_); 327058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DoFinishSubmit(); 327158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 327258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 327358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::DoFinishSubmit() { 327458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (IsPayingWithWallet()) { 327558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) profile_->GetPrefs()->SetBoolean(::prefs::kAutofillDialogHasPaidWithWallet, 327658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) true); 32777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 32787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 32792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillOutputForSection(SECTION_CC); 32802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillOutputForSection(SECTION_BILLING); 32812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillOutputForSection(SECTION_CC_BILLING); 3282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 32832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ShouldUseBillingForShipping()) { 32842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillOutputForSectionWithComparator( 32852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SECTION_BILLING, 32862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(DetailInputMatchesShippingField)); 32872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillOutputForSectionWithComparator( 32882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SECTION_CC, 32892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(DetailInputMatchesShippingField)); 3290a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FillOutputForSectionWithComparator( 3291a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) SECTION_CC_BILLING, 3292a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) base::Bind(DetailInputMatchesShippingField)); 32932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 32942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillOutputForSection(SECTION_SHIPPING); 32952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 32962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!IsPayingWithWallet()) { 329890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (size_t i = SECTION_MIN; i <= SECTION_MAX; ++i) { 329990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DialogSection section = static_cast<DialogSection>(i); 330090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!SectionIsActive(section)) 330190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) continue; 330290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 330390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 330490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string item_key = model->GetItemKeyForCheckedItem(); 330590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (IsASuggestionItemKey(item_key) || item_key == kSameAsBillingKey) { 3306d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PersistAutofillChoice(section, item_key); 3307d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } else if (item_key == kAddNewItemKey && ShouldSaveDetailsLocally()) { 3308d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(newly_saved_data_model_guids_.count(section)); 3309d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PersistAutofillChoice(section, newly_saved_data_model_guids_[section]); 331090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 331190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 331258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 331358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) profile_->GetPrefs()->SetBoolean(::prefs::kAutofillDialogSaveData, 331458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) view_->SaveDetailsLocally()); 331590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 331690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // On a successful submit, if the user manually selected "pay without wallet", 3318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // stop trying to pay with Wallet on future runs of the dialog. On the other 3319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // hand, if there was an error that prevented the user from having the choice 3320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // of using Wallet, leave the pref alone. 332158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!wallet_error_notification_ && 3322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) account_chooser_model_.HasAccountsToChoose()) { 3323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) profile_->GetPrefs()->SetBoolean( 3324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ::prefs::kAutofillDialogPayWithoutWallet, 3325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) !account_chooser_model_.WalletIsSelected()); 3326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LogOnFinishSubmitMetrics(); 3329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3330868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Callback should be called as late as possible. 3331d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) callback_.Run(&form_structure_); 3332bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch data_was_passed_back_ = true; 3333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3334868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // This might delete us. 333558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Hide(); 33362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 33372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 333890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AutofillDialogControllerImpl::PersistAutofillChoice( 333990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DialogSection section, 3340d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::string& guid) { 334190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!IsPayingWithWallet()); 334290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue()); 334390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) value->SetString(kGuidPrefKey, guid); 334490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 334590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DictionaryPrefUpdate updater(profile()->GetPrefs(), 334690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ::prefs::kAutofillDialogAutofillDefault); 334790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::DictionaryValue* autofill_choice = updater.Get(); 334890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) autofill_choice->Set(SectionToPrefString(section), value.release()); 334990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 335090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 335190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AutofillDialogControllerImpl::GetDefaultAutofillChoice( 335290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DialogSection section, 3353d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string* guid) { 335490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!IsPayingWithWallet()); 335590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The default choice is the first thing in the menu that is a suggestion 335690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // item. 335790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SuggestionsMenuModel* model = SuggestionsMenuModelForSection(section); 335890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (int i = 0; i < model->GetItemCount(); ++i) { 335990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (IsASuggestionItemKey(model->GetItemKeyAt(i))) { 336090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) *guid = model->GetItemKeyAt(i); 336190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) break; 336290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 336390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 336490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 336590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 336690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool AutofillDialogControllerImpl::GetAutofillChoice(DialogSection section, 3367d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string* guid) { 336890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!IsPayingWithWallet()); 336990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const base::DictionaryValue* choices = profile()->GetPrefs()->GetDictionary( 337090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ::prefs::kAutofillDialogAutofillDefault); 337190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!choices) 337290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 337390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 337490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const base::DictionaryValue* choice = NULL; 337590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!choices->GetDictionary(SectionToPrefString(section), &choice)) 337690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 337790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 337890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) choice->GetString(kGuidPrefKey, guid); 337990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return true; 338090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 338190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LogOnFinishSubmitMetrics() { 3383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetMetricLogger().LogDialogUiDuration( 3384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time::Now() - dialog_shown_timestamp_, 3385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillMetrics::DIALOG_ACCEPTED); 3386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 338758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_ACCEPTED); 3388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillMetrics::DialogDismissalState dismissal_state; 3390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!IsManuallyEditingAnySection()) 3391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dismissal_state = AutofillMetrics::DIALOG_ACCEPTED_EXISTING_DATA; 3392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else if (IsPayingWithWallet()) 3393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dismissal_state = AutofillMetrics::DIALOG_ACCEPTED_SAVE_TO_WALLET; 3394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else if (ShouldSaveDetailsLocally()) 3395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dismissal_state = AutofillMetrics::DIALOG_ACCEPTED_SAVE_TO_AUTOFILL; 3396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 3397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dismissal_state = AutofillMetrics::DIALOG_ACCEPTED_NO_SAVE; 3398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 339958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogDismissalState(dismissal_state); 3400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LogOnCancelMetrics() { 340358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogUiEvent(AutofillMetrics::DIALOG_UI_CANCELED); 3404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillMetrics::DialogDismissalState dismissal_state; 34067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!signin_registrar_.IsEmpty()) 34077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch dismissal_state = AutofillMetrics::DIALOG_CANCELED_DURING_SIGNIN; 34087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch else if (!IsManuallyEditingAnySection()) 3409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dismissal_state = AutofillMetrics::DIALOG_CANCELED_NO_EDITS; 3410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else if (AllSectionsAreValid()) 3411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dismissal_state = AutofillMetrics::DIALOG_CANCELED_NO_INVALID_FIELDS; 3412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 3413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dismissal_state = AutofillMetrics::DIALOG_CANCELED_WITH_INVALID_FIELDS; 3414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 341558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogDismissalState(dismissal_state); 3416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetMetricLogger().LogDialogUiDuration( 3418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time::Now() - dialog_shown_timestamp_, 3419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillMetrics::DIALOG_CANCELED); 3420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LogSuggestionItemSelectedMetric( 3423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const SuggestionsMenuModel& model) { 3424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DialogSection section = SectionForSuggestionsMenuModel(model); 3425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AutofillMetrics::DialogUiEvent dialog_ui_event; 3427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (model.GetItemKeyForCheckedItem() == kAddNewItemKey) { 3428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Selected to add a new item. 3429ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch dialog_ui_event = common::DialogSectionToUiItemAddedEvent(section); 3430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (IsASuggestionItemKey(model.GetItemKeyForCheckedItem())) { 3431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Selected an existing item. 3432ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch dialog_ui_event = common::DialogSectionToUiSelectionChangedEvent(section); 3433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 3434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(estade): add logging for "Manage items" or "Use billing for 3435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // shipping"? 3436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 3437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 343958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetMetricLogger().LogDialogUiEvent(dialog_ui_event); 3440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AutofillDialogControllerImpl::LogDialogLatencyToShow() { 3443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (was_ui_latency_logged_) 3444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 3445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetMetricLogger().LogDialogLatencyToShow( 3447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time::Now() - dialog_shown_timestamp_); 3448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) was_ui_latency_logged_ = true; 3449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AutofillMetrics::DialogInitialUserStateMetric 34522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillDialogControllerImpl::GetInitialUserState() const { 34532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Consider a user to be an Autofill user if the user has any credit cards 3454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // or addresses saved. Check that the item count is greater than 2 because 3455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // an "empty" menu still has the "add new" menu item and "manage" menu item. 34562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const bool has_autofill_profiles = 3457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_cc_.GetItemCount() > 2 || 3458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_billing_.GetItemCount() > 2; 34592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (SignedInState() != SIGNED_IN) { 34612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Not signed in. 34622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return has_autofill_profiles ? 34632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::DIALOG_USER_NOT_SIGNED_IN_HAS_AUTOFILL : 34642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::DIALOG_USER_NOT_SIGNED_IN_NO_AUTOFILL; 34652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 34662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Signed in. 34682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (wallet_items_->instruments().empty()) { 34692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No Wallet items. 34702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return has_autofill_profiles ? 34712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::DIALOG_USER_SIGNED_IN_NO_WALLET_HAS_AUTOFILL : 34722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::DIALOG_USER_SIGNED_IN_NO_WALLET_NO_AUTOFILL; 34732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 34742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Has Wallet items. 34762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return has_autofill_profiles ? 34772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::DIALOG_USER_SIGNED_IN_HAS_WALLET_HAS_AUTOFILL : 34782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AutofillMetrics::DIALOG_USER_SIGNED_IN_HAS_WALLET_NO_AUTOFILL; 34792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 34802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AutofillDialogControllerImpl::MaybeShowCreditCardBubble() { 3482bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!data_was_passed_back_) 3483bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return; 3484bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 34857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (newly_saved_card_) { 3486ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<AutofillProfile> billing_profile; 3487ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (IsManuallyEditingSection(SECTION_BILLING)) { 3488ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Scrape the view as the user's entering or updating information. 3489ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DetailOutputMap outputs; 3490ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch view_->GetUserInput(SECTION_BILLING, &outputs); 3491ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch billing_profile.reset(new AutofillProfile); 3492ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FillFormGroupFromOutputs(outputs, billing_profile.get()); 3493ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } else { 3494ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Just snag the currently suggested profile. 3495ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string item_key = SuggestionsMenuModelForSection(SECTION_BILLING)-> 3496ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetItemKeyForCheckedItem(); 3497ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AutofillProfile* profile = GetManager()->GetProfileByGUID(item_key); 3498ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch billing_profile.reset(new AutofillProfile(*profile)); 3499ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 3500ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 3501ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ShowNewCreditCardBubble(newly_saved_card_.Pass(), 3502ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch billing_profile.Pass()); 35037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 35047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 35057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3506a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!full_wallet_ || !full_wallet_->billing_address()) 3507a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 3508a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3509ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if !defined(OS_ANDROID) 3510ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GeneratedCreditCardBubbleController::Show( 3511ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch web_contents(), 3512424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) full_wallet_->TypeAndLastFourDigits(), 35138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) backing_card_last_four_); 3514ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif 35157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 35167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 351758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AutofillDialogControllerImpl::OnSubmitButtonDelayEnd() { 351858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!view_) 351958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return; 352058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ScopedViewUpdates updates(view_.get()); 352158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) view_->UpdateButtonStrip(); 352258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 352358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 35244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AutofillDialogControllerImpl::FetchWalletCookieAndUserName() { 35254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::URLRequestContextGetter* request_context = profile_->GetRequestContext(); 35264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) signin_helper_.reset(new wallet::WalletSigninHelper(this, request_context)); 35274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) signin_helper_->StartWalletCookieValueFetch(); 35284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 35294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) username_fetcher_.reset( 35304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new wallet::WalletSigninHelper(this, request_context)); 35314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) username_fetcher_->StartUserNameFetch(); 35324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 35334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 35342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace autofill 3535