Index: ash/wm/frame_border_hit_test_controller.cc |
diff --git a/ash/wm/frame_border_hit_test_controller.cc b/ash/wm/frame_border_hit_test_controller.cc |
index 28a572667153287db52c5356c6cd1f99f2cb16bc..b1e427cce4b023d128c5325f392b5f4243f43a66 100644 |
--- a/ash/wm/frame_border_hit_test_controller.cc |
+++ b/ash/wm/frame_border_hit_test_controller.cc |
@@ -14,6 +14,17 @@ |
#include "ui/views/widget/widget_delegate.h" |
#include "ui/views/window/non_client_view.h" |
+namespace { |
+ |
+// The height of the region in |frame_window_| where |frame_window_| should grab |
+// touches while in immersive fullscreen. (Even if a child window overlaps this |
+// region.) This region is used to allow us to intercept edge gestures to |
+// reveal the top-of-window views even if |frame_window_|'s web page conumes all |
+// touch events. |
+const int kImmersiveFullscreenTopInnerInsetTouch = 8; |
+ |
+} // namespace |
+ |
namespace ash { |
FrameBorderHitTestController::FrameBorderHitTestController(views::Widget* frame) |
@@ -82,15 +93,29 @@ int FrameBorderHitTestController::NonClientHitTest( |
} |
void FrameBorderHitTestController::UpdateHitTestBoundsOverrideInner() { |
- // Maximized and fullscreen windows don't want resize handles overlapping the |
- // content area, because when the user moves the cursor to the right screen |
- // edge we want them to be able to hit the scroll bar. |
- if (wm::GetWindowState(frame_window_)->IsMaximizedOrFullscreen()) { |
- frame_window_->set_hit_test_bounds_override_inner(gfx::Insets()); |
+ wm::WindowState* window_state(wm::GetWindowState(frame_window_)); |
+ if (window_state->IsFullscreen()) { |
+ // Fullscreen windows don't want resize handles when the mouse is on top of |
+ // the content area, so it is unnecessary to steal events from the web |
+ // contents along |frame_window_|'s edges. While in immersive fullscreen, we |
+ // grab touch events along the top edge of |frame_window_| so that we can |
+ // intercept edge gestures to reveal the top-of-window views even if the |
+ // web contents consumes all touch events. |
+ if (window_state->IsImmersiveFullscreen()) { |
+ frame_window_->SetHitTestBoundsOverrideInner(gfx::Insets(), |
+ gfx::Insets(kImmersiveFullscreenTopInnerInsetTouch, 0, 0, 0)); |
+ } else { |
+ frame_window_->SetHitTestBoundsOverrideInner(gfx::Insets(), |
+ gfx::Insets()); |
+ } |
+ } else if (window_state->IsMaximized()) { |
+ // We do not want resize handles for maximized windows either. |
+ frame_window_->SetHitTestBoundsOverrideInner(gfx::Insets(), |
+ gfx::Insets()); |
} else { |
- frame_window_->set_hit_test_bounds_override_inner( |
- gfx::Insets(kResizeInsideBoundsSize, kResizeInsideBoundsSize, |
- kResizeInsideBoundsSize, kResizeInsideBoundsSize)); |
+ gfx::Insets insets(kResizeInsideBoundsSize, kResizeInsideBoundsSize, |
+ kResizeInsideBoundsSize, kResizeInsideBoundsSize); |
+ frame_window_->SetHitTestBoundsOverrideInner(insets, insets); |
} |
} |
@@ -100,6 +125,12 @@ void FrameBorderHitTestController::OnWindowShowTypeChanged( |
UpdateHitTestBoundsOverrideInner(); |
} |
+void FrameBorderHitTestController::OnWindowFullscreenTypeChanged( |
+ wm::WindowState* window_state, |
+ wm::FullscreenType old_type) { |
+ UpdateHitTestBoundsOverrideInner(); |
+} |
+ |
void FrameBorderHitTestController::OnWindowDestroying(aura::Window* window) { |
frame_window_->RemoveObserver(this); |
ash::wm::GetWindowState(frame_window_)->RemoveObserver(this); |