0

Ignores programmatic bounds changes for docked windows. This prevents a window that is using resizeTo or similar API from changing window bounds while it is managed by DockedLayoutManager.

BUG=496852
TEST=DockedWindowLayoutManagerTest.DockedWindowBoundsDontChange

Review URL: https://codereview.chromium.org/1149153007

Cr-Commit-Position: refs/heads/master@{#333226}
This commit is contained in:
varkha
2015-06-06 22:31:29 -07:00
committed by Commit bot
parent f4e0b8865f
commit 352e317da0
2 changed files with 27 additions and 8 deletions

@ -210,8 +210,9 @@ bool IsPopupOrTransient(const aura::Window* window) {
::wm::GetTransientParent(window));
}
// Certain windows (minimized, hidden or popups) do not matter to docking.
bool IsUsedByLayout(const aura::Window* window) {
// Certain windows (minimized, hidden or popups) are not docked and are ignored
// by layout logic even when they are children of a docked container.
bool IsWindowDocked(const aura::Window* window) {
return (window->IsVisible() &&
!wm::GetWindowState(window)->IsMinimized() &&
!IsPopupOrTransient(window));
@ -479,8 +480,7 @@ void DockedWindowLayoutManager::StartDragging(aura::Window* window) {
WindowResizer::kBoundsChangeDirection_Horizontal)) {
for (size_t i = 0; i < dock_container_->children().size(); ++i) {
aura::Window* window1(dock_container_->children()[i]);
if (IsUsedByLayout(window1) &&
window1 != dragged_window_ &&
if (IsWindowDocked(window1) && window1 != dragged_window_ &&
window1->bounds().width() == docked_width_) {
wm::GetWindowState(window1)->set_bounds_changed_by_user(false);
}
@ -745,6 +745,8 @@ void DockedWindowLayoutManager::SetChildBounds(
actual_new_bounds.set_height(
std::max(min_size.height(), actual_new_bounds.height()));
}
if (IsWindowDocked(child) && child != dragged_window_)
return;
SnapToPixelLayoutManager::SetChildBounds(child, actual_new_bounds);
if (IsPopupOrTransient(child))
return;
@ -938,7 +940,7 @@ void DockedWindowLayoutManager::MaybeMinimizeChildrenExcept(
aura::Window::Windows::const_reverse_iterator iter = children.rbegin();
while (iter != children.rend()) {
aura::Window* window(*iter++);
if (window == child || !IsUsedByLayout(window))
if (window == child || !IsWindowDocked(window))
continue;
int room_needed = GetWindowHeightCloseTo(window, 0) +
(gap_needed ? kMinDockGap : 0);
@ -1015,7 +1017,7 @@ void DockedWindowLayoutManager::RecordUmaAction(DockedAction action,
if (IsPopupOrTransient(window))
continue;
docked_all_count++;
if (!IsUsedByLayout(window))
if (!IsWindowDocked(window))
continue;
docked_visible_count++;
if (window->type() == ui::wm::WINDOW_TYPE_PANEL)
@ -1076,7 +1078,7 @@ void DockedWindowLayoutManager::Relayout() {
for (size_t i = 0; i < dock_container_->children().size(); ++i) {
aura::Window* window(dock_container_->children()[i]);
if (!IsUsedByLayout(window) || window == dragged_window_)
if (!IsWindowDocked(window) || window == dragged_window_)
continue;
// If the shelf is currently hidden (full-screen mode), hide window until
@ -1316,7 +1318,7 @@ void DockedWindowLayoutManager::UpdateStacking(aura::Window* active_window) {
for (aura::Window::Windows::const_iterator it =
dock_container_->children().begin();
it != dock_container_->children().end(); ++it) {
if (!IsUsedByLayout(*it) ||
if (!IsWindowDocked(*it) ||
((*it) == dragged_window_ && !is_dragged_window_docked_)) {
continue;
}

@ -237,6 +237,23 @@ TEST_P(DockedWindowLayoutManagerTest, AddOneWindow) {
EXPECT_EQ(kShellWindowId_DockedContainer, window->parent()->id());
}
// Tests that a docked window's bounds cannot be changed programmatically.
TEST_P(DockedWindowLayoutManagerTest, DockedWindowBoundsDontChange) {
if (!SupportsHostWindowResize())
return;
gfx::Rect bounds(0, 0, 201, 201);
scoped_ptr<aura::Window> window(CreateTestWindow(bounds));
DragRelativeToEdge(DOCKED_EDGE_RIGHT, window.get(), 0);
// The window should be attached and docked at the right edge.
EXPECT_EQ(kShellWindowId_DockedContainer, window->parent()->id());
bounds = window->GetBoundsInScreen();
window->SetBounds(gfx::Rect(210, 210, 210, 210));
EXPECT_EQ(bounds.ToString(), window->GetBoundsInScreen().ToString());
}
// Tests that with a window docked on the left the auto-placing logic in
// RearrangeVisibleWindowOnShow places windows flush with work area edges.
TEST_P(DockedWindowLayoutManagerTest, AutoPlacingLeft) {