diff options
author | oshima <oshima@chromium.org> | 2015-12-05 20:36:19 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-12-06 04:37:01 +0000 |
commit | 3de9638ac1f7310990ece95dd43186084c2bcfcf (patch) | |
tree | 222775c0d903ff01ea0487137944be9ad533c5fc /ash | |
parent | bb33856a8aa48c7137fd0a40b59bf17d650282af (diff) | |
download | chromium_src-3de9638ac1f7310990ece95dd43186084c2bcfcf.zip chromium_src-3de9638ac1f7310990ece95dd43186084c2bcfcf.tar.gz chromium_src-3de9638ac1f7310990ece95dd43186084c2bcfcf.tar.bz2 |
Don't remember fullscreen bounds for auto rearrange
BUG=550428
TEST=WindowPositionerTest.IgnoreFullscreenInAutoRearrange
R=derat@chromium.org
Review URL: https://codereview.chromium.org/1493913009
Cr-Commit-Position: refs/heads/master@{#363357}
Diffstat (limited to 'ash')
-rw-r--r-- | ash/shell/toplevel_window.cc | 6 | ||||
-rw-r--r-- | ash/shell/toplevel_window.h | 1 | ||||
-rw-r--r-- | ash/wm/window_positioner.cc | 22 | ||||
-rw-r--r-- | ash/wm/window_positioner_unittest.cc | 37 |
4 files changed, 51 insertions, 15 deletions
diff --git a/ash/shell/toplevel_window.cc b/ash/shell/toplevel_window.cc index ab9cdc4..ef28e5d 100644 --- a/ash/shell/toplevel_window.cc +++ b/ash/shell/toplevel_window.cc @@ -29,9 +29,7 @@ SavedState* saved_state = NULL; } // namespace ToplevelWindow::CreateParams::CreateParams() - : can_resize(false), - can_maximize(false) { -} + : can_resize(false), can_maximize(false), use_saved_placement(true) {} // static views::Widget* ToplevelWindow::CreateToplevelWindow( @@ -78,7 +76,7 @@ bool ToplevelWindow::GetSavedWindowPlacement( gfx::Rect* bounds, ui::WindowShowState* show_state) const { bool is_saved_bounds = !!saved_state; - if (saved_state) { + if (saved_state && params_.use_saved_placement) { *bounds = saved_state->bounds; *show_state = saved_state->show_state; } else { diff --git a/ash/shell/toplevel_window.h b/ash/shell/toplevel_window.h index 693bad5..1910451 100644 --- a/ash/shell/toplevel_window.h +++ b/ash/shell/toplevel_window.h @@ -17,6 +17,7 @@ class ToplevelWindow : public views::WidgetDelegateView { bool can_resize; bool can_maximize; + bool use_saved_placement; }; static views::Widget* CreateToplevelWindow( const CreateParams& params); diff --git a/ash/wm/window_positioner.cc b/ash/wm/window_positioner.cc index eed15a0..4a1d02e 100644 --- a/ash/wm/window_positioner.cc +++ b/ash/wm/window_positioner.cc @@ -60,17 +60,18 @@ bool UseAutoWindowManager(const aura::Window* window) { return !window_state->is_dragged() && window_state->window_position_managed(); } -// Check if a given |window| can be managed. This includes that it's state is -// not minimized/maximized/the user has changed it's size by hand already. -// It furthermore checks for the WindowIsManaged status. +// Check if a given |window| can be managed. This includes that its +// state is not minimized/maximized/fullscreen/the user has changed +// its size by hand already. It furthermore checks for the +// WindowIsManaged status. bool WindowPositionCanBeManaged(const aura::Window* window) { if (disable_auto_positioning) return false; const wm::WindowState* window_state = wm::GetWindowState(window); return window_state->window_position_managed() && - !window_state->IsMinimized() && - !window_state->IsMaximized() && - !window_state->bounds_changed_by_user(); + !window_state->IsMinimized() && !window_state->IsMaximized() && + !window_state->IsFullscreen() && + !window_state->bounds_changed_by_user(); } // Get the work area for a given |window| in parent coordinates. @@ -291,12 +292,13 @@ void WindowPositioner::GetBoundsAndShowStateForNewWindow( ui::SHOW_STATE_DEFAULT; } - if (maximized) { + if (maximized || top_window_state->IsFullscreen()) { bool has_restore_bounds = top_window_state->HasRestoreBounds(); if (has_restore_bounds) { - // For a maximized window ignore the real bounds of the top level window - // and use its restore bounds instead. Offset the bounds to prevent the - // windows from overlapping exactly when restored. + // For a maximized/fullscreen window ignore the real bounds of + // the top level window and use its restore bounds + // instead. Offset the bounds to prevent the windows from + // overlapping exactly when restored. *bounds_in_out = top_window_state->GetRestoreBoundsInScreen() + gfx::Vector2d(kMinimumWindowOffset, kMinimumWindowOffset); } diff --git a/ash/wm/window_positioner_unittest.cc b/ash/wm/window_positioner_unittest.cc index a9445eb..0506753 100644 --- a/ash/wm/window_positioner_unittest.cc +++ b/ash/wm/window_positioner_unittest.cc @@ -195,4 +195,39 @@ TEST_F(WindowPositionerTest, FirstRunMaximizeWindowLowResolution) { EXPECT_EQ(show_state_out, ui::SHOW_STATE_MAXIMIZED); } -} // namespace +TEST_F(WindowPositionerTest, IgnoreFullscreenInAutoRearrange) { + if (!SupportsHostWindowResize()) + return; + // Set bigger than 1366 so that the new window is opened in normal state. + UpdateDisplay("1400x800"); + + // 1st window mimics fullscreen browser window behavior. + shell::ToplevelWindow::CreateParams params; + params.can_resize = true; + params.can_maximize = true; + views::Widget* widget1 = shell::ToplevelWindow::CreateToplevelWindow(params); + wm::WindowState* managed_state = + wm::GetWindowState(widget1->GetNativeWindow()); + EXPECT_TRUE(managed_state->window_position_managed()); + EXPECT_EQ("300x300", widget1->GetWindowBoundsInScreen().size().ToString()); + widget1->SetFullscreen(true); + ASSERT_EQ("1400x800", widget1->GetWindowBoundsInScreen().size().ToString()); + + // 2nd window mimics windowed v1 app. + params.use_saved_placement = false; + views::Widget* widget2 = shell::ToplevelWindow::CreateToplevelWindow(params); + wm::WindowState* state_2 = wm::GetWindowState(widget2->GetNativeWindow()); + EXPECT_TRUE(state_2->window_position_managed()); + EXPECT_EQ("300x300", widget2->GetWindowBoundsInScreen().size().ToString()); + + // Restores to the original size. + widget1->SetFullscreen(false); + ASSERT_EQ("300x300", widget1->GetWindowBoundsInScreen().size().ToString()); + + // Closing 2nd widget triggers the rearrange logic but the 1st + // widget should stay in the current size. + widget2->CloseNow(); + ASSERT_EQ("300x300", widget1->GetWindowBoundsInScreen().size().ToString()); +} + +} // namespace ash |