| 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 37975e8b1e7733a584b0f8c92053f803fb0b03a1..ce5834889ea208861090bb3b29ea673e9e18e9d4 100644
|
| --- a/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc
|
| +++ b/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc
|
| @@ -3,11 +3,13 @@
|
| // found in the LICENSE file.
|
|
|
| #include "base/memory/scoped_ptr.h"
|
| +#include "base/utf_string_conversions.h"
|
| #include "chrome/browser/autofill/test_autofill_external_delegate.h"
|
| #include "chrome/browser/ui/autofill/autofill_popup_controller_impl.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebAutofillClient.h"
|
| +#include "ui/gfx/display.h"
|
| #include "ui/gfx/rect.h"
|
|
|
| using ::testing::_;
|
| @@ -33,11 +35,23 @@ class MockAutofillExternalDelegate :
|
| class TestAutofillPopupController : public AutofillPopupControllerImpl {
|
| public:
|
| explicit TestAutofillPopupController(
|
| - AutofillExternalDelegate* external_delegate)
|
| - : AutofillPopupControllerImpl(external_delegate, NULL, gfx::Rect()) {}
|
| + AutofillExternalDelegate* external_delegate,
|
| + const gfx::Rect& element_bounds)
|
| + : AutofillPopupControllerImpl(external_delegate, NULL, element_bounds) {}
|
| virtual ~TestAutofillPopupController() {}
|
|
|
| + void set_display(const gfx::Display display) {
|
| + display_ = display;
|
| + }
|
| + virtual gfx::Display GetDisplayNearestPoint(const gfx::Point& point) const
|
| + OVERRIDE {
|
| + return display_;
|
| + }
|
| +
|
| // Making protected functions public for testing
|
| + const std::vector<string16>& names() const {
|
| + return AutofillPopupControllerImpl::names();
|
| + }
|
| const std::vector<string16>& subtexts() const {
|
| return AutofillPopupControllerImpl::subtexts();
|
| }
|
| @@ -59,6 +73,26 @@ class TestAutofillPopupController : public AutofillPopupControllerImpl {
|
| void DoHide() {
|
| AutofillPopupControllerImpl::Hide();
|
| }
|
| + const gfx::Rect& popup_bounds() const {
|
| + return AutofillPopupControllerImpl::popup_bounds();
|
| + }
|
| + const gfx::Rect& element_bounds() const {
|
| + return AutofillPopupControllerImpl::element_bounds();
|
| + }
|
| +#if !defined(OS_ANDROID)
|
| + const gfx::Font& name_font() const {
|
| + return AutofillPopupControllerImpl::name_font();
|
| + }
|
| + const gfx::Font& subtext_font() const {
|
| + return AutofillPopupControllerImpl::subtext_font();
|
| + }
|
| +#endif
|
| + int GetDesiredPopupWidth() const {
|
| + return AutofillPopupControllerImpl::GetDesiredPopupWidth();
|
| + }
|
| + int GetDesiredPopupHeight() const {
|
| + return AutofillPopupControllerImpl::GetDesiredPopupHeight();
|
| + }
|
|
|
| MOCK_METHOD1(InvalidateRow, void(size_t));
|
| MOCK_METHOD0(UpdateBoundsAndRedrawPopup, void());
|
| @@ -66,6 +100,8 @@ class TestAutofillPopupController : public AutofillPopupControllerImpl {
|
|
|
| private:
|
| virtual void ShowView() OVERRIDE {}
|
| +
|
| + gfx::Display display_;
|
| };
|
|
|
| } // namespace
|
| @@ -75,7 +111,7 @@ class AutofillPopupControllerUnitTest : public ::testing::Test {
|
| AutofillPopupControllerUnitTest()
|
| : autofill_popup_controller_(
|
| new testing::NiceMock<TestAutofillPopupController>(
|
| - &external_delegate_)) {}
|
| + &external_delegate_, gfx::Rect())) {}
|
| virtual ~AutofillPopupControllerUnitTest() {
|
| // This will make sure the controller and the view (if any) are both
|
| // cleaned up.
|
| @@ -239,8 +275,9 @@ TEST_F(AutofillPopupControllerUnitTest, GetOrCreate) {
|
| EXPECT_EQ(controller, controller2);
|
| controller->Hide();
|
|
|
| - TestAutofillPopupController* test_controller =
|
| - new TestAutofillPopupController(&delegate);
|
| + testing::NiceMock<TestAutofillPopupController>* test_controller =
|
| + new testing::NiceMock<TestAutofillPopupController>(&delegate,
|
| + gfx::Rect());
|
| EXPECT_CALL(*test_controller, Hide());
|
|
|
| gfx::Rect bounds(0, 0, 1, 2);
|
| @@ -258,3 +295,101 @@ TEST_F(AutofillPopupControllerUnitTest, GetOrCreate) {
|
| EXPECT_CALL(delegate, ControllerDestroyed());
|
| delete test_controller;
|
| }
|
| +
|
| +#if !defined(OS_ANDROID)
|
| +TEST_F(AutofillPopupControllerUnitTest, ElideText) {
|
| + std::vector<string16> names;
|
| + names.push_back(ASCIIToUTF16("Text that will need to be trimmed"));
|
| + names.push_back(ASCIIToUTF16("Untrimmed"));
|
| +
|
| + std::vector<string16> subtexts;
|
| + subtexts.push_back(ASCIIToUTF16("Label that will be trimmed"));
|
| + subtexts.push_back(ASCIIToUTF16("Untrimmed"));
|
| +
|
| + std::vector<string16> icons(2, string16());
|
| + std::vector<int> autofill_ids(2, 0);
|
| +
|
| + // Ensure the popup will be too small to display all of the first row.
|
| + int popup_max_width =
|
| + autofill_popup_controller_->name_font().GetStringWidth(names[0]) +
|
| + autofill_popup_controller_->subtext_font().GetStringWidth(subtexts[0]) -
|
| + 25;
|
| + gfx::Rect popup_bounds = gfx::Rect(0, 0, popup_max_width, 0);
|
| + autofill_popup_controller_->set_display(gfx::Display(0, popup_bounds));
|
| +
|
| + autofill_popup_controller_->Show(names, subtexts, icons, autofill_ids);
|
| +
|
| + // The first element was long so it should have been trimmed.
|
| + EXPECT_NE(names[0], autofill_popup_controller_->names()[0]);
|
| + EXPECT_NE(subtexts[0], autofill_popup_controller_->subtexts()[0]);
|
| +
|
| + // The second element was shorter so it should be unchanged.
|
| + EXPECT_EQ(names[1], autofill_popup_controller_->names()[1]);
|
| + EXPECT_EQ(subtexts[1], autofill_popup_controller_->subtexts()[1]);
|
| +}
|
| +#endif
|
| +
|
| +TEST_F(AutofillPopupControllerUnitTest, GrowPopupInSpace) {
|
| + std::vector<string16> names(1);
|
| + std::vector<int> autofill_ids(1, 1);
|
| +
|
| + // Call Show so that GetDesired...() will be able to provide valid values.
|
| + autofill_popup_controller_->Show(names, names, names, autofill_ids);
|
| + int desired_width = autofill_popup_controller_->GetDesiredPopupWidth();
|
| + int desired_height = autofill_popup_controller_->GetDesiredPopupHeight();
|
| +
|
| + // Setup the visible screen space.
|
| + gfx::Display display(0, gfx::Rect(0, 0,
|
| + desired_width * 2, desired_height * 2));
|
| +
|
| + // Store the possible element bounds and the popup bounds they should result
|
| + // in.
|
| + std::vector<gfx::Rect> element_bounds;
|
| + std::vector<gfx::Rect> expected_popup_bounds;
|
| +
|
| + // The popup grows down and to the right.
|
| + element_bounds.push_back(gfx::Rect(0, 0, 0, 0));
|
| + expected_popup_bounds.push_back(
|
| + gfx::Rect(0, 0, desired_width, desired_height));
|
| +
|
| + // The popup grows down and to the left.
|
| + element_bounds.push_back(gfx::Rect(2 * desired_width, 0, 0, 0));
|
| + expected_popup_bounds.push_back(
|
| + gfx::Rect(desired_width, 0, desired_width, desired_height));
|
| +
|
| + // The popup grows up and to the right.
|
| + element_bounds.push_back(gfx::Rect(0, 2 * desired_height, 0, 0));
|
| + expected_popup_bounds.push_back(
|
| + gfx::Rect(0, desired_height, desired_width, desired_height));
|
| +
|
| + // The popup grows up and to the left.
|
| + element_bounds.push_back(
|
| + gfx::Rect(2 * desired_width, 2 * desired_height, 0, 0));
|
| + expected_popup_bounds.push_back(
|
| + gfx::Rect(desired_width, desired_height, desired_width, desired_height));
|
| +
|
| + // The popup would be partial off the top and left side of the screen.
|
| + element_bounds.push_back(
|
| + gfx::Rect(-desired_width / 2, -desired_height / 2, 0, 0));
|
| + expected_popup_bounds.push_back(
|
| + gfx::Rect(0, 0, desired_width, desired_height));
|
| +
|
| + // The popup would be partially off the bottom and the right side of
|
| + // the screen.
|
| + element_bounds.push_back(
|
| + gfx::Rect(desired_width * 1.5, desired_height * 1.5, 0, 0));
|
| + expected_popup_bounds.push_back(gfx::Rect(
|
| + desired_width / 2, desired_height /2, desired_width, desired_height));
|
| +
|
| + for (size_t i = 0; i < element_bounds.size(); ++i) {
|
| + autofill_popup_controller_ =
|
| + new testing::NiceMock<TestAutofillPopupController>(&external_delegate_,
|
| + element_bounds[i]);
|
| + autofill_popup_controller_->set_display(display);
|
| + autofill_popup_controller_->Show(names, names, names, autofill_ids);
|
| +
|
| + EXPECT_EQ(expected_popup_bounds[i].ToString(),
|
| + autofill_popup_controller_->popup_bounds().ToString()) <<
|
| + "Popup bounds failed to match for test " << i;
|
| + }
|
| +}
|
|
|