browser_non_client_frame_view_ash_browsertest.cc revision f2477e01787aa58f445919b809d89e252beef54f
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"
9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ash/wm/caption_buttons/frame_caption_button_container_view.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/ui/fullscreen/fullscreen_controller.h"
14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/ui/fullscreen/fullscreen_controller_test.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_view.h"
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/ui/views/frame/immersive_mode_controller.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/compositor/scoped_animation_duration_scale_mode.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using views::Widget;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef InProcessBrowserTest BrowserNonClientFrameViewAshTest;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewAshTest, NonClientHitTest) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We know we're using Views, so static cast.
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserView* browser_view = static_cast<BrowserView*>(browser()->window());
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Widget* widget = browser_view->GetWidget();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We know we're using Ash, so static cast.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserNonClientFrameViewAsh* frame_view =
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<BrowserNonClientFrameViewAsh*>(
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          widget->non_client_view()->frame_view());
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Click on the top edge of a restored window hits the top edge resize handle.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kWindowWidth = 300;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kWindowHeight = 290;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->SetBounds(gfx::Rect(10, 10, kWindowWidth, kWindowHeight));
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point top_edge(kWindowWidth / 2, 0);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HTTOP, frame_view->NonClientHitTest(top_edge));
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Click just below the resize handle hits the caption.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point below_resize(kWindowWidth / 2, ash::kResizeInsideBoundsSize);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HTCAPTION, frame_view->NonClientHitTest(below_resize));
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Click in the top edge of a maximized window now hits the client area,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // because we want it to fall through to the tab strip and select a tab.
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  widget->Maximize();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HTCLIENT, frame_view->NonClientHitTest(top_edge));
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Test that the frame view does not do any painting in non-immersive
53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// fullscreen.
54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewAshTest,
55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                       NonImmersiveFullscreen) {
56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // We know we're using Views, so static cast.
57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  BrowserView* browser_view = static_cast<BrowserView*>(browser()->window());
58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  content::WebContents* web_contents = browser_view->GetActiveWebContents();
59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  Widget* widget = browser_view->GetWidget();
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // We know we're using Ash, so static cast.
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  BrowserNonClientFrameViewAsh* frame_view =
62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      static_cast<BrowserNonClientFrameViewAsh*>(
63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          widget->non_client_view()->frame_view());
64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Frame paints by default.
66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(frame_view->ShouldPaint());
67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // No painting should occur in non-immersive fullscreen. (We enter into tab
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // fullscreen here because tab fullscreen is non-immersive even on ChromeOS).
70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // NOTIFICATION_FULLSCREEN_CHANGED is sent asynchronously.
72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    scoped_ptr<FullscreenNotificationObserver> waiter(
73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        new FullscreenNotificationObserver());
74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    browser()->fullscreen_controller()->ToggleFullscreenModeForTab(
75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        web_contents, true);
76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    waiter->Wait();
77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(browser_view->immersive_mode_controller()->IsEnabled());
79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(frame_view->ShouldPaint());
80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The client view abuts top of the window.
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0, frame_view->NonClientTopBorderHeight());
83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // The frame should be painted again when fullscreen is exited and the caption
85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // buttons should be visible.
86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    scoped_ptr<FullscreenNotificationObserver> waiter(
88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        new FullscreenNotificationObserver());
89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    chrome::ToggleFullscreenMode(browser());
90a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    waiter->Wait();
91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(frame_view->ShouldPaint());
93424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_TRUE(frame_view->caption_button_container_->visible());
94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewAshTest, ImmersiveFullscreen) {
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We know we're using Views, so static cast.
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserView* browser_view = static_cast<BrowserView*>(browser()->window());
991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  content::WebContents* web_contents = browser_view->GetActiveWebContents();
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Widget* widget = browser_view->GetWidget();
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We know we're using Ash, so static cast.
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserNonClientFrameViewAsh* frame_view =
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<BrowserNonClientFrameViewAsh*>(
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          widget->non_client_view()->frame_view());
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ImmersiveModeController* immersive_mode_controller =
1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      browser_view->immersive_mode_controller();
1081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  immersive_mode_controller->SetupForTest();
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Immersive mode starts disabled.
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_FALSE(widget->IsFullscreen());
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(immersive_mode_controller->IsEnabled());
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Frame paints by default.
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(frame_view->ShouldPaint());
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Enter both browser fullscreen and tab fullscreen. Entering browser
1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // fullscreen should enable immersive fullscreen.
1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  {
1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // NOTIFICATION_FULLSCREEN_CHANGED is sent asynchronously.
1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    scoped_ptr<FullscreenNotificationObserver> waiter(
1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        new FullscreenNotificationObserver());
1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    chrome::ToggleFullscreenMode(browser());
1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    waiter->Wait();
1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  {
1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    scoped_ptr<FullscreenNotificationObserver> waiter(
1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        new FullscreenNotificationObserver());
1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    browser()->fullscreen_controller()->ToggleFullscreenModeForTab(
1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        web_contents, true);
1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    waiter->Wait();
1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(immersive_mode_controller->IsEnabled());
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // An immersive reveal shows the buttons and the top of the frame.
1361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<ImmersiveRevealedLock> revealed_lock(
1371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      immersive_mode_controller->GetRevealedLock(
1381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          ImmersiveModeController::ANIMATE_REVEAL_NO));
139a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(immersive_mode_controller->IsRevealed());
140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(frame_view->ShouldPaint());
141424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_TRUE(frame_view->caption_button_container_->visible());
142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(frame_view->UseShortHeader());
143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(frame_view->UseImmersiveLightbarHeaderStyle());
144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // End the reveal. When in both immersive browser fullscreen and tab
1461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // fullscreen, the tab lightbars should not be painted.
1471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  revealed_lock.reset();
148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(immersive_mode_controller->IsRevealed());
149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(frame_view->ShouldPaint());
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Repeat test but without tab fullscreen. The tab lightbars should now show
1521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // when the top-of-window views are not revealed.
1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  {
1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    scoped_ptr<FullscreenNotificationObserver> waiter(
1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        new FullscreenNotificationObserver());
1561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    browser()->fullscreen_controller()->ToggleFullscreenModeForTab(
1571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        web_contents, false);
1581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    waiter->Wait();
1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Immersive reveal should have same behavior as before.
1621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  revealed_lock.reset(immersive_mode_controller->GetRevealedLock(
1631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ImmersiveModeController::ANIMATE_REVEAL_NO));
164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(immersive_mode_controller->IsRevealed());
165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(frame_view->ShouldPaint());
166424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_TRUE(frame_view->caption_button_container_->visible());
167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(frame_view->UseShortHeader());
168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(frame_view->UseImmersiveLightbarHeaderStyle());
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
170a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Ending the reveal should hide the caption buttons and the header should
171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // be in the lightbar style.
1721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  revealed_lock.reset();
173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(frame_view->ShouldPaint());
174424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_FALSE(frame_view->caption_button_container_->visible());
175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(frame_view->UseShortHeader());
176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(frame_view->UseImmersiveLightbarHeaderStyle());
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Exiting immersive fullscreen should make the caption buttons and the frame
1791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // visible again.
1801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  {
1811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    scoped_ptr<FullscreenNotificationObserver> waiter(
1821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        new FullscreenNotificationObserver());
1831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    browser_view->ExitFullscreen();
1841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    waiter->Wait();
1851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(immersive_mode_controller->IsEnabled());
187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(frame_view->ShouldPaint());
188424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_TRUE(frame_view->caption_button_container_->visible());
189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(frame_view->UseImmersiveLightbarHeaderStyle());
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
191