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)#ifndef CHROME_BROWSER_UI_FULLSCREEN_FULLSCREEN_CONTROLLER_STATE_TEST_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_FULLSCREEN_FULLSCREEN_CONTROLLER_STATE_TEST_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sstream>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FullscreenController;
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FullscreenNotificationObserver;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// Utility definition for mapping enum values to strings in switch statements.
20a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#define ENUM_TO_STRING(enum) case enum: return #enum
21a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
22a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// Test fixture used to test Fullscreen Controller through exhaustive sequences
23a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// of events in unit and interactive tests.
24a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch//
25a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// Because operating system window managers are too unreliable (they result in
26a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// flakiness at around 1 out of 1000 runs) this fixture is designed to be run
27a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// on testing infrastructure in unit tests mocking out the platforms' behavior.
28a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// To verify that behavior interactive tests exist but are left disabled and
29a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// only run manually when verifying the consistency of the
30a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// FullscreenControllerTestWindow.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FullscreenControllerStateTest {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
33a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Events names for FullscreenController methods.
34a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  enum Event {
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    TOGGLE_FULLSCREEN,         // ToggleBrowserFullscreenMode()
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    TOGGLE_FULLSCREEN_CHROME,  // ToggleBrowserFullscreenWithChrome()
37a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    TAB_FULLSCREEN_TRUE,       // ToggleFullscreenModeForTab(, true)
38a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    TAB_FULLSCREEN_FALSE,      // ToggleFullscreenModeForTab(, false)
39a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    METRO_SNAP_TRUE,           // SetMetroSnapMode(true)
40a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    METRO_SNAP_FALSE,          // SetMetroSnapMode(false)
41a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    BUBBLE_EXIT_LINK,          // ExitTabOrBrowserFullscreenToPreviousState()
42a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    BUBBLE_ALLOW,              // OnAcceptFullscreenPermission()
43a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    BUBBLE_DENY,               // OnDenyFullscreenPermission()
44a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    WINDOW_CHANGE,             // ChangeWindowFullscreenState()
45a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    NUM_EVENTS,
46a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    EVENT_INVALID,
47a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  };
48a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
49a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Conceptual states of the Fullscreen Controller, these do not correspond
50a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // to particular implemenation details.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum State {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The window is not in fullscreen.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_NORMAL,
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // User-initiated fullscreen.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_BROWSER_FULLSCREEN_NO_CHROME,
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Mac User-initiated 'Lion Fullscreen' with browser chrome. OSX 10.7+ only.
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    STATE_BROWSER_FULLSCREEN_WITH_CHROME,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Windows 8 Metro Snap mode, which puts the window at 20% screen-width.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // No TO_ state for Metro, as the windows implementation is only reentrant.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_METRO_SNAP,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // HTML5 tab-initiated fullscreen.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_TAB_FULLSCREEN,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Both tab and browser fullscreen.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_TAB_BROWSER_FULLSCREEN,
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Both tab and browser fullscreen, displayed without chrome, but exits tab
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // fullscreen to STATE_BROWSER_FULLSCREEN_WITH_CHROME.
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    STATE_TAB_BROWSER_FULLSCREEN_CHROME,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TO_ states are asynchronous states waiting for window state change
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // before transitioning to their named state.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_TO_NORMAL,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_TO_BROWSER_FULLSCREEN_NO_CHROME,
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    STATE_TO_BROWSER_FULLSCREEN_WITH_CHROME,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_TO_TAB_FULLSCREEN,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NUM_STATES,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_INVALID,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  static const int kMaxStateNameLength = 39;
79a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  static const int kMaxEventNameLength = 24;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FullscreenControllerStateTest();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~FullscreenControllerStateTest();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* GetStateString(State state);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* GetEventString(Event event);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
87a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Returns true if FullscreenController::WindowFullscreenStateChanged()
88a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // will be called and re-enter FullscreenController before
89a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // FullscreenController methods complete.
90a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  static bool IsWindowFullscreenStateChangedReentrant();
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns true if |state| can be persistent. This is true for all of the
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // states without "_TO_" in their name.
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static bool IsPersistentState(State state);
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Causes Fullscreen Controller to transition to an arbitrary state.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TransitionToState(State state);
98a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Makes one state change to approach |destination_state| via shortest path.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if a state change is made.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Repeated calls are needed to reach the destination.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool TransitionAStepTowardState(State destination_state);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
104a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Calls FullscreenController::ChangeWindowFullscreenState if needed because
105a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // a mock BrowserWindow is being used.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ChangeWindowFullscreenState() {}
107a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
108a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Returns a description of the window's state, may return NULL.
109a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // FullscreenControllerStateTest owns the returned pointer.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const char* GetWindowStateString();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Causes the |event| to occur and return true on success.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool InvokeEvent(Event event);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks that window state matches the expected controller state.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void VerifyWindowState();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Wait for NOTIFICATION_FULLSCREEN_CHANGED if a notification should have been
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // sent in transitioning to |state_| from the previous persistent state.
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void MaybeWaitForNotification();
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tests all states with all permutations of multiple events to detect
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // lingering state issues that would bleed over to other states.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // I.E. for each state test all combinations of events E1, E2, E3.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This produces coverage for event sequences that may happen normally but
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // would not be exposed by traversing to each state via TransitionToState().
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TransitionToState() always takes the same path even when multiple paths
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // exist.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestTransitionsForEachState();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Log transition_table_ to a string for debugging.
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string GetTransitionTableAsString() const;
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Log state_transitions_ to a string for debugging.
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string GetStateTransitionsAsString() const;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
138a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Set of enumerations (created with a helper macro) for _FALSE, _TRUE, and
139a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // _NO_EXPECTATION values to be passed to VerifyWindowStateExpectations().
140a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  #define EXPECTATION_ENUM(enum_name, enum_prefix) \
141a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      enum enum_name { \
142a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        enum_prefix##_FALSE, \
143a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        enum_prefix##_TRUE, \
144a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        enum_prefix##_NO_EXPECTATION \
145a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      }
146a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECTATION_ENUM(FullscreenWithChromeExpectation, FULLSCREEN_WITH_CHROME);
147a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECTATION_ENUM(FullscreenWithoutChromeExpectation,
148a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                   FULLSCREEN_WITHOUT_CHROME);
149a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECTATION_ENUM(FullscreenForBrowserExpectation, FULLSCREEN_FOR_BROWSER);
150a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECTATION_ENUM(FullscreenForTabExpectation, FULLSCREEN_FOR_TAB);
151a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECTATION_ENUM(InMetroSnapExpectation, IN_METRO_SNAP);
152a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generated information about the transitions between states.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct StateTransitionInfo {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StateTransitionInfo()
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : event(EVENT_INVALID),
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          state(STATE_INVALID),
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          distance(NUM_STATES) {}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Event event;  // The |Event| that will cause the state transition.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    State state;  // The adjacent |State| transitioned to; not the final state.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int distance;  // Steps to final state. NUM_STATES represents unknown.
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns next transition info for shortest path from source to destination.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StateTransitionInfo NextTransitionInShortestPath(State source,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   State destination,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   int search_limit);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
169a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Returns a detailed log of what FullscreenControllerStateTest has done
170a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // up to this point, to be reported when tests fail.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string GetAndClearDebugLog();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns true if the |state| & |event| pair should be skipped.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ShouldSkipStateAndEventPair(State state, Event event);
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns true if a test should be skipped entirely, e.g. due to platform.
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool ShouldSkipTest(State state, Event event);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs one test of transitioning to a state and invoking an event.
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void TestStateAndEvent(State state, Event event);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
182a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Checks that window state matches the expected controller state.
183a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  virtual void VerifyWindowStateExpectations(
184a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      FullscreenWithChromeExpectation fullscreen_with_chrome,
185a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      FullscreenWithoutChromeExpectation fullscreen_without_chrome,
186a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      FullscreenForBrowserExpectation fullscreen_for_browser,
187a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      FullscreenForTabExpectation fullscreen_for_tab,
188a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      InMetroSnapExpectation in_metro_snap);
189a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
190a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual Browser* GetBrowser() = 0;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FullscreenController* GetFullscreenController();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
194a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // The state the FullscreenController is expected to be in.
195a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  State state() const { return state_; }
196a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
197a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch private:
198a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // The state the FullscreenController is expected to be in.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  State state_;
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The state when the previous NOTIFICATION_FULLSCREEN_CHANGED notification
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // was received.
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  State last_notification_received_state_;
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Listens for the NOTIFICATION_FULLSCREEN_CHANGED notification.
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<FullscreenNotificationObserver> fullscreen_notification_observer_;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Human defined |State| that results given each [state][event] pair.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  State transition_table_[NUM_STATES][NUM_EVENTS];
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generated information about the transitions between states [from][to].
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // View generated data with: out/Release/unit_tests
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //     --gtest_filter="FullscreenController*DebugLogStateTables"
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //     --gtest_also_run_disabled_tests
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StateTransitionInfo state_transitions_[NUM_STATES][NUM_STATES];
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Log of operations reported on errors via GetAndClearDebugLog().
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::ostringstream debugging_log_;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FullscreenControllerStateTest);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_FULLSCREEN_FULLSCREEN_CONTROLLER_STATE_TEST_H_
224