diff options
| -rw-r--r-- | chrome/browser/ui/fullscreen_controller.cc | 61 | ||||
| -rw-r--r-- | chrome/browser/ui/fullscreen_controller.h | 15 | ||||
| -rw-r--r-- | chrome/browser/ui/fullscreen_controller_interactive_browsertest.cc | 152 | ||||
| -rw-r--r-- | chrome/browser/ui/fullscreen_controller_test.cc | 9 | ||||
| -rw-r--r-- | chrome/browser/ui/fullscreen_controller_test.h | 1 | ||||
| -rw-r--r-- | chrome/test/functional/PYAUTO_TESTS | 2 |
6 files changed, 201 insertions, 39 deletions
diff --git a/chrome/browser/ui/fullscreen_controller.cc b/chrome/browser/ui/fullscreen_controller.cc index 4d90229..7702c65 100644 --- a/chrome/browser/ui/fullscreen_controller.cc +++ b/chrome/browser/ui/fullscreen_controller.cc @@ -39,8 +39,7 @@ FullscreenController::FullscreenController(BrowserWindow* window, tab_fullscreen_accepted_(false), toggled_into_fullscreen_(false), mouse_lock_tab_(NULL), - mouse_lock_state_(MOUSELOCK_NOT_REQUESTED), - cancel_fullscreen_on_navigate_mode_(false) { + mouse_lock_state_(MOUSELOCK_NOT_REQUESTED) { } void FullscreenController::Observe(int type, @@ -116,7 +115,7 @@ void FullscreenController::RequestToLockMouse(WebContents* web_contents, web_contents->GotResponseToLockMouseRequest(false); return; } - mouse_lock_tab_ = TabContents::FromWebContents(web_contents); + SetMouseLockTab(TabContents::FromWebContents(web_contents)); FullscreenExitBubbleType bubble_type = GetFullscreenExitBubbleType(); switch (GetMouseLockSetting(web_contents->GetURL())) { @@ -134,14 +133,14 @@ void FullscreenController::RequestToLockMouse(WebContents* web_contents, mouse_lock_state_ = MOUSELOCK_ACCEPTED; } } else { - mouse_lock_tab_ = NULL; + SetMouseLockTab(NULL); mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED; } } break; case CONTENT_SETTING_BLOCK: web_contents->GotResponseToLockMouseRequest(false); - mouse_lock_tab_ = NULL; + SetMouseLockTab(NULL); mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED; break; case CONTENT_SETTING_ASK: @@ -175,8 +174,7 @@ void FullscreenController::ToggleFullscreenModeForTab(WebContents* web_contents, #endif if (enter_fullscreen) { - fullscreened_tab_ = TabContents::FromWebContents(web_contents); - EnterCancelFullscreenOnNavigateMode(); + SetFullscreenedTab(TabContents::FromWebContents(web_contents)); if (!in_browser_or_tab_fullscreen_mode) { tab_caused_fullscreen_ = true; #if defined(OS_MACOSX) @@ -195,7 +193,6 @@ void FullscreenController::ToggleFullscreenModeForTab(WebContents* web_contents, UpdateFullscreenExitBubbleContent(); } } else { - ExitCancelFullscreenOnNavigateMode(); if (in_browser_or_tab_fullscreen_mode) { if (tab_caused_fullscreen_) { #if defined(OS_MACOSX) @@ -243,7 +240,7 @@ void FullscreenController::ToggleFullscreenModeWithExtension( void FullscreenController::LostMouseLock() { mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED; - mouse_lock_tab_ = NULL; + SetMouseLockTab(NULL); NotifyMouseLockChange(); UpdateFullscreenExitBubbleContent(); } @@ -294,7 +291,7 @@ void FullscreenController::OnAcceptFullscreenPermission( mouse_lock_state_ = MOUSELOCK_ACCEPTED; } else { mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED; - mouse_lock_tab_ = NULL; + SetMouseLockTab(NULL); } NotifyMouseLockChange(); } @@ -327,7 +324,7 @@ void FullscreenController::OnDenyFullscreenPermission( mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED; if (mouse_lock_tab_ && mouse_lock_tab_->web_contents()) mouse_lock_tab_->web_contents()->GotResponseToLockMouseRequest(false); - mouse_lock_tab_ = NULL; + SetMouseLockTab(NULL); NotifyMouseLockChange(); // UpdateFullscreenExitBubbleContent() must be called, but to avoid @@ -373,10 +370,9 @@ FullscreenController::~FullscreenController() {} void FullscreenController::NotifyTabOfExitIfNecessary() { if (fullscreened_tab_) { - ExitCancelFullscreenOnNavigateMode(); RenderViewHost* rvh = fullscreened_tab_->web_contents()->GetRenderViewHost(); - fullscreened_tab_ = NULL; + SetFullscreenedTab(NULL); tab_caused_fullscreen_ = false; tab_fullscreen_accepted_ = false; if (rvh) @@ -387,33 +383,32 @@ void FullscreenController::NotifyTabOfExitIfNecessary() { WebContents* web_contents = mouse_lock_tab_->web_contents(); if (IsMouseLockRequested()) { web_contents->GotResponseToLockMouseRequest(false); + NotifyMouseLockChange(); } else if (web_contents->GetRenderViewHost() && web_contents->GetRenderViewHost()->GetView()) { web_contents->GetRenderViewHost()->GetView()->UnlockMouse(); } - mouse_lock_tab_ = NULL; + SetMouseLockTab(NULL); mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED; } UpdateFullscreenExitBubbleContent(); } -void FullscreenController::EnterCancelFullscreenOnNavigateMode() { - if (cancel_fullscreen_on_navigate_mode_) - return; - cancel_fullscreen_on_navigate_mode_ = true; - registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, - content::Source<content::NavigationController>( - &fullscreened_tab_->web_contents()->GetController())); -} +void FullscreenController::UpdateNotificationRegistrations() { + if (fullscreened_tab_ && mouse_lock_tab_) + DCHECK(fullscreened_tab_ == mouse_lock_tab_); -void FullscreenController::ExitCancelFullscreenOnNavigateMode() { - if (!cancel_fullscreen_on_navigate_mode_) - return; - cancel_fullscreen_on_navigate_mode_ = false; - registrar_.RemoveAll(); -} + TabContents* tab = fullscreened_tab_ ? fullscreened_tab_ : mouse_lock_tab_; + if (tab && registrar_.IsEmpty()) { + registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, + content::Source<content::NavigationController>( + &tab->web_contents()->GetController())); + } else if (!tab && !registrar_.IsEmpty()) { + registrar_.RemoveAll(); + } +} void FullscreenController::ExitTabFullscreenOrMouseLockIfNecessary() { if (tab_caused_fullscreen_) @@ -588,3 +583,13 @@ void FullscreenController::ToggleFullscreenModeInternal(bool for_tab) { // BrowserWindow::EnterFullscreen() asks for bookmark_bar_state_, so we let // the BrowserWindow invoke WindowFullscreenStateChanged when appropriate. } + +void FullscreenController::SetFullscreenedTab(TabContents* tab) { + fullscreened_tab_ = tab; + UpdateNotificationRegistrations(); +} + +void FullscreenController::SetMouseLockTab(TabContents* tab) { + mouse_lock_tab_ = tab; + UpdateNotificationRegistrations(); +} diff --git a/chrome/browser/ui/fullscreen_controller.h b/chrome/browser/ui/fullscreen_controller.h index ef7eac8..e6d26c2 100644 --- a/chrome/browser/ui/fullscreen_controller.h +++ b/chrome/browser/ui/fullscreen_controller.h @@ -119,11 +119,7 @@ class FullscreenController : public base::RefCounted<FullscreenController>, // mode if necessary. void NotifyTabOfExitIfNecessary(); - // Makes the browser exit fullscreen mode when a navigation occurs. - void EnterCancelFullscreenOnNavigateMode(); - - // Makes the browser no longer exit fullscreen mode when a navigation occurs. - void ExitCancelFullscreenOnNavigateMode(); + void UpdateNotificationRegistrations(); // Make the current tab exit fullscreen mode or mouse lock if it is in it. void ExitTabFullscreenOrMouseLockIfNecessary(); @@ -139,12 +135,16 @@ class FullscreenController : public base::RefCounted<FullscreenController>, // TODO(koz): Change |for_tab| to an enum. void ToggleFullscreenModeInternal(bool for_tab); + void SetFullscreenedTab(TabContents* tab); + void SetMouseLockTab(TabContents* tab); + BrowserWindow* window_; Profile* profile_; Browser* browser_; // If there is currently a tab in fullscreen mode (entered via // webkitRequestFullScreen), this is its TabContents. + // Assign using SetFullscreenedTab(). TabContents* fullscreened_tab_; // The URL of the extension which trigerred "browser fullscreen" mode. @@ -160,16 +160,13 @@ class FullscreenController : public base::RefCounted<FullscreenController>, bool toggled_into_fullscreen_; // TabContents for current tab requesting or currently in mouse lock. + // Assign using SetMouseLockTab(). TabContents* mouse_lock_tab_; MouseLockState mouse_lock_state_; content::NotificationRegistrar registrar_; - // If this is true then we are listening for navigation events and will - // cancel fullscreen when one occurs. - bool cancel_fullscreen_on_navigate_mode_; - DISALLOW_COPY_AND_ASSIGN(FullscreenController); }; diff --git a/chrome/browser/ui/fullscreen_controller_interactive_browsertest.cc b/chrome/browser/ui/fullscreen_controller_interactive_browsertest.cc index e21efb7..0981483 100644 --- a/chrome/browser/ui/fullscreen_controller_interactive_browsertest.cc +++ b/chrome/browser/ui/fullscreen_controller_interactive_browsertest.cc @@ -318,3 +318,155 @@ IN_PROC_BROWSER_TEST_F(FullscreenControllerInteractiveTest, ASSERT_TRUE(IsMouseLocked()); } +// Tests mouse lock is exited on page navigation. +// (Similar to fullscreen version in FullscreenControllerTest) +IN_PROC_BROWSER_TEST_F(FullscreenControllerInteractiveTest, + TestTabExitsMouseLockOnNavigation) { + ASSERT_TRUE(test_server()->Start()); + ui_test_utils::NavigateToURL(browser(), + test_server()->GetURL(kFullscreenMouseLockHTML)); + + // Lock the mouse with a user gesture. + ASSERT_TRUE(ui_test_utils::SendKeyPressAndWait( + browser(), ui::VKEY_1, false, false, false, false, + chrome::NOTIFICATION_MOUSE_LOCK_CHANGED, + content::NotificationService::AllSources())); + ASSERT_TRUE(IsFullscreenBubbleDisplayed()); + ASSERT_TRUE(IsMouseLockPermissionRequested()); + ASSERT_FALSE(IsMouseLocked()); + + // Accept mouse lock. + AcceptCurrentFullscreenOrMouseLockRequest(); + ASSERT_TRUE(IsMouseLocked()); + + ui_test_utils::NavigateToURL(browser(), GURL("chrome://newtab")); + + ASSERT_FALSE(IsMouseLocked()); +} + +// Tests mouse lock is exited when navigating back. +// (Similar to fullscreen version in FullscreenControllerTest) +IN_PROC_BROWSER_TEST_F(FullscreenControllerInteractiveTest, + TestTabExitsMouseLockOnGoBack) { + ASSERT_TRUE(test_server()->Start()); + + // Navigate twice to provide a place to go back to. + ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); + ui_test_utils::NavigateToURL(browser(), + test_server()->GetURL(kFullscreenMouseLockHTML)); + + // Lock the mouse with a user gesture. + ASSERT_TRUE(ui_test_utils::SendKeyPressAndWait( + browser(), ui::VKEY_1, false, false, false, false, + chrome::NOTIFICATION_MOUSE_LOCK_CHANGED, + content::NotificationService::AllSources())); + ASSERT_TRUE(IsFullscreenBubbleDisplayed()); + ASSERT_TRUE(IsMouseLockPermissionRequested()); + ASSERT_FALSE(IsMouseLocked()); + + // Accept mouse lock. + AcceptCurrentFullscreenOrMouseLockRequest(); + ASSERT_TRUE(IsMouseLocked()); + + GoBack(); + + ASSERT_FALSE(IsMouseLocked()); +} + +// Tests mouse lock is not exited on sub frame navigation. +// (Similar to fullscreen version in FullscreenControllerTest) +IN_PROC_BROWSER_TEST_F(FullscreenControllerInteractiveTest, + TestTabDoesntExitMouseLockOnSubFrameNavigation) { + ASSERT_TRUE(test_server()->Start()); + + // Create URLs for test page and test page with #fragment. + GURL url(test_server()->GetURL(kFullscreenMouseLockHTML)); + GURL url_with_fragment(url.spec() + "#fragment"); + + // Navigate to test page. + ui_test_utils::NavigateToURL(browser(), url); + + // Lock the mouse with a user gesture. + ASSERT_TRUE(ui_test_utils::SendKeyPressAndWait( + browser(), ui::VKEY_1, false, false, false, false, + chrome::NOTIFICATION_MOUSE_LOCK_CHANGED, + content::NotificationService::AllSources())); + ASSERT_TRUE(IsFullscreenBubbleDisplayed()); + ASSERT_TRUE(IsMouseLockPermissionRequested()); + ASSERT_FALSE(IsMouseLocked()); + + // Accept mouse lock. + AcceptCurrentFullscreenOrMouseLockRequest(); + ASSERT_TRUE(IsMouseLocked()); + + // Navigate to url with fragment. Mouse lock should persist. + ui_test_utils::NavigateToURL(browser(), url_with_fragment); + ASSERT_TRUE(IsMouseLocked()); +} + +// Tests Mouse Lock and Fullscreen are exited upon reload. +IN_PROC_BROWSER_TEST_F(FullscreenControllerInteractiveTest, + ReloadExitsMouseLockAndFullscreen) { + ASSERT_TRUE(test_server()->Start()); + ui_test_utils::NavigateToURL(browser(), + test_server()->GetURL(kFullscreenMouseLockHTML)); + + ASSERT_FALSE(IsMouseLockPermissionRequested()); + + // Request mouse lock. + ASSERT_TRUE(ui_test_utils::SendKeyPressAndWait( + browser(), ui::VKEY_1, false, false, false, false, + chrome::NOTIFICATION_MOUSE_LOCK_CHANGED, + content::NotificationService::AllSources())); + ASSERT_TRUE(IsMouseLockPermissionRequested()); + + // Reload. Mouse lock request should be cleared. + { + MouseLockNotificationObserver mouselock_observer; + Reload(); + mouselock_observer.Wait(); + ASSERT_FALSE(IsMouseLockPermissionRequested()); + } + + // Request mouse lock. + ASSERT_TRUE(ui_test_utils::SendKeyPressAndWait( + browser(), ui::VKEY_1, false, false, false, false, + chrome::NOTIFICATION_MOUSE_LOCK_CHANGED, + content::NotificationService::AllSources())); + ASSERT_TRUE(IsMouseLockPermissionRequested()); + + // Accept mouse lock. + AcceptCurrentFullscreenOrMouseLockRequest(); + ASSERT_TRUE(IsMouseLocked()); + ASSERT_TRUE(IsFullscreenBubbleDisplayed()); + + // Reload. Mouse should be unlocked. + { + MouseLockNotificationObserver mouselock_observer; + Reload(); + mouselock_observer.Wait(); + ASSERT_FALSE(IsMouseLocked()); + } + + // Request to lock the mouse and enter fullscreen. + { + FullscreenNotificationObserver fullscreen_observer; + ASSERT_TRUE(ui_test_utils::SendKeyPressAndWait( + browser(), ui::VKEY_B, false, true, false, false, + chrome::NOTIFICATION_MOUSE_LOCK_CHANGED, + content::NotificationService::AllSources())); + fullscreen_observer.Wait(); + } + + // We are fullscreen. + ASSERT_TRUE(IsFullscreenForTabOrPending()); + + // Reload. Mouse should be unlocked and fullscreen exited. + { + FullscreenNotificationObserver fullscreen_observer; + Reload(); + fullscreen_observer.Wait(); + ASSERT_FALSE(IsMouseLocked()); + ASSERT_FALSE(IsFullscreenForTabOrPending()); + } +} diff --git a/chrome/browser/ui/fullscreen_controller_test.cc b/chrome/browser/ui/fullscreen_controller_test.cc index c4dee4b..6f55fe0 100644 --- a/chrome/browser/ui/fullscreen_controller_test.cc +++ b/chrome/browser/ui/fullscreen_controller_test.cc @@ -134,3 +134,12 @@ void FullscreenControllerTest::GoBack() { observer.Wait(); } + +void FullscreenControllerTest::Reload() { + content::TestNavigationObserver observer( + content::NotificationService::AllSources(), NULL, 1); + + browser()->Reload(CURRENT_TAB); + + observer.Wait(); +} diff --git a/chrome/browser/ui/fullscreen_controller_test.h b/chrome/browser/ui/fullscreen_controller_test.h index fd309a4..1bad0f5 100644 --- a/chrome/browser/ui/fullscreen_controller_test.h +++ b/chrome/browser/ui/fullscreen_controller_test.h @@ -58,6 +58,7 @@ class FullscreenControllerTest : public InProcessBrowserTest { void AddTabAtIndexAndWait(int index, const GURL& url, content::PageTransition transition); void GoBack(); + void Reload(); static const char kFullscreenMouseLockHTML[]; private: DISALLOW_COPY_AND_ASSIGN(FullscreenControllerTest); diff --git a/chrome/test/functional/PYAUTO_TESTS b/chrome/test/functional/PYAUTO_TESTS index aa4f7f6..54fcd28 100644 --- a/chrome/test/functional/PYAUTO_TESTS +++ b/chrome/test/functional/PYAUTO_TESTS @@ -93,8 +93,6 @@ '-autofill.AutofillTest.testNoDuplicatePhoneNumsInPrefs', # crbug.com/131702 '-fullscreen_mouselock.FullscreenMouselockTest.testNoMLBubbleWhenTabLoseFocus', - # crbug.com/130301 - '-fullscreen_mouselock.FullscreenMouselockTest.testMouseLockLostOnReload', # crbug.com/123396 '-fullscreen_mouselock.FullscreenMouselockTest.testPatternsForFSAndML', # crbug.com/131874 |
