| Index: chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_unittest.cc
|
| diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_unittest.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d100bc7d5ceebc1488197b68a2231968db7c0b53
|
| --- /dev/null
|
| +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_unittest.cc
|
| @@ -0,0 +1,303 @@
|
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h"
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "base/strings/utf_string_conversions.h"
|
| +#include "chrome/browser/ui/views/tab_icon_view.h"
|
| +#include "chrome/browser/ui/views/tabs/tab.h"
|
| +#include "ui/gfx/image/image_skia.h"
|
| +#include "ui/gfx/image/image_skia_rep.h"
|
| +#include "ui/gfx/text_constants.h"
|
| +#include "ui/views/controls/button/image_button.h"
|
| +#include "ui/views/controls/button/menu_button.h"
|
| +#include "ui/views/controls/label.h"
|
| +#include "ui/views/test/views_test_base.h"
|
| +
|
| +using views::Widget;
|
| +
|
| +namespace {
|
| +
|
| +const int kWidth = 500;
|
| +
|
| +class TestLayoutDelegate : public OpaqueBrowserFrameViewLayoutDelegate {
|
| + public:
|
| + enum WindowState {
|
| + STATE_NORMAL,
|
| + STATE_MAXIMIZED,
|
| + STATE_MINIMIZED,
|
| + STATE_FULLSCREEN
|
| + };
|
| +
|
| + TestLayoutDelegate()
|
| + : show_avatar_(false),
|
| + window_state_(STATE_NORMAL) {
|
| + }
|
| +
|
| + virtual ~TestLayoutDelegate() {}
|
| +
|
| + void SetWindowTitle(const base::string16& title) {
|
| + window_title_ = title;
|
| + }
|
| +
|
| + void SetShouldShowAvatar(bool show_avatar) {
|
| + show_avatar_ = show_avatar;
|
| + }
|
| +
|
| + void SetWindowState(WindowState state) {
|
| + window_state_ = state;
|
| + }
|
| +
|
| + virtual bool ShouldShowWindowIcon() const OVERRIDE {
|
| + return !window_title_.empty();
|
| + }
|
| +
|
| + virtual bool ShouldShowWindowTitle() const OVERRIDE {
|
| + return !window_title_.empty();
|
| + }
|
| +
|
| + virtual base::string16 GetWindowTitle() const OVERRIDE {
|
| + return window_title_;
|
| + }
|
| +
|
| + virtual int GetIconSize() const OVERRIDE {
|
| + // The value on linux_aura and non-aura windows.
|
| + return 17;
|
| + }
|
| +
|
| + virtual bool ShouldLeaveOffsetNearTopBorder() const OVERRIDE {
|
| + return !IsMaximized();
|
| + }
|
| +
|
| + virtual gfx::Size GetBrowserViewMinimumSize() const OVERRIDE {
|
| + // Taken from a calculation in BrowserViewLayout.
|
| + return gfx::Size(168, 64);
|
| + }
|
| +
|
| + virtual bool ShouldShowAvatar() const OVERRIDE {
|
| + return show_avatar_;
|
| + }
|
| +
|
| + virtual gfx::ImageSkia GetOTRAvatarIcon() const OVERRIDE {
|
| + // The calculations depend on the size of the OTR resource, and chromeos
|
| + // uses a different sized image, so hard code the size of the current
|
| + // windows/linux one.
|
| + gfx::ImageSkiaRep rep(gfx::Size(40, 29), ui::SCALE_FACTOR_100P);
|
| + gfx::ImageSkia image(rep);
|
| + return image;
|
| + }
|
| +
|
| + virtual bool IsMaximized() const OVERRIDE {
|
| + return window_state_ == STATE_MAXIMIZED;
|
| + }
|
| +
|
| + virtual bool IsMinimized() const OVERRIDE {
|
| + return window_state_ == STATE_MINIMIZED;
|
| + }
|
| +
|
| + virtual bool IsFullscreen() const OVERRIDE {
|
| + return window_state_ == STATE_FULLSCREEN;
|
| + }
|
| +
|
| + virtual bool IsTabStripVisible() const OVERRIDE {
|
| + return window_title_.empty();
|
| + }
|
| +
|
| + virtual int GetTabStripHeight() const OVERRIDE {
|
| + return IsTabStripVisible() ? Tab::GetMinimumUnselectedSize().height() : 0;
|
| + }
|
| +
|
| + virtual int GetAdditionalReservedSpaceInTabStrip() const OVERRIDE {
|
| + return 0;
|
| + }
|
| +
|
| + virtual gfx::Size GetTabstripPreferredSize() const OVERRIDE {
|
| + // Measured from Tabstrip::GetPreferredSize().
|
| + return IsTabStripVisible() ? gfx::Size(78, 29) : gfx::Size(0, 0);
|
| + }
|
| +
|
| + private:
|
| + base::string16 window_title_;
|
| + bool show_avatar_;
|
| + WindowState window_state_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TestLayoutDelegate);
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +class OpaqueBrowserFrameViewLayoutTest : public views::ViewsTestBase {
|
| + public:
|
| + OpaqueBrowserFrameViewLayoutTest() {}
|
| + virtual ~OpaqueBrowserFrameViewLayoutTest() {}
|
| +
|
| + virtual void SetUp() OVERRIDE {
|
| + views::ViewsTestBase::SetUp();
|
| +
|
| + delegate_ = new TestLayoutDelegate;
|
| + layout_manager_ = new OpaqueBrowserFrameViewLayout(delegate_);
|
| + widget_ = new Widget;
|
| + widget_->Init(CreateParams(Widget::InitParams::TYPE_POPUP));
|
| + root_view_ = widget_->GetRootView();
|
| + root_view_->SetSize(gfx::Size(kWidth, kWidth));
|
| + root_view_->SetLayoutManager(layout_manager_);
|
| +
|
| + // Add the caption buttons. We use fake images because we're modeling the
|
| + // Windows assets here, while the linux version uses differently sized
|
| + // assets.
|
| + //
|
| + // TODO(erg): In a follow up patch, separate these sizes out into virtual
|
| + // accessors so we can test both the windows and linux behaviours once we
|
| + // start modifying the code.
|
| + minimize_button_ = InitWindowCaptionButton(
|
| + VIEW_ID_MINIMIZE_BUTTON, gfx::Size(26, 18));
|
| + maximize_button_ = InitWindowCaptionButton(
|
| + VIEW_ID_MAXIMIZE_BUTTON, gfx::Size(25, 18));
|
| + restore_button_ = InitWindowCaptionButton(
|
| + VIEW_ID_RESTORE_BUTTON, gfx::Size(25, 18));
|
| + close_button_ = InitWindowCaptionButton(
|
| + VIEW_ID_CLOSE_BUTTON, gfx::Size(43, 18));
|
| + }
|
| +
|
| + virtual void TearDown() OVERRIDE {
|
| + widget_->CloseNow();
|
| +
|
| + views::ViewsTestBase::TearDown();
|
| + }
|
| +
|
| + protected:
|
| + views::ImageButton* InitWindowCaptionButton(ViewID view_id,
|
| + const gfx::Size& size) {
|
| + views::ImageButton* button = new views::ImageButton(NULL);
|
| + gfx::ImageSkiaRep rep(size, ui::SCALE_FACTOR_100P);
|
| + gfx::ImageSkia image(rep);
|
| + button->SetImage(views::CustomButton::STATE_NORMAL, &image);
|
| + button->set_id(view_id);
|
| + root_view_->AddChildView(button);
|
| + return button;
|
| + }
|
| +
|
| + void AddWindowTitleIcons() {
|
| + tab_icon_view_ = new TabIconView(NULL);
|
| + tab_icon_view_->set_is_light(true);
|
| + tab_icon_view_->set_id(VIEW_ID_WINDOW_ICON);
|
| + root_view_->AddChildView(tab_icon_view_);
|
| +
|
| + window_title_ = new views::Label(delegate_->GetWindowTitle(),
|
| + default_font_);
|
| + window_title_->SetVisible(delegate_->ShouldShowWindowTitle());
|
| + window_title_->SetEnabledColor(SK_ColorWHITE);
|
| + window_title_->SetBackgroundColor(0x00000000);
|
| + window_title_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
| + window_title_->set_id(VIEW_ID_WINDOW_TITLE);
|
| + root_view_->AddChildView(window_title_);
|
| + }
|
| +
|
| + void AddAvatarButton() {
|
| + menu_button_ = new views::MenuButton(NULL, string16(), NULL, false);
|
| + menu_button_->set_id(VIEW_ID_AVATAR_BUTTON);
|
| + delegate_->SetShouldShowAvatar(true);
|
| + root_view_->AddChildView(menu_button_);
|
| + }
|
| +
|
| + void ExpectBasicWindowBounds() {
|
| + EXPECT_EQ("428,1 25x18", maximize_button_->bounds().ToString());
|
| + EXPECT_EQ("402,1 26x18", minimize_button_->bounds().ToString());
|
| + EXPECT_EQ("0,0 0x0", restore_button_->bounds().ToString());
|
| + EXPECT_EQ("453,1 43x18", close_button_->bounds().ToString());
|
| + }
|
| +
|
| + gfx::Font default_font_;
|
| +
|
| + Widget* widget_;
|
| + views::View* root_view_;
|
| + OpaqueBrowserFrameViewLayout* layout_manager_;
|
| + TestLayoutDelegate* delegate_;
|
| +
|
| + // Widgets:
|
| + views::ImageButton* minimize_button_;
|
| + views::ImageButton* maximize_button_;
|
| + views::ImageButton* restore_button_;
|
| + views::ImageButton* close_button_;
|
| +
|
| + TabIconView* tab_icon_view_;
|
| + views::Label* window_title_;
|
| +
|
| + views::MenuButton* menu_button_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(OpaqueBrowserFrameViewLayoutTest);
|
| +};
|
| +
|
| +TEST_F(OpaqueBrowserFrameViewLayoutTest, BasicWindow) {
|
| + // Tests the layout of a default chrome window with no avatars, no window
|
| + // titles, and a tabstrip.
|
| + root_view_->Layout();
|
| +
|
| + ExpectBasicWindowBounds();
|
| +
|
| + // After some visual inspection, it really does look like the tabstrip is
|
| + // initally positioned out of our view.
|
| + EXPECT_EQ("-1,13 398x29",
|
| + layout_manager_->GetBoundsForTabStrip(
|
| + delegate_->GetTabstripPreferredSize(), kWidth).ToString());
|
| + EXPECT_EQ("226x73", layout_manager_->GetMinimumSize(kWidth).ToString());
|
| +
|
| + // A normal window with no window icon still produces icon bounds for
|
| + // Windows, which has a hidden icon that a user can double click on to close
|
| + // the window.
|
| + EXPECT_EQ("6,4 17x17", layout_manager_->IconBounds().ToString());
|
| +}
|
| +
|
| +TEST_F(OpaqueBrowserFrameViewLayoutTest, BasicWindowMaximized) {
|
| + // Tests the layout of a default chrome window with no avatars, no window
|
| + // titles, and a tabstrip, but maximized this time.
|
| + delegate_->SetWindowState(TestLayoutDelegate::STATE_MAXIMIZED);
|
| + root_view_->Layout();
|
| +
|
| + // Note how the bonds start at the exact top of the window while maximized
|
| + // while they start 1 pixel below when unmaximized.
|
| + EXPECT_EQ("0,0 0x0", maximize_button_->bounds().ToString());
|
| + EXPECT_EQ("403,0 26x18", minimize_button_->bounds().ToString());
|
| + EXPECT_EQ("429,0 25x18", restore_button_->bounds().ToString());
|
| + EXPECT_EQ("454,0 46x18", close_button_->bounds().ToString());
|
| +
|
| + EXPECT_EQ("-6,-3 393x29",
|
| + layout_manager_->GetBoundsForTabStrip(
|
| + delegate_->GetTabstripPreferredSize(), kWidth).ToString());
|
| + EXPECT_EQ("231x61", layout_manager_->GetMinimumSize(kWidth).ToString());
|
| +
|
| + // In the maximized case, OpaqueBrowserFrameView::NonClientHitTest() uses
|
| + // this rect, extended to the top left corner of the window.
|
| + EXPECT_EQ("2,0 17x17", layout_manager_->IconBounds().ToString());
|
| +}
|
| +
|
| +TEST_F(OpaqueBrowserFrameViewLayoutTest, WithWindowTitleAndIcon) {
|
| + // Tests the layout of pop up windows.
|
| + delegate_->SetWindowTitle(ASCIIToUTF16("Window Title"));
|
| + AddWindowTitleIcons();
|
| + root_view_->Layout();
|
| +
|
| + // We should have the right hand side should match the BasicWindow case.
|
| + ExpectBasicWindowBounds();
|
| +
|
| + // Check the location of the tab icon and window title.
|
| + EXPECT_EQ("6,3 17x17", tab_icon_view_->bounds().ToString());
|
| + EXPECT_EQ("27,3 370x17", window_title_->bounds().ToString());
|
| +}
|
| +
|
| +TEST_F(OpaqueBrowserFrameViewLayoutTest, WindowWithAvatar) {
|
| + // Tests a normal tabstrip window with an avatar icon.
|
| + AddAvatarButton();
|
| + root_view_->Layout();
|
| +
|
| + ExpectBasicWindowBounds();
|
| +
|
| + // Check the location of the avatar
|
| + EXPECT_EQ("7,11 40x29", menu_button_->bounds().ToString());
|
| + EXPECT_EQ("45,13 352x29",
|
| + layout_manager_->GetBoundsForTabStrip(
|
| + delegate_->GetTabstripPreferredSize(), kWidth).ToString());
|
| + EXPECT_EQ("226x73", layout_manager_->GetMinimumSize(kWidth).ToString());
|
| +}
|
|
|