immersive_mode_controller_ash_unittest.cc revision f2477e01787aa58f445919b809d89e252beef54f
190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file.
490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/views/frame/immersive_mode_controller_ash.h"
690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ash/root_window_controller.h"
81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ash/shelf/shelf_layout_manager.h"
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ash/shelf/shelf_types.h"
10bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "ash/shell.h"
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ash/test/ash_test_base.h"
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/fullscreen/fullscreen_controller.h"
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/fullscreen/fullscreen_controller_test.h"
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_view.h"
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/views/frame/test_with_browser_view.h"
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/views/frame/top_container_view.h"
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/views/tabs/tab_strip.h"
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/aura/window.h"
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/views/controls/webview/webview.h"
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// For now, immersive fullscreen is Chrome OS only.
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(OS_CHROMEOS)
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ImmersiveModeControllerAshTest : public TestWithBrowserView {
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ImmersiveModeControllerAshTest() {}
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~ImmersiveModeControllerAshTest() {}
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // TestWithBrowserView override:
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    TestWithBrowserView::SetUp();
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    browser()->window()->Show();
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    controller_ = browser_view()->immersive_mode_controller();
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    controller_->SetupForTest();
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Returns the bounds of |view| in widget coordinates.
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Rect GetBoundsInWidget(views::View* view) {
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return view->ConvertRectToWidget(view->GetLocalBounds());
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Toggle the browser's fullscreen state.
481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void ToggleFullscreen() {
491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // NOTIFICATION_FULLSCREEN_CHANGED is sent asynchronously. The notification
501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // is used to trigger changes in whether the shelf is auto hidden and
511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // whether a "light bar" version of the tab strip is used when the
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // top-of-window views are hidden.
531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    scoped_ptr<FullscreenNotificationObserver> waiter(
541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        new FullscreenNotificationObserver());
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    chrome::ToggleFullscreenMode(browser());
561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    waiter->Wait();
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Set whether the browser is in tab fullscreen.
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void SetTabFullscreen(bool tab_fullscreen) {
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    content::WebContents* web_contents =
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        browser_view()->GetContentsWebViewForTest()->GetWebContents();
631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    scoped_ptr<FullscreenNotificationObserver> waiter(
641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        new FullscreenNotificationObserver());
651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    browser()->fullscreen_controller()->ToggleFullscreenModeForTab(
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        web_contents, tab_fullscreen);
671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    waiter->Wait();
681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Attempt revealing the top-of-window views.
711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void AttemptReveal() {
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!revealed_lock_.get()) {
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      revealed_lock_.reset(controller_->GetRevealedLock(
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          ImmersiveModeControllerAsh::ANIMATE_REVEAL_NO));
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Attempt unrevealing the top-of-window views.
791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void AttemptUnreveal() {
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    revealed_lock_.reset();
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ImmersiveModeController* controller() { return controller_; }
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Not owned.
871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ImmersiveModeController* controller_;
881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<ImmersiveRevealedLock> revealed_lock_;
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ImmersiveModeControllerAshTest);
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Test the layout and visibility of the tabstrip, toolbar and TopContainerView
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// in immersive fullscreen.
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ImmersiveModeControllerAshTest, Layout) {
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddTab(browser(), GURL("about:blank"));
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TabStrip* tabstrip = browser_view()->tabstrip();
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ToolbarView* toolbar = browser_view()->toolbar();
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  views::WebView* contents_web_view =
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      browser_view()->GetContentsWebViewForTest();
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Immersive fullscreen starts out disabled.
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_FALSE(browser_view()->GetWidget()->IsFullscreen());
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_FALSE(controller()->IsEnabled());
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // By default, the tabstrip and toolbar should be visible.
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(tabstrip->visible());
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(toolbar->visible());
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ToggleFullscreen();
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(browser_view()->GetWidget()->IsFullscreen());
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(controller()->IsEnabled());
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(controller()->IsRevealed());
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Entering immersive fullscreen should make the tab strip use the immersive
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // style and hide the toolbar.
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(tabstrip->visible());
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(tabstrip->IsImmersiveStyle());
1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(toolbar->visible());
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The tab indicators should be flush with the top of the widget.
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0, GetBoundsInWidget(tabstrip).y());
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The web contents should be immediately below the tab indicators.
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(Tab::GetImmersiveHeight(),
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            GetBoundsInWidget(contents_web_view).y());
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Revealing the top-of-window views should set the tab strip back to the
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // normal style and show the toolbar.
1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AttemptReveal();
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(controller()->IsRevealed());
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(tabstrip->visible());
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(tabstrip->IsImmersiveStyle());
1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(toolbar->visible());
1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The TopContainerView should be flush with the top edge of the widget. If
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // it is not flush with the top edge the immersive reveal animation looks
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // wonky.
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0, GetBoundsInWidget(browser_view()->top_container()).y());
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The web contents should be at the same y position as they were when the
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // top-of-window views were hidden.
1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(Tab::GetImmersiveHeight(),
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            GetBoundsInWidget(contents_web_view).y());
1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Repeat the test for when in both immersive fullscreen and tab fullscreen.
1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetTabFullscreen(true);
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Hide and reveal the top-of-window views so that they get relain out.
1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AttemptUnreveal();
1521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AttemptReveal();
1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The tab strip and toolbar should still be visible and the TopContainerView
1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // should still be flush with the top edge of the widget.
1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(controller()->IsRevealed());
1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(tabstrip->visible());
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(tabstrip->IsImmersiveStyle());
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(toolbar->visible());
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0, GetBoundsInWidget(browser_view()->top_container()).y());
1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The web contents should be flush with the top edge of the widget when in
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // both immersive and tab fullscreen.
1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0, GetBoundsInWidget(contents_web_view).y());
1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Hide the top-of-window views. Both the tab strip and the toolbar should
1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // hide when in both immersive and tab fullscreen.
1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AttemptUnreveal();
1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(controller()->IsRevealed());
1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(tabstrip->visible());
1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(toolbar->visible());
1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The web contents should still be flush with the edge of the widget.
1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0, GetBoundsInWidget(contents_web_view).y());
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Exiting both immersive and tab fullscreen should show the tab strip and
1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // toolbar.
1781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ToggleFullscreen();
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(browser_view()->GetWidget()->IsFullscreen());
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(controller()->IsEnabled());
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(controller()->IsRevealed());
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(tabstrip->visible());
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(tabstrip->IsImmersiveStyle());
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(toolbar->visible());
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Test that the browser commands which are usually disabled in fullscreen are
1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// are enabled in immersive fullscreen.
189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ImmersiveModeControllerAshTest, EnabledCommands) {
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_FALSE(controller()->IsEnabled());
1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_OPEN_CURRENT_URL));
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_ABOUT));
1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_LOCATION));
1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ToggleFullscreen();
1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(controller()->IsEnabled());
1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_OPEN_CURRENT_URL));
1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_ABOUT));
1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_LOCATION));
2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Test that restoring a window properly exits immersive fullscreen.
203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ImmersiveModeControllerAshTest, ExitUponRestore) {
2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_FALSE(controller()->IsEnabled());
2051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ToggleFullscreen();
2061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AttemptReveal();
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(controller()->IsEnabled());
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(controller()->IsRevealed());
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(browser_view()->GetWidget()->IsFullscreen());
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  browser_view()->GetWidget()->Restore();
2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(controller()->IsEnabled());
2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Test how being simultaneously in tab fullscreen and immersive fullscreen
2161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// affects the shelf visibility and whether the tab indicators are hidden.
217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ImmersiveModeControllerAshTest, TabAndBrowserFullscreen) {
2181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AddTab(browser(), GURL("about:blank"));
2191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // The shelf should start out as visible.
2211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ash::internal::ShelfLayoutManager* shelf =
2221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ash::Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager();
2231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_EQ(ash::SHELF_VISIBLE, shelf->visibility_state());
2241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // 1) Test that entering tab fullscreen from immersive fullscreen hides the
2261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // tab indicators and the shelf.
2271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ToggleFullscreen();
2281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(controller()->IsEnabled());
2291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(ash::SHELF_AUTO_HIDE, shelf->visibility_state());
2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(controller()->ShouldHideTabIndicators());
2311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetTabFullscreen(true);
2331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(controller()->IsEnabled());
2341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(ash::SHELF_HIDDEN, shelf->visibility_state());
2351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(controller()->ShouldHideTabIndicators());
2361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // 2) Test that exiting tab fullscreen shows the tab indicators and autohides
2381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // the shelf.
2391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetTabFullscreen(false);
2401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(controller()->IsEnabled());
2411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(ash::SHELF_AUTO_HIDE, shelf->visibility_state());
2421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(controller()->ShouldHideTabIndicators());
2431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // 3) Test that exiting tab fullscreen and immersive fullscreen
2451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // simultaneously correctly updates the shelf visibility and whether the tab
2461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // indicators should be hidden.
2471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SetTabFullscreen(true);
2481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ToggleFullscreen();
2491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_FALSE(controller()->IsEnabled());
2501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(ash::SHELF_VISIBLE, shelf->visibility_state());
2511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(controller()->ShouldHideTabIndicators());
2521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif  // defined(OS_CHROMEOS)
255