Index: chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc |
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc b/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc |
index 0d5b8519342e9346966d802d0eeb779dd4abb13d..37ab716a24ce93094867022a9e20c1d015aaeab3 100644 |
--- a/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc |
+++ b/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc |
@@ -353,7 +353,7 @@ void ImmersiveModeControllerAsh::SetEnabled(bool enabled) { |
if (reveal_state_ == REVEALED) { |
// Reveal was unsuccessful. Reacquire the revealed locks if appropriate. |
- UpdateLocatedEventRevealedLock(NULL); |
+ UpdateLocatedEventRevealedLock(NULL, ALLOW_REVEAL_WHILE_CLOSING_NO); |
UpdateFocusRevealedLock(); |
} |
} else { |
@@ -440,7 +440,7 @@ void ImmersiveModeControllerAsh::OnMouseEvent(ui::MouseEvent* event) { |
return; |
if (IsRevealed()) |
- UpdateLocatedEventRevealedLock(event); |
+ UpdateLocatedEventRevealedLock(event, ALLOW_REVEAL_WHILE_CLOSING_NO); |
// Trigger a reveal if the cursor pauses at the top of the screen for a |
// while. |
@@ -452,7 +452,7 @@ void ImmersiveModeControllerAsh::OnTouchEvent(ui::TouchEvent* event) { |
if (!enabled_ || event->type() != ui::ET_TOUCH_PRESSED) |
return; |
- UpdateLocatedEventRevealedLock(event); |
+ UpdateLocatedEventRevealedLock(event, ALLOW_REVEAL_WHILE_CLOSING_NO); |
} |
void ImmersiveModeControllerAsh::OnGestureEvent(ui::GestureEvent* event) { |
@@ -493,15 +493,6 @@ void ImmersiveModeControllerAsh::OnWillChangeFocus(views::View* focused_before, |
void ImmersiveModeControllerAsh::OnDidChangeFocus(views::View* focused_before, |
views::View* focused_now) { |
- scoped_ptr<ImmersiveRevealedLock> lock; |
- if (reveal_state_ == REVEALED || reveal_state_ == SLIDING_OPEN) { |
- // Acquire a lock so that if UpdateLocatedEventRevealedLock() or |
- // UpdateFocusRevealedLock() ends the reveal, it occurs after the |
- // function terminates. This is useful in tests. |
- lock.reset(GetRevealedLock(ANIMATE_REVEAL_YES)); |
- } |
- |
- UpdateLocatedEventRevealedLock(NULL); |
UpdateFocusRevealedLock(); |
} |
@@ -517,20 +508,21 @@ void ImmersiveModeControllerAsh::OnWidgetDestroying(views::Widget* widget) { |
void ImmersiveModeControllerAsh::OnWidgetActivationChanged( |
views::Widget* widget, |
bool active) { |
- scoped_ptr<ImmersiveRevealedLock> lock; |
- if (reveal_state_ == REVEALED || reveal_state_ == SLIDING_OPEN) { |
- // Acquire a lock so that if UpdateLocatedEventRevealedLock() or |
- // UpdateFocusRevealedLock() ends the reveal, it occurs after the |
- // function terminates. This is useful in tests. |
- lock.reset(GetRevealedLock(ANIMATE_REVEAL_YES)); |
- } |
- |
// Mouse hover should not initiate revealing the top-of-window views while |
// |native_window_| is inactive. |
top_edge_hover_timer_.Stop(); |
- UpdateLocatedEventRevealedLock(NULL); |
UpdateFocusRevealedLock(); |
+ |
+ // Allow the top-of-window views to stay revealed if all of the revealed locks |
+ // were released in the process of activating |widget| but the mouse is still |
+ // hovered above the top-of-window views. For instance, if the bubble which |
+ // has been keeping the top-of-window views revealed is hidden but the mouse |
+ // is hovered above the top-of-window views, the top-of-window views should |
+ // stay revealed. We cannot call UpdateLocatedEventRevealedLock() from |
+ // BubbleManager::UpdateRevealedLock() because |widget| is not yet active |
+ // at that time. |
+ UpdateLocatedEventRevealedLock(NULL, ALLOW_REVEAL_WHILE_CLOSING_YES); |
} |
//////////////////////////////////////////////////////////////////////////////// |
@@ -623,12 +615,12 @@ void ImmersiveModeControllerAsh::SetForceHideTabIndicatorsForTest(bool force) { |
void ImmersiveModeControllerAsh::StartRevealForTest(bool hovered) { |
MaybeStartReveal(ANIMATE_NO); |
MoveMouse(top_container_, hovered); |
- UpdateLocatedEventRevealedLock(NULL); |
+ UpdateLocatedEventRevealedLock(NULL, ALLOW_REVEAL_WHILE_CLOSING_NO); |
} |
void ImmersiveModeControllerAsh::SetMouseHoveredForTest(bool hovered) { |
MoveMouse(top_container_, hovered); |
- UpdateLocatedEventRevealedLock(NULL); |
+ UpdateLocatedEventRevealedLock(NULL, ALLOW_REVEAL_WHILE_CLOSING_NO); |
} |
void ImmersiveModeControllerAsh::DisableAnimationsForTest() { |
@@ -746,7 +738,8 @@ void ImmersiveModeControllerAsh::UpdateTopEdgeHoverTimer( |
} |
void ImmersiveModeControllerAsh::UpdateLocatedEventRevealedLock( |
- ui::LocatedEvent* event) { |
+ ui::LocatedEvent* event, |
+ AllowRevealWhileClosing allow_reveal_while_closing) { |
if (!enabled_) |
return; |
DCHECK(!event || event->IsMouseEvent() || event->IsTouchEvent()); |
@@ -755,8 +748,11 @@ void ImmersiveModeControllerAsh::UpdateLocatedEventRevealedLock( |
// views are sliding closed or are closed with the following exceptions: |
// - Hovering at y = 0 which is handled in OnMouseEvent(). |
// - Doing a SWIPE_OPEN edge gesture which is handled in OnGestureEvent(). |
- if (reveal_state_ == SLIDING_CLOSED || reveal_state_ == CLOSED) |
+ if (reveal_state_ == CLOSED || |
+ (reveal_state_ == SLIDING_CLOSED && |
+ allow_reveal_while_closing == ALLOW_REVEAL_WHILE_CLOSING_NO)) { |
return; |
+ } |
// Neither the mouse nor touch should keep the top-of-window views revealed if |
// |native_window_| is not active. |
@@ -895,7 +891,7 @@ bool ImmersiveModeControllerAsh::UpdateRevealedLocksForSwipe( |
return true; |
// Ending the reveal was unsuccessful. Reaquire the locks if appropriate. |
- UpdateLocatedEventRevealedLock(NULL); |
+ UpdateLocatedEventRevealedLock(NULL, ALLOW_REVEAL_WHILE_CLOSING_NO); |
UpdateFocusRevealedLock(); |
} |
} |
@@ -1031,7 +1027,7 @@ void ImmersiveModeControllerAsh::OnSlideOpenAnimationCompleted(Layout layout) { |
// The user may not have moved the mouse since the reveal was initiated. |
// Update the revealed lock to reflect the mouse's current state. |
- UpdateLocatedEventRevealedLock(NULL); |
+ UpdateLocatedEventRevealedLock(NULL, ALLOW_REVEAL_WHILE_CLOSING_NO); |
} |
void ImmersiveModeControllerAsh::MaybeEndReveal(Animate animate) { |