Commit 3c280149 authored by Xiaoqian Dai's avatar Xiaoqian Dai Committed by Commit Bot

Hide the multi-window resizer if the resized window is hidden.

If one of the resized windows is hidden (visibility changes to hidden),
the multi-window resizer should also be hidden.

Bug: 894853
Change-Id: I77c8c5e831a85a6e66edb35381778d92e97cc856
Reviewed-on: https://chromium-review.googlesource.com/c/1282027
Commit-Queue: Xiaoqian Dai <xdai@chromium.org>
Reviewed-by: default avatarMitsuru Oshima <oshima@chromium.org>
Cr-Commit-Position: refs/heads/master@{#600181}
parent 971df2a0
......@@ -201,8 +201,7 @@ bool MultiWindowResizeController::ResizeWindows::Equals(
MultiWindowResizeController::MultiWindowResizeController() = default;
MultiWindowResizeController::~MultiWindowResizeController() {
window_resizer_.reset();
Hide();
ResetResizer();
}
void MultiWindowResizeController::Show(aura::Window* window,
......@@ -235,39 +234,19 @@ void MultiWindowResizeController::Show(aura::Window* window,
&MultiWindowResizeController::ShowIfValidMouseLocation);
}
void MultiWindowResizeController::Hide() {
if (window_resizer_)
return; // Ignore hides while actively resizing.
if (windows_.window1) {
StopObserving(windows_.window1);
windows_.window1 = nullptr;
}
if (windows_.window2) {
StopObserving(windows_.window2);
windows_.window2 = nullptr;
}
show_timer_.Stop();
if (!resize_widget_)
return;
for (size_t i = 0; i < windows_.other_windows.size(); ++i)
StopObserving(windows_.other_windows[i]);
mouse_watcher_.reset();
resize_widget_.reset();
windows_ = ResizeWindows();
}
void MultiWindowResizeController::MouseMovedOutOfHost() {
Hide();
}
void MultiWindowResizeController::OnWindowVisibilityChanged(
aura::Window* window,
bool visible) {
if (!visible)
ResetResizer();
}
void MultiWindowResizeController::OnWindowDestroying(aura::Window* window) {
// Have to explicitly reset the WindowResizer, otherwise Hide() does nothing.
window_resizer_.reset();
Hide();
ResetResizer();
}
void MultiWindowResizeController::OnPostWindowStateTypeChange(
......@@ -275,8 +254,7 @@ void MultiWindowResizeController::OnPostWindowStateTypeChange(
mojom::WindowStateType old_type) {
if (window_state->IsMaximized() || window_state->IsFullscreen() ||
window_state->IsMinimized()) {
window_resizer_.reset();
Hide();
ResetResizer();
}
}
......@@ -476,6 +454,37 @@ bool MultiWindowResizeController::IsShowing() const {
return resize_widget_.get() || show_timer_.IsRunning();
}
void MultiWindowResizeController::Hide() {
if (window_resizer_)
return; // Ignore hides while actively resizing.
if (windows_.window1) {
StopObserving(windows_.window1);
windows_.window1 = nullptr;
}
if (windows_.window2) {
StopObserving(windows_.window2);
windows_.window2 = nullptr;
}
show_timer_.Stop();
if (!resize_widget_)
return;
for (auto* window : windows_.other_windows)
StopObserving(window);
mouse_watcher_.reset();
resize_widget_.reset();
windows_ = ResizeWindows();
}
void MultiWindowResizeController::ResetResizer() {
// Have to explicitly reset the WindowResizer, otherwise Hide() does nothing.
window_resizer_.reset();
Hide();
}
void MultiWindowResizeController::StartResize(
const gfx::Point& location_in_screen) {
DCHECK(!window_resizer_.get());
......@@ -543,8 +552,7 @@ void MultiWindowResizeController::CancelResize() {
return; // Happens if window was destroyed and we nuked the WindowResizer.
window_resizer_->RevertDrag();
wm::GetWindowState(window_resizer_->GetTarget())->DeleteDragDetails();
window_resizer_.reset();
Hide();
ResetResizer();
}
gfx::Rect MultiWindowResizeController::CalculateResizeWidgetBounds(
......
......@@ -45,13 +45,11 @@ class ASH_EXPORT MultiWindowResizeController
// is over, |component| the edge and |point| the location of the mouse.
void Show(aura::Window* window, int component, const gfx::Point& point);
// Hides the resize widget.
void Hide();
// MouseWatcherListener:
void MouseMovedOutOfHost() override;
// WindowObserver:
void OnWindowVisibilityChanged(aura::Window* window, bool visible) override;
void OnWindowDestroying(aura::Window* window) override;
// wm::WindowStateObserver:
......@@ -132,6 +130,12 @@ class ASH_EXPORT MultiWindowResizeController
// Returns true if the widget is showing.
bool IsShowing() const;
// Hides the resize widget.
void Hide();
// Resets the window resizer and hides the resize widget.
void ResetResizer();
// Initiates a resize.
void StartResize(const gfx::Point& location_in_screen);
......
......@@ -406,6 +406,29 @@ TEST_F(MultiWindowResizeControllerTest, WindowStateChange) {
EXPECT_FALSE(IsShowing());
}
// Tests that if one of the resized windows visibility changes to hidden, the
// resize widget should be dismissed.
TEST_F(MultiWindowResizeControllerTest, HideWindowTest) {
aura::test::TestWindowDelegate delegate1;
std::unique_ptr<aura::Window> w1(CreateTestWindowInShellWithDelegate(
&delegate1, -1, gfx::Rect(0, 0, 100, 100)));
delegate1.set_window_component(HTRIGHT);
aura::test::TestWindowDelegate delegate2;
std::unique_ptr<aura::Window> w2(CreateTestWindowInShellWithDelegate(
&delegate2, -2, gfx::Rect(100, 0, 100, 100)));
delegate2.set_window_component(HTLEFT);
ui::test::EventGenerator* generator = GetEventGenerator();
gfx::Point w1_center_in_screen = w1->GetBoundsInScreen().CenterPoint();
generator->MoveMouseTo(w1_center_in_screen);
ShowNow();
EXPECT_TRUE(IsShowing());
// Hide one window should dimiss the resizer.
w1->Hide();
EXPECT_FALSE(IsShowing());
}
namespace {
class TestWindowStateDelegate : public wm::WindowStateDelegate {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment