| 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() {
|
|
|