15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/panels/base_panel_browser_test.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/panels/panel.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/panels/panel_constants.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/views/panels/panel_frame_view.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/panels/panel_view.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/tab_icon_view.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/image_button.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/menu_button.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/link.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/textfield/textfield.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/win/hwnd_util.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BasePanelBrowserTest now creates refactored Panels. Refactor 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// has only been done for Mac panels so far. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PanelViewTest : public BasePanelBrowserTest { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PanelViewTest() : BasePanelBrowserTest() { } 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PanelView* GetPanelView(Panel* panel) const { 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return static_cast<PanelView*>(panel->native_panel()); 3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PanelViewTest, ActivePanelWindowProperties) { 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreatePanelParams params("1", gfx::Rect(0, 0, 200, 150), SHOW_AS_ACTIVE); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Panel* panel = CreatePanelWithParams(params); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(panel->IsActive()); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Validate window styles. We want to ensure that the window is created 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with expected styles regardless of its active state. 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HWND native_window = views::HWNDForWidget(GetPanelView(panel)->window()); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG styles = ::GetWindowLong(native_window, GWL_STYLE); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, styles & WS_MAXIMIZEBOX); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, styles & WS_MINIMIZEBOX); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG ext_styles = ::GetWindowLong(native_window, GWL_EXSTYLE); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(WS_EX_TOPMOST, ext_styles & WS_EX_TOPMOST); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECT window_rect; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(::GetWindowRect(native_window, &window_rect)); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, window_rect.right - window_rect.left); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(150, window_rect.bottom - window_rect.top); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(::IsWindowVisible(native_window)); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panel->Close(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PanelViewTest, InactivePanelWindowProperties) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreatePanelParams params("1", gfx::Rect(0, 0, 200, 150), SHOW_AS_INACTIVE); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Panel* panel = CreatePanelWithParams(params); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(panel->IsActive()); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Validate window styles. We want to ensure that the window is created 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with expected styles regardless of its active state. 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HWND native_window = views::HWNDForWidget(GetPanelView(panel)->window()); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG styles = ::GetWindowLong(native_window, GWL_STYLE); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, styles & WS_MAXIMIZEBOX); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, styles & WS_MINIMIZEBOX); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG ext_styles = ::GetWindowLong(native_window, GWL_EXSTYLE); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(WS_EX_TOPMOST, ext_styles & WS_EX_TOPMOST); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RECT window_rect; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(::GetWindowRect(native_window, &window_rect)); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, window_rect.right - window_rect.left); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(150, window_rect.bottom - window_rect.top); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(::IsWindowVisible(native_window)); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panel->Close(); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PanelViewTest, PanelLayout) { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a fixed-size panel to avoid possible collapsing of the title 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if the enforced min sizes are too small. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Panel* panel = CreatePanelWithBounds("PanelTest", gfx::Rect(0, 0, 200, 50)); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PanelFrameView* frame_view = GetPanelView(panel)->GetFrameView(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabIconView* title_icon = frame_view->title_icon(); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View* title_text = frame_view->title_label(); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View* close_button = frame_view->close_button(); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View* minimize_button = frame_view->minimize_button(); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View* restore_button = frame_view->restore_button(); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should have icon, text, minimize, restore and close buttons. Only one of 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // minimize and restore buttons are visible. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, frame_view->child_count()); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(frame_view->Contains(title_icon)); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(frame_view->Contains(title_text)); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(frame_view->Contains(close_button)); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(frame_view->Contains(minimize_button)); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(frame_view->Contains(restore_button)); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These controls should be visible. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(title_icon->visible()); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(title_text->visible()); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(close_button->visible()); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(minimize_button->visible()); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(restore_button->visible()); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Validate their layouts. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int titlebar_height = panel::kTitlebarHeight; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(title_icon->width(), 0); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(title_icon->height(), 0); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LT(title_icon->height(), titlebar_height); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(title_text->width(), 0); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(title_text->height(), 0); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LT(title_text->height(), titlebar_height); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(minimize_button->width(), 0); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(minimize_button->height(), 0); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LT(minimize_button->height(), titlebar_height); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(close_button->width(), 0); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(close_button->height(), 0); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LT(close_button->height(), titlebar_height); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LT(title_icon->x() + title_icon->width(), title_text->x()); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LT(title_text->x() + title_text->width(), minimize_button->x()); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LT(minimize_button->x() + minimize_button->width(), close_button->x()); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PanelViewTest, CheckTitleOnlyHeight) { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds(0, 0, 200, 50); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Panel* panel = CreatePanelWithBounds("PanelTest", bounds); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change panel to title-only and check its height. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panel->SetExpansionState(Panel::TITLE_ONLY); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForBoundsAnimationFinished(panel); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(panel->TitleOnlyHeight(), panel->GetBounds().height()); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, GetPanelView(panel)->height()); // client area height. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panel->Close(); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(PanelViewTest, CheckMinimizedHeight) { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds(0, 0, 200, 50); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Panel* panel = CreatePanelWithBounds("PanelTest", bounds); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change panel to minimized and check its height. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panel->SetExpansionState(Panel::MINIMIZED); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForBoundsAnimationFinished(panel); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(panel::kMinimizedPanelHeight, panel->GetBounds().height()); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, GetPanelView(panel)->height()); // client area height. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panel->Close(); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)