Commit d229cdd7 authored by varkha@chromium.org's avatar varkha@chromium.org

Avoids updating dock alignment when drag is cancelled

BUG=334313
TEST=ash_unittests --gtest_filter=*RevertDockedDragRevertsAttachment*
TEST=Manual on Chromebook

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@245435 0039d316-1c4b-4281-b951-d872f2087c98
parent f4de0ad8
...@@ -464,6 +464,14 @@ void DockedWindowLayoutManager::StartDragging(aura::Window* window) { ...@@ -464,6 +464,14 @@ void DockedWindowLayoutManager::StartDragging(aura::Window* window) {
if (dragged_window_->parent() != dock_container_) { if (dragged_window_->parent() != dock_container_) {
dragged_window_->AddObserver(this); dragged_window_->AddObserver(this);
dragged_state->AddObserver(this); dragged_state->AddObserver(this);
} else if (!IsAnyWindowDocked() &&
dragged_state->drag_details() &&
!(dragged_state->drag_details()->bounds_change &
WindowResizer::kBoundsChange_Resizes)) {
// If there are no other docked windows clear alignment when a docked window
// is moved (but not when it is resized or the window could get undocked
// when resized away from the edge while docked).
alignment_ = DOCKED_ALIGNMENT_NONE;
} }
is_dragged_from_dock_ = window->parent() == dock_container_; is_dragged_from_dock_ = window->parent() == dock_container_;
DCHECK(!is_dragged_window_docked_); DCHECK(!is_dragged_window_docked_);
...@@ -518,6 +526,12 @@ void DockedWindowLayoutManager::FinishDragging(DockedAction action, ...@@ -518,6 +526,12 @@ void DockedWindowLayoutManager::FinishDragging(DockedAction action,
views::corewm::SetWindowShowAnimationDuration(dragged_window_, views::corewm::SetWindowShowAnimationDuration(dragged_window_,
base::TimeDelta()); base::TimeDelta());
} else { } else {
// If this is the first window that got docked by a move update alignment.
if (alignment_ == DOCKED_ALIGNMENT_NONE) {
alignment_ = GetAlignmentOfWindow(dragged_window_);
DCHECK(action == DOCKED_ACTION_NONE ||
alignment_ != DOCKED_ALIGNMENT_NONE);
}
// A window is no longer dragged and is a child. // A window is no longer dragged and is a child.
// When a window becomes a child at drag start this is // When a window becomes a child at drag start this is
// the only opportunity we will have to enforce a window // the only opportunity we will have to enforce a window
...@@ -657,7 +671,7 @@ void DockedWindowLayoutManager::OnWindowAddedToLayout(aura::Window* child) { ...@@ -657,7 +671,7 @@ void DockedWindowLayoutManager::OnWindowAddedToLayout(aura::Window* child) {
// change, so the the alignment may not be valid. // change, so the the alignment may not be valid.
if (alignment_ == DOCKED_ALIGNMENT_NONE) { if (alignment_ == DOCKED_ALIGNMENT_NONE) {
alignment_ = GetAlignmentOfWindow(child); alignment_ = GetAlignmentOfWindow(child);
DCHECK(alignment_ != DOCKED_ALIGNMENT_NONE); DCHECK_NE(DOCKED_ALIGNMENT_NONE, alignment_);
} }
MaybeMinimizeChildrenExcept(child); MaybeMinimizeChildrenExcept(child);
child->AddObserver(this); child->AddObserver(this);
...@@ -830,7 +844,7 @@ void DockedWindowLayoutManager::OnWindowDestroying(aura::Window* window) { ...@@ -830,7 +844,7 @@ void DockedWindowLayoutManager::OnWindowDestroying(aura::Window* window) {
if (dragged_window_ == window) { if (dragged_window_ == window) {
FinishDragging(DOCKED_ACTION_NONE, DOCKED_ACTION_SOURCE_UNKNOWN); FinishDragging(DOCKED_ACTION_NONE, DOCKED_ACTION_SOURCE_UNKNOWN);
DCHECK(!dragged_window_); DCHECK(!dragged_window_);
DCHECK (!is_dragged_window_docked_); DCHECK(!is_dragged_window_docked_);
} }
if (window == last_active_window_) if (window == last_active_window_)
last_active_window_ = NULL; last_active_window_ = NULL;
...@@ -985,25 +999,9 @@ void DockedWindowLayoutManager::UpdateDockedWidth(int width) { ...@@ -985,25 +999,9 @@ void DockedWindowLayoutManager::UpdateDockedWidth(int width) {
void DockedWindowLayoutManager::OnDraggedWindowDocked(aura::Window* window) { void DockedWindowLayoutManager::OnDraggedWindowDocked(aura::Window* window) {
DCHECK(!is_dragged_window_docked_); DCHECK(!is_dragged_window_docked_);
is_dragged_window_docked_ = true; is_dragged_window_docked_ = true;
// If there are no other docked windows update alignment when the window is
// moved.
if (!IsAnyWindowDocked() &&
wm::GetWindowState(dragged_window_)->drag_details() &&
!(wm::GetWindowState(dragged_window_)->drag_details()->bounds_change &
WindowResizer::kBoundsChange_Resizes)) {
alignment_ = DOCKED_ALIGNMENT_NONE;
}
} }
void DockedWindowLayoutManager::OnDraggedWindowUndocked() { void DockedWindowLayoutManager::OnDraggedWindowUndocked() {
// If this is the first window getting docked by moving it - update alignment.
if (!IsAnyWindowDocked() &&
wm::GetWindowState(dragged_window_)->drag_details() &&
!(wm::GetWindowState(dragged_window_)->drag_details()->bounds_change &
WindowResizer::kBoundsChange_Resizes)) {
alignment_ = GetAlignmentOfWindow(dragged_window_);
}
DCHECK (is_dragged_window_docked_); DCHECK (is_dragged_window_docked_);
is_dragged_window_docked_ = false; is_dragged_window_docked_ = false;
} }
......
...@@ -113,7 +113,7 @@ void DockedWindowResizer::Drag(const gfx::Point& location, int event_flags) { ...@@ -113,7 +113,7 @@ void DockedWindowResizer::Drag(const gfx::Point& location, int event_flags) {
void DockedWindowResizer::CompleteDrag() { void DockedWindowResizer::CompleteDrag() {
// The root window can change when dragging into a different screen. // The root window can change when dragging into a different screen.
next_window_resizer_->CompleteDrag(); next_window_resizer_->CompleteDrag();
FinishedDragging(); FinishedDragging(aura::client::MOVE_SUCCESSFUL);
} }
void DockedWindowResizer::RevertDrag() { void DockedWindowResizer::RevertDrag() {
...@@ -126,7 +126,7 @@ void DockedWindowResizer::RevertDrag() { ...@@ -126,7 +126,7 @@ void DockedWindowResizer::RevertDrag() {
else else
dock_layout_->UndockDraggedWindow(); dock_layout_->UndockDraggedWindow();
} }
FinishedDragging(); FinishedDragging(aura::client::MOVE_CANCELED);
} }
DockedWindowResizer::DockedWindowResizer(WindowResizer* next_window_resizer, DockedWindowResizer::DockedWindowResizer(WindowResizer* next_window_resizer,
...@@ -213,7 +213,8 @@ void DockedWindowResizer::StartedDragging() { ...@@ -213,7 +213,8 @@ void DockedWindowResizer::StartedDragging() {
dock_layout_->DockDraggedWindow(GetTarget()); dock_layout_->DockDraggedWindow(GetTarget());
} }
void DockedWindowResizer::FinishedDragging() { void DockedWindowResizer::FinishedDragging(
aura::client::WindowMoveResult move_result) {
if (!did_move_or_resize_) if (!did_move_or_resize_)
return; return;
did_move_or_resize_ = false; did_move_or_resize_ = false;
...@@ -245,7 +246,7 @@ void DockedWindowResizer::FinishedDragging() { ...@@ -245,7 +246,7 @@ void DockedWindowResizer::FinishedDragging() {
DockedAction action = MaybeReparentWindowOnDragCompletion(is_resized, DockedAction action = MaybeReparentWindowOnDragCompletion(is_resized,
is_attached_panel); is_attached_panel);
dock_layout_->FinishDragging( dock_layout_->FinishDragging(
action, move_result == aura::client::MOVE_CANCELED ? DOCKED_ACTION_NONE : action,
details().source == aura::client::WINDOW_MOVE_SOURCE_MOUSE ? details().source == aura::client::WINDOW_MOVE_SOURCE_MOUSE ?
DOCKED_ACTION_SOURCE_MOUSE : DOCKED_ACTION_SOURCE_TOUCH); DOCKED_ACTION_SOURCE_MOUSE : DOCKED_ACTION_SOURCE_TOUCH);
......
...@@ -58,8 +58,9 @@ class ASH_EXPORT DockedWindowResizer : public WindowResizer { ...@@ -58,8 +58,9 @@ class ASH_EXPORT DockedWindowResizer : public WindowResizer {
void StartedDragging(); void StartedDragging();
// Informs the DockLayoutManager that the drag is complete if it was informed // Informs the DockLayoutManager that the drag is complete if it was informed
// of the drag start. // of the drag start. |move_result| specifies if the drag was completed or
void FinishedDragging(); // reverted.
void FinishedDragging(aura::client::WindowMoveResult move_result);
// Reparents dragged window as necessary to the docked container or back to // Reparents dragged window as necessary to the docked container or back to
// workspace at the end of the drag. Calculates and returns action taken that // workspace at the end of the drag. Calculates and returns action taken that
......
...@@ -624,6 +624,11 @@ TEST_P(DockedWindowResizerTest, RevertDockedDragRevertsAttachment) { ...@@ -624,6 +624,11 @@ TEST_P(DockedWindowResizerTest, RevertDockedDragRevertsAttachment) {
if (!SupportsHostWindowResize()) if (!SupportsHostWindowResize())
return; return;
scoped_ptr<aura::Window> window(CreateTestWindow(gfx::Rect(0, 0, 201, 201))); scoped_ptr<aura::Window> window(CreateTestWindow(gfx::Rect(0, 0, 201, 201)));
aura::Window* dock_container = Shell::GetContainer(
window->GetRootWindow(),
kShellWindowId_DockedContainer);
DockedWindowLayoutManager* manager =
static_cast<DockedWindowLayoutManager*>(dock_container->layout_manager());
int previous_container_id = window->parent()->id(); int previous_container_id = window->parent()->id();
// Drag the window out but revert the drag // Drag the window out but revert the drag
ASSERT_NO_FATAL_FAILURE(DragStart(window.get())); ASSERT_NO_FATAL_FAILURE(DragStart(window.get()));
...@@ -631,6 +636,32 @@ TEST_P(DockedWindowResizerTest, RevertDockedDragRevertsAttachment) { ...@@ -631,6 +636,32 @@ TEST_P(DockedWindowResizerTest, RevertDockedDragRevertsAttachment) {
EXPECT_EQ(CorrectContainerIdDuringDrag(), window->parent()->id()); EXPECT_EQ(CorrectContainerIdDuringDrag(), window->parent()->id());
DragRevert(); DragRevert();
EXPECT_EQ(previous_container_id, window->parent()->id()); EXPECT_EQ(previous_container_id, window->parent()->id());
EXPECT_EQ(DOCKED_ALIGNMENT_NONE, docked_alignment(manager));
// Drag a window to the left so that it overlaps the screen edge.
ASSERT_NO_FATAL_FAILURE(DragStartAtOffsetFromWindowOrigin(
window.get(),
window->bounds().width()/2 + 10,
0));
DragMove(-50 - window->bounds().x(), 50 - window->bounds().y());
DragEnd();
// The window now overlaps the left screen edge but is not docked.
EXPECT_EQ(kShellWindowId_DefaultContainer, window->parent()->id());
EXPECT_EQ(DOCKED_ALIGNMENT_NONE, docked_alignment(manager));
EXPECT_LT(window->bounds().x(), 0);
EXPECT_GT(window->bounds().right(), 0);
// Drag the window further left and revert the drag.
ASSERT_NO_FATAL_FAILURE(DragStartAtOffsetFromWindowOrigin(
window.get(),
window->bounds().width()/2 + 10,
0));
DragMove(-10, 10);
DragRevert();
// The window should be in default container and not docked.
EXPECT_EQ(kShellWindowId_DefaultContainer, window->parent()->id());
// Docked area alignment should be cleared.
EXPECT_EQ(DOCKED_ALIGNMENT_NONE, docked_alignment(manager));
} }
// Move a docked window to the second display // Move a docked window to the second display
......
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