Index: chrome/browser/ui/autofill/autofill_popup_controller_impl.cc |
diff --git a/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc b/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc |
index d7231c2a20ba59c4a9e538b90a2d9e4c47f6ac35..e290ac0f6b114dfd6ffc5d34aa2d1a2ae33d158c 100644 |
--- a/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc |
+++ b/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc |
@@ -20,7 +20,7 @@ namespace { |
// Used to indicate that no line is currently selected by the user. |
const int kNoSelection = -1; |
-// Size difference between value text and label text in pixels. |
+// Size difference between name and subtext in pixels. |
const int kLabelFontSizeDelta = -2; |
// The vertical height of each row in pixels. |
@@ -29,10 +29,11 @@ const size_t kRowHeight = 24; |
// The vertical height of a separator in pixels. |
const size_t kSeparatorHeight = 1; |
-// The amount of minimum padding between the Autofill value and label in pixels. |
-const size_t kLabelPadding = 15; |
+// The amount of minimum padding between the Autofill name and subtext in |
+// pixels. |
+const size_t kNamePadding = 15; |
-// The maximum amount of characters to display from either the label or value. |
+// The maximum amount of characters to display from either the name or subtext. |
const size_t kMaxTextLength = 15; |
#if !defined(OS_ANDROID) |
@@ -94,7 +95,7 @@ AutofillPopupControllerImpl::AutofillPopupControllerImpl( |
delete_icon_hovered_(false), |
is_hiding_(false) { |
#if !defined(OS_ANDROID) |
- label_font_ = value_font_.DeriveFont(kLabelFontSizeDelta); |
+ subtext_font_ = name_font_.DeriveFont(kLabelFontSizeDelta); |
#endif |
} |
@@ -104,24 +105,24 @@ AutofillPopupControllerImpl::~AutofillPopupControllerImpl() { |
} |
void AutofillPopupControllerImpl::Show( |
- const std::vector<string16>& autofill_values, |
- const std::vector<string16>& autofill_labels, |
- const std::vector<string16>& autofill_icons, |
- const std::vector<int>& autofill_unique_ids) { |
- autofill_values_ = autofill_values; |
- autofill_labels_ = autofill_labels; |
- autofill_icons_ = autofill_icons; |
- autofill_unique_ids_ = autofill_unique_ids; |
+ const std::vector<string16>& names, |
+ const std::vector<string16>& subtexts, |
+ const std::vector<string16>& icons, |
+ const std::vector<int>& identifiers) { |
+ names_ = names; |
+ subtexts_ = subtexts; |
+ icons_ = icons; |
+ identifiers_ = identifiers; |
#if !defined(OS_ANDROID) |
// Android displays the long text with ellipsis using the view attributes. |
// TODO(csharp): Fix crbug.com/156163 and use better logic when clipping. |
- for (size_t i = 0; i < autofill_values_.size(); ++i) { |
- if (autofill_values_[i].length() > 15) |
- autofill_values_[i].erase(15); |
- if (autofill_labels[i].length() > 15) |
- autofill_labels_[i].erase(15); |
+ for (size_t i = 0; i < names_.size(); ++i) { |
+ if (names_[i].length() > 15) |
+ names_[i].erase(15); |
+ if (subtexts[i].length() > 15) |
+ subtexts_[i].erase(15); |
} |
#endif |
@@ -151,10 +152,8 @@ void AutofillPopupControllerImpl::UpdateBoundsAndRedrawPopup() { |
view_->UpdateBoundsAndRedrawPopup(); |
} |
-void AutofillPopupControllerImpl::SetSelectedPosition(int x, int y) { |
- int line = LineFromY(y); |
- |
- SetSelectedLine(line); |
+void AutofillPopupControllerImpl::MouseHovered(int x, int y) { |
+ SetSelectedLine(LineFromY(y)); |
bool delete_icon_hovered = DeleteIconIsUnder(x, y); |
if (delete_icon_hovered != delete_icon_hovered_) { |
@@ -163,26 +162,23 @@ void AutofillPopupControllerImpl::SetSelectedPosition(int x, int y) { |
} |
} |
-bool AutofillPopupControllerImpl::AcceptAutofillSuggestion( |
- const string16& value, |
- int unique_id, |
- unsigned index) { |
- return delegate_->DidAcceptAutofillSuggestion(value, unique_id, index); |
-} |
- |
-void AutofillPopupControllerImpl::AcceptSelectedPosition(int x, int y) { |
- DCHECK_EQ(selected_line(), LineFromY(y)); |
+void AutofillPopupControllerImpl::MouseClicked(int x, int y) { |
+ MouseHovered(x, y); |
- if (DeleteIconIsUnder(x, y)) |
+ if (delete_icon_hovered_) |
RemoveSelectedLine(); |
else |
AcceptSelectedLine(); |
} |
-void AutofillPopupControllerImpl::ClearSelectedLine() { |
+void AutofillPopupControllerImpl::MouseExitedPopup() { |
SetSelectedLine(kNoSelection); |
} |
+void AutofillPopupControllerImpl::AcceptSuggestion(size_t index) { |
+ delegate_->DidAcceptSuggestion(names_[index], identifiers_[index]); |
+} |
+ |
int AutofillPopupControllerImpl::GetIconResourceID( |
const string16& resource_name) { |
for (size_t i = 0; i < arraysize(kDataResources); ++i) { |
@@ -193,7 +189,8 @@ int AutofillPopupControllerImpl::GetIconResourceID( |
return -1; |
} |
-bool AutofillPopupControllerImpl::CanDelete(int id) { |
+bool AutofillPopupControllerImpl::CanDelete(size_t index) { |
+ int id = identifiers_[index]; |
return id > 0 || |
id == WebAutofillClient::MenuItemIDAutocompleteEntry || |
id == WebAutofillClient::MenuItemIDPasswordEntry; |
@@ -201,27 +198,27 @@ bool AutofillPopupControllerImpl::CanDelete(int id) { |
#if !defined(OS_ANDROID) |
int AutofillPopupControllerImpl::GetPopupRequiredWidth() { |
- if (value_font_.platform_font() == NULL || |
- label_font_.platform_font() == NULL) { |
+ if (name_font_.platform_font() == NULL || |
+ subtext_font_.platform_font() == NULL) { |
// We can't calculate the size of the popup if the fonts |
// aren't present. |
return 0; |
} |
int popup_width = element_bounds().width(); |
- DCHECK_EQ(autofill_values().size(), autofill_labels().size()); |
- for (size_t i = 0; i < autofill_values().size(); ++i) { |
+ DCHECK_EQ(names().size(), subtexts().size()); |
+ for (size_t i = 0; i < names().size(); ++i) { |
int row_size = kEndPadding + |
- value_font_.GetStringWidth(autofill_values()[i]) + |
- kLabelPadding + |
- label_font_.GetStringWidth(autofill_labels()[i]); |
+ name_font_.GetStringWidth(names()[i]) + |
+ kNamePadding + |
+ subtext_font_.GetStringWidth(subtexts()[i]); |
// Add the Autofill icon size, if required. |
- if (!autofill_icons()[i].empty()) |
+ if (!icons()[i].empty()) |
row_size += kAutofillIconWidth + kIconPadding; |
// Add delete icon, if required. |
- if (CanDelete(autofill_unique_ids()[i])) |
+ if (CanDelete(i)) |
row_size += kDeleteIconWidth + kIconPadding; |
// Add the padding at the end |
@@ -236,29 +233,25 @@ int AutofillPopupControllerImpl::GetPopupRequiredWidth() { |
int AutofillPopupControllerImpl::GetPopupRequiredHeight() { |
int popup_height = 0; |
- for (size_t i = 0; i < autofill_unique_ids().size(); ++i) { |
- popup_height += GetRowHeightFromId(autofill_unique_ids()[i]); |
+ for (size_t i = 0; i < identifiers().size(); ++i) { |
+ popup_height += GetRowHeightFromId(identifiers()[i]); |
} |
return popup_height; |
} |
#endif // !defined(OS_ANDROID) |
-int AutofillPopupControllerImpl::GetRowHeightFromId(int unique_id) { |
- if (unique_id == WebAutofillClient::MenuItemIDSeparator) |
- return kSeparatorHeight; |
- |
- return kRowHeight; |
-} |
- |
-gfx::Rect AutofillPopupControllerImpl::GetRectForRow(size_t row, int width) { |
+gfx::Rect AutofillPopupControllerImpl::GetRowBounds(size_t index) { |
int top = 0; |
- for (size_t i = 0; i < row; ++i) { |
- top += GetRowHeightFromId(autofill_unique_ids()[i]); |
+ for (size_t i = 0; i < index; ++i) { |
+ top += GetRowHeightFromId(identifiers()[i]); |
} |
return gfx::Rect( |
- 0, top, width, GetRowHeightFromId(autofill_unique_ids()[row])); |
+ 0, |
+ top, |
+ popup_bounds_.width(), |
+ GetRowHeightFromId(identifiers()[index])); |
} |
void AutofillPopupControllerImpl::SetPopupBounds(const gfx::Rect& bounds) { |
@@ -278,33 +271,29 @@ const gfx::Rect& AutofillPopupControllerImpl::element_bounds() const { |
return element_bounds_; |
} |
-const std::vector<string16>& AutofillPopupControllerImpl:: |
- autofill_values() const { |
- return autofill_values_; |
+const std::vector<string16>& AutofillPopupControllerImpl::names() const { |
+ return names_; |
} |
-const std::vector<string16>& AutofillPopupControllerImpl:: |
- autofill_labels() const { |
- return autofill_labels_; |
+const std::vector<string16>& AutofillPopupControllerImpl::subtexts() const { |
+ return subtexts_; |
} |
-const std::vector<string16>& AutofillPopupControllerImpl:: |
- autofill_icons() const { |
- return autofill_icons_; |
+const std::vector<string16>& AutofillPopupControllerImpl::icons() const { |
+ return icons_; |
} |
-const std::vector<int>& AutofillPopupControllerImpl:: |
- autofill_unique_ids() const { |
- return autofill_unique_ids_; |
+const std::vector<int>& AutofillPopupControllerImpl::identifiers() const { |
+ return identifiers_; |
} |
#if !defined(OS_ANDROID) |
-const gfx::Font& AutofillPopupControllerImpl::label_font() const { |
- return label_font_; |
+const gfx::Font& AutofillPopupControllerImpl::name_font() const { |
+ return name_font_; |
} |
-const gfx::Font& AutofillPopupControllerImpl::value_font() const { |
- return value_font_; |
+const gfx::Font& AutofillPopupControllerImpl::subtext_font() const { |
+ return subtext_font_; |
} |
#endif |
@@ -329,7 +318,7 @@ bool AutofillPopupControllerImpl::HandleKeyPressEvent( |
SetSelectedLine(0); |
return true; |
case ui::VKEY_NEXT: // Page down. |
- SetSelectedLine(autofill_values().size() - 1); |
+ SetSelectedLine(names().size() - 1); |
return true; |
case ui::VKEY_ESCAPE: |
HideInternal(); |
@@ -367,22 +356,20 @@ void AutofillPopupControllerImpl::SetSelectedLine(int selected_line) { |
selected_line_ = selected_line; |
- if (selected_line_ != kNoSelection) { |
- delegate_->SelectAutofillSuggestion( |
- autofill_unique_ids_[selected_line_]); |
- } |
+ if (selected_line_ != kNoSelection) |
+ delegate_->DidSelectSuggestion(identifiers_[selected_line_]); |
} |
void AutofillPopupControllerImpl::SelectNextLine() { |
int new_selected_line = selected_line_ + 1; |
// Skip over any lines that can't be selected. |
- while (static_cast<size_t>(new_selected_line) < autofill_values_.size() && |
- !CanAccept(autofill_unique_ids()[new_selected_line])) { |
+ while (static_cast<size_t>(new_selected_line) < names_.size() && |
+ !CanAccept(identifiers()[new_selected_line])) { |
++new_selected_line; |
} |
- if (new_selected_line == static_cast<int>(autofill_values_.size())) |
+ if (new_selected_line == static_cast<int>(names_.size())) |
new_selected_line = 0; |
SetSelectedLine(new_selected_line); |
@@ -393,12 +380,12 @@ void AutofillPopupControllerImpl::SelectPreviousLine() { |
// Skip over any lines that can't be selected. |
while (new_selected_line > kNoSelection && |
- !CanAccept(autofill_unique_ids()[new_selected_line])) { |
+ !CanAccept(identifiers()[new_selected_line])) { |
--new_selected_line; |
} |
if (new_selected_line <= kNoSelection) |
- new_selected_line = autofill_values_.size() - 1; |
+ new_selected_line = names_.size() - 1; |
SetSelectedLine(new_selected_line); |
} |
@@ -408,15 +395,13 @@ bool AutofillPopupControllerImpl::AcceptSelectedLine() { |
return false; |
DCHECK_GE(selected_line_, 0); |
- DCHECK_LT(selected_line_, static_cast<int>(autofill_values_.size())); |
+ DCHECK_LT(selected_line_, static_cast<int>(names_.size())); |
- if (!CanAccept(autofill_unique_ids_[selected_line_])) |
+ if (!CanAccept(identifiers_[selected_line_])) |
return false; |
- return AcceptAutofillSuggestion( |
- autofill_values_[selected_line_], |
- autofill_unique_ids_[selected_line_], |
- selected_line_); |
+ AcceptSuggestion(selected_line_); |
+ return true; |
} |
bool AutofillPopupControllerImpl::RemoveSelectedLine() { |
@@ -424,24 +409,19 @@ bool AutofillPopupControllerImpl::RemoveSelectedLine() { |
return false; |
DCHECK_GE(selected_line_, 0); |
- DCHECK_LT(selected_line_, static_cast<int>(autofill_values_.size())); |
+ DCHECK_LT(selected_line_, static_cast<int>(names_.size())); |
- if (!CanDelete(autofill_unique_ids_[selected_line_])) |
+ if (!CanDelete(selected_line_)) |
return false; |
- if (autofill_unique_ids_[selected_line_] > 0) { |
- delegate_->RemoveAutofillProfileOrCreditCard( |
- autofill_unique_ids_[selected_line_]); |
- } else { |
- delegate_->RemoveAutocompleteEntry( |
- autofill_values_[selected_line_]); |
- } |
+ delegate_->RemoveSuggestion(names_[selected_line_], |
+ identifiers_[selected_line_]); |
// Remove the deleted element. |
- autofill_values_.erase(autofill_values_.begin() + selected_line_); |
- autofill_labels_.erase(autofill_labels_.begin() + selected_line_); |
- autofill_icons_.erase(autofill_icons_.begin() + selected_line_); |
- autofill_unique_ids_.erase(autofill_unique_ids_.begin() + selected_line_); |
+ names_.erase(names_.begin() + selected_line_); |
+ subtexts_.erase(subtexts_.begin() + selected_line_); |
+ icons_.erase(icons_.begin() + selected_line_); |
+ identifiers_.erase(identifiers_.begin() + selected_line_); |
SetSelectedLine(kNoSelection); |
@@ -458,15 +438,22 @@ bool AutofillPopupControllerImpl::RemoveSelectedLine() { |
int AutofillPopupControllerImpl::LineFromY(int y) { |
int current_height = 0; |
- for (size_t i = 0; i < autofill_unique_ids().size(); ++i) { |
- current_height += GetRowHeightFromId(autofill_unique_ids()[i]); |
+ for (size_t i = 0; i < identifiers().size(); ++i) { |
+ current_height += GetRowHeightFromId(identifiers()[i]); |
if (y <= current_height) |
return i; |
} |
// The y value goes beyond the popup so stop the selection at the last line. |
- return autofill_unique_ids().size() - 1; |
+ return identifiers().size() - 1; |
+} |
+ |
+int AutofillPopupControllerImpl::GetRowHeightFromId(int identifier) { |
+ if (identifier == WebAutofillClient::MenuItemIDSeparator) |
+ return kSeparatorHeight; |
+ |
+ return kRowHeight; |
} |
bool AutofillPopupControllerImpl::DeleteIconIsUnder(int x, int y) { |
@@ -478,7 +465,7 @@ bool AutofillPopupControllerImpl::DeleteIconIsUnder(int x, int y) { |
int row_start_y = 0; |
for (int i = 0; i < selected_line(); ++i) { |
- row_start_y += GetRowHeightFromId(autofill_unique_ids()[i]); |
+ row_start_y += GetRowHeightFromId(identifiers()[i]); |
} |
gfx::Rect delete_icon_bounds = gfx::Rect( |
@@ -492,16 +479,17 @@ bool AutofillPopupControllerImpl::DeleteIconIsUnder(int x, int y) { |
} |
bool AutofillPopupControllerImpl::CanAccept(int id) { |
- return id != WebAutofillClient::MenuItemIDSeparator; |
+ return id != WebAutofillClient::MenuItemIDSeparator && |
+ id != WebAutofillClient::MenuItemIDWarningMessage; |
} |
bool AutofillPopupControllerImpl::HasAutofillEntries() { |
- return autofill_values_.size() != 0 && |
- (autofill_unique_ids_[0] > 0 || |
- autofill_unique_ids_[0] == |
+ return names_.size() != 0 && |
+ (identifiers_[0] > 0 || |
+ identifiers_[0] == |
WebAutofillClient::MenuItemIDAutocompleteEntry || |
- autofill_unique_ids_[0] == WebAutofillClient::MenuItemIDPasswordEntry || |
- autofill_unique_ids_[0] == WebAutofillClient::MenuItemIDDataListEntry); |
+ identifiers_[0] == WebAutofillClient::MenuItemIDPasswordEntry || |
+ identifiers_[0] == WebAutofillClient::MenuItemIDDataListEntry); |
} |
void AutofillPopupControllerImpl::ShowView() { |