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