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 "build/build_config.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/fullscreen/fullscreen_controller.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/fullscreen/fullscreen_controller_state_test.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/tabs/tab_strip_model.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/browser_with_test_window_test.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The FullscreenControllerStateUnitTest unit test suite exhastively tests
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the FullscreenController through all permutations of events. The behavior
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the BrowserWindow is mocked via FullscreenControllerTestWindow.
19a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
20a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
21a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// FullscreenControllerTestWindow ----------------------------------------------
22a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
23a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// A BrowserWindow used for testing FullscreenController. The behavior of this
24a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// mock is verfied manually by running FullscreenControllerStateInteractiveTest.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FullscreenControllerTestWindow : public TestBrowserWindow {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the window state with an enumeration.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum WindowState {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NORMAL,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FULLSCREEN,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // No TO_ state for METRO_SNAP, the windows implementation is synchronous.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    METRO_SNAP,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TO_NORMAL,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TO_FULLSCREEN,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FullscreenControllerTestWindow();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~FullscreenControllerTestWindow() {}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BrowserWindow Interface:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void EnterFullscreen(const GURL& url,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               FullscreenExitBubbleType type) OVERRIDE;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ExitFullscreen() OVERRIDE;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool ShouldHideUIForFullscreen() const OVERRIDE;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsFullscreen() const OVERRIDE;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetMetroSnapMode(bool enable) OVERRIDE;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsInMetroSnapMode() const OVERRIDE;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void EnterFullscreenWithChrome() OVERRIDE;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool IsFullscreenWithChrome() OVERRIDE;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool IsFullscreenWithoutChrome() OVERRIDE;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* GetWindowStateString(WindowState state);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowState state() const { return state_; }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_browser(Browser* browser) { browser_ = browser; }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulates the window changing state.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ChangeWindowFullscreenState();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Enters fullscreen with |new_mac_with_chrome_mode|.
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void EnterFullscreen(bool new_mac_with_chrome_mode);
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns true if ChangeWindowFullscreenState() should be called as a result
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // of updating the current fullscreen state to the passed in state.
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool IsTransitionReentrant(bool new_fullscreen,
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             bool new_mac_with_chrome_mode);
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowState state_;
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool mac_with_chrome_mode_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FullscreenControllerTestWindow::FullscreenControllerTestWindow()
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : state_(NORMAL),
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      mac_with_chrome_mode_(false),
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      browser_(NULL) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FullscreenControllerTestWindow::EnterFullscreen(
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url, FullscreenExitBubbleType type) {
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EnterFullscreen(false);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FullscreenControllerTestWindow::ExitFullscreen() {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsFullscreen()) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_ = TO_NORMAL;
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mac_with_chrome_mode_ = false;
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (IsTransitionReentrant(false, false))
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ChangeWindowFullscreenState();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool FullscreenControllerTestWindow::ShouldHideUIForFullscreen() const {
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsFullscreen();
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FullscreenControllerTestWindow::IsFullscreen() const {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return state_ == FULLSCREEN || state_ == TO_FULLSCREEN;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return state_ == FULLSCREEN || state_ == TO_NORMAL;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FullscreenControllerTestWindow::SetMetroSnapMode(bool enable) {
112a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  if (enable != IsInMetroSnapMode())
113a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    state_ = enable ? METRO_SNAP : NORMAL;
114a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
115a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  if (FullscreenControllerStateTest::IsWindowFullscreenStateChangedReentrant())
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ChangeWindowFullscreenState();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FullscreenControllerTestWindow::IsInMetroSnapMode() const {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return state_ == METRO_SNAP;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FullscreenControllerTestWindow::EnterFullscreenWithChrome() {
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EnterFullscreen(true);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool FullscreenControllerTestWindow::IsFullscreenWithChrome() {
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsFullscreen() && mac_with_chrome_mode_;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool FullscreenControllerTestWindow::IsFullscreenWithoutChrome() {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsFullscreen() && !mac_with_chrome_mode_;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* FullscreenControllerTestWindow::GetWindowStateString(
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WindowState state) {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (state) {
142a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    ENUM_TO_STRING(NORMAL);
143a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    ENUM_TO_STRING(FULLSCREEN);
144a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    ENUM_TO_STRING(METRO_SNAP);
145a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    ENUM_TO_STRING(TO_FULLSCREEN);
146a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    ENUM_TO_STRING(TO_NORMAL);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "No string for state " << state;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "WindowState-Unknown";
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FullscreenControllerTestWindow::ChangeWindowFullscreenState() {
154a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Most states result in "no operation" intentionally. The tests
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // assume that all possible states and event pairs can be tested, even
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // though window managers will not generate all of these.
157a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  if (state_ == TO_FULLSCREEN)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_ = FULLSCREEN;
159a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  else if (state_ == TO_NORMAL)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_ = NORMAL;
161a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Emit a change event from every state to ensure the Fullscreen Controller
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // handles it in all circumstances.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_->WindowFullscreenStateChanged();
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FullscreenControllerTestWindow::EnterFullscreen(
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool new_mac_with_chrome_mode) {
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool reentrant = IsTransitionReentrant(true, new_mac_with_chrome_mode);
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mac_with_chrome_mode_ = new_mac_with_chrome_mode;
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!IsFullscreen())
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    state_ = TO_FULLSCREEN;
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (reentrant)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChangeWindowFullscreenState();
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool FullscreenControllerTestWindow::IsTransitionReentrant(
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool new_fullscreen,
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool new_mac_with_chrome_mode) {
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_MACOSX)
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool mac_with_chrome_mode_changed = new_mac_with_chrome_mode ?
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IsFullscreenWithoutChrome() : IsFullscreenWithChrome();
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool mac_with_chrome_mode_changed = false;
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool fullscreen_changed = (new_fullscreen != IsFullscreen());
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!fullscreen_changed && !mac_with_chrome_mode_changed)
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
193a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  if (FullscreenControllerStateTest::IsWindowFullscreenStateChangedReentrant())
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // BrowserWindowCocoa::EnterFullscreen() and
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // BrowserWindowCocoa::EnterFullscreenWithChrome() are reentrant when
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // switching between fullscreen with chrome and fullscreen without chrome.
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return state_ == FULLSCREEN &&
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      !fullscreen_changed &&
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      mac_with_chrome_mode_changed;
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
204a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
205a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// FullscreenControllerStateUnitTest -------------------------------------------
206a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
207a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// Unit test fixture testing Fullscreen Controller through its states. Most of
208a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// the test logic comes from FullscreenControllerStateTest.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FullscreenControllerStateUnitTest : public BrowserWithTestWindowTest,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          public FullscreenControllerStateTest {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FullscreenControllerStateUnitTest();
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FullscreenControllerStateTest:
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE;
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual BrowserWindow* CreateBrowserWindow() OVERRIDE;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ChangeWindowFullscreenState() OVERRIDE;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const char* GetWindowStateString() OVERRIDE;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void VerifyWindowState() OVERRIDE;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FullscreenControllerStateTest:
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ShouldSkipStateAndEventPair(State state, Event event) OVERRIDE;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual Browser* GetBrowser() OVERRIDE;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FullscreenControllerTestWindow* window_;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FullscreenControllerStateUnitTest::FullscreenControllerStateUnitTest ()
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : window_(NULL) {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FullscreenControllerStateUnitTest::SetUp() {
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserWithTestWindowTest::SetUp();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->set_browser(browser());
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)BrowserWindow* FullscreenControllerStateUnitTest::CreateBrowserWindow() {
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  window_ = new FullscreenControllerTestWindow();
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return window_;  // BrowserWithTestWindowTest takes ownership.
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FullscreenControllerStateUnitTest::ChangeWindowFullscreenState() {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_->ChangeWindowFullscreenState();
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* FullscreenControllerStateUnitTest::GetWindowStateString() {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return FullscreenControllerTestWindow::GetWindowStateString(window_->state());
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FullscreenControllerStateUnitTest::VerifyWindowState() {
251a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  switch (state()) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STATE_NORMAL:
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(FullscreenControllerTestWindow::NORMAL,
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                window_->state()) << GetAndClearDebugLog();
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
256a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STATE_BROWSER_FULLSCREEN_NO_CHROME:
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case STATE_BROWSER_FULLSCREEN_WITH_CHROME:
259a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    case STATE_TAB_FULLSCREEN:
260a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    case STATE_TAB_BROWSER_FULLSCREEN:
261a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    case STATE_TAB_BROWSER_FULLSCREEN_CHROME:
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(FullscreenControllerTestWindow::FULLSCREEN,
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                window_->state()) << GetAndClearDebugLog();
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
265a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STATE_METRO_SNAP:
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(FullscreenControllerTestWindow::METRO_SNAP,
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                window_->state()) << GetAndClearDebugLog();
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
272a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STATE_TO_NORMAL:
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(FullscreenControllerTestWindow::TO_NORMAL,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                window_->state()) << GetAndClearDebugLog();
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
277a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STATE_TO_BROWSER_FULLSCREEN_NO_CHROME:
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case STATE_TO_BROWSER_FULLSCREEN_WITH_CHROME:
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case STATE_TO_TAB_FULLSCREEN:
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(FullscreenControllerTestWindow::TO_FULLSCREEN,
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                window_->state()) << GetAndClearDebugLog();
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
284a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << GetAndClearDebugLog();
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FullscreenControllerStateTest::VerifyWindowState();
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FullscreenControllerStateUnitTest::ShouldSkipStateAndEventPair(
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    State state, Event event) {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(scheib) Toggle, Window Event, Toggle, Toggle on Mac as exposed by
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // test *.STATE_TO_NORMAL__TOGGLE_FULLSCREEN runs interactively and exits to
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Normal. This doesn't appear to be the desired result, and would add
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // too much complexity to mimic in our simple FullscreenControllerTestWindow.
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://crbug.com/156968
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((state == STATE_TO_NORMAL ||
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       state == STATE_TO_BROWSER_FULLSCREEN_NO_CHROME ||
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       state == STATE_TO_TAB_FULLSCREEN) &&
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event == TOGGLE_FULLSCREEN)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return FullscreenControllerStateTest::ShouldSkipStateAndEventPair(state,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                                    event);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser* FullscreenControllerStateUnitTest::GetBrowser() {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return BrowserWithTestWindowTest::browser();
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
316a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// Soak tests ------------------------------------------------------------------
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests all states with all permutations of multiple events to detect lingering
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// state issues that would bleed over to other states.
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// I.E. for each state test all combinations of events E1, E2, E3.
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This produces coverage for event sequences that may happen normally but
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// would not be exposed by traversing to each state via TransitionToState().
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TransitionToState() always takes the same path even when multiple paths
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// exist.
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(FullscreenControllerStateUnitTest, TransitionsForEachState) {
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A tab is needed for tab fullscreen.
32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddTab(browser(), GURL(content::kAboutBlankURL));
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestTransitionsForEachState();
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Progress of test can be examined via LOG(INFO) << GetAndClearDebugLog();
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
334a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// Individual tests for each pair of state and event ---------------------------
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
336a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#define TEST_EVENT(state, event) \
337a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    TEST_F(FullscreenControllerStateUnitTest, state##__##event) { \
338a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      AddTab(browser(), GURL(content::kAboutBlankURL)); \
339a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      ASSERT_NO_FATAL_FAILURE(TestStateAndEvent(state, event)) \
340a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          << GetAndClearDebugLog(); \
341a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    }
342a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    // Progress of tests can be examined by inserting the following line:
343a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    // LOG(INFO) << GetAndClearDebugLog(); }
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "chrome/browser/ui/fullscreen/fullscreen_controller_state_tests.h"
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
348a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// Specific one-off tests for known issues -------------------------------------
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(scheib) Toggling Tab fullscreen while pending Tab or
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser fullscreen is broken currently http://crbug.com/154196
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FullscreenControllerStateUnitTest,
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       DISABLED_ToggleTabWhenPendingBrowser) {
354a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Only possible without reentrancy.
355a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  if (FullscreenControllerStateTest::IsWindowFullscreenStateChangedReentrant())
356a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    return;
35790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddTab(browser(), GURL(content::kAboutBlankURL));
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TransitionToState(STATE_TO_BROWSER_FULLSCREEN_NO_CHROME))
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << GetAndClearDebugLog();
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(InvokeEvent(TAB_FULLSCREEN_TRUE)) << GetAndClearDebugLog();
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(InvokeEvent(TAB_FULLSCREEN_FALSE)) << GetAndClearDebugLog();
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(InvokeEvent(WINDOW_CHANGE)) << GetAndClearDebugLog();
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(scheib) Toggling Tab fullscreen while pending Tab or
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser fullscreen is broken currently http://crbug.com/154196
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FullscreenControllerStateUnitTest, DISABLED_ToggleTabWhenPendingTab) {
370a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Only possible without reentrancy.
371a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  if (FullscreenControllerStateTest::IsWindowFullscreenStateChangedReentrant())
372a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    return;
37390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddTab(browser(), GURL(content::kAboutBlankURL));
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TransitionToState(STATE_TO_TAB_FULLSCREEN))
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << GetAndClearDebugLog();
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(InvokeEvent(TAB_FULLSCREEN_TRUE)) << GetAndClearDebugLog();
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(InvokeEvent(TAB_FULLSCREEN_FALSE)) << GetAndClearDebugLog();
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(InvokeEvent(WINDOW_CHANGE)) << GetAndClearDebugLog();
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Debugging utility: Display the transition tables. Intentionally disabled
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(FullscreenControllerStateUnitTest, DISABLED_DebugLogStateTables) {
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::ostringstream output;
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  output << "\n\nTransition Table:";
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  output << GetTransitionTableAsString();
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  output << "\n\nInitial transitions:";
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  output << GetStateTransitionsAsString();
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Calculate all transition pairs.
393a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  for (int state1_int = 0; state1_int < NUM_STATES; ++state1_int) {
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    State state1 = static_cast<State>(state1_int);
395a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    for (int state2_int = 0; state2_int < NUM_STATES; ++state2_int) {
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      State state2 = static_cast<State>(state2_int);
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (ShouldSkipStateAndEventPair(state1, EVENT_INVALID) ||
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          ShouldSkipStateAndEventPair(state2, EVENT_INVALID))
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        continue;
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Compute the transition
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (NextTransitionInShortestPath(state1, state2, NUM_STATES).state ==
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          STATE_INVALID) {
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LOG(ERROR) << "Should be skipping state transitions for: "
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            << GetStateString(state1) << " " << GetStateString(state2);
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  output << "\n\nAll transitions:";
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  output << GetStateTransitionsAsString();
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LOG(INFO) << output.str();
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test that the fullscreen exit bubble is closed by
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// WindowFullscreenStateChanged() if fullscreen is exited via BrowserWindow.
416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This currently occurs when an extension exits fullscreen via changing the
417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// browser bounds.
418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(FullscreenControllerStateUnitTest, ExitFullscreenViaBrowserWindow) {
41990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddTab(browser(), GURL(content::kAboutBlankURL));
420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(InvokeEvent(TOGGLE_FULLSCREEN));
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(InvokeEvent(WINDOW_CHANGE));
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(browser()->window()->IsFullscreen());
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Exit fullscreen without going through fullscreen controller.
424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  browser()->window()->ExitFullscreen();
425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ChangeWindowFullscreenState();
426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(FEB_TYPE_NONE,
427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            browser()->fullscreen_controller()->GetFullscreenExitBubbleType());
428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
430eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Test that switching tabs takes the browser out of tab fullscreen.
431eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(FullscreenControllerStateUnitTest, ExitTabFullscreenViaSwitchingTab) {
432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AddTab(browser(), GURL(content::kAboutBlankURL));
433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AddTab(browser(), GURL(content::kAboutBlankURL));
434eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(InvokeEvent(TAB_FULLSCREEN_TRUE));
435eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(InvokeEvent(WINDOW_CHANGE));
436eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(browser()->window()->IsFullscreen());
437eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
438eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  browser()->tab_strip_model()->SelectNextTab();
439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ChangeWindowFullscreenState();
440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(browser()->window()->IsFullscreen());
441eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
442eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Test that switching tabs via detaching the active tab (which is in tab
444eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// fullscreen) takes the browser out of tab fullscreen. This case can
445eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// occur if the user is in both tab fullscreen and immersive browser fullscreen.
446eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(FullscreenControllerStateUnitTest, ExitTabFullscreenViaDetachingTab) {
447eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AddTab(browser(), GURL(content::kAboutBlankURL));
448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AddTab(browser(), GURL(content::kAboutBlankURL));
449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(InvokeEvent(TAB_FULLSCREEN_TRUE));
450eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(InvokeEvent(WINDOW_CHANGE));
451eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(browser()->window()->IsFullscreen());
452eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<content::WebContents> web_contents(
454eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      browser()->tab_strip_model()->DetachWebContentsAt(0));
455eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ChangeWindowFullscreenState();
456eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(browser()->window()->IsFullscreen());
457eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
458eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
459eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Test that replacing the web contents for a tab which is in tab fullscreen
460eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// takes the browser out of tab fullscreen. This can occur if the user
461eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// navigates to a prerendered page from a page which is tab fullscreen.
462eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(FullscreenControllerStateUnitTest, ExitTabFullscreenViaReplacingTab) {
463eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AddTab(browser(), GURL(content::kAboutBlankURL));
464eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(InvokeEvent(TAB_FULLSCREEN_TRUE));
465eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(InvokeEvent(WINDOW_CHANGE));
466eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(browser()->window()->IsFullscreen());
467eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
468eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  content::WebContents* new_web_contents = content::WebContents::Create(
469eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      content::WebContents::CreateParams(profile()));
470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<content::WebContents> old_web_contents(
471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      browser()->tab_strip_model()->ReplaceWebContentsAt(
472eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          0, new_web_contents));
473eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ChangeWindowFullscreenState();
474eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(browser()->window()->IsFullscreen());
475eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
476