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/views/frame/browser_non_client_frame_view_ash.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/ash_constants.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/ash_switches.h"
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/frame/caption_buttons/frame_caption_button_container_view.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/frame/header_painter.h"
11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ash/shell.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ash/wm/maximize_mode/maximize_mode_controller.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/ui/fullscreen/fullscreen_controller.h"
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/ui/fullscreen/fullscreen_controller_test.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_view.h"
191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/ui/views/frame/immersive_mode_controller.h"
20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/views/tabs/tab.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/compositor/scoped_animation_duration_scale_mode.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using views::Widget;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)typedef InProcessBrowserTest BrowserNonClientFrameViewAshTest;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewAshTest, NonClientHitTest) {
31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser());
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Widget* widget = browser_view->GetWidget();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We know we're using Ash, so static cast.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserNonClientFrameViewAsh* frame_view =
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<BrowserNonClientFrameViewAsh*>(
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          widget->non_client_view()->frame_view());
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Click on the top edge of a restored window hits the top edge resize handle.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kWindowWidth = 300;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kWindowHeight = 290;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->SetBounds(gfx::Rect(10, 10, kWindowWidth, kWindowHeight));
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point top_edge(kWindowWidth / 2, 0);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HTTOP, frame_view->NonClientHitTest(top_edge));
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Click just below the resize handle hits the caption.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point below_resize(kWindowWidth / 2, ash::kResizeInsideBoundsSize);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HTCAPTION, frame_view->NonClientHitTest(below_resize));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Click in the top edge of a maximized window now hits the client area,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // because we want it to fall through to the tab strip and select a tab.
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  widget->Maximize();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HTCLIENT, frame_view->NonClientHitTest(top_edge));
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Test that the frame view does not do any painting in non-immersive
56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// fullscreen.
57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewAshTest,
58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                       NonImmersiveFullscreen) {
59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser());
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  content::WebContents* web_contents = browser_view->GetActiveWebContents();
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  Widget* widget = browser_view->GetWidget();
62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // We know we're using Ash, so static cast.
63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  BrowserNonClientFrameViewAsh* frame_view =
64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      static_cast<BrowserNonClientFrameViewAsh*>(
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          widget->non_client_view()->frame_view());
66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Frame paints by default.
68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(frame_view->ShouldPaint());
69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // No painting should occur in non-immersive fullscreen. (We enter into tab
711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // fullscreen here because tab fullscreen is non-immersive even on ChromeOS).
72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // NOTIFICATION_FULLSCREEN_CHANGED is sent asynchronously.
74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    scoped_ptr<FullscreenNotificationObserver> waiter(
75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        new FullscreenNotificationObserver());
76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    browser()->fullscreen_controller()->ToggleFullscreenModeForTab(
77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        web_contents, true);
78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    waiter->Wait();
79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(browser_view->immersive_mode_controller()->IsEnabled());
81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(frame_view->ShouldPaint());
82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The client view abuts top of the window.
84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(0, frame_view->GetBoundsForClientView().y());
85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // The frame should be painted again when fullscreen is exited and the caption
87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // buttons should be visible.
88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    scoped_ptr<FullscreenNotificationObserver> waiter(
90a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        new FullscreenNotificationObserver());
91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    chrome::ToggleFullscreenMode(browser());
92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    waiter->Wait();
93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(frame_view->ShouldPaint());
95424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_TRUE(frame_view->caption_button_container_->visible());
96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// TODO(zturner): Change this to USE_ASH after fixing the test on Windows.
99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_CHROMEOS)
100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewAshTest, ImmersiveFullscreen) {
101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser());
1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  content::WebContents* web_contents = browser_view->GetActiveWebContents();
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Widget* widget = browser_view->GetWidget();
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We know we're using Ash, so static cast.
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserNonClientFrameViewAsh* frame_view =
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<BrowserNonClientFrameViewAsh*>(
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          widget->non_client_view()->frame_view());
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ImmersiveModeController* immersive_mode_controller =
1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      browser_view->immersive_mode_controller();
1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  immersive_mode_controller->SetupForTest();
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Immersive fullscreen starts disabled.
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_FALSE(widget->IsFullscreen());
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(immersive_mode_controller->IsEnabled());
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Frame paints by default.
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(frame_view->ShouldPaint());
119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_LT(Tab::GetImmersiveHeight(),
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            frame_view->header_painter_->GetHeaderHeightForPainting());
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Enter both browser fullscreen and tab fullscreen. Entering browser
1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // fullscreen should enable immersive fullscreen.
1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  {
1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // NOTIFICATION_FULLSCREEN_CHANGED is sent asynchronously.
1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    scoped_ptr<FullscreenNotificationObserver> waiter(
1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        new FullscreenNotificationObserver());
1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    chrome::ToggleFullscreenMode(browser());
1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    waiter->Wait();
1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  {
1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    scoped_ptr<FullscreenNotificationObserver> waiter(
1331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        new FullscreenNotificationObserver());
1341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    browser()->fullscreen_controller()->ToggleFullscreenModeForTab(
1351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        web_contents, true);
1361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    waiter->Wait();
1371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(immersive_mode_controller->IsEnabled());
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // An immersive reveal shows the buttons and the top of the frame.
1411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<ImmersiveRevealedLock> revealed_lock(
1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      immersive_mode_controller->GetRevealedLock(
1431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          ImmersiveModeController::ANIMATE_REVEAL_NO));
144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(immersive_mode_controller->IsRevealed());
145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(frame_view->ShouldPaint());
146424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_TRUE(frame_view->caption_button_container_->visible());
147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(frame_view->UseImmersiveLightbarHeaderStyle());
148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // End the reveal. When in both immersive browser fullscreen and tab
1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // fullscreen, the tab lightbars should not be painted.
1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  revealed_lock.reset();
152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(immersive_mode_controller->IsRevealed());
153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(frame_view->ShouldPaint());
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0, frame_view->header_painter_->GetHeaderHeightForPainting());
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Repeat test but without tab fullscreen. The tab lightbars should now show
1571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // when the top-of-window views are not revealed.
1581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  {
1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    scoped_ptr<FullscreenNotificationObserver> waiter(
1601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        new FullscreenNotificationObserver());
1611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    browser()->fullscreen_controller()->ToggleFullscreenModeForTab(
1621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        web_contents, false);
1631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    waiter->Wait();
1641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Immersive reveal should have same behavior as before.
1671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  revealed_lock.reset(immersive_mode_controller->GetRevealedLock(
1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ImmersiveModeController::ANIMATE_REVEAL_NO));
169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(immersive_mode_controller->IsRevealed());
170a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(frame_view->ShouldPaint());
171424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_TRUE(frame_view->caption_button_container_->visible());
172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(frame_view->UseImmersiveLightbarHeaderStyle());
173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_LT(Tab::GetImmersiveHeight(),
174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            frame_view->header_painter_->GetHeaderHeightForPainting());
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Ending the reveal should hide the caption buttons and the header should
177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // be in the lightbar style.
1781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  revealed_lock.reset();
179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(frame_view->ShouldPaint());
180424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_FALSE(frame_view->caption_button_container_->visible());
181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(frame_view->UseImmersiveLightbarHeaderStyle());
182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(Tab::GetImmersiveHeight(),
183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            frame_view->header_painter_->GetHeaderHeightForPainting());
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Exiting immersive fullscreen should make the caption buttons and the frame
1861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // visible again.
1871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  {
1881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    scoped_ptr<FullscreenNotificationObserver> waiter(
1891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        new FullscreenNotificationObserver());
1901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    browser_view->ExitFullscreen();
1911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    waiter->Wait();
1921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(immersive_mode_controller->IsEnabled());
194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(frame_view->ShouldPaint());
195424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_TRUE(frame_view->caption_button_container_->visible());
196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(frame_view->UseImmersiveLightbarHeaderStyle());
197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_LT(Tab::GetImmersiveHeight(),
198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            frame_view->header_painter_->GetHeaderHeightForPainting());
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Tests that FrameCaptionButtonContainer has been relaid out in response to
203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// maximize mode being toggled.
204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochIN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewAshTest,
205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                       ToggleMaximizeModeRelayout) {
206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser());
207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  Widget* widget = browser_view->GetWidget();
208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // We know we're using Ash, so static cast.
209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  BrowserNonClientFrameViewAsh* frame_view =
210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      static_cast<BrowserNonClientFrameViewAsh*>(
211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          widget->non_client_view()->frame_view());
212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const gfx::Rect initial = frame_view->caption_button_container_->bounds();
214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ash::Shell::GetInstance()->maximize_mode_controller()->
215f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      EnableMaximizeModeWindowManager(true);
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ash::FrameCaptionButtonContainerView::TestApi test(frame_view->
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                     caption_button_container_);
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  test.EndAnimations();
219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const gfx::Rect during_maximize = frame_view->caption_button_container_->
220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      bounds();
221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_GT(initial.width(), during_maximize.width());
222f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ash::Shell::GetInstance()->maximize_mode_controller()->
223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      EnableMaximizeModeWindowManager(false);
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  test.EndAnimations();
225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const gfx::Rect after_restore = frame_view->caption_button_container_->
226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      bounds();
227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(initial, after_restore);
228c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
229