Chromium Code Reviews| Index: ash/wm/immersive_fullscreen_controller.cc |
| diff --git a/ash/wm/immersive_fullscreen_controller.cc b/ash/wm/immersive_fullscreen_controller.cc |
| index ba6eb3c0c1517d53f8940acd886a97082a4cc9b3..4970f4e729f09fad19ec56f2e4db30bc6fa0fa50 100644 |
| --- a/ash/wm/immersive_fullscreen_controller.cc |
| +++ b/ash/wm/immersive_fullscreen_controller.cc |
| @@ -287,7 +287,7 @@ void ImmersiveFullscreenController::SetEnabled(bool enabled) { |
| if (reveal_state_ == REVEALED) { |
| // Reveal was unsuccessful. Reacquire the revealed locks if appropriate. |
| - UpdateLocatedEventRevealedLock(NULL, ALLOW_REVEAL_WHILE_CLOSING_NO); |
| + UpdateLocatedEventRevealedLock(NULL); |
| UpdateFocusRevealedLock(); |
| } |
| } else { |
| @@ -332,7 +332,7 @@ void ImmersiveFullscreenController::SetupForTest() { |
| } |
| gfx::Point cursor_pos(0, bottommost_in_screen + 100); |
| aura::Env::GetInstance()->set_last_mouse_location(cursor_pos); |
| - UpdateLocatedEventRevealedLock(NULL, ALLOW_REVEAL_WHILE_CLOSING_NO); |
| + UpdateLocatedEventRevealedLock(NULL); |
| } |
| //////////////////////////////////////////////////////////////////////////////// |
| @@ -349,30 +349,29 @@ void ImmersiveFullscreenController::OnMouseEvent(ui::MouseEvent* event) { |
| return; |
| } |
| - // Mouse hover should not initiate revealing the top-of-window views while |
| - // |native_window_| is inactive. |
| - if (!views::Widget::GetWidgetForNativeWindow(native_window_)->IsActive()) |
| - return; |
| - |
| - // Mouse hover should not initiate revealing the top-of-window views while |
| - // a window has mouse capture. |
| - if (aura::client::GetCaptureWindow(native_window_)) |
| - return; |
| - |
| - if (IsRevealed()) |
| - UpdateLocatedEventRevealedLock(event, ALLOW_REVEAL_WHILE_CLOSING_NO); |
| + // Mouse hover can initiate revealing the top-of-window views while |widget_| |
| + // is inactive. |
| - // Trigger a reveal if the cursor pauses at the top of the screen for a |
| - // while. |
| - if (event->type() != ui::ET_MOUSE_CAPTURE_CHANGED) |
| + if (reveal_state_ == SLIDING_OPEN || reveal_state_ == REVEALED) { |
| + top_edge_hover_timer_.Stop(); |
| + UpdateLocatedEventRevealedLock(event); |
| + } else if (event->type() != ui::ET_MOUSE_CAPTURE_CHANGED) { |
| + // Trigger a reveal if the cursor pauses at the top of the screen for a |
| + // while. |
| UpdateTopEdgeHoverTimer(event); |
| + } |
| } |
| void ImmersiveFullscreenController::OnTouchEvent(ui::TouchEvent* event) { |
| if (!enabled_ || event->type() != ui::ET_TOUCH_PRESSED) |
| return; |
| - UpdateLocatedEventRevealedLock(event, ALLOW_REVEAL_WHILE_CLOSING_NO); |
| + // Touch should not initiate revealing the top-of-window views while |widget_| |
| + // is inactive. |
| + if (!widget_->IsActive()) |
| + return; |
| + |
| + UpdateLocatedEventRevealedLock(event); |
| } |
| void ImmersiveFullscreenController::OnGestureEvent(ui::GestureEvent* event) { |
| @@ -380,8 +379,8 @@ void ImmersiveFullscreenController::OnGestureEvent(ui::GestureEvent* event) { |
| return; |
| // Touch gestures should not initiate revealing the top-of-window views while |
| - // |native_window_| is inactive. |
| - if (!views::Widget::GetWidgetForNativeWindow(native_window_)->IsActive()) |
| + // |widget_| is inactive. |
| + if (!widget_->IsActive()) |
| return; |
| switch (event->type()) { |
| @@ -436,21 +435,7 @@ void ImmersiveFullscreenController::OnWidgetDestroying(views::Widget* widget) { |
| void ImmersiveFullscreenController::OnWidgetActivationChanged( |
| views::Widget* widget, |
| bool active) { |
| - // Mouse hover should not initiate revealing the top-of-window views while |
| - // |native_window_| is inactive. |
| - top_edge_hover_timer_.Stop(); |
| - |
| 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); |
| } |
| //////////////////////////////////////////////////////////////////////////////// |
| @@ -520,19 +505,17 @@ void ImmersiveFullscreenController::EnableWindowObservers(bool enable) { |
| return; |
| observers_enabled_ = enable; |
| - views::Widget* widget = |
| - views::Widget::GetWidgetForNativeWindow(native_window_); |
| - views::FocusManager* focus_manager = widget->GetFocusManager(); |
| + views::FocusManager* focus_manager = widget_->GetFocusManager(); |
| if (enable) { |
| - widget->AddObserver(this); |
| + widget_->AddObserver(this); |
| focus_manager->AddFocusChangeListener(this); |
| Shell::GetInstance()->AddPreTargetHandler(this); |
| native_window_->AddObserver(this); |
| RecreateBubbleManager(); |
| } else { |
| - widget->RemoveObserver(this); |
| + widget_->RemoveObserver(this); |
| focus_manager->RemoveFocusChangeListener(this); |
| Shell::GetInstance()->RemovePreTargetHandler(this); |
| native_window_->RemoveObserver(this); |
| @@ -550,12 +533,22 @@ void ImmersiveFullscreenController::EnableWindowObservers(bool enable) { |
| void ImmersiveFullscreenController::UpdateTopEdgeHoverTimer( |
| ui::MouseEvent* event) { |
| DCHECK(enabled_); |
| - // Stop the timer if the top-of-window views are already revealed. |
| - if (reveal_state_ == SLIDING_OPEN || reveal_state_ == REVEALED) { |
| - top_edge_hover_timer_.Stop(); |
| + DCHECK(reveal_state_ == SLIDING_CLOSED || reveal_state_ == CLOSED); |
| + |
| + // Check whether |native_window_| is the event target's parent window instead |
| + // of checking for activation. This allows the timer to be started when |
| + // |widget_| is inactive but prevents starting the timer if the mouse is over |
| + // a portion of the top edge obscured by an unrelated widget. |
| + if (!top_edge_hover_timer_.IsRunning() && |
| + !native_window_->Contains(static_cast<aura::Window*>(event->target()))) { |
|
pkotwicz
2013/12/01 22:57:20
I check whether |top_edge_hover_timer_| is running
|
| return; |
| } |
| + // Mouse hover should not initiate revealing the top-of-window views while a |
| + // window has mouse capture. |
| + if (aura::client::GetCaptureWindow(native_window_)) |
| + return; |
| + |
| gfx::Point location_in_screen = GetEventLocationInScreen(*event); |
| if (ShouldIgnoreMouseEventAtLocation(location_in_screen)) |
| return; |
| @@ -591,8 +584,7 @@ void ImmersiveFullscreenController::UpdateTopEdgeHoverTimer( |
| } |
| void ImmersiveFullscreenController::UpdateLocatedEventRevealedLock( |
| - ui::LocatedEvent* event, |
| - AllowRevealWhileClosing allow_reveal_while_closing) { |
| + ui::LocatedEvent* event) { |
| if (!enabled_) |
| return; |
| DCHECK(!event || event->IsMouseEvent() || event->IsTouchEvent()); |
| @@ -601,18 +593,14 @@ void ImmersiveFullscreenController::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_ == CLOSED || |
| - (reveal_state_ == SLIDING_CLOSED && |
| - allow_reveal_while_closing == ALLOW_REVEAL_WHILE_CLOSING_NO)) { |
| + if (reveal_state_ == CLOSED || reveal_state_ == SLIDING_CLOSED) |
| return; |
| - } |
| - // Neither the mouse nor touch should keep the top-of-window views revealed if |
| - // |native_window_| is not active. |
| - if (!views::Widget::GetWidgetForNativeWindow(native_window_)->IsActive()) { |
| - located_event_revealed_lock_.reset(); |
| - return; |
| - } |
| + // For the sake of simplicity, ignore |widget_|'s activation in computing |
| + // whether the top-of-window views should stay revealed. Ideally, the |
| + // top-of-window views would stay revealed only when the mouse cursor is |
| + // hovered above a non-obscured portion of the top-of-window views. The |
| + // top-of-window views may be partially obscured when |widget_| is inactive. |
|
pkotwicz
2013/12/01 22:57:20
Doing the right thing is complicated by the maximi
|
| // Ignore all events while a window has capture. This keeps the top-of-window |
| // views revealed during a drag. |
| @@ -679,10 +667,8 @@ void ImmersiveFullscreenController::UpdateFocusRevealedLock() { |
| return; |
| bool hold_lock = false; |
| - views::Widget* widget = |
| - views::Widget::GetWidgetForNativeWindow(native_window_); |
| - if (widget->IsActive()) { |
| - views::View* focused_view = widget->GetFocusManager()->GetFocusedView(); |
| + if (widget_->IsActive()) { |
| + views::View* focused_view = widget_->GetFocusManager()->GetFocusedView(); |
| if (top_container_->Contains(focused_view)) |
| hold_lock = true; |
| } else { |
| @@ -729,7 +715,7 @@ bool ImmersiveFullscreenController::UpdateRevealedLocksForSwipe( |
| // Swipes while |native_window_| is inactive should have been filtered out in |
| // OnGestureEvent(). |
| - DCHECK(views::Widget::GetWidgetForNativeWindow(native_window_)->IsActive()); |
| + DCHECK(widget_->IsActive()); |
| if (reveal_state_ == SLIDING_CLOSED || reveal_state_ == CLOSED) { |
| if (swipe_type == SWIPE_OPEN && !located_event_revealed_lock_.get()) { |
| @@ -747,7 +733,7 @@ bool ImmersiveFullscreenController::UpdateRevealedLocksForSwipe( |
| return true; |
| // Ending the reveal was unsuccessful. Reaquire the locks if appropriate. |
| - UpdateLocatedEventRevealedLock(NULL, ALLOW_REVEAL_WHILE_CLOSING_NO); |
| + UpdateLocatedEventRevealedLock(NULL); |
| UpdateFocusRevealedLock(); |
| } |
| } |
| @@ -808,7 +794,7 @@ void ImmersiveFullscreenController::OnSlideOpenAnimationCompleted() { |
| // 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, ALLOW_REVEAL_WHILE_CLOSING_NO); |
| + UpdateLocatedEventRevealedLock(NULL); |
| } |
| void ImmersiveFullscreenController::MaybeEndReveal(Animate animate) { |
| @@ -880,6 +866,7 @@ bool ImmersiveFullscreenController::ShouldIgnoreMouseEventAtLocation( |
| bool ImmersiveFullscreenController::ShouldHandleGestureEvent( |
| const gfx::Point& location) const { |
| + DCHECK(widget_->IsActive()); |
| if (reveal_state_ == REVEALED) { |
| std::vector<gfx::Rect> hit_bounds_in_screen( |
| delegate_->GetVisibleBoundsInScreen()); |