Home | History | Annotate | Download | only in panels
      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
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/ui/panels/base_panel_browser_test.h"
      6 #include "chrome/browser/ui/panels/panel.h"
      7 #include "chrome/browser/ui/panels/panel_constants.h"
      8 #include "chrome/browser/ui/views/panels/panel_frame_view.h"
      9 #include "chrome/browser/ui/views/panels/panel_view.h"
     10 #include "chrome/browser/ui/views/tab_icon_view.h"
     11 #include "testing/gtest/include/gtest/gtest.h"
     12 #include "ui/views/controls/button/image_button.h"
     13 #include "ui/views/controls/button/menu_button.h"
     14 #include "ui/views/controls/image_view.h"
     15 #include "ui/views/controls/label.h"
     16 #include "ui/views/controls/link.h"
     17 #include "ui/views/controls/textfield/textfield.h"
     18 
     19 #if defined(OS_WIN)
     20 #include "ui/views/win/hwnd_util.h"
     21 #endif
     22 
     23 // BasePanelBrowserTest now creates refactored Panels. Refactor
     24 // has only been done for Mac panels so far.
     25 class PanelViewTest : public BasePanelBrowserTest {
     26  public:
     27   PanelViewTest() : BasePanelBrowserTest() { }
     28 
     29  protected:
     30   PanelView* GetPanelView(Panel* panel) const {
     31     return static_cast<PanelView*>(panel->native_panel());
     32   }
     33 };
     34 
     35 IN_PROC_BROWSER_TEST_F(PanelViewTest, ActivePanelWindowProperties) {
     36   CreatePanelParams params("1", gfx::Rect(0, 0, 200, 150), SHOW_AS_ACTIVE);
     37   Panel* panel = CreatePanelWithParams(params);
     38   EXPECT_TRUE(panel->IsActive());
     39 
     40   // Validate window styles. We want to ensure that the window is created
     41   // with expected styles regardless of its active state.
     42 #if defined(OS_WIN)
     43   HWND native_window = views::HWNDForWidget(GetPanelView(panel)->window());
     44 
     45   LONG styles = ::GetWindowLong(native_window, GWL_STYLE);
     46   EXPECT_EQ(0, styles & WS_MAXIMIZEBOX);
     47   EXPECT_EQ(0, styles & WS_MINIMIZEBOX);
     48 
     49   LONG ext_styles = ::GetWindowLong(native_window, GWL_EXSTYLE);
     50   EXPECT_EQ(WS_EX_TOPMOST, ext_styles & WS_EX_TOPMOST);
     51 
     52   RECT window_rect;
     53   EXPECT_TRUE(::GetWindowRect(native_window, &window_rect));
     54   EXPECT_EQ(200, window_rect.right - window_rect.left);
     55   EXPECT_EQ(150, window_rect.bottom - window_rect.top);
     56 
     57   EXPECT_TRUE(::IsWindowVisible(native_window));
     58 #endif
     59 
     60   panel->Close();
     61 }
     62 
     63 IN_PROC_BROWSER_TEST_F(PanelViewTest, InactivePanelWindowProperties) {
     64   CreatePanelParams params("1", gfx::Rect(0, 0, 200, 150), SHOW_AS_INACTIVE);
     65   Panel* panel = CreatePanelWithParams(params);
     66   EXPECT_FALSE(panel->IsActive());
     67 
     68   // Validate window styles. We want to ensure that the window is created
     69   // with expected styles regardless of its active state.
     70 #if defined(OS_WIN)
     71   HWND native_window = views::HWNDForWidget(GetPanelView(panel)->window());
     72 
     73   LONG styles = ::GetWindowLong(native_window, GWL_STYLE);
     74   EXPECT_EQ(0, styles & WS_MAXIMIZEBOX);
     75   EXPECT_EQ(0, styles & WS_MINIMIZEBOX);
     76 
     77   LONG ext_styles = ::GetWindowLong(native_window, GWL_EXSTYLE);
     78   EXPECT_EQ(WS_EX_TOPMOST, ext_styles & WS_EX_TOPMOST);
     79 
     80   RECT window_rect;
     81   EXPECT_TRUE(::GetWindowRect(native_window, &window_rect));
     82   EXPECT_EQ(200, window_rect.right - window_rect.left);
     83   EXPECT_EQ(150, window_rect.bottom - window_rect.top);
     84 
     85   EXPECT_TRUE(::IsWindowVisible(native_window));
     86 #endif
     87 
     88   panel->Close();
     89 }
     90 
     91 IN_PROC_BROWSER_TEST_F(PanelViewTest, PanelLayout) {
     92   // Create a fixed-size panel to avoid possible collapsing of the title
     93   // if the enforced min sizes are too small.
     94   Panel* panel = CreatePanelWithBounds("PanelTest", gfx::Rect(0, 0, 200, 50));
     95   PanelFrameView* frame_view = GetPanelView(panel)->GetFrameView();
     96 
     97   TabIconView* title_icon = frame_view->title_icon();
     98   views::View* title_text = frame_view->title_label();
     99   views::View* close_button = frame_view->close_button();
    100   views::View* minimize_button = frame_view->minimize_button();
    101   views::View* restore_button = frame_view->restore_button();
    102 
    103   // We should have icon, text, minimize, restore and close buttons. Only one of
    104   // minimize and restore buttons are visible.
    105   EXPECT_EQ(5, frame_view->child_count());
    106   EXPECT_TRUE(frame_view->Contains(title_icon));
    107   EXPECT_TRUE(frame_view->Contains(title_text));
    108   EXPECT_TRUE(frame_view->Contains(close_button));
    109   EXPECT_TRUE(frame_view->Contains(minimize_button));
    110   EXPECT_TRUE(frame_view->Contains(restore_button));
    111 
    112   // These controls should be visible.
    113   EXPECT_TRUE(title_icon->visible());
    114   EXPECT_TRUE(title_text->visible());
    115   EXPECT_TRUE(close_button->visible());
    116   EXPECT_TRUE(minimize_button->visible());
    117   EXPECT_FALSE(restore_button->visible());
    118 
    119   // Validate their layouts.
    120   int titlebar_height = panel::kTitlebarHeight;
    121   EXPECT_GT(title_icon->width(), 0);
    122   EXPECT_GT(title_icon->height(), 0);
    123   EXPECT_LT(title_icon->height(), titlebar_height);
    124   EXPECT_GT(title_text->width(), 0);
    125   EXPECT_GT(title_text->height(), 0);
    126   EXPECT_LT(title_text->height(), titlebar_height);
    127   EXPECT_GT(minimize_button->width(), 0);
    128   EXPECT_GT(minimize_button->height(), 0);
    129   EXPECT_LT(minimize_button->height(), titlebar_height);
    130   EXPECT_GT(close_button->width(), 0);
    131   EXPECT_GT(close_button->height(), 0);
    132   EXPECT_LT(close_button->height(), titlebar_height);
    133   EXPECT_LT(title_icon->x() + title_icon->width(), title_text->x());
    134   EXPECT_LT(title_text->x() + title_text->width(), minimize_button->x());
    135   EXPECT_LT(minimize_button->x() + minimize_button->width(), close_button->x());
    136 }
    137 
    138 IN_PROC_BROWSER_TEST_F(PanelViewTest, CheckTitleOnlyHeight) {
    139   gfx::Rect bounds(0, 0, 200, 50);
    140   Panel* panel = CreatePanelWithBounds("PanelTest", bounds);
    141 
    142   // Change panel to title-only and check its height.
    143   panel->SetExpansionState(Panel::TITLE_ONLY);
    144   WaitForBoundsAnimationFinished(panel);
    145   EXPECT_EQ(panel->TitleOnlyHeight(), panel->GetBounds().height());
    146   EXPECT_EQ(0, GetPanelView(panel)->height()); // client area height.
    147 
    148   panel->Close();
    149 }
    150 
    151 IN_PROC_BROWSER_TEST_F(PanelViewTest, CheckMinimizedHeight) {
    152   gfx::Rect bounds(0, 0, 200, 50);
    153   Panel* panel = CreatePanelWithBounds("PanelTest", bounds);
    154 
    155   // Change panel to minimized and check its height.
    156   panel->SetExpansionState(Panel::MINIMIZED);
    157   WaitForBoundsAnimationFinished(panel);
    158   EXPECT_EQ(panel::kMinimizedPanelHeight, panel->GetBounds().height());
    159   EXPECT_EQ(0, GetPanelView(panel)->height()); // client area height.
    160 
    161   panel->Close();
    162 }
    163