Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/views/tabs/tab.h" | 5 #include "chrome/browser/ui/views/tabs/tab.h" |
| 6 | 6 |
| 7 #include "base/i18n/rtl.h" | |
| 7 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
| 9 #include "chrome/browser/ui/views/tabs/media_indicator_button.h" | |
| 8 #include "chrome/browser/ui/views/tabs/tab_controller.h" | 10 #include "chrome/browser/ui/views/tabs/tab_controller.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
| 10 #include "ui/base/models/list_selection_model.h" | 12 #include "ui/base/models/list_selection_model.h" |
| 11 #include "ui/views/controls/button/image_button.h" | 13 #include "ui/views/controls/button/image_button.h" |
| 12 #include "ui/views/controls/label.h" | 14 #include "ui/views/controls/label.h" |
| 13 #include "ui/views/test/views_test_base.h" | 15 #include "ui/views/test/views_test_base.h" |
| 14 #include "ui/views/widget/widget.h" | 16 #include "ui/views/widget/widget.h" |
| 15 | 17 |
| 16 using views::Widget; | 18 using views::Widget; |
| 17 | 19 |
| 18 class FakeTabController : public TabController { | 20 class FakeTabController : public TabController { |
| 19 public: | 21 public: |
| 20 FakeTabController() : immersive_style_(false), active_tab_(false) { | 22 FakeTabController() : immersive_style_(false), active_tab_(false) { |
| 21 } | 23 } |
| 22 virtual ~FakeTabController() {} | 24 virtual ~FakeTabController() {} |
| 23 | 25 |
| 24 void set_immersive_style(bool value) { immersive_style_ = value; } | 26 void set_immersive_style(bool value) { immersive_style_ = value; } |
| 25 void set_active_tab(bool value) { active_tab_ = value; } | 27 void set_active_tab(bool value) { active_tab_ = value; } |
| 26 | 28 |
| 27 virtual const ui::ListSelectionModel& GetSelectionModel() OVERRIDE { | 29 virtual const ui::ListSelectionModel& GetSelectionModel() OVERRIDE { |
| 28 return selection_model_; | 30 return selection_model_; |
| 29 } | 31 } |
| 30 virtual bool SupportsMultipleSelection() OVERRIDE { return false; } | 32 virtual bool SupportsMultipleSelection() OVERRIDE { return false; } |
| 31 virtual void SelectTab(Tab* tab) OVERRIDE {} | 33 virtual void SelectTab(Tab* tab) OVERRIDE {} |
| 32 virtual void ExtendSelectionTo(Tab* tab) OVERRIDE {} | 34 virtual void ExtendSelectionTo(Tab* tab) OVERRIDE {} |
| 33 virtual void ToggleSelected(Tab* tab) OVERRIDE {} | 35 virtual void ToggleSelected(Tab* tab) OVERRIDE {} |
| 34 virtual void AddSelectionFromAnchorTo(Tab* tab) OVERRIDE {} | 36 virtual void AddSelectionFromAnchorTo(Tab* tab) OVERRIDE {} |
| 35 virtual void CloseTab(Tab* tab, CloseTabSource source) OVERRIDE {} | 37 virtual void CloseTab(Tab* tab, CloseTabSource source) OVERRIDE {} |
| 38 virtual void ToggleTabAudioMute(Tab* tab) OVERRIDE {} | |
| 36 virtual void ShowContextMenuForTab(Tab* tab, | 39 virtual void ShowContextMenuForTab(Tab* tab, |
| 37 const gfx::Point& p, | 40 const gfx::Point& p, |
| 38 ui::MenuSourceType source_type) OVERRIDE {} | 41 ui::MenuSourceType source_type) OVERRIDE {} |
| 39 virtual bool IsActiveTab(const Tab* tab) const OVERRIDE { | 42 virtual bool IsActiveTab(const Tab* tab) const OVERRIDE { |
| 40 return active_tab_; | 43 return active_tab_; |
| 41 } | 44 } |
| 42 virtual bool IsTabSelected(const Tab* tab) const OVERRIDE { | 45 virtual bool IsTabSelected(const Tab* tab) const OVERRIDE { |
| 43 return false; | 46 return false; |
| 44 } | 47 } |
| 45 virtual bool IsTabPinned(const Tab* tab) const OVERRIDE { return false; } | 48 virtual bool IsTabPinned(const Tab* tab) const OVERRIDE { return false; } |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 64 ui::AXViewState* state) OVERRIDE{}; | 67 ui::AXViewState* state) OVERRIDE{}; |
| 65 | 68 |
| 66 private: | 69 private: |
| 67 ui::ListSelectionModel selection_model_; | 70 ui::ListSelectionModel selection_model_; |
| 68 bool immersive_style_; | 71 bool immersive_style_; |
| 69 bool active_tab_; | 72 bool active_tab_; |
| 70 | 73 |
| 71 DISALLOW_COPY_AND_ASSIGN(FakeTabController); | 74 DISALLOW_COPY_AND_ASSIGN(FakeTabController); |
| 72 }; | 75 }; |
| 73 | 76 |
| 74 class TabTest : public views::ViewsTestBase { | 77 class TabTest : public views::ViewsTestBase, |
| 78 public ::testing::WithParamInterface<bool> { | |
| 75 public: | 79 public: |
| 76 TabTest() {} | 80 TabTest() {} |
| 77 virtual ~TabTest() {} | 81 virtual ~TabTest() {} |
| 78 | 82 |
| 79 static void DisableMediaIndicatorAnimation(Tab* tab) { | 83 bool testing_for_rtl_locale() const { return GetParam(); } |
| 80 tab->media_indicator_animation_.reset(); | 84 |
| 81 tab->animating_media_state_ = tab->data_.media_state; | 85 virtual void SetUp() OVERRIDE { |
| 86 if (testing_for_rtl_locale()) { | |
| 87 original_locale_ = base::i18n::GetConfiguredLocale(); | |
| 88 base::i18n::SetICUDefaultLocale("he"); | |
| 89 } | |
| 90 views::ViewsTestBase::SetUp(); | |
| 91 } | |
| 92 | |
| 93 virtual void TearDown() OVERRIDE { | |
| 94 views::ViewsTestBase::TearDown(); | |
| 95 if (testing_for_rtl_locale()) { | |
|
sky
2014/09/25 19:25:05
nit: no {}
miu
2014/09/25 22:49:36
Done.
| |
| 96 base::i18n::SetICUDefaultLocale(original_locale_); | |
| 97 } | |
| 98 } | |
| 99 | |
| 100 bool ShouldSkipRTLTestOnUnsupportedPlatform() const { | |
| 101 if (!testing_for_rtl_locale()) { | |
| 102 EXPECT_FALSE(base::i18n::IsRTL()); | |
| 103 return false; | |
|
sky
2014/09/25 19:25:05
I don't get what you're trying to do here. If not
miu
2014/09/25 22:49:36
I thought of a cleaner way to do this to make it m
| |
| 104 } | |
| 105 return !base::i18n::IsRTL(); | |
| 82 } | 106 } |
| 83 | 107 |
| 84 static void CheckForExpectedLayoutAndVisibilityOfElements(const Tab& tab) { | 108 static void CheckForExpectedLayoutAndVisibilityOfElements(const Tab& tab) { |
| 85 // Check whether elements are visible when they are supposed to be, given | 109 // Check whether elements are visible when they are supposed to be, given |
| 86 // Tab size and TabRendererData state. | 110 // Tab size and TabRendererData state. |
| 87 if (tab.data_.mini) { | 111 if (tab.data_.mini) { |
| 88 EXPECT_EQ(1, tab.IconCapacity()); | 112 EXPECT_EQ(1, tab.IconCapacity()); |
| 89 if (tab.data_.media_state != TAB_MEDIA_STATE_NONE) { | 113 if (tab.data_.media_state != TAB_MEDIA_STATE_NONE) { |
| 90 EXPECT_FALSE(tab.ShouldShowIcon()); | 114 EXPECT_FALSE(tab.ShouldShowIcon()); |
| 91 EXPECT_TRUE(tab.ShouldShowMediaIndicator()); | 115 EXPECT_TRUE(tab.ShouldShowMediaIndicator()); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 152 // are fully within the contents bounds. | 176 // are fully within the contents bounds. |
| 153 const gfx::Rect contents_bounds = tab.GetContentsBounds(); | 177 const gfx::Rect contents_bounds = tab.GetContentsBounds(); |
| 154 if (tab.ShouldShowIcon()) { | 178 if (tab.ShouldShowIcon()) { |
| 155 EXPECT_LE(contents_bounds.x(), tab.favicon_bounds_.x()); | 179 EXPECT_LE(contents_bounds.x(), tab.favicon_bounds_.x()); |
| 156 if (tab.title_->width() > 0) | 180 if (tab.title_->width() > 0) |
| 157 EXPECT_LE(tab.favicon_bounds_.right(), tab.title_->x()); | 181 EXPECT_LE(tab.favicon_bounds_.right(), tab.title_->x()); |
| 158 EXPECT_LE(contents_bounds.y(), tab.favicon_bounds_.y()); | 182 EXPECT_LE(contents_bounds.y(), tab.favicon_bounds_.y()); |
| 159 EXPECT_LE(tab.favicon_bounds_.bottom(), contents_bounds.bottom()); | 183 EXPECT_LE(tab.favicon_bounds_.bottom(), contents_bounds.bottom()); |
| 160 } | 184 } |
| 161 if (tab.ShouldShowIcon() && tab.ShouldShowMediaIndicator()) | 185 if (tab.ShouldShowIcon() && tab.ShouldShowMediaIndicator()) |
| 162 EXPECT_LE(tab.favicon_bounds_.right(), tab.media_indicator_bounds_.x()); | 186 EXPECT_LE(tab.favicon_bounds_.right(), GetMediaIndicatorBounds(tab).x()); |
| 163 if (tab.ShouldShowMediaIndicator()) { | 187 if (tab.ShouldShowMediaIndicator()) { |
| 164 if (tab.title_->width() > 0) { | 188 if (tab.title_->width() > 0) { |
| 165 EXPECT_LE(tab.title_->bounds().right(), | 189 EXPECT_LE(tab.title_->bounds().right(), |
| 166 tab.media_indicator_bounds_.x()); | 190 GetMediaIndicatorBounds(tab).x()); |
| 167 } | 191 } |
| 168 EXPECT_LE(tab.media_indicator_bounds_.right(), contents_bounds.right()); | 192 EXPECT_LE(GetMediaIndicatorBounds(tab).right(), contents_bounds.right()); |
| 169 EXPECT_LE(contents_bounds.y(), tab.media_indicator_bounds_.y()); | 193 EXPECT_LE(contents_bounds.y(), GetMediaIndicatorBounds(tab).y()); |
| 170 EXPECT_LE(tab.media_indicator_bounds_.bottom(), contents_bounds.bottom()); | 194 EXPECT_LE(GetMediaIndicatorBounds(tab).bottom(), |
| 195 contents_bounds.bottom()); | |
| 171 } | 196 } |
| 172 if (tab.ShouldShowMediaIndicator() && tab.ShouldShowCloseBox()) { | 197 if (tab.ShouldShowMediaIndicator() && tab.ShouldShowCloseBox()) { |
| 173 // Note: The media indicator can overlap the left-insets of the close box, | 198 // Note: The media indicator can overlap the left-insets of the close box, |
| 174 // but should otherwise be to the left of the close button. | 199 // but should otherwise be to the left of the close button. |
| 175 EXPECT_LE(tab.media_indicator_bounds_.right(), | 200 EXPECT_LE(GetMediaIndicatorBounds(tab).right(), |
| 176 tab.close_button_->bounds().x() + | 201 tab.close_button_->bounds().x() + |
| 177 tab.close_button_->GetInsets().left()); | 202 tab.close_button_->GetInsets().left()); |
| 178 } | 203 } |
| 179 if (tab.ShouldShowCloseBox()) { | 204 if (tab.ShouldShowCloseBox()) { |
| 180 // Note: The title bounds can overlap the left-insets of the close box, | 205 // Note: The title bounds can overlap the left-insets of the close box, |
| 181 // but should otherwise be to the left of the close button. | 206 // but should otherwise be to the left of the close button. |
| 182 if (tab.title_->width() > 0) { | 207 if (tab.title_->width() > 0) { |
| 183 EXPECT_LE(tab.title_->bounds().right(), | 208 EXPECT_LE(tab.title_->bounds().right(), |
| 184 tab.close_button_->bounds().x() + | 209 tab.close_button_->bounds().x() + |
| 185 tab.close_button_->GetInsets().left()); | 210 tab.close_button_->GetInsets().left()); |
| 186 } | 211 } |
| 187 EXPECT_LE(tab.close_button_->bounds().right(), contents_bounds.right()); | 212 EXPECT_LE(tab.close_button_->bounds().right(), contents_bounds.right()); |
| 188 EXPECT_LE(contents_bounds.y(), tab.close_button_->bounds().y()); | 213 EXPECT_LE(contents_bounds.y(), tab.close_button_->bounds().y()); |
| 189 EXPECT_LE(tab.close_button_->bounds().bottom(), contents_bounds.bottom()); | 214 EXPECT_LE(tab.close_button_->bounds().bottom(), contents_bounds.bottom()); |
| 190 } | 215 } |
| 191 } | 216 } |
| 217 | |
| 218 private: | |
| 219 static gfx::Rect GetMediaIndicatorBounds(const Tab& tab) { | |
| 220 if (!tab.media_indicator_button_) { | |
| 221 ADD_FAILURE(); | |
| 222 return gfx::Rect(); | |
| 223 } | |
| 224 return tab.media_indicator_button_->bounds(); | |
| 225 } | |
| 226 | |
| 227 std::string original_locale_; | |
| 192 }; | 228 }; |
| 193 | 229 |
| 194 TEST_F(TabTest, HitTestTopPixel) { | 230 TEST_P(TabTest, HitTestTopPixel) { |
| 231 if (ShouldSkipRTLTestOnUnsupportedPlatform()) { | |
| 232 LOG(WARNING) << "Testing of RTL locale not supported on current platform."; | |
| 233 return; | |
| 234 } | |
| 235 | |
| 195 Widget widget; | 236 Widget widget; |
| 196 Widget::InitParams params(CreateParams(Widget::InitParams::TYPE_WINDOW)); | 237 Widget::InitParams params(CreateParams(Widget::InitParams::TYPE_WINDOW)); |
| 197 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 238 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
| 198 params.bounds.SetRect(10, 20, 300, 400); | 239 params.bounds.SetRect(10, 20, 300, 400); |
| 199 widget.Init(params); | 240 widget.Init(params); |
| 200 | 241 |
| 201 FakeTabController tab_controller; | 242 FakeTabController tab_controller; |
| 202 Tab tab(&tab_controller); | 243 Tab tab(&tab_controller); |
| 203 widget.GetContentsView()->AddChildView(&tab); | 244 widget.GetContentsView()->AddChildView(&tab); |
| 204 tab.SetBoundsRect(gfx::Rect(gfx::Point(0, 0), Tab::GetStandardSize())); | 245 tab.SetBoundsRect(gfx::Rect(gfx::Point(0, 0), Tab::GetStandardSize())); |
| 205 | 246 |
| 206 // Tabs have some shadow in the top, so by default we don't hit the tab there. | 247 // Tabs have some shadow in the top, so by default we don't hit the tab there. |
| 207 int middle_x = tab.width() / 2; | 248 int middle_x = tab.width() / 2; |
| 208 EXPECT_FALSE(tab.HitTestPoint(gfx::Point(middle_x, 0))); | 249 EXPECT_FALSE(tab.HitTestPoint(gfx::Point(middle_x, 0))); |
| 209 | 250 |
| 210 // Tabs are slanted, so a click halfway down the left edge won't hit it. | 251 // Tabs are slanted, so a click halfway down the left edge won't hit it. |
| 211 int middle_y = tab.height() / 2; | 252 int middle_y = tab.height() / 2; |
| 212 EXPECT_FALSE(tab.HitTestPoint(gfx::Point(0, middle_y))); | 253 EXPECT_FALSE(tab.HitTestPoint(gfx::Point(0, middle_y))); |
| 213 | 254 |
| 214 // If the window is maximized, however, we want clicks in the top edge to | 255 // If the window is maximized, however, we want clicks in the top edge to |
| 215 // select the tab. | 256 // select the tab. |
| 216 widget.Maximize(); | 257 widget.Maximize(); |
| 217 EXPECT_TRUE(tab.HitTestPoint(gfx::Point(middle_x, 0))); | 258 EXPECT_TRUE(tab.HitTestPoint(gfx::Point(middle_x, 0))); |
| 218 | 259 |
| 219 // But clicks in the area above the slanted sides should still miss. | 260 // But clicks in the area above the slanted sides should still miss. |
| 220 EXPECT_FALSE(tab.HitTestPoint(gfx::Point(0, 0))); | 261 EXPECT_FALSE(tab.HitTestPoint(gfx::Point(0, 0))); |
| 221 EXPECT_FALSE(tab.HitTestPoint(gfx::Point(tab.width() - 1, 0))); | 262 EXPECT_FALSE(tab.HitTestPoint(gfx::Point(tab.width() - 1, 0))); |
| 222 } | 263 } |
| 223 | 264 |
| 224 TEST_F(TabTest, LayoutAndVisibilityOfElements) { | 265 TEST_P(TabTest, LayoutAndVisibilityOfElements) { |
| 266 if (ShouldSkipRTLTestOnUnsupportedPlatform()) { | |
| 267 LOG(WARNING) << "Testing of RTL locale not supported on current platform."; | |
| 268 return; | |
| 269 } | |
| 270 | |
| 225 static const TabMediaState kMediaStatesToTest[] = { | 271 static const TabMediaState kMediaStatesToTest[] = { |
| 226 TAB_MEDIA_STATE_NONE, TAB_MEDIA_STATE_CAPTURING, | 272 TAB_MEDIA_STATE_NONE, TAB_MEDIA_STATE_CAPTURING, |
| 227 TAB_MEDIA_STATE_AUDIO_PLAYING | 273 TAB_MEDIA_STATE_AUDIO_PLAYING, TAB_MEDIA_STATE_AUDIO_MUTING |
| 228 }; | 274 }; |
| 229 | 275 |
| 230 FakeTabController controller; | 276 FakeTabController controller; |
| 231 Tab tab(&controller); | 277 Tab tab(&controller); |
| 232 | 278 |
| 233 SkBitmap bitmap; | 279 SkBitmap bitmap; |
| 234 bitmap.allocN32Pixels(16, 16); | 280 bitmap.allocN32Pixels(16, 16); |
| 235 TabRendererData data; | 281 TabRendererData data; |
| 236 data.favicon = gfx::ImageSkia::CreateFrom1xBitmap(bitmap); | 282 data.favicon = gfx::ImageSkia::CreateFrom1xBitmap(bitmap); |
| 237 | 283 |
| 238 // Perform layout over all possible combinations, checking for correct | 284 // Perform layout over all possible combinations, checking for correct |
| 239 // results. | 285 // results. |
| 240 for (int is_mini_tab = 0; is_mini_tab < 2; ++is_mini_tab) { | 286 for (int is_mini_tab = 0; is_mini_tab < 2; ++is_mini_tab) { |
| 241 for (int is_active_tab = 0; is_active_tab < 2; ++is_active_tab) { | 287 for (int is_active_tab = 0; is_active_tab < 2; ++is_active_tab) { |
| 242 for (size_t media_state_index = 0; | 288 for (size_t media_state_index = 0; |
| 243 media_state_index < arraysize(kMediaStatesToTest); | 289 media_state_index < arraysize(kMediaStatesToTest); |
| 244 ++media_state_index) { | 290 ++media_state_index) { |
| 245 const TabMediaState media_state = kMediaStatesToTest[media_state_index]; | 291 const TabMediaState media_state = kMediaStatesToTest[media_state_index]; |
| 246 SCOPED_TRACE(::testing::Message() | 292 SCOPED_TRACE(::testing::Message() |
| 247 << (is_active_tab ? "Active" : "Inactive") << ' ' | 293 << (is_active_tab ? "Active" : "Inactive") << ' ' |
| 248 << (is_mini_tab ? "Mini " : "") | 294 << (is_mini_tab ? "Mini " : "") |
| 249 << "Tab with media indicator state " << media_state); | 295 << "Tab with media indicator state " << media_state); |
| 250 | 296 |
| 251 data.mini = !!is_mini_tab; | 297 data.mini = !!is_mini_tab; |
| 252 controller.set_active_tab(!!is_active_tab); | 298 controller.set_active_tab(!!is_active_tab); |
| 253 data.media_state = media_state; | 299 data.media_state = media_state; |
| 254 tab.SetData(data); | 300 tab.SetData(data); |
| 255 | 301 |
| 256 // Disable the media indicator animation so that the layout/visibility | |
| 257 // logic can be tested effectively. If the animation was left enabled, | |
| 258 // the ShouldShowMediaIndicator() method would return true during | |
| 259 // fade-out transitions. | |
| 260 DisableMediaIndicatorAnimation(&tab); | |
| 261 | |
| 262 // Test layout for every width from standard to minimum. | 302 // Test layout for every width from standard to minimum. |
| 263 gfx::Rect bounds(gfx::Point(0, 0), Tab::GetStandardSize()); | 303 gfx::Rect bounds(gfx::Point(0, 0), Tab::GetStandardSize()); |
| 264 int min_width; | 304 int min_width; |
| 265 if (is_mini_tab) { | 305 if (is_mini_tab) { |
| 266 bounds.set_width(Tab::GetMiniWidth()); | 306 bounds.set_width(Tab::GetMiniWidth()); |
| 267 min_width = Tab::GetMiniWidth(); | 307 min_width = Tab::GetMiniWidth(); |
| 268 } else { | 308 } else { |
| 269 min_width = is_active_tab ? Tab::GetMinimumSelectedSize().width() : | 309 min_width = is_active_tab ? Tab::GetMinimumSelectedSize().width() : |
| 270 Tab::GetMinimumUnselectedSize().width(); | 310 Tab::GetMinimumUnselectedSize().width(); |
| 271 } | 311 } |
| 272 while (bounds.width() >= min_width) { | 312 while (bounds.width() >= min_width) { |
| 273 SCOPED_TRACE(::testing::Message() << "bounds=" << bounds.ToString()); | 313 SCOPED_TRACE(::testing::Message() << "bounds=" << bounds.ToString()); |
| 274 tab.SetBoundsRect(bounds); // Invokes Tab::Layout(). | 314 tab.SetBoundsRect(bounds); // Invokes Tab::Layout(). |
| 275 CheckForExpectedLayoutAndVisibilityOfElements(tab); | 315 CheckForExpectedLayoutAndVisibilityOfElements(tab); |
| 276 bounds.set_width(bounds.width() - 1); | 316 bounds.set_width(bounds.width() - 1); |
| 277 } | 317 } |
| 278 } | 318 } |
| 279 } | 319 } |
| 280 } | 320 } |
| 281 } | 321 } |
| 282 | 322 |
| 283 // Regression test for http://crbug.com/226253. Calling Layout() more than once | 323 // Regression test for http://crbug.com/226253. Calling Layout() more than once |
| 284 // shouldn't change the insets of the close button. | 324 // shouldn't change the insets of the close button. |
| 285 TEST_F(TabTest, CloseButtonLayout) { | 325 TEST_P(TabTest, CloseButtonLayout) { |
| 326 if (ShouldSkipRTLTestOnUnsupportedPlatform()) { | |
| 327 LOG(WARNING) << "Testing of RTL locale not supported on current platform."; | |
| 328 return; | |
| 329 } | |
| 330 | |
| 286 FakeTabController tab_controller; | 331 FakeTabController tab_controller; |
| 287 Tab tab(&tab_controller); | 332 Tab tab(&tab_controller); |
| 288 tab.SetBounds(0, 0, 100, 50); | 333 tab.SetBounds(0, 0, 100, 50); |
| 289 tab.Layout(); | 334 tab.Layout(); |
| 290 gfx::Insets close_button_insets = tab.close_button_->GetInsets(); | 335 gfx::Insets close_button_insets = tab.close_button_->GetInsets(); |
| 291 tab.Layout(); | 336 tab.Layout(); |
| 292 gfx::Insets close_button_insets_2 = tab.close_button_->GetInsets(); | 337 gfx::Insets close_button_insets_2 = tab.close_button_->GetInsets(); |
| 293 EXPECT_EQ(close_button_insets.top(), close_button_insets_2.top()); | 338 EXPECT_EQ(close_button_insets.top(), close_button_insets_2.top()); |
| 294 EXPECT_EQ(close_button_insets.left(), close_button_insets_2.left()); | 339 EXPECT_EQ(close_button_insets.left(), close_button_insets_2.left()); |
| 295 EXPECT_EQ(close_button_insets.bottom(), close_button_insets_2.bottom()); | 340 EXPECT_EQ(close_button_insets.bottom(), close_button_insets_2.bottom()); |
| 296 EXPECT_EQ(close_button_insets.right(), close_button_insets_2.right()); | 341 EXPECT_EQ(close_button_insets.right(), close_button_insets_2.right()); |
| 297 | 342 |
| 298 // Also make sure the close button is sized as large as the tab. | 343 // Also make sure the close button is sized as large as the tab. |
| 299 EXPECT_EQ(50, tab.close_button_->bounds().height()); | 344 EXPECT_EQ(50, tab.close_button_->bounds().height()); |
| 300 } | 345 } |
| 346 | |
| 347 // Test in both a LTR and a RTL locale. Note: The fact that the UI code is | |
| 348 // configured for an RTL locale does *not* change how the coordinates are | |
| 349 // examined in the tests above because views::View and friends are supposed to | |
| 350 // auto-mirror the widgets when painting. Thus, what we're testing here is that | |
| 351 // there's no code in Tab that will erroneously subvert this automatic | |
| 352 // coordinate translation. http://crbug.com/384179 | |
| 353 INSTANTIATE_TEST_CASE_P(, TabTest, ::testing::Values(false, true)); | |
| OLD | NEW |