| Index: chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc
 | 
| diff --git a/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc b/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc
 | 
| index a6ef0406f1470abf07411f11d52bf338f4b68616..a8557401c3ec20622449c9675cb7a2512787ecd7 100644
 | 
| --- a/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc
 | 
| +++ b/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc
 | 
| @@ -8,6 +8,7 @@
 | 
|  
 | 
|  #include "base/macros.h"
 | 
|  #include "base/memory/weak_ptr.h"
 | 
| +#include "base/optional.h"
 | 
|  #include "base/strings/utf_string_conversions.h"
 | 
|  #include "build/build_config.h"
 | 
|  #include "chrome/browser/ui/autofill/autofill_popup_controller_impl.h"
 | 
| @@ -69,6 +70,21 @@ class MockAutofillClient : public autofill::TestAutofillClient {
 | 
|    DISALLOW_COPY_AND_ASSIGN(MockAutofillClient);
 | 
|  };
 | 
|  
 | 
| +class MockAutofillPopupView : public AutofillPopupView {
 | 
| + public:
 | 
| +  MockAutofillPopupView() {}
 | 
| +
 | 
| +  MOCK_METHOD0(Show, void());
 | 
| +  MOCK_METHOD0(Hide, void());
 | 
| +  MOCK_METHOD2(OnSelectedRowChanged,
 | 
| +               void(base::Optional<int> previous_row_selection,
 | 
| +                    base::Optional<int> current_row_selection));
 | 
| +  MOCK_METHOD0(OnSuggestionsChanged, void());
 | 
| +
 | 
| + private:
 | 
| +  DISALLOW_COPY_AND_ASSIGN(MockAutofillPopupView);
 | 
| +};
 | 
| +
 | 
