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

Unified Diff: chrome/browser/ui/autofill/autofill_popup_controller_impl.cc

Issue 2727233003: Uses child views in Autofill Popup so we can trigger (Closed)
Patch Set: (int) to NSInteger Created 3 years, 9 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: 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 487248fba6fdda38fb06cfa215aecb70cb0b4acf..b800e88cc141934f36e113db3cb1c86beb358449 100644
--- a/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc
+++ b/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc
@@ -10,6 +10,7 @@
#include "base/command_line.h"
#include "base/logging.h"
#include "base/macros.h"
+#include "base/optional.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
#include "chrome/browser/ui/autofill/autofill_popup_view.h"
@@ -25,12 +26,6 @@
using base::WeakPtr;
namespace autofill {
-namespace {
-
-// Used to indicate that no line is currently selected by the user.
-const int kNoSelection = -1;
-
-} // namespace
// static
WeakPtr<AutofillPopupControllerImpl> AutofillPopupControllerImpl::GetOrCreate(
@@ -106,7 +101,7 @@ void AutofillPopupControllerImpl::Show(
// Elide the name and label strings so that the popup fits in the available
// space.
- for (size_t i = 0; i < suggestions_.size(); ++i) {
+ for (int i = 0; i < GetLineCount(); ++i) {
bool has_label = !suggestions_[i].label.empty();
ElideValueAndLabelForRow(
i, layout_model_.GetAvailableWidthForRow(i, has_label));
@@ -114,9 +109,12 @@ void AutofillPopupControllerImpl::Show(
#endif
if (just_created) {
- ShowView();
+ view_->Show();
} else {
- UpdateBoundsAndRedrawPopup();
+ if (selected_line_ && *selected_line_ >= GetLineCount())
+ selected_line_.reset();
+
+ OnSuggestionsChanged();
}
controller_common_->RegisterKeyPressCallback();
@@ -153,7 +151,7 @@ void AutofillPopupControllerImpl::UpdateDataListValues(
// The popup contents have changed, so either update the bounds or hide it.
if (HasSuggestions())
- UpdateBoundsAndRedrawPopup();
+ OnSuggestionsChanged();
else
Hide();
@@ -185,7 +183,7 @@ void AutofillPopupControllerImpl::UpdateDataListValues(
elided_labels_[i] = labels[i];
}
- UpdateBoundsAndRedrawPopup();
+ OnSuggestionsChanged();
DCHECK_EQ(suggestions_.size(), elided_values_.size());
DCHECK_EQ(suggestions_.size(), elided_labels_.size());
}
@@ -220,7 +218,7 @@ bool AutofillPopupControllerImpl::HandleKeyPressEvent(
case ui::VKEY_PRIOR: // Page up.
// Set no line and then select the next line in case the first line is not
// selectable.
- SetSelectedLine(kNoSelection);
+ SetSelectedLine(base::nullopt);
SelectNextLine();
return true;
case ui::VKEY_NEXT: // Page down.
@@ -245,7 +243,7 @@ bool AutofillPopupControllerImpl::HandleKeyPressEvent(
}
}
-void AutofillPopupControllerImpl::UpdateBoundsAndRedrawPopup() {
+void AutofillPopupControllerImpl::OnSuggestionsChanged() {
#if !defined(OS_ANDROID)
// TODO(csharp): Since UpdatePopupBounds can change the position of the popup,
// the popup could end up jumping from above the element to below it.
@@ -255,7 +253,7 @@ void AutofillPopupControllerImpl::UpdateBoundsAndRedrawPopup() {
#endif
// Platform-specific draw call.
- view_->UpdateBoundsAndRedrawPopup();
+ view_->OnSuggestionsChanged();
}
void AutofillPopupControllerImpl::SetSelectionAtPoint(const gfx::Point& point) {
@@ -263,24 +261,23 @@ void AutofillPopupControllerImpl::SetSelectionAtPoint(const gfx::Point& point) {
}
bool AutofillPopupControllerImpl::AcceptSelectedLine() {
- if (selected_line_ == kNoSelection)
+ if (!selected_line_)
return false;
- DCHECK_GE(selected_line_, 0);
- DCHECK_LT(selected_line_, static_cast<int>(GetLineCount()));
+ DCHECK_LT(*selected_line_, GetLineCount());
- if (!CanAccept(suggestions_[selected_line_].frontend_id))
+ if (!CanAccept(suggestions_[*selected_line_].frontend_id))
return false;
- AcceptSuggestion(selected_line_);
+ AcceptSuggestion(*selected_line_);
return true;
}
void AutofillPopupControllerImpl::SelectionCleared() {
- SetSelectedLine(kNoSelection);
+ SetSelectedLine(base::nullopt);
}
-void AutofillPopupControllerImpl::AcceptSuggestion(size_t index) {
+void AutofillPopupControllerImpl::AcceptSuggestion(int index) {
const autofill::Suggestion& suggestion = suggestions_[index];
delegate_->DidAcceptSuggestion(suggestion.value, suggestion.frontend_id,
index);
@@ -312,33 +309,33 @@ AutofillPopupControllerImpl::GetSuggestions() {
}
#if !defined(OS_ANDROID)
-int AutofillPopupControllerImpl::GetElidedValueWidthForRow(size_t row) {
+int AutofillPopupControllerImpl::GetElidedValueWidthForRow(int row) {
return gfx::GetStringWidth(GetElidedValueAt(row),
layout_model_.GetValueFontListForRow(row));
}
-int AutofillPopupControllerImpl::GetElidedLabelWidthForRow(size_t row) {
+int AutofillPopupControllerImpl::GetElidedLabelWidthForRow(int row) {
return gfx::GetStringWidth(GetElidedLabelAt(row),
layout_model_.GetLabelFontListForRow(row));
}
#endif
-size_t AutofillPopupControllerImpl::GetLineCount() const {
+int AutofillPopupControllerImpl::GetLineCount() const {
return suggestions_.size();
}
const autofill::Suggestion& AutofillPopupControllerImpl::GetSuggestionAt(
- size_t row) const {
+ int row) const {
return suggestions_[row];
}
const base::string16& AutofillPopupControllerImpl::GetElidedValueAt(
- size_t row) const {
+ int row) const {
return elided_values_[row];
}
const base::string16& AutofillPopupControllerImpl::GetElidedLabelAt(
- size_t row) const {
+ int row) const {
return elided_labels_[row];
}
@@ -362,11 +359,11 @@ bool AutofillPopupControllerImpl::RemoveSuggestion(int list_index) {
elided_values_.erase(elided_values_.begin() + list_index);
elided_labels_.erase(elided_labels_.begin() + list_index);
- SetSelectedLine(kNoSelection);
+ SetSelectedLine(base::nullopt);
if (HasSuggestions()) {
delegate_->ClearPreviewedForm();
- UpdateBoundsAndRedrawPopup();
+ OnSuggestionsChanged();
} else {
Hide();
}
@@ -376,12 +373,12 @@ bool AutofillPopupControllerImpl::RemoveSuggestion(int list_index) {
ui::NativeTheme::ColorId
AutofillPopupControllerImpl::GetBackgroundColorIDForRow(int index) const {
- return index == selected_line_ ?
- ui::NativeTheme::kColorId_ResultsTableHoveredBackground :
- ui::NativeTheme::kColorId_ResultsTableNormalBackground;
+ return selected_line_ && index == *selected_line_
+ ? ui::NativeTheme::kColorId_ResultsTableHoveredBackground
+ : ui::NativeTheme::kColorId_ResultsTableNormalBackground;
}
-int AutofillPopupControllerImpl::selected_line() const {
+base::Optional<int> AutofillPopupControllerImpl::selected_line() const {
return selected_line_;
}
@@ -390,68 +387,65 @@ const AutofillPopupLayoutModel& AutofillPopupControllerImpl::layout_model()
return layout_model_;
}
-void AutofillPopupControllerImpl::SetSelectedLine(int selected_line) {
+void AutofillPopupControllerImpl::SetSelectedLine(
+ base::Optional<int> selected_line) {
if (selected_line_ == selected_line)
return;
- if (selected_line_ != kNoSelection &&
- static_cast<size_t>(selected_line_) < suggestions_.size())
- InvalidateRow(selected_line_);
-
- if (selected_line != kNoSelection) {
- InvalidateRow(selected_line);
-
- if (!CanAccept(suggestions_[selected_line].frontend_id))
- selected_line = kNoSelection;
+ if (selected_line) {
+ DCHECK_LT(*selected_line, GetLineCount());
+ if (!CanAccept(suggestions_[*selected_line].frontend_id))
+ selected_line = base::nullopt;
}
+ auto previous_selected_line(selected_line_);
selected_line_ = selected_line;
+ view_->OnSelectedRowChanged(previous_selected_line, selected_line_);
- if (selected_line_ != kNoSelection) {
- delegate_->DidSelectSuggestion(suggestions_[selected_line_].value,
- suggestions_[selected_line_].frontend_id);
+ if (selected_line_) {
+ delegate_->DidSelectSuggestion(suggestions_[*selected_line_].value,
+ suggestions_[*selected_line_].frontend_id);
} else {
delegate_->ClearPreviewedForm();
}
}
void AutofillPopupControllerImpl::SelectNextLine() {
- int new_selected_line = selected_line_ + 1;
+ int new_selected_line = selected_line_ ? *selected_line_ + 1 : 0;
// Skip over any lines that can't be selected.
- while (static_cast<size_t>(new_selected_line) < GetLineCount() &&
+ while (new_selected_line < GetLineCount() &&
!CanAccept(suggestions_[new_selected_line].frontend_id)) {
++new_selected_line;
}
- if (new_selected_line >= static_cast<int>(GetLineCount()))
+ if (new_selected_line >= GetLineCount())
new_selected_line = 0;
SetSelectedLine(new_selected_line);
}
void AutofillPopupControllerImpl::SelectPreviousLine() {
- int new_selected_line = selected_line_ - 1;
+ int new_selected_line = selected_line_.value_or(0) - 1;
// Skip over any lines that can't be selected.
- while (new_selected_line > kNoSelection &&
+ while (new_selected_line >= 0 &&
!CanAccept(GetSuggestionAt(new_selected_line).frontend_id)) {
--new_selected_line;
}
- if (new_selected_line <= kNoSelection)
+ if (new_selected_line < 0)
new_selected_line = GetLineCount() - 1;
SetSelectedLine(new_selected_line);
}
bool AutofillPopupControllerImpl::RemoveSelectedLine() {
- if (selected_line_ == kNoSelection)
+ if (!selected_line_)
return false;
- DCHECK_GE(selected_line_, 0);
- DCHECK_LT(selected_line_, static_cast<int>(GetLineCount()));
- return RemoveSuggestion(selected_line_);
+ DCHECK_LT(*selected_line_, GetLineCount());
+ return RemoveSuggestion(*selected_line_);
}
bool AutofillPopupControllerImpl::CanAccept(int id) {
@@ -482,23 +476,13 @@ void AutofillPopupControllerImpl::SetValues(
}
}
-void AutofillPopupControllerImpl::ShowView() {
- view_->Show();
-}
-
-void AutofillPopupControllerImpl::InvalidateRow(size_t row) {
- DCHECK(0 <= row);
- DCHECK(row < suggestions_.size());
- view_->InvalidateRow(row);
-}
-
WeakPtr<AutofillPopupControllerImpl> AutofillPopupControllerImpl::GetWeakPtr() {
return weak_ptr_factory_.GetWeakPtr();
}
#if !defined(OS_ANDROID)
void AutofillPopupControllerImpl::ElideValueAndLabelForRow(
- size_t row,
+ int row,
int available_width) {
int value_width = gfx::GetStringWidth(
suggestions_[row].value, layout_model_.GetValueFontListForRow(row));
@@ -531,7 +515,7 @@ void AutofillPopupControllerImpl::ClearState() {
elided_values_.clear();
elided_labels_.clear();
- selected_line_ = kNoSelection;
+ selected_line_.reset();
}
} // namespace autofill

Powered by Google App Engine
This is Rietveld 408576698