| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/ui/views/bubble/border_contents.h" | |
| 6 #include "testing/gtest/include/gtest/gtest.h" | |
| 7 | |
| 8 typedef testing::Test BorderContentsTest; | |
| 9 | |
| 10 class TestBorderContents : public BorderContents { | |
| 11 public: | |
| 12 TestBorderContents() {} | |
| 13 | |
| 14 void set_monitor_bounds(const gfx::Rect& bounds) { | |
| 15 monitor_bounds_ = bounds; | |
| 16 } | |
| 17 | |
| 18 views::BubbleBorder* bubble_border() const { | |
| 19 return BorderContents::bubble_border(); | |
| 20 } | |
| 21 | |
| 22 protected: | |
| 23 virtual gfx::Rect GetMonitorBounds(const gfx::Rect& rect) { | |
| 24 return monitor_bounds_; | |
| 25 } | |
| 26 | |
| 27 private: | |
| 28 gfx::Rect monitor_bounds_; | |
| 29 | |
| 30 DISALLOW_COPY_AND_ASSIGN(TestBorderContents); | |
| 31 }; | |
| 32 | |
| 33 // Tests that the arrow is moved appropriately when the info-bubble does not fit | |
| 34 // the screen. | |
| 35 TEST_F(BorderContentsTest, BorderContentsSizeAndGetBounds) { | |
| 36 TestBorderContents border_contents; | |
| 37 border_contents.Init(); | |
| 38 | |
| 39 gfx::Insets insets; | |
| 40 border_contents.bubble_border()->GetInsets(&insets); | |
| 41 int xposition = 95 - insets.width(); | |
| 42 | |
| 43 // Test that the info bubble displays normally when it fits. | |
| 44 gfx::Rect contents_bounds; | |
| 45 gfx::Rect window_bounds; | |
| 46 border_contents.set_monitor_bounds(gfx::Rect(0, 0, 1000, 1000)); | |
| 47 border_contents.SizeAndGetBounds( | |
| 48 gfx::Rect(100, 100, 50, 50), // |position_relative_to| | |
| 49 views::BubbleBorder::TOP_LEFT, | |
| 50 false, // |allow_bubble_offscreen| | |
| 51 gfx::Size(500, 500), // |contents_size| | |
| 52 &contents_bounds, &window_bounds); | |
| 53 // The arrow shouldn't have changed from TOP_LEFT. | |
| 54 views::BubbleBorder::ArrowLocation arrow_location = | |
| 55 border_contents.bubble_border()->arrow_location(); | |
| 56 EXPECT_TRUE(views::BubbleBorder::has_arrow(arrow_location)); | |
| 57 EXPECT_TRUE(views::BubbleBorder::is_arrow_on_top(arrow_location)); | |
| 58 EXPECT_TRUE(views::BubbleBorder::is_arrow_on_left(arrow_location)); | |
| 59 EXPECT_GT(window_bounds.x(), xposition); | |
| 60 EXPECT_GT(window_bounds.y(), 100 + 50 - 10); // -10 to roughly compensate for | |
| 61 // arrow overlap. | |
| 62 | |
| 63 // Test bubble not fitting on left. | |
| 64 border_contents.SizeAndGetBounds( | |
| 65 gfx::Rect(100, 100, 50, 50), // |position_relative_to| | |
| 66 views::BubbleBorder::TOP_RIGHT, | |
| 67 false, // |allow_bubble_offscreen| | |
| 68 gfx::Size(500, 500), // |contents_size| | |
| 69 &contents_bounds, &window_bounds); | |
| 70 arrow_location = border_contents.bubble_border()->arrow_location(); | |
| 71 // The arrow should have changed to TOP_LEFT. | |
| 72 EXPECT_TRUE(views::BubbleBorder::has_arrow(arrow_location)); | |
| 73 EXPECT_TRUE(views::BubbleBorder::is_arrow_on_top(arrow_location)); | |
| 74 EXPECT_TRUE(views::BubbleBorder::is_arrow_on_left(arrow_location)); | |
| 75 EXPECT_GT(window_bounds.x(), xposition); | |
| 76 EXPECT_GT(window_bounds.y(), 100 + 50 - 10); // -10 to roughly compensate for | |
| 77 // arrow overlap. | |
| 78 | |
| 79 // Test bubble not fitting on left or top. | |
| 80 border_contents.SizeAndGetBounds( | |
| 81 gfx::Rect(100, 100, 50, 50), // |position_relative_to| | |
| 82 views::BubbleBorder::BOTTOM_RIGHT, | |
| 83 false, // |allow_bubble_offscreen| | |
| 84 gfx::Size(500, 500), // |contents_size| | |
| 85 &contents_bounds, &window_bounds); | |
| 86 arrow_location = border_contents.bubble_border()->arrow_location(); | |
| 87 // The arrow should have changed to TOP_LEFT. | |
| 88 EXPECT_TRUE(views::BubbleBorder::has_arrow(arrow_location)); | |
| 89 EXPECT_TRUE(views::BubbleBorder::is_arrow_on_top(arrow_location)); | |
| 90 EXPECT_TRUE(views::BubbleBorder::is_arrow_on_left(arrow_location)); | |
| 91 EXPECT_GT(window_bounds.x(), xposition); | |
| 92 EXPECT_GT(window_bounds.y(), 100 + 50 - 10); // -10 to roughly compensate for | |
| 93 // arrow overlap. | |
| 94 | |
| 95 // Test bubble not fitting on top. | |
| 96 border_contents.SizeAndGetBounds( | |
| 97 gfx::Rect(100, 100, 50, 50), // |position_relative_to| | |
| 98 views::BubbleBorder::BOTTOM_LEFT, | |
| 99 false, // |allow_bubble_offscreen| | |
| 100 gfx::Size(500, 500), // |contents_size| | |
| 101 &contents_bounds, &window_bounds); | |
| 102 arrow_location = border_contents.bubble_border()->arrow_location(); | |
| 103 // The arrow should have changed to TOP_LEFT. | |
| 104 EXPECT_TRUE(views::BubbleBorder::has_arrow(arrow_location)); | |
| 105 EXPECT_TRUE(views::BubbleBorder::is_arrow_on_top(arrow_location)); | |
| 106 EXPECT_TRUE(views::BubbleBorder::is_arrow_on_left(arrow_location)); | |
| 107 EXPECT_GT(window_bounds.x(), xposition); | |
| 108 EXPECT_GT(window_bounds.y(), 100 + 50 - 10); // -10 to roughly compensate for | |
| 109 // arrow overlap. | |
| 110 | |
| 111 // Test bubble not fitting on top and right. | |
| 112 border_contents.SizeAndGetBounds( | |
| 113 gfx::Rect(900, 100, 50, 50), // |position_relative_to| | |
| 114 views::BubbleBorder::BOTTOM_LEFT, | |
| 115 false, // |allow_bubble_offscreen| | |
| 116 gfx::Size(500, 500), // |contents_size| | |
| 117 &contents_bounds, &window_bounds); | |
| 118 arrow_location = border_contents.bubble_border()->arrow_location(); | |
| 119 // The arrow should have changed to TOP_RIGHT. | |
| 120 EXPECT_TRUE(views::BubbleBorder::has_arrow(arrow_location)); | |
| 121 EXPECT_TRUE(views::BubbleBorder::is_arrow_on_top(arrow_location)); | |
| 122 EXPECT_FALSE(views::BubbleBorder::is_arrow_on_left(arrow_location)); | |
| 123 EXPECT_LT(window_bounds.x(), 900 + 50 - 500); | |
| 124 EXPECT_GT(window_bounds.y(), 100 + 50 - 10); // -10 to roughly compensate for | |
| 125 // arrow overlap. | |
| 126 | |
| 127 // Test bubble not fitting on right. | |
| 128 border_contents.SizeAndGetBounds( | |
| 129 gfx::Rect(900, 100, 50, 50), // |position_relative_to| | |
| 130 views::BubbleBorder::TOP_LEFT, | |
| 131 false, // |allow_bubble_offscreen| | |
| 132 gfx::Size(500, 500), // |contents_size| | |
| 133 &contents_bounds, &window_bounds); | |
| 134 arrow_location = border_contents.bubble_border()->arrow_location(); | |
| 135 // The arrow should have changed to TOP_RIGHT. | |
| 136 EXPECT_TRUE(views::BubbleBorder::has_arrow(arrow_location)); | |
| 137 EXPECT_TRUE(views::BubbleBorder::is_arrow_on_top(arrow_location)); | |
| 138 EXPECT_FALSE(views::BubbleBorder::is_arrow_on_left(arrow_location)); | |
| 139 EXPECT_LT(window_bounds.x(), 900 + 50 - 500); | |
| 140 EXPECT_GT(window_bounds.y(), 100 + 50 - 10); // -10 to roughly compensate for | |
| 141 // arrow overlap. | |
| 142 | |
| 143 // Test bubble not fitting on bottom and right. | |
| 144 border_contents.SizeAndGetBounds( | |
| 145 gfx::Rect(900, 900, 50, 50), // |position_relative_to| | |
| 146 views::BubbleBorder::TOP_LEFT, | |
| 147 false, // |allow_bubble_offscreen| | |
| 148 gfx::Size(500, 500), // |contents_size| | |
| 149 &contents_bounds, &window_bounds); | |
| 150 arrow_location = border_contents.bubble_border()->arrow_location(); | |
| 151 // The arrow should have changed to BOTTOM_RIGHT. | |
| 152 EXPECT_TRUE(views::BubbleBorder::has_arrow(arrow_location)); | |
| 153 EXPECT_FALSE(views::BubbleBorder::is_arrow_on_top(arrow_location)); | |
| 154 EXPECT_FALSE(views::BubbleBorder::is_arrow_on_left(arrow_location)); | |
| 155 EXPECT_LT(window_bounds.x(), 900 + 50 - 500); | |
| 156 EXPECT_LT(window_bounds.y(), 900 - 500 - 15); // -15 to roughly compensate | |
| 157 // for arrow height. | |
| 158 | |
| 159 // Test bubble not fitting at the bottom. | |
| 160 border_contents.SizeAndGetBounds( | |
| 161 gfx::Rect(100, 900, 50, 50), // |position_relative_to| | |
| 162 views::BubbleBorder::TOP_LEFT, | |
| 163 false, // |allow_bubble_offscreen| | |
| 164 gfx::Size(500, 500), // |contents_size| | |
| 165 &contents_bounds, &window_bounds); | |
| 166 arrow_location = border_contents.bubble_border()->arrow_location(); | |
| 167 // The arrow should have changed to BOTTOM_LEFT. | |
| 168 EXPECT_TRUE(views::BubbleBorder::has_arrow(arrow_location)); | |
| 169 EXPECT_FALSE(views::BubbleBorder::is_arrow_on_top(arrow_location)); | |
| 170 EXPECT_TRUE(views::BubbleBorder::is_arrow_on_left(arrow_location)); | |
| 171 // The window should be right aligned with the position_relative_to. | |
| 172 EXPECT_LT(window_bounds.x(), 900 + 50 - 500); | |
| 173 EXPECT_LT(window_bounds.y(), 900 - 500 - 15); // -15 to roughly compensate | |
| 174 // for arrow height. | |
| 175 | |
| 176 // Test bubble not fitting at the bottom and left. | |
| 177 border_contents.SizeAndGetBounds( | |
| 178 gfx::Rect(100, 900, 50, 50), // |position_relative_to| | |
| 179 views::BubbleBorder::TOP_RIGHT, | |
| 180 false, // |allow_bubble_offscreen| | |
| 181 gfx::Size(500, 500), // |contents_size| | |
| 182 &contents_bounds, &window_bounds); | |
| 183 arrow_location = border_contents.bubble_border()->arrow_location(); | |
| 184 // The arrow should have changed to BOTTOM_LEFT. | |
| 185 EXPECT_TRUE(views::BubbleBorder::has_arrow(arrow_location)); | |
| 186 EXPECT_FALSE(views::BubbleBorder::is_arrow_on_top(arrow_location)); | |
| 187 EXPECT_TRUE(views::BubbleBorder::is_arrow_on_left(arrow_location)); | |
| 188 // The window should be right aligned with the position_relative_to. | |
| 189 EXPECT_LT(window_bounds.x(), 900 + 50 - 500); | |
| 190 EXPECT_LT(window_bounds.y(), 900 - 500 - 15); // -15 to roughly compensate | |
| 191 // for arrow height. | |
| 192 } | |
| 193 | |
| 194 // Tests that the arrow is not moved when the info-bubble does not fit the | |
| 195 // screen but moving it would make matter worse. | |
| 196 TEST_F(BorderContentsTest, BorderContentsSizeAndGetBoundsDontMoveArrow) { | |
| 197 TestBorderContents border_contents; | |
| 198 border_contents.Init(); | |
| 199 gfx::Rect contents_bounds; | |
| 200 gfx::Rect window_bounds; | |
| 201 border_contents.set_monitor_bounds(gfx::Rect(0, 0, 1000, 1000)); | |
| 202 border_contents.SizeAndGetBounds( | |
| 203 gfx::Rect(400, 100, 50, 50), // |position_relative_to| | |
| 204 views::BubbleBorder::TOP_LEFT, | |
| 205 false, // |allow_bubble_offscreen| | |
| 206 gfx::Size(500, 700), // |contents_size| | |
| 207 &contents_bounds, &window_bounds); | |
| 208 | |
| 209 // The arrow should not have changed, as it would make it the bubble even more | |
| 210 // offscreen. | |
| 211 views::BubbleBorder::ArrowLocation arrow_location = | |
| 212 border_contents.bubble_border()->arrow_location(); | |
| 213 EXPECT_TRUE(views::BubbleBorder::has_arrow(arrow_location)); | |
| 214 EXPECT_TRUE(views::BubbleBorder::is_arrow_on_top(arrow_location)); | |
| 215 EXPECT_TRUE(views::BubbleBorder::is_arrow_on_left(arrow_location)); | |
| 216 } | |
| 217 | |
| 218 // Test that the 'allow offscreen' prevents the bubble from moving. | |
| 219 TEST_F(BorderContentsTest, BorderContentsSizeAndGetBoundsAllowOffscreen) { | |
| 220 TestBorderContents border_contents; | |
| 221 border_contents.Init(); | |
| 222 gfx::Rect contents_bounds; | |
| 223 gfx::Rect window_bounds; | |
| 224 border_contents.set_monitor_bounds(gfx::Rect(0, 0, 1000, 1000)); | |
| 225 border_contents.SizeAndGetBounds( | |
| 226 gfx::Rect(100, 900, 50, 50), // |position_relative_to| | |
| 227 views::BubbleBorder::TOP_RIGHT, | |
| 228 true, // |allow_bubble_offscreen| | |
| 229 gfx::Size(500, 500), // |contents_size| | |
| 230 &contents_bounds, &window_bounds); | |
| 231 | |
| 232 // The arrow should not have changed (eventhough the bubble does not fit). | |
| 233 views::BubbleBorder::ArrowLocation arrow_location = | |
| 234 border_contents.bubble_border()->arrow_location(); | |
| 235 EXPECT_TRUE(views::BubbleBorder::has_arrow(arrow_location)); | |
| 236 EXPECT_TRUE(views::BubbleBorder::is_arrow_on_top(arrow_location)); | |
| 237 EXPECT_FALSE(views::BubbleBorder::is_arrow_on_left(arrow_location)); | |
| 238 // The coordinates should be pointing to 'positive relative to' from | |
| 239 // TOP_RIGHT. | |
| 240 EXPECT_LT(window_bounds.x(), 100 + 50 - 500); | |
| 241 EXPECT_GT(window_bounds.y(), 900 + 50 - 10); // -10 to roughly compensate for | |
| 242 // arrow overlap. | |
| 243 } | |
| OLD | NEW |