| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/frame/opaque_browser_frame_view_layout.h" | 5 #include "chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
| 10 #include "chrome/browser/ui/views/profiles/avatar_label.h" | |
| 11 #include "chrome/browser/ui/views/profiles/avatar_menu_button.h" | 10 #include "chrome/browser/ui/views/profiles/avatar_menu_button.h" |
| 12 #include "chrome/browser/ui/views/tab_icon_view.h" | 11 #include "chrome/browser/ui/views/tab_icon_view.h" |
| 13 #include "chrome/browser/ui/views/tabs/tab.h" | 12 #include "chrome/browser/ui/views/tabs/tab.h" |
| 14 #include "chrome/common/chrome_switches.h" | 13 #include "chrome/common/chrome_switches.h" |
| 15 #include "components/signin/core/common/profile_management_switches.h" | 14 #include "components/signin/core/common/profile_management_switches.h" |
| 16 #include "ui/gfx/image/image_skia.h" | 15 #include "ui/gfx/image/image_skia.h" |
| 17 #include "ui/gfx/image/image_skia_rep.h" | 16 #include "ui/gfx/image/image_skia_rep.h" |
| 18 #include "ui/gfx/text_constants.h" | 17 #include "ui/gfx/text_constants.h" |
| 19 #include "ui/views/controls/button/image_button.h" | 18 #include "ui/views/controls/button/image_button.h" |
| 20 #include "ui/views/controls/button/menu_button.h" | 19 #include "ui/views/controls/button/menu_button.h" |
| 21 #include "ui/views/controls/label.h" | 20 #include "ui/views/controls/label.h" |
| 22 #include "ui/views/test/views_test_base.h" | 21 #include "ui/views/test/views_test_base.h" |
| 23 | 22 |
| 23 #if defined(ENABLE_MANAGED_USERS) |
| 24 #include "chrome/browser/ui/views/profiles/supervised_user_avatar_label.h" |
| 25 #endif |
| 26 |
| 24 using views::Widget; | 27 using views::Widget; |
| 25 | 28 |
| 26 namespace { | 29 namespace { |
| 27 | 30 |
| 28 const int kWidth = 500; | 31 const int kWidth = 500; |
| 29 | 32 |
| 30 class TestLayoutDelegate : public OpaqueBrowserFrameViewLayoutDelegate { | 33 class TestLayoutDelegate : public OpaqueBrowserFrameViewLayoutDelegate { |
| 31 public: | 34 public: |
| 32 enum WindowState { | 35 enum WindowState { |
| 33 STATE_NORMAL, | 36 STATE_NORMAL, |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 void AddAvatarButton() { | 219 void AddAvatarButton() { |
| 217 // Disable the New Avatar Menu. | 220 // Disable the New Avatar Menu. |
| 218 switches::DisableNewAvatarMenuForTesting(CommandLine::ForCurrentProcess()); | 221 switches::DisableNewAvatarMenuForTesting(CommandLine::ForCurrentProcess()); |
| 219 | 222 |
| 220 menu_button_ = new AvatarMenuButton(NULL, false); | 223 menu_button_ = new AvatarMenuButton(NULL, false); |
| 221 menu_button_->set_id(VIEW_ID_AVATAR_BUTTON); | 224 menu_button_->set_id(VIEW_ID_AVATAR_BUTTON); |
| 222 delegate_->SetShouldShowAvatar(true); | 225 delegate_->SetShouldShowAvatar(true); |
| 223 root_view_->AddChildView(menu_button_); | 226 root_view_->AddChildView(menu_button_); |
| 224 } | 227 } |
| 225 | 228 |
| 226 void AddAvatarLabel() { | 229 #if defined(ENABLE_MANAGED_USERS) |
| 227 avatar_label_ = new AvatarLabel(NULL); | 230 void AddSupervisedUserAvatarLabel() { |
| 228 avatar_label_->set_id(VIEW_ID_AVATAR_LABEL); | 231 supervised_user_avatar_label_ = new SupervisedUserAvatarLabel(NULL); |
| 229 root_view_->AddChildView(avatar_label_); | 232 supervised_user_avatar_label_->set_id(VIEW_ID_SUPERVISED_USER_AVATAR_LABEL); |
| 233 root_view_->AddChildView(supervised_user_avatar_label_); |
| 230 | 234 |
| 231 // The avatar label should only be used together with the avatar button. | 235 // The avatar label should only be used together with the avatar button. |
| 232 AddAvatarButton(); | 236 AddAvatarButton(); |
| 233 } | 237 } |
| 238 #endif |
| 234 | 239 |
| 235 void AddNewAvatarButton() { | 240 void AddNewAvatarButton() { |
| 236 // Enable the New Avatar Menu. | 241 // Enable the New Avatar Menu. |
| 237 switches::EnableNewAvatarMenuForTesting(CommandLine::ForCurrentProcess()); | 242 switches::EnableNewAvatarMenuForTesting(CommandLine::ForCurrentProcess()); |
| 238 | 243 |
| 239 new_avatar_button_ = | 244 new_avatar_button_ = |
| 240 new views::MenuButton(NULL, base::string16(), NULL, false); | 245 new views::MenuButton(NULL, base::string16(), NULL, false); |
| 241 new_avatar_button_->set_id(VIEW_ID_NEW_AVATAR_BUTTON); | 246 new_avatar_button_->set_id(VIEW_ID_NEW_AVATAR_BUTTON); |
| 242 root_view_->AddChildView(new_avatar_button_); | 247 root_view_->AddChildView(new_avatar_button_); |
| 243 } | 248 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 256 | 261 |
| 257 // Widgets: | 262 // Widgets: |
| 258 views::ImageButton* minimize_button_; | 263 views::ImageButton* minimize_button_; |
| 259 views::ImageButton* maximize_button_; | 264 views::ImageButton* maximize_button_; |
| 260 views::ImageButton* restore_button_; | 265 views::ImageButton* restore_button_; |
| 261 views::ImageButton* close_button_; | 266 views::ImageButton* close_button_; |
| 262 | 267 |
| 263 TabIconView* tab_icon_view_; | 268 TabIconView* tab_icon_view_; |
| 264 views::Label* window_title_; | 269 views::Label* window_title_; |
| 265 | 270 |
| 266 AvatarLabel* avatar_label_; | 271 #if defined(ENABLE_MANAGED_USERS) |
| 272 SupervisedUserAvatarLabel* supervised_user_avatar_label_; |
| 273 #endif |
| 267 AvatarMenuButton* menu_button_; | 274 AvatarMenuButton* menu_button_; |
| 268 views::MenuButton* new_avatar_button_; | 275 views::MenuButton* new_avatar_button_; |
| 269 | 276 |
| 270 DISALLOW_COPY_AND_ASSIGN(OpaqueBrowserFrameViewLayoutTest); | 277 DISALLOW_COPY_AND_ASSIGN(OpaqueBrowserFrameViewLayoutTest); |
| 271 }; | 278 }; |
| 272 | 279 |
| 273 TEST_F(OpaqueBrowserFrameViewLayoutTest, BasicWindow) { | 280 TEST_F(OpaqueBrowserFrameViewLayoutTest, BasicWindow) { |
| 274 // Tests the layout of a default chrome window with no avatars, no window | 281 // Tests the layout of a default chrome window with no avatars, no window |
| 275 // titles, and a tabstrip. | 282 // titles, and a tabstrip. |
| 276 root_view_->Layout(); | 283 root_view_->Layout(); |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 429 ExpectBasicWindowBounds(); | 436 ExpectBasicWindowBounds(); |
| 430 | 437 |
| 431 // Check the location of the avatar | 438 // Check the location of the avatar |
| 432 EXPECT_EQ("7,11 40x29", menu_button_->bounds().ToString()); | 439 EXPECT_EQ("7,11 40x29", menu_button_->bounds().ToString()); |
| 433 EXPECT_EQ("45,13 352x29", | 440 EXPECT_EQ("45,13 352x29", |
| 434 layout_manager_->GetBoundsForTabStrip( | 441 layout_manager_->GetBoundsForTabStrip( |
| 435 delegate_->GetTabstripPreferredSize(), kWidth).ToString()); | 442 delegate_->GetTabstripPreferredSize(), kWidth).ToString()); |
| 436 EXPECT_EQ("261x73", layout_manager_->GetMinimumSize(kWidth).ToString()); | 443 EXPECT_EQ("261x73", layout_manager_->GetMinimumSize(kWidth).ToString()); |
| 437 } | 444 } |
| 438 | 445 |
| 439 TEST_F(OpaqueBrowserFrameViewLayoutTest, WindowWithAvatarWithButtonsOnLeft) { | |
| 440 // Tests the layout of a chrome window with an avatar icon and caption buttons | |
| 441 // on the left. The avatar icon should therefore be on the right. | |
| 442 // AddAvatarLabel() also adds the avatar button. | |
| 443 AddAvatarLabel(); | |
| 444 std::vector<views::FrameButton> leading_buttons; | |
| 445 std::vector<views::FrameButton> trailing_buttons; | |
| 446 leading_buttons.push_back(views::FRAME_BUTTON_CLOSE); | |
| 447 leading_buttons.push_back(views::FRAME_BUTTON_MINIMIZE); | |
| 448 leading_buttons.push_back(views::FRAME_BUTTON_MAXIMIZE); | |
| 449 layout_manager_->SetButtonOrdering(leading_buttons, trailing_buttons); | |
| 450 root_view_->Layout(); | |
| 451 | |
| 452 EXPECT_EQ("73,1 25x18", maximize_button_->bounds().ToString()); | |
| 453 EXPECT_EQ("47,1 26x18", minimize_button_->bounds().ToString()); | |
| 454 EXPECT_EQ("0,0 0x0", restore_button_->bounds().ToString()); | |
| 455 EXPECT_EQ("4,1 43x18", close_button_->bounds().ToString()); | |
| 456 | |
| 457 // Check the location of the avatar | |
| 458 EXPECT_EQ("454,11 40x29", menu_button_->bounds().ToString()); | |
| 459 | |
| 460 // Check the tab strip bounds. | |
| 461 gfx::Rect tab_strip_bounds = layout_manager_->GetBoundsForTabStrip( | |
| 462 delegate_->GetTabstripPreferredSize(), kWidth); | |
| 463 EXPECT_GT(tab_strip_bounds.x(), maximize_button_->bounds().x()); | |
| 464 EXPECT_GT(maximize_button_->bounds().right(), tab_strip_bounds.x()); | |
| 465 EXPECT_EQ(13, tab_strip_bounds.y()); | |
| 466 EXPECT_EQ(29, tab_strip_bounds.height()); | |
| 467 EXPECT_GT(avatar_label_->bounds().x(), tab_strip_bounds.right()); | |
| 468 EXPECT_EQ("261x73", layout_manager_->GetMinimumSize(kWidth).ToString()); | |
| 469 | |
| 470 // Check the relative location of the avatar label to the avatar. The right | |
| 471 // end of the avatar label should be slightly to the right of the right end of | |
| 472 // the avatar icon. | |
| 473 EXPECT_GT(avatar_label_->bounds().right(), menu_button_->bounds().right()); | |
| 474 EXPECT_GT(menu_button_->bounds().x(), avatar_label_->bounds().x()); | |
| 475 EXPECT_GT(menu_button_->bounds().bottom(), | |
| 476 avatar_label_->bounds().bottom()); | |
| 477 EXPECT_GT(avatar_label_->bounds().y(), menu_button_->bounds().y()); | |
| 478 | |
| 479 // This means that the menu will pop out facing the left (if it were to face | |
| 480 // the right, it would go outside the window frame and be clipped). | |
| 481 EXPECT_TRUE(menu_button_->button_on_right()); | |
| 482 | |
| 483 // If the buttons are on the left, there should be no hidden icon for the user | |
| 484 // to double click. | |
| 485 EXPECT_EQ("0,0 0x0", layout_manager_->IconBounds().ToString()); | |
| 486 } | |
| 487 | |
| 488 TEST_F(OpaqueBrowserFrameViewLayoutTest, | 446 TEST_F(OpaqueBrowserFrameViewLayoutTest, |
| 489 WindowWithAvatarWithoutCaptionButtonsOnLeft) { | 447 WindowWithAvatarWithoutCaptionButtonsOnLeft) { |
| 490 // Tests the layout of a chrome window with an avatar icon and no caption | 448 // Tests the layout of a chrome window with an avatar icon and no caption |
| 491 // buttons. However, the caption buttons *would* be on the left if they | 449 // buttons. However, the caption buttons *would* be on the left if they |
| 492 // weren't hidden, and therefore, the avatar icon should be on the right. | 450 // weren't hidden, and therefore, the avatar icon should be on the right. |
| 493 // The lack of caption buttons should force the tab strip to be condensed. | 451 // The lack of caption buttons should force the tab strip to be condensed. |
| 494 AddAvatarButton(); | 452 AddAvatarButton(); |
| 495 std::vector<views::FrameButton> leading_buttons; | 453 std::vector<views::FrameButton> leading_buttons; |
| 496 std::vector<views::FrameButton> trailing_buttons; | 454 std::vector<views::FrameButton> trailing_buttons; |
| 497 leading_buttons.push_back(views::FRAME_BUTTON_CLOSE); | 455 leading_buttons.push_back(views::FRAME_BUTTON_CLOSE); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 529 // Check the location of the avatar button. | 487 // Check the location of the avatar button. |
| 530 EXPECT_EQ("385,1 12x18", new_avatar_button_->bounds().ToString()); | 488 EXPECT_EQ("385,1 12x18", new_avatar_button_->bounds().ToString()); |
| 531 // The new tab button is 39px wide and slides completely under the new | 489 // The new tab button is 39px wide and slides completely under the new |
| 532 // avatar button, thus increasing the tabstrip by that amount. | 490 // avatar button, thus increasing the tabstrip by that amount. |
| 533 EXPECT_EQ("-1,13 420x29", | 491 EXPECT_EQ("-1,13 420x29", |
| 534 layout_manager_->GetBoundsForTabStrip( | 492 layout_manager_->GetBoundsForTabStrip( |
| 535 delegate_->GetTabstripPreferredSize(), kWidth).ToString()); | 493 delegate_->GetTabstripPreferredSize(), kWidth).ToString()); |
| 536 EXPECT_EQ("261x73", layout_manager_->GetMinimumSize(kWidth).ToString()); | 494 EXPECT_EQ("261x73", layout_manager_->GetMinimumSize(kWidth).ToString()); |
| 537 } | 495 } |
| 538 | 496 |
| 497 #if defined(ENABLE_MANAGED_USERS) |
| 498 TEST_F(OpaqueBrowserFrameViewLayoutTest, WindowWithAvatarWithButtonsOnLeft) { |
| 499 // Tests the layout of a chrome window with an avatar icon and caption buttons |
| 500 // on the left. The avatar icon should therefore be on the right. |
| 501 // AddAvatarLabel() also adds the avatar button. |
| 502 AddSupervisedUserAvatarLabel(); |
| 503 std::vector<views::FrameButton> leading_buttons; |
| 504 std::vector<views::FrameButton> trailing_buttons; |
| 505 leading_buttons.push_back(views::FRAME_BUTTON_CLOSE); |
| 506 leading_buttons.push_back(views::FRAME_BUTTON_MINIMIZE); |
| 507 leading_buttons.push_back(views::FRAME_BUTTON_MAXIMIZE); |
| 508 layout_manager_->SetButtonOrdering(leading_buttons, trailing_buttons); |
| 509 root_view_->Layout(); |
| 510 |
| 511 EXPECT_EQ("73,1 25x18", maximize_button_->bounds().ToString()); |
| 512 EXPECT_EQ("47,1 26x18", minimize_button_->bounds().ToString()); |
| 513 EXPECT_EQ("0,0 0x0", restore_button_->bounds().ToString()); |
| 514 EXPECT_EQ("4,1 43x18", close_button_->bounds().ToString()); |
| 515 |
| 516 // Check the location of the avatar |
| 517 EXPECT_EQ("454,11 40x29", menu_button_->bounds().ToString()); |
| 518 |
| 519 // Check the tab strip bounds. |
| 520 gfx::Rect tab_strip_bounds = layout_manager_->GetBoundsForTabStrip( |
| 521 delegate_->GetTabstripPreferredSize(), kWidth); |
| 522 EXPECT_GT(tab_strip_bounds.x(), maximize_button_->bounds().x()); |
| 523 EXPECT_GT(maximize_button_->bounds().right(), tab_strip_bounds.x()); |
| 524 EXPECT_EQ(13, tab_strip_bounds.y()); |
| 525 EXPECT_EQ(29, tab_strip_bounds.height()); |
| 526 EXPECT_GT(supervised_user_avatar_label_->bounds().x(), |
| 527 tab_strip_bounds.right()); |
| 528 EXPECT_EQ("261x73", layout_manager_->GetMinimumSize(kWidth).ToString()); |
| 529 |
| 530 // Check the relative location of the avatar label to the avatar. The right |
| 531 // end of the avatar label should be slightly to the right of the right end of |
| 532 // the avatar icon. |
| 533 EXPECT_GT(supervised_user_avatar_label_->bounds().right(), |
| 534 menu_button_->bounds().right()); |
| 535 EXPECT_GT(menu_button_->bounds().x(), |
| 536 supervised_user_avatar_label_->bounds().x()); |
| 537 EXPECT_GT(menu_button_->bounds().bottom(), |
| 538 supervised_user_avatar_label_->bounds().bottom()); |
| 539 EXPECT_GT(supervised_user_avatar_label_->bounds().y(), |
| 540 menu_button_->bounds().y()); |
| 541 |
| 542 // This means that the menu will pop out facing the left (if it were to face |
| 543 // the right, it would go outside the window frame and be clipped). |
| 544 EXPECT_TRUE(menu_button_->button_on_right()); |
| 545 |
| 546 // If the buttons are on the left, there should be no hidden icon for the user |
| 547 // to double click. |
| 548 EXPECT_EQ("0,0 0x0", layout_manager_->IconBounds().ToString()); |
| 549 } |
| 550 |
| 539 TEST_F(OpaqueBrowserFrameViewLayoutTest, WindowWithAvatarLabelAndButtonOnLeft) { | 551 TEST_F(OpaqueBrowserFrameViewLayoutTest, WindowWithAvatarLabelAndButtonOnLeft) { |
| 540 AddAvatarLabel(); | 552 AddSupervisedUserAvatarLabel(); |
| 541 root_view_->Layout(); | 553 root_view_->Layout(); |
| 542 | 554 |
| 543 ExpectBasicWindowBounds(); | 555 ExpectBasicWindowBounds(); |
| 544 | 556 |
| 545 // Check the location of the avatar label relative to the avatar button if | 557 // Check the location of the avatar label relative to the avatar button if |
| 546 // both are displayed on the left side. | 558 // both are displayed on the left side. |
| 547 // The label height and width depends on the font size and the text displayed. | 559 // The label height and width depends on the font size and the text displayed. |
| 548 // This may possibly change, so we don't test it here. | 560 // This may possibly change, so we don't test it here. |
| 549 EXPECT_EQ(menu_button_->bounds().x() - 2, avatar_label_->bounds().x()); | 561 EXPECT_EQ(menu_button_->bounds().x() - 2, |
| 550 EXPECT_EQ( | 562 supervised_user_avatar_label_->bounds().x()); |
| 551 menu_button_->bounds().bottom() - 3 - avatar_label_->bounds().height(), | 563 EXPECT_EQ(menu_button_->bounds().bottom() - 3 - |
| 552 avatar_label_->bounds().y()); | 564 supervised_user_avatar_label_->bounds().height(), |
| 565 supervised_user_avatar_label_->bounds().y()); |
| 553 } | 566 } |
| 567 #endif |
| OLD | NEW |