summaryrefslogtreecommitdiffstats
path: root/ash
diff options
context:
space:
mode:
authoroshima <oshima@chromium.org>2015-12-05 20:36:19 -0800
committerCommit bot <commit-bot@chromium.org>2015-12-06 04:37:01 +0000
commit3de9638ac1f7310990ece95dd43186084c2bcfcf (patch)
tree222775c0d903ff01ea0487137944be9ad533c5fc /ash
parentbb33856a8aa48c7137fd0a40b59bf17d650282af (diff)
downloadchromium_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.cc6
-rw-r--r--ash/shell/toplevel_window.h1
-rw-r--r--ash/wm/window_positioner.cc22
-rw-r--r--ash/wm/window_positioner_unittest.cc37
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