summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorscheib@chromium.org <scheib@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-07-09 23:37:10 +0000
committerscheib@chromium.org <scheib@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-07-09 23:37:10 +0000
commitd2b67a475c1f0c4b649e48b58d0fb1dd6c284e14 (patch)
treebefea18c13a926fde2bdded23b99298db7f4b7f9
parent9cbcbbb3bb2cfbc7dfc50cb65d9b2e0a4ab7a240 (diff)
downloadchromium_src-d2b67a475c1f0c4b649e48b58d0fb1dd6c284e14.zip
chromium_src-d2b67a475c1f0c4b649e48b58d0fb1dd6c284e14.tar.gz
chromium_src-d2b67a475c1f0c4b649e48b58d0fb1dd6c284e14.tar.bz2
Merge 143417 - Exit mouse lock or fullscreen on navigation and reload.
Merge approved in roll-up issue crbug.com/134196#c9. BUG=131702, 132669, 130301 Review URL: https://chromiumcodereview.appspot.com/10559071 TBR=scheib@chromium.org git-svn-id: svn://svn.chromium.org/chrome/branches/1180/src@145788 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/ui/fullscreen_controller.cc61
-rw-r--r--chrome/browser/ui/fullscreen_controller.h15
-rw-r--r--chrome/browser/ui/fullscreen_controller_interactive_browsertest.cc152
-rw-r--r--chrome/browser/ui/fullscreen_controller_test.cc9
-rw-r--r--chrome/browser/ui/fullscreen_controller_test.h1
-rw-r--r--chrome/test/functional/PYAUTO_TESTS2
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