Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(418)

Unified Diff: components/autofill/core/browser/autofill_external_delegate.cc

Issue 286243002: Mac: Autofill should not immediately request access to address book. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Respond to comments from isherman. Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/autofill/core/browser/autofill_external_delegate.cc
diff --git a/components/autofill/core/browser/autofill_external_delegate.cc b/components/autofill/core/browser/autofill_external_delegate.cc
index 95cf8a14a1aff8ea0f06f75969d6685ee4919d12..7425239a8ee5318dbaf5a1b02d32e5672cd36625 100644
--- a/components/autofill/core/browser/autofill_external_delegate.cc
+++ b/components/autofill/core/browser/autofill_external_delegate.cc
@@ -14,15 +14,17 @@
namespace autofill {
-AutofillExternalDelegate::AutofillExternalDelegate(
- AutofillManager* manager,
- AutofillDriver* driver)
+AutofillExternalDelegate::AutofillExternalDelegate(AutofillManager* manager,
+ AutofillDriver* driver)
: manager_(manager),
driver_(driver),
query_id_(0),
display_warning_if_disabled_(false),
has_suggestion_(false),
has_shown_popup_for_current_edit_(false),
+#if defined(OS_MACOSX)
+ redisplay_popop_on_focus_lost_(false),
+#endif
weak_ptr_factory_(this) {
DCHECK(manager);
}
@@ -91,6 +93,18 @@ void AutofillExternalDelegate::OnSuggestionsReturned(
// updated to match.
InsertDataListValues(&values, &labels, &icons, &ids);
+#if defined(OS_MACOSX)
+ if (values.empty() &&
+ manager_->ShouldShowAccessAddressBookSuggestion(query_form_,
+ query_field_)) {
+ values.push_back(
+ l10n_util::GetStringUTF16(IDS_AUTOFILL_ACCESS_MAC_CONTACTS));
+ labels.push_back(base::string16());
+ icons.push_back(base::string16());
+ ids.push_back(POPUP_ITEM_ID_MAC_ACCESS_CONTACTS);
+ }
+#endif
+
if (values.empty()) {
// No suggestions, any popup currently showing is obsolete.
manager_->delegate()->HideAutofillPopup();
@@ -157,6 +171,26 @@ void AutofillExternalDelegate::DidAcceptSuggestion(const base::string16& value,
} else if (identifier == POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY) {
// User selected an Autocomplete, so we fill directly.
driver_->RendererShouldFillFieldWithValue(value);
+ } else if (identifier == POPUP_ITEM_ID_MAC_ACCESS_CONTACTS) {
+#if defined(OS_MACOSX)
+ // User wants to give Chrome access to user's address book.
+ bool modal_presented = manager_->AccessAddressBook();
+
+ // If a modal view was not presented, immediately refresh the popup.
+ if (!modal_presented) {
+ manager_->delegate()->HideAutofillPopup();
+ ReissueQuery();
+ return;
+ }
+
+ // A blocking modal was presented. When the user responds, the text field
+ // loses focus. At that point, the user may have granted permission to their
+ // address book. Immediately redisplay the popup, which may contain new
+ // suggestions from the address book.
+ redisplay_popop_on_focus_lost_ = true;
Ilya Sherman 2014/05/23 15:47:10 Hmm, this still seems not really correct. Presuma
erikchen 2014/05/23 17:19:38 Focus is not lost as soon as the modal dialog is d
Ilya Sherman 2014/05/28 06:43:27 Hmm, this still seems like more complexity than we
+#else
+ NOTREACHED();
+#endif
} else {
FillAutofillFormData(identifier, false);
}
@@ -176,6 +210,18 @@ void AutofillExternalDelegate::DidEndTextFieldEditing() {
manager_->delegate()->HideAutofillPopup();
has_shown_popup_for_current_edit_ = false;
+
+#if defined(OS_MACOSX)
+ // The user was presented a modal dialog, which they had to interact with
+ // before the Chrome process could resume. Their interaction is guaranteed to
+ // cause the text field to lose focus. They were either granting or denying
+ // Chrome access to their address book, so immediately try to redisplay the
+ // autofill popup.
+ if (redisplay_popop_on_focus_lost_) {
+ ReissueQuery();
+ redisplay_popop_on_focus_lost_ = false;
+ }
+#endif
}
void AutofillExternalDelegate::ClearPreviewedForm() {
@@ -308,4 +354,14 @@ void AutofillExternalDelegate::InsertDataListValues(
POPUP_ITEM_ID_DATALIST_ENTRY);
}
+#if defined(OS_MACOSX)
+void AutofillExternalDelegate::ReissueQuery() {
+ manager_->OnQueryFormFieldAutofill(query_id_,
+ query_form_,
+ query_field_,
+ element_bounds_,
+ display_warning_if_disabled_);
+}
+#endif
+
} // namespace autofill

Powered by Google App Engine
This is Rietveld 408576698