diff options
Diffstat (limited to 'chrome/browser/ui/panels/panel_browser_view_browsertest.cc')
-rw-r--r-- | chrome/browser/ui/panels/panel_browser_view_browsertest.cc | 316 |
1 files changed, 221 insertions, 95 deletions
diff --git a/chrome/browser/ui/panels/panel_browser_view_browsertest.cc b/chrome/browser/ui/panels/panel_browser_view_browsertest.cc index 34d8cdc..3a92f69 100644 --- a/chrome/browser/ui/panels/panel_browser_view_browsertest.cc +++ b/chrome/browser/ui/panels/panel_browser_view_browsertest.cc @@ -60,49 +60,105 @@ class PanelBrowserViewTest : public BasePanelBrowserTest { bool is_cursor_in_view_; }; - PanelBrowserView* GetBrowserView(Panel* panel) { + PanelBrowserView* GetBrowserView(Panel* panel) const { return static_cast<PanelBrowserView*>(panel->native_panel()); } - void WaitTillBoundsAnimationFinished(PanelBrowserView* browser_view) { + gfx::Rect GetViewBounds(Panel* panel) const { + return GetBrowserView(panel)->GetBounds(); + } + + void SetViewBounds(Panel* panel, const gfx::Rect& rect) const { + return GetBrowserView(panel)->SetPanelBounds(rect); + } + + HWND GetNativeWindow(Panel* panel) const { + return GetBrowserView(panel)->GetNativeHandle(); + } + + ui::SlideAnimation* GetBoundsAnimator(Panel* panel) const { + return GetBrowserView(panel)->bounds_animator_.get(); + } + + ui::SlideAnimation* GetSettingsButtonAnimator(Panel* panel) const { + return GetBrowserView(panel)->GetFrameView()-> + settings_button_animator_.get(); + } + + int GetTitlebarHeight(Panel* panel) const { + PanelBrowserFrameView* frame_view = GetBrowserView(panel)->GetFrameView(); + return frame_view->NonClientTopBorderHeight() - + frame_view->NonClientBorderThickness(); + } + + MockMouseWatcher* CreateTitlebarMouseWatcher(Panel* panel) { + PanelBrowserFrameView* frame_view = GetBrowserView(panel)->GetFrameView(); + MockMouseWatcher* mouse_watcher = new MockMouseWatcher(frame_view); + frame_view->set_mouse_watcher(mouse_watcher); + return mouse_watcher; + } + + PanelBrowserFrameView::PaintState GetTitlebarPaintState(Panel* panel) const { + return GetBrowserView(panel)->GetFrameView()->paint_state_; + } + + bool IsTitlebarPaintedAsActive(Panel* panel) const { + return GetTitlebarPaintState(panel) == + PanelBrowserFrameView::PAINT_AS_ACTIVE; + } + + bool IsTitlebarPaintedAsInactive(Panel* panel) const { + return GetTitlebarPaintState(panel) == + PanelBrowserFrameView::PAINT_AS_INACTIVE; + } + + bool IsTitlebarPaintedForAttention(Panel* panel) const { + return GetTitlebarPaintState(panel) == + PanelBrowserFrameView::PAINT_FOR_ATTENTION; + } + + int GetControlCount(Panel* panel) const { + return GetBrowserView(panel)->GetFrameView()->child_count(); + } + + TabIconView* GetTitleIcon(Panel* panel) const { + return GetBrowserView(panel)->GetFrameView()->title_icon_; + } + + views::Label* GetTitleText(Panel* panel) const { + return GetBrowserView(panel)->GetFrameView()->title_label_; + } + + views::Button* GetSettingsButton(Panel* panel) const { + return GetBrowserView(panel)->GetFrameView()->settings_button_; + } + + views::Button* GetCloseButton(Panel* panel) const { + return GetBrowserView(panel)->GetFrameView()->close_button_; + } + + bool ContainsControl(Panel* panel, views::View* control) const { + return GetBrowserView(panel)->GetFrameView()->Contains(control); + } + + void WaitTillBoundsAnimationFinished(Panel* panel) { // The timer for the animation will only kick in as async task. - while (browser_view->bounds_animator_->is_animating()) { + while (GetBoundsAnimator(panel)->is_animating()) { MessageLoopForUI::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask()); MessageLoopForUI::current()->RunAllPending(); } } - void WaitTillSettingsAnimationFinished(PanelBrowserFrameView* frame_view) { + void WaitTillSettingsAnimationFinished(Panel* panel) { // The timer for the animation will only kick in as async task. - while (frame_view->settings_button_animator_->is_animating()) { + while (GetSettingsButtonAnimator(panel)->is_animating()) { MessageLoopForUI::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask()); MessageLoopForUI::current()->RunAllPending(); } } - void TestShowPanelActiveOrInactive() { - CreatePanelParams params1("PanelTest1", gfx::Rect(), SHOW_AS_ACTIVE); - Panel* panel1 = CreatePanelWithParams(params1); - PanelBrowserView* browser_view1 = GetBrowserView(panel1); - PanelBrowserFrameView* frame_view1 = browser_view1->GetFrameView(); - EXPECT_TRUE(panel1->IsActive()); - EXPECT_EQ(PanelBrowserFrameView::PAINT_AS_ACTIVE, - frame_view1->paint_state_); - - CreatePanelParams params2("PanelTest2", gfx::Rect(), SHOW_AS_INACTIVE); - Panel* panel2 = CreatePanelWithParams(params2); - PanelBrowserView* browser_view2 = GetBrowserView(panel2); - PanelBrowserFrameView* frame_view2 = browser_view2->GetFrameView(); - EXPECT_FALSE(panel2->IsActive()); - EXPECT_EQ(PanelBrowserFrameView::PAINT_AS_INACTIVE, - frame_view2->paint_state_); - - panel1->Close(); - panel2->Close(); - } - // We put all the testing logic in this class instead of the test so that // we do not need to declare each new test as a friend of PanelBrowserView // for the purpose of accessing its private members. @@ -137,7 +193,7 @@ class PanelBrowserViewTest : public BasePanelBrowserTest { EXPECT_GT(panel1->GetBounds().height(), 0); EXPECT_EQ(expected_bottom_on_minimized, panel1->GetBounds().bottom()); EXPECT_EQ(1, panel_manager->minimized_panel_count()); - WaitTillBoundsAnimationFinished(browser_view1); + WaitTillBoundsAnimationFinished(panel1); EXPECT_FALSE(panel1->IsActive()); panel1->SetExpansionState(Panel::TITLE_ONLY); @@ -145,7 +201,7 @@ class PanelBrowserViewTest : public BasePanelBrowserTest { EXPECT_EQ(titlebar_height, panel1->GetBounds().height()); EXPECT_EQ(expected_bottom_on_unminimized, panel1->GetBounds().bottom()); EXPECT_EQ(1, panel_manager->minimized_panel_count()); - WaitTillBoundsAnimationFinished(browser_view1); + WaitTillBoundsAnimationFinished(panel1); EXPECT_TRUE(frame_view1->close_button_->IsVisible()); EXPECT_TRUE(frame_view1->title_icon_->IsVisible()); EXPECT_TRUE(frame_view1->title_label_->IsVisible()); @@ -155,7 +211,7 @@ class PanelBrowserViewTest : public BasePanelBrowserTest { EXPECT_EQ(initial_height, panel1->GetBounds().height()); EXPECT_EQ(expected_bottom_on_unminimized, panel1->GetBounds().bottom()); EXPECT_EQ(0, panel_manager->minimized_panel_count()); - WaitTillBoundsAnimationFinished(browser_view1); + WaitTillBoundsAnimationFinished(panel1); EXPECT_TRUE(frame_view1->close_button_->IsVisible()); EXPECT_TRUE(frame_view1->title_icon_->IsVisible()); EXPECT_TRUE(frame_view1->title_label_->IsVisible()); @@ -333,73 +389,139 @@ class PanelBrowserViewTest : public BasePanelBrowserTest { // Panel is not supported for Linux view yet. #if !defined(OS_LINUX) || !defined(TOOLKIT_VIEWS) -IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, CreatePanel) { +IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, CreatePanelBasic) { + CreatePanelParams params( + "PanelTest", gfx::Rect(0, 0, 200, 150), SHOW_AS_ACTIVE); + Panel* panel = CreatePanelWithParams(params); + + // Validate basic window properties. +#if defined(OS_WIN) + HWND native_window = GetNativeWindow(panel); + + RECT window_rect; + EXPECT_TRUE(::GetWindowRect(native_window, &window_rect)); + EXPECT_EQ(200, window_rect.right - window_rect.left); + EXPECT_EQ(150, window_rect.bottom - window_rect.top); + + EXPECT_TRUE(::IsWindowVisible(native_window)); +#endif + + panel->Close(); +} + +IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, CreatePanelActive) { + CreatePanelParams params("PanelTest", gfx::Rect(), SHOW_AS_ACTIVE); + Panel* panel = CreatePanelWithParams(params); + + // Validate it is active. + EXPECT_TRUE(panel->IsActive()); + EXPECT_TRUE(IsTitlebarPaintedAsActive(panel)); + + // Validate window styles. We want to ensure that the window is created + // with expected styles regardless of its active state. +#if defined(OS_WIN) + HWND native_window = GetNativeWindow(panel); + + LONG styles = ::GetWindowLong(native_window, GWL_STYLE); + EXPECT_EQ(0, styles & WS_MAXIMIZEBOX); + EXPECT_EQ(0, styles & WS_MINIMIZEBOX); + EXPECT_EQ(0, styles & WS_THICKFRAME); + + LONG ext_styles = ::GetWindowLong(native_window, GWL_EXSTYLE); + EXPECT_EQ(WS_EX_TOPMOST, ext_styles & WS_EX_TOPMOST); +#endif + + panel->Close(); +} + +IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, CreatePanelInactive) { + CreatePanelParams params("PanelTest", gfx::Rect(), SHOW_AS_INACTIVE); + Panel* panel = CreatePanelWithParams(params); + + // Validate it is inactive. + EXPECT_FALSE(panel->IsActive()); + EXPECT_TRUE(IsTitlebarPaintedAsInactive(panel)); + + // Validate window styles. We want to ensure that the window is created + // with expected styles regardless of its active state. +#if defined(OS_WIN) + HWND native_window = GetNativeWindow(panel); + + LONG styles = ::GetWindowLong(native_window, GWL_STYLE); + EXPECT_EQ(0, styles & WS_MAXIMIZEBOX); + EXPECT_EQ(0, styles & WS_MINIMIZEBOX); + EXPECT_EQ(0, styles & WS_THICKFRAME); + + LONG ext_styles = ::GetWindowLong(native_window, GWL_EXSTYLE); + EXPECT_EQ(WS_EX_TOPMOST, ext_styles & WS_EX_TOPMOST); +#endif + + panel->Close(); +} + +IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, PanelLayout) { Panel* panel = CreatePanel("PanelTest"); - PanelBrowserView* browser_view = GetBrowserView(panel); - PanelBrowserFrameView* frame_view = browser_view->GetFrameView(); - // The bounds animation should not be triggered when the panel is up for the - // first time. - EXPECT_FALSE(browser_view->bounds_animator_.get()); + views::View* title_icon = GetTitleIcon(panel); + views::View* title_text = GetTitleText(panel); + views::View* settings_button = GetSettingsButton(panel); + views::View* close_button = GetCloseButton(panel); // We should have icon, text, settings button and close button. - EXPECT_EQ(4, frame_view->child_count()); - EXPECT_TRUE(frame_view->Contains(frame_view->title_icon_)); - EXPECT_TRUE(frame_view->Contains(frame_view->title_label_)); - EXPECT_TRUE(frame_view->Contains(frame_view->settings_button_)); - EXPECT_TRUE(frame_view->Contains(frame_view->close_button_)); + EXPECT_EQ(4, GetControlCount(panel)); + EXPECT_TRUE(ContainsControl(panel, title_icon)); + EXPECT_TRUE(ContainsControl(panel, title_text)); + EXPECT_TRUE(ContainsControl(panel, settings_button)); + EXPECT_TRUE(ContainsControl(panel, close_button)); // These controls should be visible. - EXPECT_TRUE(frame_view->title_icon_->IsVisible()); - EXPECT_TRUE(frame_view->title_label_->IsVisible()); - EXPECT_TRUE(frame_view->close_button_->IsVisible()); + EXPECT_TRUE(title_icon->IsVisible()); + EXPECT_TRUE(title_text->IsVisible()); + EXPECT_TRUE(close_button->IsVisible()); // Validate their layouts. - int titlebar_height = frame_view->NonClientTopBorderHeight() - - frame_view->NonClientBorderThickness(); - EXPECT_GT(frame_view->title_icon_->width(), 0); - EXPECT_GT(frame_view->title_icon_->height(), 0); - EXPECT_LT(frame_view->title_icon_->height(), titlebar_height); - EXPECT_GT(frame_view->title_label_->width(), 0); - EXPECT_GT(frame_view->title_label_->height(), 0); - EXPECT_LT(frame_view->title_label_->height(), titlebar_height); - EXPECT_GT(frame_view->settings_button_->width(), 0); - EXPECT_GT(frame_view->settings_button_->height(), 0); - EXPECT_LT(frame_view->settings_button_->height(), titlebar_height); - EXPECT_GT(frame_view->close_button_->width(), 0); - EXPECT_GT(frame_view->close_button_->height(), 0); - EXPECT_LT(frame_view->close_button_->height(), titlebar_height); - EXPECT_LT(frame_view->title_icon_->x() + frame_view->title_icon_->width(), - frame_view->title_label_->x()); - EXPECT_LT(frame_view->title_label_->x() + frame_view->title_label_->width(), - frame_view->settings_button_->x()); - EXPECT_LT( - frame_view->settings_button_->x() + frame_view->settings_button_->width(), - frame_view->close_button_->x()); - - // Validate that the controls should be updated when the activation state is - // changed. - frame_view->UpdateControlStyles(PanelBrowserFrameView::PAINT_AS_ACTIVE); - SkColor title_label_color1 = frame_view->title_label_->GetColor(); - frame_view->UpdateControlStyles(PanelBrowserFrameView::PAINT_AS_INACTIVE); - SkColor title_label_color2 = frame_view->title_label_->GetColor(); - EXPECT_NE(title_label_color1, title_label_color2); - - panel->Close(); + int titlebar_height = GetTitlebarHeight(panel); + EXPECT_GT(title_icon->width(), 0); + EXPECT_GT(title_icon->height(), 0); + EXPECT_LT(title_icon->height(), titlebar_height); + EXPECT_GT(title_text->width(), 0); + EXPECT_GT(title_text->height(), 0); + EXPECT_LT(title_text->height(), titlebar_height); + EXPECT_GT(settings_button->width(), 0); + EXPECT_GT(settings_button->height(), 0); + EXPECT_LT(settings_button->height(), titlebar_height); + EXPECT_GT(close_button->width(), 0); + EXPECT_GT(close_button->height(), 0); + EXPECT_LT(close_button->height(), titlebar_height); + EXPECT_LT(title_icon->x() + title_icon->width(), title_text->x()); + EXPECT_LT(title_text->x() + title_text->width(), settings_button->x()); + EXPECT_LT(settings_button->x() + settings_button->width(), close_button->x()); } -IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, ShowPanelActiveOrInactive) { - TestShowPanelActiveOrInactive(); +IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, Deactivate) { + // When a panel is created, it should be active at first. + Panel* panel = CreatePanel("PanelTest"); + EXPECT_TRUE(panel->IsActive()); + + // When the panel is deactivated, the appearance of controls should be + // updated. + views::Label* title_text = GetTitleText(panel); + SkColor title_text_color_before = title_text->GetColor(); + + panel->Deactivate(); + EXPECT_FALSE(panel->IsActive()); + + SkColor title_text_color_after = title_text->GetColor(); + EXPECT_NE(title_text_color_before, title_text_color_after); } IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, ShowOrHideSettingsButton) { Panel* panel = CreatePanel("PanelTest"); - PanelBrowserFrameView* frame_view = GetBrowserView(panel)->GetFrameView(); + views::View* settings_button = GetSettingsButton(panel); // Create and hook up the MockMouseWatcher so that we can simulate if the // mouse is over the panel. - MockMouseWatcher* mouse_watcher = new MockMouseWatcher(frame_view); - frame_view->set_mouse_watcher(mouse_watcher); + MockMouseWatcher* mouse_watcher = CreateTitlebarMouseWatcher(panel); // When the panel is created, it is active. Since we cannot programatically // bring the panel back to active state once it is deactivated, we have to @@ -408,40 +530,44 @@ IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, ShowOrHideSettingsButton) { // When the panel is active, the settings button should always be visible. mouse_watcher->MoveMouse(true); - EXPECT_TRUE(frame_view->settings_button_->IsVisible()); + EXPECT_TRUE(settings_button->IsVisible()); mouse_watcher->MoveMouse(false); - EXPECT_TRUE(frame_view->settings_button_->IsVisible()); + EXPECT_TRUE(settings_button->IsVisible()); // When the panel is inactive, the options button is active per the mouse over // the panel or not. panel->Deactivate(); EXPECT_FALSE(panel->IsActive()); - WaitTillSettingsAnimationFinished(frame_view); - EXPECT_FALSE(frame_view->settings_button_->IsVisible()); + WaitTillSettingsAnimationFinished(panel); + EXPECT_FALSE(settings_button->IsVisible()); mouse_watcher->MoveMouse(true); - WaitTillSettingsAnimationFinished(frame_view); - EXPECT_TRUE(frame_view->settings_button_->IsVisible()); + WaitTillSettingsAnimationFinished(panel); + EXPECT_TRUE(settings_button->IsVisible()); mouse_watcher->MoveMouse(false); - WaitTillSettingsAnimationFinished(frame_view); - EXPECT_FALSE(frame_view->settings_button_->IsVisible()); + WaitTillSettingsAnimationFinished(panel); + EXPECT_FALSE(settings_button->IsVisible()); } IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, SetBoundsAnimation) { Panel* panel = CreatePanel("PanelTest"); PanelBrowserView* browser_view = GetBrowserView(panel); + // The bounds animation should not be triggered when the panel is up for the + // first time. + EXPECT_FALSE(GetBoundsAnimator(panel)); + // Validate that animation should be triggered when bounds are changed. - gfx::Rect target_bounds(browser_view->GetBounds()); + gfx::Rect target_bounds(GetViewBounds(panel)); target_bounds.Offset(20, -30); target_bounds.set_width(target_bounds.width() + 100); target_bounds.set_height(target_bounds.height() + 50); - browser_view->SetPanelBounds(target_bounds); - ASSERT_TRUE(browser_view->bounds_animator_.get()); - EXPECT_TRUE(browser_view->bounds_animator_->is_animating()); - EXPECT_NE(browser_view->GetBounds(), target_bounds); - WaitTillBoundsAnimationFinished(browser_view); - EXPECT_EQ(browser_view->GetBounds(), target_bounds); + SetViewBounds(panel, target_bounds); + ASSERT_TRUE(GetBoundsAnimator(panel)); + EXPECT_TRUE(GetBoundsAnimator(panel)->is_animating()); + EXPECT_NE(GetViewBounds(panel), target_bounds); + WaitTillBoundsAnimationFinished(panel); + EXPECT_EQ(GetViewBounds(panel), target_bounds); // Validates that no animation should be triggered for the panel currently // being dragged. @@ -449,7 +575,7 @@ IN_PROC_BROWSER_TEST_F(PanelBrowserViewTest, SetBoundsAnimation) { target_bounds.x(), target_bounds.y())); browser_view->OnTitlebarMouseDragged(gfx::Point( target_bounds.x() + 5, target_bounds.y() + 5)); - EXPECT_FALSE(browser_view->bounds_animator_->is_animating()); + EXPECT_FALSE(GetBoundsAnimator(panel)->is_animating()); browser_view->OnTitlebarMouseCaptureLost(); panel->Close(); |