| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ash/wm/toplevel_window_event_handler.h" | 5 #include "ash/wm/toplevel_window_event_handler.h" |
| 6 | 6 |
| 7 #include "ash/root_window_controller.h" | 7 #include "ash/root_window_controller.h" |
| 8 #include "ash/shell.h" | 8 #include "ash/shell.h" |
| 9 #include "ash/shell_window_ids.h" | 9 #include "ash/shell_window_ids.h" |
| 10 #include "ash/test/ash_test_base.h" | 10 #include "ash/test/ash_test_base.h" |
| 11 #include "ash/wm/lock_state_controller.h" | 11 #include "ash/wm/lock_state_controller.h" |
| 12 #include "ash/wm/resize_shadow.h" | 12 #include "ash/wm/resize_shadow.h" |
| 13 #include "ash/wm/resize_shadow_controller.h" | 13 #include "ash/wm/resize_shadow_controller.h" |
| 14 #include "ash/wm/window_state.h" | 14 #include "ash/wm/window_state.h" |
| 15 #include "ash/wm/window_util.h" | 15 #include "ash/wm/window_util.h" |
| 16 #include "ash/wm/workspace_controller.h" | 16 #include "ash/wm/workspace_controller.h" |
| 17 #include "base/basictypes.h" | 17 #include "base/basictypes.h" |
| 18 #include "base/compiler_specific.h" | 18 #include "base/compiler_specific.h" |
| 19 #include "base/message_loop/message_loop.h" | 19 #include "base/message_loop/message_loop.h" |
| 20 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
| 21 #include "ui/aura/client/aura_constants.h" | 21 #include "ui/aura/client/aura_constants.h" |
| 22 #include "ui/aura/test/aura_test_base.h" | 22 #include "ui/aura/test/aura_test_base.h" |
| 23 #include "ui/aura/test/event_generator.h" |
| 23 #include "ui/aura/test/test_window_delegate.h" | 24 #include "ui/aura/test/test_window_delegate.h" |
| 24 #include "ui/aura/window_event_dispatcher.h" | 25 #include "ui/aura/window_event_dispatcher.h" |
| 25 #include "ui/base/hit_test.h" | 26 #include "ui/base/hit_test.h" |
| 26 #include "ui/events/event.h" | 27 #include "ui/events/event.h" |
| 27 #include "ui/events/test/event_generator.h" | |
| 28 #include "ui/gfx/screen.h" | 28 #include "ui/gfx/screen.h" |
| 29 #include "ui/wm/core/window_util.h" | 29 #include "ui/wm/core/window_util.h" |
| 30 #include "ui/wm/public/window_move_client.h" | 30 #include "ui/wm/public/window_move_client.h" |
| 31 | 31 |
| 32 #if defined(OS_WIN) | 32 #if defined(OS_WIN) |
| 33 // Windows headers define macros for these function names which screw with us. | 33 // Windows headers define macros for these function names which screw with us. |
| 34 #if defined(CreateWindow) | 34 #if defined(CreateWindow) |
| 35 #undef CreateWindow | 35 #undef CreateWindow |
| 36 #endif | 36 #endif |
| 37 #endif | 37 #endif |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 w1->Init(aura::WINDOW_LAYER_TEXTURED); | 73 w1->Init(aura::WINDOW_LAYER_TEXTURED); |
| 74 aura::Window* parent = Shell::GetContainer( | 74 aura::Window* parent = Shell::GetContainer( |
| 75 Shell::GetPrimaryRootWindow(), kShellWindowId_AlwaysOnTopContainer); | 75 Shell::GetPrimaryRootWindow(), kShellWindowId_AlwaysOnTopContainer); |
| 76 parent->AddChild(w1); | 76 parent->AddChild(w1); |
| 77 w1->SetBounds(gfx::Rect(0, 0, 100, 100)); | 77 w1->SetBounds(gfx::Rect(0, 0, 100, 100)); |
| 78 w1->Show(); | 78 w1->Show(); |
| 79 return w1; | 79 return w1; |
| 80 } | 80 } |
| 81 | 81 |
| 82 void DragFromCenterBy(aura::Window* window, int dx, int dy) { | 82 void DragFromCenterBy(aura::Window* window, int dx, int dy) { |
| 83 ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), window); | 83 aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), window); |
| 84 generator.DragMouseBy(dx, dy); | 84 generator.DragMouseBy(dx, dy); |
| 85 } | 85 } |
| 86 | 86 |
| 87 void TouchDragFromCenterBy(aura::Window* window, int dx, int dy) { | 87 void TouchDragFromCenterBy(aura::Window* window, int dx, int dy) { |
| 88 ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), window); | 88 aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), window); |
| 89 generator.PressMoveAndReleaseTouchBy(dx, dy); | 89 generator.PressMoveAndReleaseTouchBy(dx, dy); |
| 90 } | 90 } |
| 91 | 91 |
| 92 scoped_ptr<ToplevelWindowEventHandler> handler_; | 92 scoped_ptr<ToplevelWindowEventHandler> handler_; |
| 93 | 93 |
| 94 private: | 94 private: |
| 95 DISALLOW_COPY_AND_ASSIGN(ToplevelWindowEventHandlerTest); | 95 DISALLOW_COPY_AND_ASSIGN(ToplevelWindowEventHandlerTest); |
| 96 }; | 96 }; |
| 97 | 97 |
| 98 } | 98 } |
| (...skipping 24 matching lines...) Expand all Loading... |
| 123 EXPECT_EQ(gfx::Size(200, 200).ToString(), w1->bounds().size().ToString()); | 123 EXPECT_EQ(gfx::Size(200, 200).ToString(), w1->bounds().size().ToString()); |
| 124 } | 124 } |
| 125 | 125 |
| 126 TEST_F(ToplevelWindowEventHandlerTest, GrowBox) { | 126 TEST_F(ToplevelWindowEventHandlerTest, GrowBox) { |
| 127 scoped_ptr<aura::Window> w1(CreateWindow(HTGROWBOX)); | 127 scoped_ptr<aura::Window> w1(CreateWindow(HTGROWBOX)); |
| 128 TestWindowDelegate* window_delegate = | 128 TestWindowDelegate* window_delegate = |
| 129 static_cast<TestWindowDelegate*>(w1->delegate()); | 129 static_cast<TestWindowDelegate*>(w1->delegate()); |
| 130 window_delegate->set_minimum_size(gfx::Size(40, 40)); | 130 window_delegate->set_minimum_size(gfx::Size(40, 40)); |
| 131 | 131 |
| 132 gfx::Point position = w1->bounds().origin(); | 132 gfx::Point position = w1->bounds().origin(); |
| 133 ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow()); | 133 aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow()); |
| 134 generator.MoveMouseToCenterOf(w1.get()); | 134 generator.MoveMouseToCenterOf(w1.get()); |
| 135 generator.DragMouseBy(100, 100); | 135 generator.DragMouseBy(100, 100); |
| 136 // Position should not have changed. | 136 // Position should not have changed. |
| 137 EXPECT_EQ(position.ToString(), w1->bounds().origin().ToString()); | 137 EXPECT_EQ(position.ToString(), w1->bounds().origin().ToString()); |
| 138 // Size should have increased by 100,100. | 138 // Size should have increased by 100,100. |
| 139 EXPECT_EQ(gfx::Size(200, 200).ToString(), w1->bounds().size().ToString()); | 139 EXPECT_EQ(gfx::Size(200, 200).ToString(), w1->bounds().size().ToString()); |
| 140 | 140 |
| 141 // Shrink the wnidow by (-100, -100). | 141 // Shrink the wnidow by (-100, -100). |
| 142 generator.DragMouseBy(-100, -100); | 142 generator.DragMouseBy(-100, -100); |
| 143 // Position should not have changed. | 143 // Position should not have changed. |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 367 EXPECT_EQ(size.ToString(), w1->bounds().size().ToString()); | 367 EXPECT_EQ(size.ToString(), w1->bounds().size().ToString()); |
| 368 | 368 |
| 369 TouchDragFromCenterBy(w1.get(), 100, 100); | 369 TouchDragFromCenterBy(w1.get(), 100, 100); |
| 370 EXPECT_EQ("0,0", w1->bounds().origin().ToString()); | 370 EXPECT_EQ("0,0", w1->bounds().origin().ToString()); |
| 371 EXPECT_EQ(size.ToString(), w1->bounds().size().ToString()); | 371 EXPECT_EQ(size.ToString(), w1->bounds().size().ToString()); |
| 372 } | 372 } |
| 373 | 373 |
| 374 // Verifies we don't let windows drag to a -y location. | 374 // Verifies we don't let windows drag to a -y location. |
| 375 TEST_F(ToplevelWindowEventHandlerTest, DontDragToNegativeY) { | 375 TEST_F(ToplevelWindowEventHandlerTest, DontDragToNegativeY) { |
| 376 scoped_ptr<aura::Window> target(CreateWindow(HTTOP)); | 376 scoped_ptr<aura::Window> target(CreateWindow(HTTOP)); |
| 377 ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), | 377 aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), |
| 378 target.get()); | 378 target.get()); |
| 379 generator.MoveMouseTo(0, 5); | 379 generator.MoveMouseTo(0, 5); |
| 380 generator.DragMouseBy(0, -5); | 380 generator.DragMouseBy(0, -5); |
| 381 // The y location and height should not have changed. | 381 // The y location and height should not have changed. |
| 382 EXPECT_EQ(0, target->bounds().y()); | 382 EXPECT_EQ(0, target->bounds().y()); |
| 383 EXPECT_EQ(100, target->bounds().height()); | 383 EXPECT_EQ(100, target->bounds().height()); |
| 384 } | 384 } |
| 385 | 385 |
| 386 // Verifies we don't let windows go bigger than the display width. | 386 // Verifies we don't let windows go bigger than the display width. |
| 387 TEST_F(ToplevelWindowEventHandlerTest, DontGotWiderThanScreen) { | 387 TEST_F(ToplevelWindowEventHandlerTest, DontGotWiderThanScreen) { |
| 388 scoped_ptr<aura::Window> target(CreateWindow(HTRIGHT)); | 388 scoped_ptr<aura::Window> target(CreateWindow(HTRIGHT)); |
| 389 gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow( | 389 gfx::Rect work_area = Shell::GetScreen()->GetDisplayNearestWindow( |
| 390 target.get()).bounds(); | 390 target.get()).bounds(); |
| 391 DragFromCenterBy(target.get(), work_area.width() * 2, 0); | 391 DragFromCenterBy(target.get(), work_area.width() * 2, 0); |
| 392 // The y location and height should not have changed. | 392 // The y location and height should not have changed. |
| 393 EXPECT_EQ(work_area.width(), target->bounds().width()); | 393 EXPECT_EQ(work_area.width(), target->bounds().width()); |
| 394 } | 394 } |
| 395 | 395 |
| 396 // Verifies that touch-gestures drag the window correctly. | 396 // Verifies that touch-gestures drag the window correctly. |
| 397 TEST_F(ToplevelWindowEventHandlerTest, GestureDrag) { | 397 TEST_F(ToplevelWindowEventHandlerTest, GestureDrag) { |
| 398 scoped_ptr<aura::Window> target( | 398 scoped_ptr<aura::Window> target( |
| 399 CreateTestWindowInShellWithDelegate( | 399 CreateTestWindowInShellWithDelegate( |
| 400 new TestWindowDelegate(HTCAPTION), | 400 new TestWindowDelegate(HTCAPTION), |
| 401 0, | 401 0, |
| 402 gfx::Rect(0, 0, 100, 100))); | 402 gfx::Rect(0, 0, 100, 100))); |
| 403 wm::WindowState* window_state = wm::GetWindowState(target.get()); | 403 wm::WindowState* window_state = wm::GetWindowState(target.get()); |
| 404 ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), | 404 aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), |
| 405 target.get()); | 405 target.get()); |
| 406 gfx::Rect old_bounds = target->bounds(); | 406 gfx::Rect old_bounds = target->bounds(); |
| 407 gfx::Point location(5, 5); | 407 gfx::Point location(5, 5); |
| 408 target->SetProperty(aura::client::kCanMaximizeKey, true); | 408 target->SetProperty(aura::client::kCanMaximizeKey, true); |
| 409 | 409 |
| 410 gfx::Point end = location; | 410 gfx::Point end = location; |
| 411 | 411 |
| 412 // Snap right; | 412 // Snap right; |
| 413 end.Offset(100, 0); | 413 end.Offset(100, 0); |
| 414 generator.GestureScrollSequence(location, end, | 414 generator.GestureScrollSequence(location, end, |
| 415 base::TimeDelta::FromMilliseconds(5), | 415 base::TimeDelta::FromMilliseconds(5), |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 474 Shell::GetInstance()->lock_state_controller(); | 474 Shell::GetInstance()->lock_state_controller(); |
| 475 state_controller->OnLoginStateChanged(user::LOGGED_IN_NONE); | 475 state_controller->OnLoginStateChanged(user::LOGGED_IN_NONE); |
| 476 state_controller->OnLockStateChanged(false); | 476 state_controller->OnLockStateChanged(false); |
| 477 SetUserLoggedIn(false); | 477 SetUserLoggedIn(false); |
| 478 | 478 |
| 479 scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION)); | 479 scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION)); |
| 480 aura::Window* lock = | 480 aura::Window* lock = |
| 481 RootWindowController::ForWindow(target.get()) | 481 RootWindowController::ForWindow(target.get()) |
| 482 ->GetContainer(kShellWindowId_LockSystemModalContainer); | 482 ->GetContainer(kShellWindowId_LockSystemModalContainer); |
| 483 lock->AddChild(target.get()); | 483 lock->AddChild(target.get()); |
| 484 ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), | 484 aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), |
| 485 target.get()); | 485 target.get()); |
| 486 gfx::Rect old_bounds = target->bounds(); | 486 gfx::Rect old_bounds = target->bounds(); |
| 487 gfx::Point location(5, 5); | 487 gfx::Point location(5, 5); |
| 488 target->SetProperty(aura::client::kCanMaximizeKey, true); | 488 target->SetProperty(aura::client::kCanMaximizeKey, true); |
| 489 | 489 |
| 490 gfx::Point end = location; | 490 gfx::Point end = location; |
| 491 end.Offset(0, 100); | 491 end.Offset(0, 100); |
| 492 generator.GestureScrollSequence(location, end, | 492 generator.GestureScrollSequence(location, end, |
| 493 base::TimeDelta::FromMilliseconds(5), | 493 base::TimeDelta::FromMilliseconds(5), |
| 494 10); | 494 10); |
| 495 RunAllPendingInMessageLoop(); | 495 RunAllPendingInMessageLoop(); |
| 496 EXPECT_FALSE(wm::GetWindowState(target.get())->IsMinimized()); | 496 EXPECT_FALSE(wm::GetWindowState(target.get())->IsMinimized()); |
| 497 } | 497 } |
| 498 | 498 |
| 499 TEST_F(ToplevelWindowEventHandlerTest, GestureDragToRestore) { | 499 TEST_F(ToplevelWindowEventHandlerTest, GestureDragToRestore) { |
| 500 scoped_ptr<aura::Window> window( | 500 scoped_ptr<aura::Window> window( |
| 501 CreateTestWindowInShellWithDelegate( | 501 CreateTestWindowInShellWithDelegate( |
| 502 new TestWindowDelegate(HTCAPTION), | 502 new TestWindowDelegate(HTCAPTION), |
| 503 0, | 503 0, |
| 504 gfx::Rect(10, 20, 30, 40))); | 504 gfx::Rect(10, 20, 30, 40))); |
| 505 window->Show(); | 505 window->Show(); |
| 506 wm::WindowState* window_state = wm::GetWindowState(window.get()); | 506 wm::WindowState* window_state = wm::GetWindowState(window.get()); |
| 507 window_state->Activate(); | 507 window_state->Activate(); |
| 508 | 508 |
| 509 ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), | 509 aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), |
| 510 window.get()); | 510 window.get()); |
| 511 gfx::Rect old_bounds = window->bounds(); | 511 gfx::Rect old_bounds = window->bounds(); |
| 512 gfx::Point location, end; | 512 gfx::Point location, end; |
| 513 end = location = window->GetBoundsInRootWindow().CenterPoint(); | 513 end = location = window->GetBoundsInRootWindow().CenterPoint(); |
| 514 end.Offset(0, 100); | 514 end.Offset(0, 100); |
| 515 generator.GestureScrollSequence(location, end, | 515 generator.GestureScrollSequence(location, end, |
| 516 base::TimeDelta::FromMilliseconds(5), | 516 base::TimeDelta::FromMilliseconds(5), |
| 517 10); | 517 10); |
| 518 RunAllPendingInMessageLoop(); | 518 RunAllPendingInMessageLoop(); |
| 519 EXPECT_NE(old_bounds.ToString(), window->bounds().ToString()); | 519 EXPECT_NE(old_bounds.ToString(), window->bounds().ToString()); |
| 520 EXPECT_TRUE(window_state->IsMinimized()); | 520 EXPECT_TRUE(window_state->IsMinimized()); |
| 521 EXPECT_TRUE(window_state->unminimize_to_restore_bounds()); | 521 EXPECT_TRUE(window_state->unminimize_to_restore_bounds()); |
| 522 EXPECT_EQ(old_bounds.ToString(), | 522 EXPECT_EQ(old_bounds.ToString(), |
| 523 window_state->GetRestoreBoundsInScreen().ToString()); | 523 window_state->GetRestoreBoundsInScreen().ToString()); |
| 524 } | 524 } |
| 525 | 525 |
| 526 // Tests that an unresizable window cannot be dragged or snapped using gestures. | 526 // Tests that an unresizable window cannot be dragged or snapped using gestures. |
| 527 TEST_F(ToplevelWindowEventHandlerTest, GestureDragForUnresizableWindow) { | 527 TEST_F(ToplevelWindowEventHandlerTest, GestureDragForUnresizableWindow) { |
| 528 scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION)); | 528 scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION)); |
| 529 wm::WindowState* window_state = wm::GetWindowState(target.get()); | 529 wm::WindowState* window_state = wm::GetWindowState(target.get()); |
| 530 | 530 |
| 531 ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), | 531 aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), |
| 532 target.get()); | 532 target.get()); |
| 533 gfx::Rect old_bounds = target->bounds(); | 533 gfx::Rect old_bounds = target->bounds(); |
| 534 gfx::Point location(5, 5); | 534 gfx::Point location(5, 5); |
| 535 | 535 |
| 536 target->SetProperty(aura::client::kCanResizeKey, false); | 536 target->SetProperty(aura::client::kCanResizeKey, false); |
| 537 | 537 |
| 538 gfx::Point end = location; | 538 gfx::Point end = location; |
| 539 | 539 |
| 540 // Try to snap right. The window is not resizable. So it should not snap. | 540 // Try to snap right. The window is not resizable. So it should not snap. |
| 541 end.Offset(100, 0); | 541 end.Offset(100, 0); |
| 542 generator.GestureScrollSequence(location, end, | 542 generator.GestureScrollSequence(location, end, |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 576 scoped_ptr<aura::Window> target( | 576 scoped_ptr<aura::Window> target( |
| 577 CreateTestWindowInShellWithDelegate( | 577 CreateTestWindowInShellWithDelegate( |
| 578 new TestWindowDelegate(HTCAPTION), | 578 new TestWindowDelegate(HTCAPTION), |
| 579 0, | 579 0, |
| 580 gfx::Rect(0, 0, 100, 100))); | 580 gfx::Rect(0, 0, 100, 100))); |
| 581 scoped_ptr<aura::Window> notmoved( | 581 scoped_ptr<aura::Window> notmoved( |
| 582 CreateTestWindowInShellWithDelegate( | 582 CreateTestWindowInShellWithDelegate( |
| 583 new TestWindowDelegate(HTCAPTION), | 583 new TestWindowDelegate(HTCAPTION), |
| 584 1, gfx::Rect(100, 0, 100, 100))); | 584 1, gfx::Rect(100, 0, 100, 100))); |
| 585 | 585 |
| 586 ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), | 586 aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), |
| 587 target.get()); | 587 target.get()); |
| 588 gfx::Rect old_bounds = target->bounds(); | 588 gfx::Rect old_bounds = target->bounds(); |
| 589 gfx::Point location(5, 5); | 589 gfx::Point location(5, 5); |
| 590 target->SetProperty(aura::client::kCanMaximizeKey, true); | 590 target->SetProperty(aura::client::kCanMaximizeKey, true); |
| 591 | 591 |
| 592 // Send some touch events to start dragging |target|. | 592 // Send some touch events to start dragging |target|. |
| 593 generator.MoveTouch(location); | 593 generator.MoveTouch(location); |
| 594 generator.PressTouch(); | 594 generator.PressTouch(); |
| 595 location.Offset(40, 5); | 595 location.Offset(40, 5); |
| 596 generator.MoveTouch(location); | 596 generator.MoveTouch(location); |
| 597 | 597 |
| 598 // Try to drag |notmoved| window. This should not move the window. | 598 // Try to drag |notmoved| window. This should not move the window. |
| 599 { | 599 { |
| 600 gfx::Rect bounds = notmoved->bounds(); | 600 gfx::Rect bounds = notmoved->bounds(); |
| 601 ui::test::EventGenerator gen(Shell::GetPrimaryRootWindow(), notmoved.get()); | 601 aura::test::EventGenerator gen(Shell::GetPrimaryRootWindow(), |
| 602 notmoved.get()); |
| 602 gfx::Point start = notmoved->bounds().origin() + gfx::Vector2d(10, 10); | 603 gfx::Point start = notmoved->bounds().origin() + gfx::Vector2d(10, 10); |
| 603 gfx::Point end = start + gfx::Vector2d(100, 10); | 604 gfx::Point end = start + gfx::Vector2d(100, 10); |
| 604 gen.GestureScrollSequence(start, end, | 605 gen.GestureScrollSequence(start, end, |
| 605 base::TimeDelta::FromMilliseconds(10), | 606 base::TimeDelta::FromMilliseconds(10), |
| 606 10); | 607 10); |
| 607 EXPECT_EQ(bounds.ToString(), notmoved->bounds().ToString()); | 608 EXPECT_EQ(bounds.ToString(), notmoved->bounds().ToString()); |
| 608 } | 609 } |
| 609 } | 610 } |
| 610 | 611 |
| 611 // Verifies pressing escape resets the bounds to the original bounds. | 612 // Verifies pressing escape resets the bounds to the original bounds. |
| 612 // Disabled crbug.com/166219. | 613 // Disabled crbug.com/166219. |
| 613 #if defined(OS_WIN) | 614 #if defined(OS_WIN) |
| 614 #define MAYBE_EscapeReverts DISABLED_EscapeReverts | 615 #define MAYBE_EscapeReverts DISABLED_EscapeReverts |
| 615 #else | 616 #else |
| 616 #define MAYBE_EscapeReverts EscapeReverts | 617 #define MAYBE_EscapeReverts EscapeReverts |
| 617 #endif | 618 #endif |
| 618 TEST_F(ToplevelWindowEventHandlerTest, MAYBE_EscapeReverts) { | 619 TEST_F(ToplevelWindowEventHandlerTest, MAYBE_EscapeReverts) { |
| 619 scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOMRIGHT)); | 620 scoped_ptr<aura::Window> target(CreateWindow(HTBOTTOMRIGHT)); |
| 620 ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), | 621 aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), |
| 621 target.get()); | 622 target.get()); |
| 622 generator.PressLeftButton(); | 623 generator.PressLeftButton(); |
| 623 generator.MoveMouseBy(10, 11); | 624 generator.MoveMouseBy(10, 11); |
| 624 | 625 |
| 625 // Execute any scheduled draws so that pending mouse events are processed. | 626 // Execute any scheduled draws so that pending mouse events are processed. |
| 626 RunAllPendingInMessageLoop(); | 627 RunAllPendingInMessageLoop(); |
| 627 | 628 |
| 628 EXPECT_EQ("0,0 110x111", target->bounds().ToString()); | 629 EXPECT_EQ("0,0 110x111", target->bounds().ToString()); |
| 629 generator.PressKey(ui::VKEY_ESCAPE, 0); | 630 generator.PressKey(ui::VKEY_ESCAPE, 0); |
| 630 generator.ReleaseKey(ui::VKEY_ESCAPE, 0); | 631 generator.ReleaseKey(ui::VKEY_ESCAPE, 0); |
| 631 EXPECT_EQ("0,0 100x100", target->bounds().ToString()); | 632 EXPECT_EQ("0,0 100x100", target->bounds().ToString()); |
| 632 } | 633 } |
| 633 | 634 |
| 634 // Verifies window minimization/maximization completes drag. | 635 // Verifies window minimization/maximization completes drag. |
| 635 // Disabled crbug.com/166219. | 636 // Disabled crbug.com/166219. |
| 636 #if defined(OS_WIN) | 637 #if defined(OS_WIN) |
| 637 #define MAYBE_MinimizeMaximizeCompletes DISABLED_MinimizeMaximizeCompletes | 638 #define MAYBE_MinimizeMaximizeCompletes DISABLED_MinimizeMaximizeCompletes |
| 638 #else | 639 #else |
| 639 #define MAYBE_MinimizeMaximizeCompletes MinimizeMaximizeCompletes | 640 #define MAYBE_MinimizeMaximizeCompletes MinimizeMaximizeCompletes |
| 640 #endif | 641 #endif |
| 641 TEST_F(ToplevelWindowEventHandlerTest, MAYBE_MinimizeMaximizeCompletes) { | 642 TEST_F(ToplevelWindowEventHandlerTest, MAYBE_MinimizeMaximizeCompletes) { |
| 642 // Once window is minimized, window dragging completes. | 643 // Once window is minimized, window dragging completes. |
| 643 { | 644 { |
| 644 scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION)); | 645 scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION)); |
| 645 target->Focus(); | 646 target->Focus(); |
| 646 ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), | 647 aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), |
| 647 target.get()); | 648 target.get()); |
| 648 generator.PressLeftButton(); | 649 generator.PressLeftButton(); |
| 649 generator.MoveMouseBy(10, 11); | 650 generator.MoveMouseBy(10, 11); |
| 650 RunAllPendingInMessageLoop(); | 651 RunAllPendingInMessageLoop(); |
| 651 EXPECT_EQ("10,11 100x100", target->bounds().ToString()); | 652 EXPECT_EQ("10,11 100x100", target->bounds().ToString()); |
| 652 wm::WindowState* window_state = wm::GetWindowState(target.get()); | 653 wm::WindowState* window_state = wm::GetWindowState(target.get()); |
| 653 window_state->Minimize(); | 654 window_state->Minimize(); |
| 654 window_state->Restore(); | 655 window_state->Restore(); |
| 655 | 656 |
| 656 generator.PressLeftButton(); | 657 generator.PressLeftButton(); |
| 657 generator.MoveMouseBy(10, 11); | 658 generator.MoveMouseBy(10, 11); |
| 658 RunAllPendingInMessageLoop(); | 659 RunAllPendingInMessageLoop(); |
| 659 EXPECT_EQ("10,11 100x100", target->bounds().ToString()); | 660 EXPECT_EQ("10,11 100x100", target->bounds().ToString()); |
| 660 } | 661 } |
| 661 | 662 |
| 662 // Once window is maximized, window dragging completes. | 663 // Once window is maximized, window dragging completes. |
| 663 { | 664 { |
| 664 scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION)); | 665 scoped_ptr<aura::Window> target(CreateWindow(HTCAPTION)); |
| 665 target->Focus(); | 666 target->Focus(); |
| 666 ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), | 667 aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), |
| 667 target.get()); | 668 target.get()); |
| 668 generator.PressLeftButton(); | 669 generator.PressLeftButton(); |
| 669 generator.MoveMouseBy(10, 11); | 670 generator.MoveMouseBy(10, 11); |
| 670 RunAllPendingInMessageLoop(); | 671 RunAllPendingInMessageLoop(); |
| 671 EXPECT_EQ("10,11 100x100", target->bounds().ToString()); | 672 EXPECT_EQ("10,11 100x100", target->bounds().ToString()); |
| 672 wm::WindowState* window_state = wm::GetWindowState(target.get()); | 673 wm::WindowState* window_state = wm::GetWindowState(target.get()); |
| 673 window_state->Maximize(); | 674 window_state->Maximize(); |
| 674 window_state->Restore(); | 675 window_state->Restore(); |
| 675 | 676 |
| 676 generator.PressLeftButton(); | 677 generator.PressLeftButton(); |
| 677 generator.MoveMouseBy(10, 11); | 678 generator.MoveMouseBy(10, 11); |
| 678 RunAllPendingInMessageLoop(); | 679 RunAllPendingInMessageLoop(); |
| 679 EXPECT_EQ("10,11 100x100", target->bounds().ToString()); | 680 EXPECT_EQ("10,11 100x100", target->bounds().ToString()); |
| 680 } | 681 } |
| 681 } | 682 } |
| 682 | 683 |
| 683 // Verifies that a drag cannot be started via | 684 // Verifies that a drag cannot be started via |
| 684 // aura::client::WindowMoveClient::RunMoveLoop() while another drag is already | 685 // aura::client::WindowMoveClient::RunMoveLoop() while another drag is already |
| 685 // in progress. | 686 // in progress. |
| 686 TEST_F(ToplevelWindowEventHandlerTest, RunMoveLoopFailsDuringInProgressDrag) { | 687 TEST_F(ToplevelWindowEventHandlerTest, RunMoveLoopFailsDuringInProgressDrag) { |
| 687 scoped_ptr<aura::Window> window1(CreateWindow(HTCAPTION)); | 688 scoped_ptr<aura::Window> window1(CreateWindow(HTCAPTION)); |
| 688 EXPECT_EQ("0,0 100x100", window1->bounds().ToString()); | 689 EXPECT_EQ("0,0 100x100", window1->bounds().ToString()); |
| 689 scoped_ptr<aura::Window> window2(CreateWindow(HTCAPTION)); | 690 scoped_ptr<aura::Window> window2(CreateWindow(HTCAPTION)); |
| 690 | 691 |
| 691 ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), | 692 aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), |
| 692 window1.get()); | 693 window1.get()); |
| 693 window1->Focus(); | 694 window1->Focus(); |
| 694 generator.PressLeftButton(); | 695 generator.PressLeftButton(); |
| 695 generator.MoveMouseBy(10, 11); | 696 generator.MoveMouseBy(10, 11); |
| 696 EXPECT_EQ("10,11 100x100", window1->bounds().ToString()); | 697 EXPECT_EQ("10,11 100x100", window1->bounds().ToString()); |
| 697 | 698 |
| 698 aura::client::WindowMoveClient* move_client = | 699 aura::client::WindowMoveClient* move_client = |
| 699 aura::client::GetWindowMoveClient(window2->GetRootWindow()); | 700 aura::client::GetWindowMoveClient(window2->GetRootWindow()); |
| 700 EXPECT_EQ(aura::client::MOVE_CANCELED, | 701 EXPECT_EQ(aura::client::MOVE_CANCELED, |
| 701 move_client->RunMoveLoop(window2.get(), gfx::Vector2d(), | 702 move_client->RunMoveLoop(window2.get(), gfx::Vector2d(), |
| 702 aura::client::WINDOW_MOVE_SOURCE_MOUSE)); | 703 aura::client::WINDOW_MOVE_SOURCE_MOUSE)); |
| 703 | 704 |
| 704 generator.ReleaseLeftButton(); | 705 generator.ReleaseLeftButton(); |
| 705 EXPECT_EQ("10,11 100x100", window1->bounds().ToString()); | 706 EXPECT_EQ("10,11 100x100", window1->bounds().ToString()); |
| 706 } | 707 } |
| 707 | 708 |
| 708 namespace { | 709 namespace { |
| 709 | 710 |
| 710 void SendMouseReleaseAndReleaseCapture(ui::test::EventGenerator* generator, | 711 void SendMouseReleaseAndReleaseCapture(aura::test::EventGenerator* generator, |
| 711 aura::Window* window) { | 712 aura::Window* window) { |
| 712 generator->ReleaseLeftButton(); | 713 generator->ReleaseLeftButton(); |
| 713 window->ReleaseCapture(); | 714 window->ReleaseCapture(); |
| 714 } | 715 } |
| 715 | 716 |
| 716 } // namespace | 717 } // namespace |
| 717 | 718 |
| 718 // Test that a drag is successful even if ET_MOUSE_CAPTURE_CHANGED is sent | 719 // Test that a drag is successful even if ET_MOUSE_CAPTURE_CHANGED is sent |
| 719 // immediately after the mouse release. views::Widget has this behavior. | 720 // immediately after the mouse release. views::Widget has this behavior. |
| 720 TEST_F(ToplevelWindowEventHandlerTest, CaptureLossAfterMouseRelease) { | 721 TEST_F(ToplevelWindowEventHandlerTest, CaptureLossAfterMouseRelease) { |
| 721 scoped_ptr<aura::Window> window(CreateWindow(HTNOWHERE)); | 722 scoped_ptr<aura::Window> window(CreateWindow(HTNOWHERE)); |
| 722 ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), | 723 aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), |
| 723 window.get()); | 724 window.get()); |
| 724 generator.PressLeftButton(); | 725 generator.PressLeftButton(); |
| 725 window->SetCapture(); | 726 window->SetCapture(); |
| 726 | 727 |
| 727 aura::client::WindowMoveClient* move_client = | 728 aura::client::WindowMoveClient* move_client = |
| 728 aura::client::GetWindowMoveClient(window->GetRootWindow()); | 729 aura::client::GetWindowMoveClient(window->GetRootWindow()); |
| 729 base::MessageLoopForUI::current()->PostTask( | 730 base::MessageLoopForUI::current()->PostTask( |
| 730 FROM_HERE, | 731 FROM_HERE, |
| 731 base::Bind(&SendMouseReleaseAndReleaseCapture, | 732 base::Bind(&SendMouseReleaseAndReleaseCapture, |
| 732 base::Unretained(&generator), | 733 base::Unretained(&generator), |
| 733 base::Unretained(window.get()))); | 734 base::Unretained(window.get()))); |
| 734 EXPECT_EQ(aura::client::MOVE_SUCCESSFUL, | 735 EXPECT_EQ(aura::client::MOVE_SUCCESSFUL, |
| 735 move_client->RunMoveLoop(window.get(), gfx::Vector2d(), | 736 move_client->RunMoveLoop(window.get(), gfx::Vector2d(), |
| 736 aura::client::WINDOW_MOVE_SOURCE_MOUSE)); | 737 aura::client::WINDOW_MOVE_SOURCE_MOUSE)); |
| 737 } | 738 } |
| 738 | 739 |
| 739 // Showing the resize shadows when the mouse is over the window edges is tested | 740 // Showing the resize shadows when the mouse is over the window edges is tested |
| 740 // in resize_shadow_and_cursor_test.cc | 741 // in resize_shadow_and_cursor_test.cc |
| 741 | 742 |
| 742 } // namespace test | 743 } // namespace test |
| 743 } // namespace ash | 744 } // namespace ash |
| OLD | NEW |