| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include "base/macros.h" | 9 #include "base/macros.h" |
| 10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
| 11 #include "chrome/browser/ui/layout_constants.h" | 11 #include "chrome/browser/ui/layout_constants.h" |
| 12 #include "chrome/browser/ui/tabs/tab_utils.h" | 12 #include "chrome/browser/ui/tabs/tab_utils.h" |
| 13 #include "chrome/browser/ui/views/tabs/media_indicator_button.h" | 13 #include "chrome/browser/ui/views/tabs/alert_indicator_button.h" |
| 14 #include "chrome/browser/ui/views/tabs/tab_controller.h" | 14 #include "chrome/browser/ui/views/tabs/tab_controller.h" |
| 15 #include "grit/theme_resources.h" | 15 #include "grit/theme_resources.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 #include "ui/base/models/list_selection_model.h" | 17 #include "ui/base/models/list_selection_model.h" |
| 18 #include "ui/views/controls/button/image_button.h" | 18 #include "ui/views/controls/button/image_button.h" |
| 19 #include "ui/views/controls/label.h" | 19 #include "ui/views/controls/label.h" |
| 20 #include "ui/views/test/views_test_base.h" | 20 #include "ui/views/test/views_test_base.h" |
| 21 #include "ui/views/widget/widget.h" | 21 #include "ui/views/widget/widget.h" |
| 22 | 22 |
| 23 using views::Widget; | 23 using views::Widget; |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 return tab.title_->bounds().width(); | 109 return tab.title_->bounds().width(); |
| 110 } | 110 } |
| 111 | 111 |
| 112 static void LayoutTab(Tab* tab) { tab->Layout(); } | 112 static void LayoutTab(Tab* tab) { tab->Layout(); } |
| 113 | 113 |
| 114 static void CheckForExpectedLayoutAndVisibilityOfElements(const Tab& tab) { | 114 static void CheckForExpectedLayoutAndVisibilityOfElements(const Tab& tab) { |
| 115 // Check whether elements are visible when they are supposed to be, given | 115 // Check whether elements are visible when they are supposed to be, given |
| 116 // Tab size and TabRendererData state. | 116 // Tab size and TabRendererData state. |
| 117 if (tab.data_.pinned) { | 117 if (tab.data_.pinned) { |
| 118 EXPECT_EQ(1, tab.IconCapacity()); | 118 EXPECT_EQ(1, tab.IconCapacity()); |
| 119 if (tab.data_.media_state != TAB_MEDIA_STATE_NONE) { | 119 if (tab.data_.alert_state != TabAlertState::NONE) { |
| 120 EXPECT_FALSE(tab.ShouldShowIcon()); | 120 EXPECT_FALSE(tab.ShouldShowIcon()); |
| 121 EXPECT_TRUE(tab.ShouldShowMediaIndicator()); | 121 EXPECT_TRUE(tab.ShouldShowAlertIndicator()); |
| 122 } else { | 122 } else { |
| 123 EXPECT_TRUE(tab.ShouldShowIcon()); | 123 EXPECT_TRUE(tab.ShouldShowIcon()); |
| 124 EXPECT_FALSE(tab.ShouldShowMediaIndicator()); | 124 EXPECT_FALSE(tab.ShouldShowAlertIndicator()); |
| 125 } | 125 } |
| 126 EXPECT_FALSE(tab.ShouldShowCloseBox()); | 126 EXPECT_FALSE(tab.ShouldShowCloseBox()); |
| 127 } else if (tab.IsActive()) { | 127 } else if (tab.IsActive()) { |
| 128 EXPECT_TRUE(tab.ShouldShowCloseBox()); | 128 EXPECT_TRUE(tab.ShouldShowCloseBox()); |
| 129 switch (tab.IconCapacity()) { | 129 switch (tab.IconCapacity()) { |
| 130 case 0: | 130 case 0: |
| 131 case 1: | 131 case 1: |
| 132 EXPECT_FALSE(tab.ShouldShowIcon()); | 132 EXPECT_FALSE(tab.ShouldShowIcon()); |
| 133 EXPECT_FALSE(tab.ShouldShowMediaIndicator()); | 133 EXPECT_FALSE(tab.ShouldShowAlertIndicator()); |
| 134 break; | 134 break; |
| 135 case 2: | 135 case 2: |
| 136 if (tab.data_.media_state != TAB_MEDIA_STATE_NONE) { | 136 if (tab.data_.alert_state != TabAlertState::NONE) { |
| 137 EXPECT_FALSE(tab.ShouldShowIcon()); | 137 EXPECT_FALSE(tab.ShouldShowIcon()); |
| 138 EXPECT_TRUE(tab.ShouldShowMediaIndicator()); | 138 EXPECT_TRUE(tab.ShouldShowAlertIndicator()); |
| 139 } else { | 139 } else { |
| 140 EXPECT_TRUE(tab.ShouldShowIcon()); | 140 EXPECT_TRUE(tab.ShouldShowIcon()); |
| 141 EXPECT_FALSE(tab.ShouldShowMediaIndicator()); | 141 EXPECT_FALSE(tab.ShouldShowAlertIndicator()); |
| 142 } | 142 } |
| 143 break; | 143 break; |
| 144 default: | 144 default: |
| 145 EXPECT_LE(3, tab.IconCapacity()); | 145 EXPECT_LE(3, tab.IconCapacity()); |
| 146 EXPECT_TRUE(tab.ShouldShowIcon()); | 146 EXPECT_TRUE(tab.ShouldShowIcon()); |
| 147 if (tab.data_.media_state != TAB_MEDIA_STATE_NONE) | 147 if (tab.data_.alert_state != TabAlertState::NONE) |
| 148 EXPECT_TRUE(tab.ShouldShowMediaIndicator()); | 148 EXPECT_TRUE(tab.ShouldShowAlertIndicator()); |
| 149 else | 149 else |
| 150 EXPECT_FALSE(tab.ShouldShowMediaIndicator()); | 150 EXPECT_FALSE(tab.ShouldShowAlertIndicator()); |
| 151 break; | 151 break; |
| 152 } | 152 } |
| 153 } else { // Tab not active and not pinned tab. | 153 } else { // Tab not active and not pinned tab. |
| 154 switch (tab.IconCapacity()) { | 154 switch (tab.IconCapacity()) { |
| 155 case 0: | 155 case 0: |
| 156 EXPECT_FALSE(tab.ShouldShowCloseBox()); | 156 EXPECT_FALSE(tab.ShouldShowCloseBox()); |
| 157 EXPECT_FALSE(tab.ShouldShowIcon()); | 157 EXPECT_FALSE(tab.ShouldShowIcon()); |
| 158 EXPECT_FALSE(tab.ShouldShowMediaIndicator()); | 158 EXPECT_FALSE(tab.ShouldShowAlertIndicator()); |
| 159 break; | 159 break; |
| 160 case 1: | 160 case 1: |
| 161 EXPECT_FALSE(tab.ShouldShowCloseBox()); | 161 EXPECT_FALSE(tab.ShouldShowCloseBox()); |
| 162 if (tab.data_.media_state != TAB_MEDIA_STATE_NONE) { | 162 if (tab.data_.alert_state != TabAlertState::NONE) { |
| 163 EXPECT_FALSE(tab.ShouldShowIcon()); | 163 EXPECT_FALSE(tab.ShouldShowIcon()); |
| 164 EXPECT_TRUE(tab.ShouldShowMediaIndicator()); | 164 EXPECT_TRUE(tab.ShouldShowAlertIndicator()); |
| 165 } else { | 165 } else { |
| 166 EXPECT_TRUE(tab.ShouldShowIcon()); | 166 EXPECT_TRUE(tab.ShouldShowIcon()); |
| 167 EXPECT_FALSE(tab.ShouldShowMediaIndicator()); | 167 EXPECT_FALSE(tab.ShouldShowAlertIndicator()); |
| 168 } | 168 } |
| 169 break; | 169 break; |
| 170 default: | 170 default: |
| 171 EXPECT_LE(2, tab.IconCapacity()); | 171 EXPECT_LE(2, tab.IconCapacity()); |
| 172 EXPECT_TRUE(tab.ShouldShowIcon()); | 172 EXPECT_TRUE(tab.ShouldShowIcon()); |
| 173 if (tab.data_.media_state != TAB_MEDIA_STATE_NONE) | 173 if (tab.data_.alert_state != TabAlertState::NONE) |
| 174 EXPECT_TRUE(tab.ShouldShowMediaIndicator()); | 174 EXPECT_TRUE(tab.ShouldShowAlertIndicator()); |
| 175 else | 175 else |
| 176 EXPECT_FALSE(tab.ShouldShowMediaIndicator()); | 176 EXPECT_FALSE(tab.ShouldShowAlertIndicator()); |
| 177 break; | 177 break; |
| 178 } | 178 } |
| 179 } | 179 } |
| 180 | 180 |
| 181 // Check positioning of elements with respect to each other, and that they | 181 // Check positioning of elements with respect to each other, and that they |
| 182 // are fully within the contents bounds. | 182 // are fully within the contents bounds. |
| 183 const gfx::Rect contents_bounds = tab.GetContentsBounds(); | 183 const gfx::Rect contents_bounds = tab.GetContentsBounds(); |
| 184 if (tab.ShouldShowIcon()) { | 184 if (tab.ShouldShowIcon()) { |
| 185 EXPECT_LE(contents_bounds.x(), tab.favicon_bounds_.x()); | 185 EXPECT_LE(contents_bounds.x(), tab.favicon_bounds_.x()); |
| 186 if (tab.title_->width() > 0) | 186 if (tab.title_->width() > 0) |
| 187 EXPECT_LE(tab.favicon_bounds_.right(), tab.title_->x()); | 187 EXPECT_LE(tab.favicon_bounds_.right(), tab.title_->x()); |
| 188 EXPECT_LE(contents_bounds.y(), tab.favicon_bounds_.y()); | 188 EXPECT_LE(contents_bounds.y(), tab.favicon_bounds_.y()); |
| 189 EXPECT_LE(tab.favicon_bounds_.bottom(), contents_bounds.bottom()); | 189 EXPECT_LE(tab.favicon_bounds_.bottom(), contents_bounds.bottom()); |
| 190 } | 190 } |
| 191 if (tab.ShouldShowIcon() && tab.ShouldShowMediaIndicator()) | 191 if (tab.ShouldShowIcon() && tab.ShouldShowAlertIndicator()) |
| 192 EXPECT_LE(tab.favicon_bounds_.right(), GetMediaIndicatorBounds(tab).x()); | 192 EXPECT_LE(tab.favicon_bounds_.right(), GetAlertIndicatorBounds(tab).x()); |
| 193 if (tab.ShouldShowMediaIndicator()) { | 193 if (tab.ShouldShowAlertIndicator()) { |
| 194 if (tab.title_->width() > 0) { | 194 if (tab.title_->width() > 0) { |
| 195 EXPECT_LE(tab.title_->bounds().right(), | 195 EXPECT_LE(tab.title_->bounds().right(), |
| 196 GetMediaIndicatorBounds(tab).x()); | 196 GetAlertIndicatorBounds(tab).x()); |
| 197 } | 197 } |
| 198 EXPECT_LE(GetMediaIndicatorBounds(tab).right(), contents_bounds.right()); | 198 EXPECT_LE(GetAlertIndicatorBounds(tab).right(), contents_bounds.right()); |
| 199 EXPECT_LE(contents_bounds.y(), GetMediaIndicatorBounds(tab).y()); | 199 EXPECT_LE(contents_bounds.y(), GetAlertIndicatorBounds(tab).y()); |
| 200 EXPECT_LE(GetMediaIndicatorBounds(tab).bottom(), | 200 EXPECT_LE(GetAlertIndicatorBounds(tab).bottom(), |
| 201 contents_bounds.bottom()); | 201 contents_bounds.bottom()); |
| 202 } | 202 } |
| 203 if (tab.ShouldShowMediaIndicator() && tab.ShouldShowCloseBox()) { | 203 if (tab.ShouldShowAlertIndicator() && tab.ShouldShowCloseBox()) { |
| 204 // Note: The media indicator can overlap the left-insets of the close box, | 204 // Note: The alert indicator can overlap the left-insets of the close box, |
| 205 // but should otherwise be to the left of the close button. | 205 // but should otherwise be to the left of the close button. |
| 206 EXPECT_LE(GetMediaIndicatorBounds(tab).right(), | 206 EXPECT_LE(GetAlertIndicatorBounds(tab).right(), |
| 207 tab.close_button_->bounds().x() + | 207 tab.close_button_->bounds().x() + |
| 208 tab.close_button_->GetInsets().left()); | 208 tab.close_button_->GetInsets().left()); |
| 209 } | 209 } |
| 210 if (tab.ShouldShowCloseBox()) { | 210 if (tab.ShouldShowCloseBox()) { |
| 211 // Note: The title bounds can overlap the left-insets of the close box, | 211 // Note: The title bounds can overlap the left-insets of the close box, |
| 212 // but should otherwise be to the left of the close button. | 212 // but should otherwise be to the left of the close button. |
| 213 if (tab.title_->width() > 0) { | 213 if (tab.title_->width() > 0) { |
| 214 EXPECT_LE(tab.title_->bounds().right(), | 214 EXPECT_LE(tab.title_->bounds().right(), |
| 215 tab.close_button_->bounds().x() + | 215 tab.close_button_->bounds().x() + |
| 216 tab.close_button_->GetInsets().left()); | 216 tab.close_button_->GetInsets().left()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 229 | 229 |
| 230 protected: | 230 protected: |
| 231 void InitWidget(Widget* widget) { | 231 void InitWidget(Widget* widget) { |
| 232 Widget::InitParams params(CreateParams(Widget::InitParams::TYPE_WINDOW)); | 232 Widget::InitParams params(CreateParams(Widget::InitParams::TYPE_WINDOW)); |
| 233 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 233 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
| 234 params.bounds.SetRect(10, 20, 300, 400); | 234 params.bounds.SetRect(10, 20, 300, 400); |
| 235 widget->Init(params); | 235 widget->Init(params); |
| 236 } | 236 } |
| 237 | 237 |
| 238 private: | 238 private: |
| 239 static gfx::Rect GetMediaIndicatorBounds(const Tab& tab) { | 239 static gfx::Rect GetAlertIndicatorBounds(const Tab& tab) { |
| 240 if (!tab.media_indicator_button_) { | 240 if (!tab.alert_indicator_button_) { |
| 241 ADD_FAILURE(); | 241 ADD_FAILURE(); |
| 242 return gfx::Rect(); | 242 return gfx::Rect(); |
| 243 } | 243 } |
| 244 return tab.media_indicator_button_->bounds(); | 244 return tab.alert_indicator_button_->bounds(); |
| 245 } | 245 } |
| 246 | 246 |
| 247 std::string original_locale_; | 247 std::string original_locale_; |
| 248 }; | 248 }; |
| 249 | 249 |
| 250 TEST_F(TabTest, HitTestTopPixel) { | 250 TEST_F(TabTest, HitTestTopPixel) { |
| 251 Widget widget; | 251 Widget widget; |
| 252 InitWidget(&widget); | 252 InitWidget(&widget); |
| 253 | 253 |
| 254 FakeTabController tab_controller; | 254 FakeTabController tab_controller; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 271 // select the tab. | 271 // select the tab. |
| 272 widget.Maximize(); | 272 widget.Maximize(); |
| 273 EXPECT_TRUE(tab.HitTestPoint(gfx::Point(middle_x, 0))); | 273 EXPECT_TRUE(tab.HitTestPoint(gfx::Point(middle_x, 0))); |
| 274 | 274 |
| 275 // But clicks in the area above the slanted sides should still miss. | 275 // But clicks in the area above the slanted sides should still miss. |
| 276 EXPECT_FALSE(tab.HitTestPoint(gfx::Point(0, 0))); | 276 EXPECT_FALSE(tab.HitTestPoint(gfx::Point(0, 0))); |
| 277 EXPECT_FALSE(tab.HitTestPoint(gfx::Point(tab.width() - 1, 0))); | 277 EXPECT_FALSE(tab.HitTestPoint(gfx::Point(tab.width() - 1, 0))); |
| 278 } | 278 } |
| 279 | 279 |
| 280 TEST_F(TabTest, LayoutAndVisibilityOfElements) { | 280 TEST_F(TabTest, LayoutAndVisibilityOfElements) { |
| 281 static const TabMediaState kMediaStatesToTest[] = { | 281 static const TabAlertState kAlertStatesToTest[] = { |
| 282 TAB_MEDIA_STATE_NONE, TAB_MEDIA_STATE_CAPTURING, | 282 TabAlertState::NONE, TabAlertState::TAB_CAPTURING, |
| 283 TAB_MEDIA_STATE_AUDIO_PLAYING, TAB_MEDIA_STATE_AUDIO_MUTING | 283 TabAlertState::AUDIO_PLAYING, TabAlertState::AUDIO_MUTING}; |
| 284 }; | |
| 285 | 284 |
| 286 Widget widget; | 285 Widget widget; |
| 287 InitWidget(&widget); | 286 InitWidget(&widget); |
| 288 | 287 |
| 289 FakeTabController controller; | 288 FakeTabController controller; |
| 290 Tab tab(&controller, nullptr); | 289 Tab tab(&controller, nullptr); |
| 291 widget.GetContentsView()->AddChildView(&tab); | 290 widget.GetContentsView()->AddChildView(&tab); |
| 292 | 291 |
| 293 SkBitmap bitmap; | 292 SkBitmap bitmap; |
| 294 bitmap.allocN32Pixels(16, 16); | 293 bitmap.allocN32Pixels(16, 16); |
| 295 TabRendererData data; | 294 TabRendererData data; |
| 296 data.favicon = gfx::ImageSkia::CreateFrom1xBitmap(bitmap); | 295 data.favicon = gfx::ImageSkia::CreateFrom1xBitmap(bitmap); |
| 297 | 296 |
| 298 // Perform layout over all possible combinations, checking for correct | 297 // Perform layout over all possible combinations, checking for correct |
| 299 // results. | 298 // results. |
| 300 for (int is_pinned_tab = 0; is_pinned_tab < 2; ++is_pinned_tab) { | 299 for (int is_pinned_tab = 0; is_pinned_tab < 2; ++is_pinned_tab) { |
| 301 for (int is_active_tab = 0; is_active_tab < 2; ++is_active_tab) { | 300 for (int is_active_tab = 0; is_active_tab < 2; ++is_active_tab) { |
| 302 for (size_t media_state_index = 0; | 301 for (size_t alert_state_index = 0; |
| 303 media_state_index < arraysize(kMediaStatesToTest); | 302 alert_state_index < arraysize(kAlertStatesToTest); |
| 304 ++media_state_index) { | 303 ++alert_state_index) { |
| 305 const TabMediaState media_state = kMediaStatesToTest[media_state_index]; | 304 const TabAlertState alert_state = kAlertStatesToTest[alert_state_index]; |
| 306 SCOPED_TRACE(::testing::Message() | 305 SCOPED_TRACE(::testing::Message() |
| 307 << (is_active_tab ? "Active" : "Inactive") << ' ' | 306 << (is_active_tab ? "Active" : "Inactive") << ' ' |
| 308 << (is_pinned_tab ? "Pinned " : "") | 307 << (is_pinned_tab ? "Pinned " : "") |
| 309 << "Tab with media indicator state " << media_state); | 308 << "Tab with alert indicator state " |
| 309 << static_cast<uint8_t>(alert_state)); |
| 310 | 310 |
| 311 data.pinned = !!is_pinned_tab; | 311 data.pinned = !!is_pinned_tab; |
| 312 controller.set_active_tab(!!is_active_tab); | 312 controller.set_active_tab(!!is_active_tab); |
| 313 data.media_state = media_state; | 313 data.alert_state = alert_state; |
| 314 tab.SetData(data); | 314 tab.SetData(data); |
| 315 | 315 |
| 316 // Test layout for every width from standard to minimum. | 316 // Test layout for every width from standard to minimum. |
| 317 gfx::Rect bounds(gfx::Point(0, 0), Tab::GetStandardSize()); | 317 gfx::Rect bounds(gfx::Point(0, 0), Tab::GetStandardSize()); |
| 318 int min_width; | 318 int min_width; |
| 319 if (is_pinned_tab) { | 319 if (is_pinned_tab) { |
| 320 bounds.set_width(Tab::GetPinnedWidth()); | 320 bounds.set_width(Tab::GetPinnedWidth()); |
| 321 min_width = Tab::GetPinnedWidth(); | 321 min_width = Tab::GetPinnedWidth(); |
| 322 } else { | 322 } else { |
| 323 min_width = is_active_tab ? Tab::GetMinimumActiveSize().width() | 323 min_width = is_active_tab ? Tab::GetMinimumActiveSize().width() |
| (...skipping 26 matching lines...) Expand all Loading... |
| 350 bitmap.allocN32Pixels(16, 16); | 350 bitmap.allocN32Pixels(16, 16); |
| 351 TabRendererData data; | 351 TabRendererData data; |
| 352 data.favicon = gfx::ImageSkia::CreateFrom1xBitmap(bitmap); | 352 data.favicon = gfx::ImageSkia::CreateFrom1xBitmap(bitmap); |
| 353 | 353 |
| 354 data.title = base::UTF8ToUTF16( | 354 data.title = base::UTF8ToUTF16( |
| 355 "This is a really long tab title that would case views::Label to provide " | 355 "This is a really long tab title that would case views::Label to provide " |
| 356 "its own tooltip; but Tab should disable that feature so it can provide " | 356 "its own tooltip; but Tab should disable that feature so it can provide " |
| 357 "the tooltip instead."); | 357 "the tooltip instead."); |
| 358 | 358 |
| 359 // Test both with and without an indicator showing since the tab tooltip text | 359 // Test both with and without an indicator showing since the tab tooltip text |
| 360 // should include a description of the media state when the indicator is | 360 // should include a description of the alert state when the indicator is |
| 361 // present. | 361 // present. |
| 362 for (int i = 0; i < 2; ++i) { | 362 for (int i = 0; i < 2; ++i) { |
| 363 data.media_state = | 363 data.alert_state = |
| 364 (i == 0 ? TAB_MEDIA_STATE_NONE : TAB_MEDIA_STATE_AUDIO_PLAYING); | 364 (i == 0 ? TabAlertState::NONE : TabAlertState::AUDIO_PLAYING); |
| 365 SCOPED_TRACE(::testing::Message() | 365 SCOPED_TRACE(::testing::Message() |
| 366 << "Tab with media indicator state " << data.media_state); | 366 << "Tab with alert indicator state " |
| 367 << static_cast<uint8_t>(data.alert_state)); |
| 367 tab.SetData(data); | 368 tab.SetData(data); |
| 368 | 369 |
| 369 for (int j = 0; j < tab.child_count(); ++j) { | 370 for (int j = 0; j < tab.child_count(); ++j) { |
| 370 views::View& child = *tab.child_at(j); | 371 views::View& child = *tab.child_at(j); |
| 371 if (!strcmp(child.GetClassName(), "TabCloseButton")) | 372 if (!strcmp(child.GetClassName(), "TabCloseButton")) |
| 372 continue; // Close button is excepted. | 373 continue; // Close button is excepted. |
| 373 if (!child.visible()) | 374 if (!child.visible()) |
| 374 continue; | 375 continue; |
| 375 SCOPED_TRACE(::testing::Message() << "child_at(" << j << "): " | 376 SCOPED_TRACE(::testing::Message() << "child_at(" << j << "): " |
| 376 << child.GetClassName()); | 377 << child.GetClassName()); |
| 377 | 378 |
| 378 const gfx::Point midpoint(child.width() / 2, child.height() / 2); | 379 const gfx::Point midpoint(child.width() / 2, child.height() / 2); |
| 379 EXPECT_FALSE(child.GetTooltipHandlerForPoint(midpoint)); | 380 EXPECT_FALSE(child.GetTooltipHandlerForPoint(midpoint)); |
| 380 const gfx::Point mouse_hover_point = | 381 const gfx::Point mouse_hover_point = |
| 381 midpoint + child.GetMirroredPosition().OffsetFromOrigin(); | 382 midpoint + child.GetMirroredPosition().OffsetFromOrigin(); |
| 382 base::string16 tooltip; | 383 base::string16 tooltip; |
| 383 EXPECT_TRUE(static_cast<views::View&>(tab).GetTooltipText( | 384 EXPECT_TRUE(static_cast<views::View&>(tab).GetTooltipText( |
| 384 mouse_hover_point, &tooltip)); | 385 mouse_hover_point, &tooltip)); |
| 385 EXPECT_EQ(chrome::AssembleTabTooltipText(data.title, data.media_state), | 386 EXPECT_EQ(chrome::AssembleTabTooltipText(data.title, data.alert_state), |
| 386 tooltip); | 387 tooltip); |
| 387 } | 388 } |
| 388 } | 389 } |
| 389 } | 390 } |
| 390 | 391 |
| 391 // Regression test for http://crbug.com/226253. Calling Layout() more than once | 392 // Regression test for http://crbug.com/226253. Calling Layout() more than once |
| 392 // shouldn't change the insets of the close button. | 393 // shouldn't change the insets of the close button. |
| 393 TEST_F(TabTest, CloseButtonLayout) { | 394 TEST_F(TabTest, CloseButtonLayout) { |
| 394 FakeTabController tab_controller; | 395 FakeTabController tab_controller; |
| 395 Tab tab(&tab_controller, nullptr); | 396 Tab tab(&tab_controller, nullptr); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 464 } | 465 } |
| 465 | 466 |
| 466 TEST_F(TabTest, TitleHiddenWhenSmall) { | 467 TEST_F(TabTest, TitleHiddenWhenSmall) { |
| 467 FakeTabController tab_controller; | 468 FakeTabController tab_controller; |
| 468 Tab tab(&tab_controller, nullptr); | 469 Tab tab(&tab_controller, nullptr); |
| 469 tab.SetBounds(0, 0, 100, 50); | 470 tab.SetBounds(0, 0, 100, 50); |
| 470 EXPECT_GT(GetTitleWidth(tab), 0); | 471 EXPECT_GT(GetTitleWidth(tab), 0); |
| 471 tab.SetBounds(0, 0, 0, 50); | 472 tab.SetBounds(0, 0, 0, 50); |
| 472 EXPECT_EQ(0, GetTitleWidth(tab)); | 473 EXPECT_EQ(0, GetTitleWidth(tab)); |
| 473 } | 474 } |
| OLD | NEW |