|  class TestAutofillPopupController : public AutofillPopupControllerImpl {
 | 
|   public:
 | 
|    TestAutofillPopupController(
 | 
| @@ -95,18 +111,16 @@ class TestAutofillPopupController : public AutofillPopupControllerImpl {
 | 
|    using AutofillPopupControllerImpl::element_bounds;
 | 
|    using AutofillPopupControllerImpl::SetValues;
 | 
|    using AutofillPopupControllerImpl::GetWeakPtr;
 | 
| -  MOCK_METHOD1(InvalidateRow, void(size_t));
 | 
| -  MOCK_METHOD0(UpdateBoundsAndRedrawPopup, void());
 | 
| +  MOCK_METHOD0(OnSuggestionsChanged, void());
 | 
|    MOCK_METHOD0(Hide, void());
 | 
|  
 | 
|    void DoHide() {
 | 
|      AutofillPopupControllerImpl::Hide();
 | 
|    }
 | 
| -
 | 
| - private:
 | 
| -  void ShowView() override {}
 | 
|  };
 | 
|  
 | 
| +static constexpr base::Optional<int> kNoSelection;
 | 
| +
 | 
|  }  // namespace
 | 
|  
 | 
|  class AutofillPopupControllerUnitTest : public ChromeRenderViewHostTestHarness {
 | 
| @@ -132,10 +146,10 @@ class AutofillPopupControllerUnitTest : public ChromeRenderViewHostTestHarness {
 | 
|          new NiceMock<MockAutofillExternalDelegate>(
 | 
|              driver->autofill_manager(),
 | 
|              driver));
 | 
| -
 | 
| -    autofill_popup_controller_ =
 | 
| -        new testing::NiceMock<TestAutofillPopupController>(
 | 
| -            external_delegate_->GetWeakPtr(), gfx::RectF());
 | 
| +    autofill_popup_view_.reset(new NiceMock<MockAutofillPopupView>());
 | 
| +    autofill_popup_controller_ = new NiceMock<TestAutofillPopupController>(
 | 
| +        external_delegate_->GetWeakPtr(), gfx::RectF());
 | 
| +    autofill_popup_controller_->SetViewForTesting(autofill_popup_view());
 | 
|    }
 | 
|  
 | 
|    void TearDown() override {
 | 
| @@ -156,10 +170,15 @@ class AutofillPopupControllerUnitTest : public ChromeRenderViewHostTestHarness {
 | 
|      return external_delegate_.get();
 | 
|    }
 | 
|  
 | 
| +  MockAutofillPopupView* autofill_popup_view() {
 | 
| +    return autofill_popup_view_.get();
 | 
| +  }
 | 
| +
 | 
|   protected:
 | 
|    std::unique_ptr<MockAutofillClient> autofill_client_;
 | 
|    std::unique_ptr<NiceMock<MockAutofillExternalDelegate>> external_delegate_;
 | 
| -  testing::NiceMock<TestAutofillPopupController>* autofill_popup_controller_;
 | 
| +  std::unique_ptr<NiceMock<MockAutofillPopupView>> autofill_popup_view_;
 | 
| +  NiceMock<TestAutofillPopupController>* autofill_popup_controller_;
 | 
|  };
 | 
|  
 | 
|  TEST_F(AutofillPopupControllerUnitTest, ChangeSelectedLine) {
 | 
| @@ -169,7 +188,7 @@ TEST_F(AutofillPopupControllerUnitTest, ChangeSelectedLine) {
 | 
|    suggestions.push_back(Suggestion("", "", "", 0));
 | 
|    autofill_popup_controller_->Show(suggestions);
 | 
|  
 | 
| -  EXPECT_LT(autofill_popup_controller_->selected_line(), 0);
 | 
| +  EXPECT_FALSE(autofill_popup_controller_->selected_line());
 | 
|    // Check that there are at least 2 values so that the first and last selection
 | 
|    // are different.
 | 
|    EXPECT_GE(2,
 | 
| @@ -177,13 +196,12 @@ TEST_F(AutofillPopupControllerUnitTest, ChangeSelectedLine) {
 | 
|  
 | 
|    // Test wrapping before the front.
 | 
|    autofill_popup_controller_->SelectPreviousLine();
 | 
| -  EXPECT_EQ(static_cast<int>(
 | 
| -      autofill_popup_controller_->GetLineCount() - 1),
 | 
| -      autofill_popup_controller_->selected_line());
 | 
| +  EXPECT_EQ(autofill_popup_controller_->GetLineCount() - 1,
 | 
| +            autofill_popup_controller_->selected_line().value());
 | 
|  
 | 
|    // Test wrapping after the end.
 | 
|    autofill_popup_controller_->SelectNextLine();
 | 
| -  EXPECT_EQ(0, autofill_popup_controller_->selected_line());
 | 
| +  EXPECT_EQ(0, *autofill_popup_controller_->selected_line());
 | 
|  }
 | 
|  
 | 
|  TEST_F(AutofillPopupControllerUnitTest, RedrawSelectedLine) {
 | 
| @@ -195,18 +213,21 @@ TEST_F(AutofillPopupControllerUnitTest, RedrawSelectedLine) {
 | 
|  
 | 
|    // Make sure that when a new line is selected, it is invalidated so it can
 | 
|    // be updated to show it is selected.
 | 
| -  int selected_line = 0;
 | 
| -  EXPECT_CALL(*autofill_popup_controller_, InvalidateRow(selected_line));
 | 
| +  base::Optional<int> selected_line = 0;
 | 
| +  EXPECT_CALL(*autofill_popup_view_,
 | 
| +              OnSelectedRowChanged(kNoSelection, selected_line));
 | 
| +
 | 
|    autofill_popup_controller_->SetSelectedLine(selected_line);
 | 
|  
 | 
|    // Ensure that the row isn't invalidated if it didn't change.
 | 
| -  EXPECT_CALL(*autofill_popup_controller_,
 | 
| -              InvalidateRow(selected_line)).Times(0);
 | 
| +  EXPECT_CALL(*autofill_popup_view_, OnSelectedRowChanged(_, _)).Times(0);
 | 
|    autofill_popup_controller_->SetSelectedLine(selected_line);
 | 
|  
 | 
|    // Change back to no selection.
 | 
| -  EXPECT_CALL(*autofill_popup_controller_, InvalidateRow(selected_line));
 | 
| -  autofill_popup_controller_->SetSelectedLine(-1);
 | 
| +  EXPECT_CALL(*autofill_popup_view_,
 | 
| +              OnSelectedRowChanged(selected_line, kNoSelection));
 | 
| +
 | 
| +  autofill_popup_controller_->SetSelectedLine(kNoSelection);
 | 
|  }
 | 
|  
 | 
|  TEST_F(AutofillPopupControllerUnitTest, RemoveLine) {
 | 
| @@ -227,7 +248,7 @@ TEST_F(AutofillPopupControllerUnitTest, RemoveLine) {
 | 
|  
 | 
|    // Remove the first entry. The popup should be redrawn since its size has
 | 
|    // changed.
 | 
| -  EXPECT_CALL(*autofill_popup_controller_, UpdateBoundsAndRedrawPopup());
 | 
| +  EXPECT_CALL(*autofill_popup_controller_, OnSuggestionsChanged());
 | 
|    autofill_popup_controller_->SetSelectedLine(0);
 | 
|    EXPECT_TRUE(autofill_popup_controller_->RemoveSelectedLine());
 | 
|  
 | 
| @@ -248,12 +269,17 @@ TEST_F(AutofillPopupControllerUnitTest, RemoveOnlyLine) {
 | 
|    autofill::GenerateTestAutofillPopup(external_delegate_.get());
 | 
|  
 | 
|    // Select the only line.
 | 
| -  autofill_popup_controller_->SetSelectedLine(0);
 | 
| +  base::Optional<int> selected_line(0);
 | 
| +  autofill_popup_controller_->SetSelectedLine(selected_line);
 | 
| +  EXPECT_CALL(*autofill_popup_view_,
 | 
| +              OnSelectedRowChanged(kNoSelection, selected_line))
 | 
| +      .Times(0);
 | 
|  
 | 
| -  // Remove the only line. There should be no row invalidation and the popup
 | 
| -  // should then be hidden since there are no Autofill entries left.
 | 
| +  // Remove the only line. The popup should then be hidden since there are no
 | 
| +  // Autofill entries left.
 | 
|    EXPECT_CALL(*autofill_popup_controller_, Hide());
 | 
| -  EXPECT_CALL(*autofill_popup_controller_, InvalidateRow(_)).Times(0);
 | 
| +  EXPECT_CALL(*autofill_popup_view_,
 | 
| +              OnSelectedRowChanged(selected_line, kNoSelection));
 | 
|    EXPECT_TRUE(autofill_popup_controller_->RemoveSelectedLine());
 | 
|  }
 | 
|  
 | 
| @@ -269,11 +295,33 @@ TEST_F(AutofillPopupControllerUnitTest, SkipSeparator) {
 | 
|  
 | 
|    // Make sure next skips the unselectable separator.
 | 
|    autofill_popup_controller_->SelectNextLine();
 | 
| -  EXPECT_EQ(2, autofill_popup_controller_->selected_line());
 | 
| +  EXPECT_EQ(2, *autofill_popup_controller_->selected_line());
 | 
|  
 | 
|    // Make sure previous skips the unselectable separator.
 | 
|    autofill_popup_controller_->SelectPreviousLine();
 | 
| -  EXPECT_EQ(0, autofill_popup_controller_->selected_line());
 | 
| +  EXPECT_EQ(0, *autofill_popup_controller_->selected_line());
 | 
| +}
 | 
| +
 | 
| +TEST_F(AutofillPopupControllerUnitTest, SkipInsecureFormWarning) {
 | 
| +  std::vector<Suggestion> suggestions;
 | 
| +  suggestions.push_back(Suggestion("", "", "", 1));
 | 
| +  suggestions.push_back(Suggestion("", "", "", POPUP_ITEM_ID_SEPARATOR));
 | 
| +  suggestions.push_back(Suggestion(
 | 
| +      "", "", "", POPUP_ITEM_ID_INSECURE_CONTEXT_PAYMENT_DISABLED_MESSAGE));
 | 
| +  autofill_popup_controller_->Show(suggestions);
 | 
| +
 | 
| +  // Make sure previous skips the unselectable form warning when there is no
 | 
| +  // selection.
 | 
| +  autofill_popup_controller_->SelectPreviousLine();
 | 
| +  EXPECT_FALSE(autofill_popup_controller_->selected_line());
 | 
| +
 | 
| +  autofill_popup_controller_->SetSelectedLine(0);
 | 
| +  EXPECT_EQ(0, *autofill_popup_controller_->selected_line());
 | 
| +
 | 
| +  // Make sure previous skips the unselectable form warning when there is a
 | 
| +  // selection.
 | 
| +  autofill_popup_controller_->SelectPreviousLine();
 | 
| +  EXPECT_FALSE(autofill_popup_controller_->selected_line());
 | 
|  }
 | 
|  
 | 
|  TEST_F(AutofillPopupControllerUnitTest, UpdateDataListValues) {
 | 
| @@ -289,7 +337,7 @@ TEST_F(AutofillPopupControllerUnitTest, UpdateDataListValues) {
 | 
|    autofill_popup_controller_->UpdateDataListValues(data_list_values,
 | 
|                                                     data_list_values);
 | 
|  
 | 
| -  ASSERT_EQ(3u, autofill_popup_controller_->GetLineCount());
 | 
| +  ASSERT_EQ(3, autofill_popup_controller_->GetLineCount());
 | 
|  
 | 
|    Suggestion result0 = autofill_popup_controller_->GetSuggestionAt(0);
 | 
|    EXPECT_EQ(value1, result0.value);
 | 
| @@ -314,7 +362,7 @@ TEST_F(AutofillPopupControllerUnitTest, UpdateDataListValues) {
 | 
|  
 | 
|    autofill_popup_controller_->UpdateDataListValues(data_list_values,
 | 
|                                                     data_list_values);
 | 
| -  ASSERT_EQ(4u, autofill_popup_controller_->GetLineCount());
 | 
| +  ASSERT_EQ(4, autofill_popup_controller_->GetLineCount());
 | 
|  
 | 
|    // Original one first, followed by new one, then separator.
 | 
|    EXPECT_EQ(value1, autofill_popup_controller_->GetSuggestionAt(0).value);
 | 
| @@ -329,7 +377,7 @@ TEST_F(AutofillPopupControllerUnitTest, UpdateDataListValues) {
 | 
|    autofill_popup_controller_->UpdateDataListValues(data_list_values,
 | 
|                                                     data_list_values);
 | 
|  
 | 
| -  ASSERT_EQ(1u, autofill_popup_controller_->GetLineCount());
 | 
| +  ASSERT_EQ(1, autofill_popup_controller_->GetLineCount());
 | 
|    EXPECT_EQ(1, autofill_popup_controller_->GetSuggestionAt(0).frontend_id);
 | 
|  }
 | 
|  
 | 
| @@ -347,7 +395,7 @@ TEST_F(AutofillPopupControllerUnitTest, PopupsWithOnlyDataLists) {
 | 
|    autofill_popup_controller_->UpdateDataListValues(data_list_values,
 | 
|                                                     data_list_values);
 | 
|  
 | 
| -  ASSERT_EQ(1u, autofill_popup_controller_->GetLineCount());
 | 
| +  ASSERT_EQ(1, autofill_popup_controller_->GetLineCount());
 | 
|    EXPECT_EQ(value1, autofill_popup_controller_->GetSuggestionAt(0).value);
 | 
|    EXPECT_EQ(POPUP_ITEM_ID_DATALIST_ENTRY,
 | 
|              autofill_popup_controller_->GetSuggestionAt(0).frontend_id);
 | 
| @@ -386,9 +434,9 @@ TEST_F(AutofillPopupControllerUnitTest, GetOrCreate) {
 | 
|    EXPECT_EQ(controller.get(), controller2.get());
 | 
|    controller->Hide();
 | 
|  
 | 
| -  testing::NiceMock<TestAutofillPopupController>* test_controller =
 | 
| -      new testing::NiceMock<TestAutofillPopupController>(delegate.GetWeakPtr(),
 | 
| -                                                         gfx::RectF());
 | 
| +  NiceMock<TestAutofillPopupController>* test_controller =
 | 
| +      new NiceMock<TestAutofillPopupController>(delegate.GetWeakPtr(),
 | 
| +                                                gfx::RectF());
 | 
|    EXPECT_CALL(*test_controller, Hide());
 | 
|  
 | 
|    gfx::RectF bounds(0.f, 0.f, 1.f, 2.f);
 | 
| @@ -414,7 +462,7 @@ TEST_F(AutofillPopupControllerUnitTest, ProperlyResetController) {
 | 
|    std::vector<Suggestion> suggestions;
 | 
|    suggestions.push_back(Suggestion("", "", "", 0));
 | 
|    suggestions.push_back(Suggestion("", "", "", 0));
 | 
| -  popup_controller()->SetValues(suggestions);
 | 
| +  popup_controller()->Show(suggestions);
 | 
|    popup_controller()->SetSelectedLine(0);
 | 
|  
 | 
|    // Now show a new popup with the same controller, but with fewer items.
 | 
| @@ -422,8 +470,8 @@ TEST_F(AutofillPopupControllerUnitTest, ProperlyResetController) {
 | 
|        AutofillPopupControllerImpl::GetOrCreate(
 | 
|            popup_controller()->GetWeakPtr(), delegate()->GetWeakPtr(), NULL,
 | 
|            NULL, gfx::RectF(), base::i18n::UNKNOWN_DIRECTION);
 | 
| -  EXPECT_NE(0, controller->selected_line());
 | 
| -  EXPECT_EQ(0u, controller->GetLineCount());
 | 
| +  EXPECT_FALSE(controller->selected_line());
 | 
| +  EXPECT_EQ(0, controller->GetLineCount());
 | 
|  }
 | 
|  
 | 
|  #if !defined(OS_ANDROID)
 | 
| 
 |