| Index: chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc
|
| diff --git a/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc b/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc
|
| index 5c81a4216cbfa6d426cacf49e338ebdb58632472..27e912884adcccddcab5f681ca04e8f3ae8df4b4 100644
|
| --- a/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc
|
| +++ b/chrome/browser/ui/autofill/autofill_dialog_controller_impl.cc
|
| @@ -192,7 +192,7 @@ void GetBillingInfoFromOutputs(const DetailOutputMap& output,
|
| }
|
| }
|
|
|
| -// Returns the containing window for the given |web_contents|. The containing
|
| +// Returns the containing window for the given |web_contents|. The containing
|
| // window might be a browser window for a Chrome tab, or it might be a shell
|
| // window for a platform app.
|
| BaseWindow* GetBaseWindowForWebContents(
|
| @@ -466,11 +466,12 @@ bool AutofillDialogControllerImpl::ShouldShowSpinner() const {
|
| }
|
|
|
| string16 AutofillDialogControllerImpl::AccountChooserText() const {
|
| + // TODO(aruslan): this should be l10n "Not using Google Wallet".
|
| if (!account_chooser_model_.WalletIsSelected())
|
| return l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PAY_WITHOUT_WALLET);
|
|
|
| if (SignedInState() == SIGNED_IN)
|
| - return UTF8ToUTF16(current_username_);
|
| + return account_chooser_model_.active_wallet_account_name();
|
|
|
| // In this case, the account chooser should be showing the signin link.
|
| return string16();
|
| @@ -535,11 +536,14 @@ void AutofillDialogControllerImpl::GetWalletItems() {
|
| GetWalletClient()->GetWalletItems(source_url_);
|
| }
|
|
|
| -void AutofillDialogControllerImpl::OnWalletOrSigninUpdate() {
|
| +void AutofillDialogControllerImpl::SignedInStateUpdated() {
|
| + if (!account_chooser_model_.WalletIsSelected())
|
| + return;
|
| +
|
| switch (SignedInState()) {
|
| case SIGNED_IN:
|
| // Start fetching the user name if we don't know it yet.
|
| - if (current_username_.empty()) {
|
| + if (account_chooser_model_.active_wallet_account_name().empty()) {
|
| signin_helper_.reset(new wallet::WalletSigninHelper(
|
| this, profile_->GetRequestContext()));
|
| signin_helper_->StartUserNameFetch();
|
| @@ -547,24 +551,29 @@ void AutofillDialogControllerImpl::OnWalletOrSigninUpdate() {
|
| break;
|
|
|
| case REQUIRES_SIGN_IN:
|
| - // TODO(aruslan): automatic sign-in?
|
| + // Switch to the local account and refresh the dialog.
|
| + OnWalletSigninError();
|
| break;
|
|
|
| case REQUIRES_PASSIVE_SIGN_IN:
|
| // Attempt to passively sign in the user.
|
| - current_username_.clear();
|
| + DCHECK(!signin_helper_);
|
| + account_chooser_model_.ClearActiveWalletAccountName();
|
| signin_helper_.reset(new wallet::WalletSigninHelper(
|
| - this, profile_->GetRequestContext()));
|
| + this,
|
| + profile_->GetRequestContext()));
|
| signin_helper_->StartPassiveSignin();
|
| break;
|
|
|
| case REQUIRES_RESPONSE:
|
| break;
|
| }
|
| +}
|
|
|
| +void AutofillDialogControllerImpl::OnWalletOrSigninUpdate() {
|
| + SignedInStateUpdated();
|
| SuggestionsUpdated();
|
| - view_->UpdateAccountChooser();
|
| - view_->UpdateNotificationArea();
|
| + UpdateAccountChooserView();
|
|
|
| // On the first successful response, compute the initial user state metric.
|
| if (initial_user_state_ == AutofillMetrics::DIALOG_USER_STATE_UNKNOWN)
|
| @@ -573,7 +582,6 @@ void AutofillDialogControllerImpl::OnWalletOrSigninUpdate() {
|
|
|
| void AutofillDialogControllerImpl::OnWalletSigninError() {
|
| signin_helper_.reset();
|
| - current_username_.clear();
|
| account_chooser_model_.SetHadWalletSigninError();
|
| GetWalletClient()->CancelRequests();
|
| }
|
| @@ -669,12 +677,15 @@ ui::MenuModel* AutofillDialogControllerImpl::MenuModelForSection(
|
| }
|
|
|
| ui::MenuModel* AutofillDialogControllerImpl::MenuModelForAccountChooser() {
|
| - // When paying with wallet, but not signed in, there is no menu, just a
|
| - // sign in link.
|
| - if (account_chooser_model_.WalletIsSelected() && SignedInState() != SIGNED_IN)
|
| - return NULL;
|
| + // If there were unrecoverable Wallet errors, or if there are choices other
|
| + // than "Pay without the wallet", show the full menu.
|
| + if (account_chooser_model_.had_wallet_error() ||
|
| + account_chooser_model_.HasAccountsToChoose()) {
|
| + return &account_chooser_model_;
|
| + }
|
|
|
| - return &account_chooser_model_;
|
| + // Otherwise, there is no menu, just a sign in link.
|
| + return NULL;
|
| }
|
|
|
| gfx::Image AutofillDialogControllerImpl::AccountChooserImage() {
|
| @@ -684,8 +695,10 @@ gfx::Image AutofillDialogControllerImpl::AccountChooserImage() {
|
| }
|
|
|
| gfx::Image icon;
|
| - account_chooser_model_.GetIconAt(account_chooser_model_.checked_item(),
|
| - &icon);
|
| + account_chooser_model_.GetIconAt(
|
| + account_chooser_model_.GetIndexOfCommandId(
|
| + account_chooser_model_.checked_item()),
|
| + &icon);
|
| return icon;
|
| }
|
|
|
| @@ -797,9 +810,14 @@ scoped_ptr<DataModelWrapper> AutofillDialogControllerImpl::CreateWrapper(
|
| return scoped_ptr<DataModelWrapper>(
|
| new WalletInstrumentWrapper(wallet_items_->instruments()[index]));
|
| }
|
| +
|
| + if (section == SECTION_SHIPPING) {
|
| + return scoped_ptr<DataModelWrapper>(
|
| + new WalletAddressWrapper(wallet_items_->addresses()[index]));
|
| + }
|
| +
|
| // TODO(dbeam): should SECTION_EMAIL get here? http://crbug.com/223923
|
| - return scoped_ptr<DataModelWrapper>(
|
| - new WalletAddressWrapper(wallet_items_->addresses()[index]));
|
| + return scoped_ptr<DataModelWrapper>();
|
| }
|
|
|
| if (section == SECTION_CC) {
|
| @@ -1166,6 +1184,7 @@ std::vector<DialogNotification>
|
| }
|
|
|
| void AutofillDialogControllerImpl::StartSignInFlow() {
|
| + DCHECK(!IsPayingWithWallet());
|
| DCHECK(registrar_.IsEmpty());
|
|
|
| content::Source<content::NavigationController> source(view_->ShowSignIn());
|
| @@ -1184,9 +1203,10 @@ void AutofillDialogControllerImpl::EndSignInFlow() {
|
| void AutofillDialogControllerImpl::NotificationCheckboxStateChanged(
|
| DialogNotification::Type type, bool checked) {
|
| if (type == DialogNotification::WALLET_USAGE_CONFIRMATION) {
|
| - int command = checked ? AccountChooserModel::kWalletItemId :
|
| - AccountChooserModel::kAutofillItemId;
|
| - account_chooser_model_.ExecuteCommand(command, 0);
|
| + if (checked)
|
| + account_chooser_model_.SelectActiveWalletAccount();
|
| + else
|
| + account_chooser_model_.SelectUseAutofill();
|
| }
|
| }
|
|
|
| @@ -1321,8 +1341,14 @@ void AutofillDialogControllerImpl::Observe(
|
| content::Details<content::LoadCommittedDetails>(details).ptr();
|
| if (wallet::IsSignInContinueUrl(load_details->entry->GetVirtualURL())) {
|
| EndSignInFlow();
|
| - if (account_chooser_model_.WalletIsSelected())
|
| +
|
| + if (account_chooser_model_.WalletIsSelected()) {
|
| GetWalletItems();
|
| + } else {
|
| + // The sign-in flow means that the user implicitly switched the account
|
| + // to the Wallet. This will trigger AccountChoiceChanged.
|
| + account_chooser_model_.SelectActiveWalletAccount();
|
| + }
|
| }
|
| }
|
|
|
| @@ -1386,28 +1412,29 @@ void AutofillDialogControllerImpl::OnDidGetFullWallet(
|
|
|
| void AutofillDialogControllerImpl::OnPassiveSigninSuccess(
|
| const std::string& username) {
|
| - current_username_ = username;
|
| + const string16 username16 = UTF8ToUTF16(username);
|
| signin_helper_.reset();
|
| + account_chooser_model_.SetActiveWalletAccountName(username16);
|
| GetWalletItems();
|
| }
|
|
|
| void AutofillDialogControllerImpl::OnUserNameFetchSuccess(
|
| const std::string& username) {
|
| - current_username_ = username;
|
| + const string16 username16 = UTF8ToUTF16(username);
|
| signin_helper_.reset();
|
| + account_chooser_model_.SetActiveWalletAccountName(username16);
|
| OnWalletOrSigninUpdate();
|
| }
|
|
|
| void AutofillDialogControllerImpl::OnAutomaticSigninSuccess(
|
| const std::string& username) {
|
| - // TODO(aruslan): automatic sign-in.
|
| NOTIMPLEMENTED();
|
| }
|
|
|
| void AutofillDialogControllerImpl::OnPassiveSigninFailure(
|
| const GoogleServiceAuthError& error) {
|
| // TODO(aruslan): report an error.
|
| - LOG(ERROR) << "failed to passively sign-in: " << error.ToString();
|
| + LOG(ERROR) << "failed to passively sign in: " << error.ToString();
|
| OnWalletSigninError();
|
| }
|
|
|
| @@ -1420,14 +1447,14 @@ void AutofillDialogControllerImpl::OnUserNameFetchFailure(
|
|
|
| void AutofillDialogControllerImpl::OnAutomaticSigninFailure(
|
| const GoogleServiceAuthError& error) {
|
| - // TODO(aruslan): automatic sign-in failure.
|
| - NOTIMPLEMENTED();
|
| + // TODO(aruslan): report an error.
|
| + LOG(ERROR) << "failed to automatically sign in: " << error.ToString();
|
| + OnWalletSigninError();
|
| }
|
|
|
| void AutofillDialogControllerImpl::OnDidGetWalletItems(
|
| scoped_ptr<wallet::WalletItems> wallet_items) {
|
| DCHECK(account_chooser_model_.WalletIsSelected());
|
| -
|
| legal_documents_text_.clear();
|
| legal_document_link_ranges_.clear();
|
|
|
| @@ -1504,6 +1531,9 @@ void AutofillDialogControllerImpl::OnPersonalDataChanged() {
|
| SuggestionsUpdated();
|
| }
|
|
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// AccountChooserModelDelegate implementation.
|
| +
|
| void AutofillDialogControllerImpl::AccountChoiceChanged() {
|
| // Whenever the user changes the account, all manual inputs should be reset.
|
| ResetManualInputForSection(SECTION_EMAIL);
|
| @@ -1517,11 +1547,28 @@ void AutofillDialogControllerImpl::AccountChoiceChanged() {
|
|
|
| SetIsSubmitting(false);
|
|
|
| - if (account_chooser_model_.WalletIsSelected() && !wallet_items_)
|
| - GetWalletItems();
|
| + if (!signin_helper_ && account_chooser_model_.WalletIsSelected()) {
|
| + if (account_chooser_model_.IsActiveWalletAccountSelected()) {
|
| + // If the user has chosen an already active Wallet account, and we don't
|
| + // have the Wallet items, an attempt to fetch the Wallet data is made to
|
| + // see if the user is still signed in. This will trigger a passive sign-in
|
| + // if required.
|
| + if (!wallet_items_)
|
| + GetWalletItems();
|
| + else
|
| + SignedInStateUpdated();
|
| + } else {
|
| + // TODO(aruslan): trigger the automatic sign-in process.
|
| + LOG(ERROR) << "failed to initiate an automatic sign-in";
|
| + OnWalletSigninError();
|
| + }
|
| + }
|
|
|
| SuggestionsUpdated();
|
| + UpdateAccountChooserView();
|
| +}
|
|
|
| +void AutofillDialogControllerImpl::UpdateAccountChooserView() {
|
| if (view_) {
|
| view_->UpdateAccountChooser();
|
| view_->UpdateNotificationArea();
|
| @@ -1615,7 +1662,6 @@ bool AutofillDialogControllerImpl::IsFirstRun() const {
|
|
|
| void AutofillDialogControllerImpl::DisableWallet() {
|
| signin_helper_.reset();
|
| - current_username_.clear();
|
| account_chooser_model_.SetHadWalletError();
|
| GetWalletClient()->CancelRequests();
|
| wallet_items_.reset();
|
| @@ -1632,7 +1678,11 @@ void AutofillDialogControllerImpl::SuggestionsUpdated() {
|
| HidePopup();
|
|
|
| if (IsPayingWithWallet()) {
|
| - // TODO(estade): fill in the email address.
|
| + if (!account_chooser_model_.active_wallet_account_name().empty()) {
|
| + suggested_email_.AddKeyedItem(
|
| + base::IntToString(0),
|
| + account_chooser_model_.active_wallet_account_name());
|
| + }
|
|
|
| const std::vector<wallet::Address*>& addresses =
|
| wallet_items_->addresses();
|
| @@ -2166,7 +2216,7 @@ void AutofillDialogControllerImpl::LogSuggestionItemSelectedMetric(
|
| AutofillMetrics::DialogInitialUserStateMetric
|
| AutofillDialogControllerImpl::GetInitialUserState() const {
|
| // Consider a user to be an Autofill user if the user has any credit cards
|
| - // or addresses saved. Check that the item count is greater than 1 because
|
| + // or addresses saved. Check that the item count is greater than 1 because
|
| // an "empty" menu still has the "add new" menu item.
|
| const bool has_autofill_profiles =
|
| suggested_cc_.GetItemCount() > 1 ||
|
|
|