| Index: components/mus/ws/event_dispatcher_unittest.cc
|
| diff --git a/components/mus/ws/event_dispatcher_unittest.cc b/components/mus/ws/event_dispatcher_unittest.cc
|
| index 607f4c25690b464a3f1c0410c1aab24f63b00d7a..91ce4b3a060404688ee4425b0b8a9ec0e5a9d760 100644
|
| --- a/components/mus/ws/event_dispatcher_unittest.cc
|
| +++ b/components/mus/ws/event_dispatcher_unittest.cc
|
| @@ -22,7 +22,8 @@ class TestEventDispatcherDelegate : public EventDispatcherDelegate {
|
| : root_(root),
|
| focused_window_(nullptr),
|
| last_target_(nullptr),
|
| - last_accelerator_(0) {}
|
| + last_accelerator_(0),
|
| + last_in_nonclient_area_(false) {}
|
| ~TestEventDispatcherDelegate() override {}
|
|
|
| mojo::EventPtr GetAndClearLastDispatchedEvent() {
|
| @@ -37,6 +38,12 @@ class TestEventDispatcherDelegate : public EventDispatcherDelegate {
|
|
|
| ServerWindow* last_target() { return last_target_; }
|
|
|
| + bool GetAndClearLastInNonclientArea() {
|
| + const bool result = last_in_nonclient_area_;
|
| + last_in_nonclient_area_ = false;
|
| + return result;
|
| + }
|
| +
|
| private:
|
| // EventDispatcherDelegate:
|
| void OnAccelerator(uint32_t accelerator, mojo::EventPtr event) override {
|
| @@ -50,9 +57,11 @@ class TestEventDispatcherDelegate : public EventDispatcherDelegate {
|
| return focused_window_;
|
| }
|
| void DispatchInputEventToWindow(ServerWindow* target,
|
| + bool in_nonclient_area,
|
| mojo::EventPtr event) override {
|
| last_target_ = target;
|
| last_dispatched_event_ = event.Pass();
|
| + last_in_nonclient_area_ = in_nonclient_area;
|
| }
|
|
|
| ServerWindow* root_;
|
| @@ -60,6 +69,7 @@ class TestEventDispatcherDelegate : public EventDispatcherDelegate {
|
| ServerWindow* last_target_;
|
| mojo::EventPtr last_dispatched_event_;
|
| uint32_t last_accelerator_;
|
| + bool last_in_nonclient_area_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(TestEventDispatcherDelegate);
|
| };
|
| @@ -90,6 +100,8 @@ void RunMouseEventTests(EventDispatcher* dispatcher,
|
| dispatched_event_mojo.To<scoped_ptr<ui::Event>>());
|
| ASSERT_TRUE(dispatched_event.get()) << "Test " << i << " failed.";
|
| ASSERT_TRUE(dispatched_event->IsMouseEvent()) << "Test " << i << " failed.";
|
| + EXPECT_FALSE(dispatcher_delegate->GetAndClearLastInNonclientArea())
|
| + << "Test " << i << " failed.";
|
| ui::MouseEvent* dispatched_mouse_event =
|
| static_cast<ui::MouseEvent*>(dispatched_event.get());
|
| EXPECT_EQ(test.expected_root_location,
|
| @@ -268,7 +280,7 @@ TEST(EventDispatcherTest, CaptureMultipleMouseButtons) {
|
| arraysize(tests));
|
| }
|
|
|
| -TEST(EventDispatcherTest, MoveWindow) {
|
| +TEST(EventDispatcherTest, ClientAreaGoesToOwner) {
|
| TestServerWindowDelegate window_delegate;
|
| ServerWindow root(&window_delegate, WindowId(1, 2));
|
| window_delegate.set_root_window(&root);
|
| @@ -281,7 +293,6 @@ TEST(EventDispatcherTest, MoveWindow) {
|
| root.SetBounds(gfx::Rect(0, 0, 100, 100));
|
| child.SetBounds(gfx::Rect(10, 10, 20, 20));
|
|
|
| - root.set_is_draggable_window_container(true);
|
| child.SetClientArea(gfx::Rect(5, 5, 10, 10));
|
|
|
| TestEventDispatcherDelegate event_dispatcher_delegate(&root);
|
| @@ -295,20 +306,20 @@ TEST(EventDispatcherTest, MoveWindow) {
|
| dispatcher.OnEvent(
|
| mojo::Event::From(static_cast<const ui::Event&>(press_event)));
|
|
|
| - // The event should not have been dispatched to the delegate.
|
| - ASSERT_EQ(nullptr, event_dispatcher_delegate.last_target());
|
| + // Events should target child and be in the non-client area.
|
| + ASSERT_EQ(&child, event_dispatcher_delegate.last_target());
|
| + EXPECT_TRUE(event_dispatcher_delegate.GetAndClearLastInNonclientArea());
|
|
|
| - // Move the mouse 5,6 pixels and verify window moved.
|
| + // Move the mouse 5,6 pixels and target is the same.
|
| const ui::MouseEvent move_event(ui::ET_MOUSE_MOVED, gfx::PointF(17.f, 18.f),
|
| gfx::PointF(17.f, 18.f), base::TimeDelta(),
|
| ui::EF_LEFT_MOUSE_BUTTON, 0);
|
| dispatcher.OnEvent(
|
| mojo::Event::From(static_cast<const ui::Event&>(move_event)));
|
|
|
| - // The event should not have been dispatched to the delegate.
|
| - ASSERT_EQ(nullptr, event_dispatcher_delegate.last_target());
|
| -
|
| - EXPECT_EQ(gfx::Rect(15, 16, 20, 20), child.bounds());
|
| + // Still same target.
|
| + ASSERT_EQ(&child, event_dispatcher_delegate.last_target());
|
| + EXPECT_TRUE(event_dispatcher_delegate.GetAndClearLastInNonclientArea());
|
|
|
| // Release the mouse.
|
| const ui::MouseEvent release_event(
|
| @@ -318,71 +329,17 @@ TEST(EventDispatcherTest, MoveWindow) {
|
| mojo::Event::From(static_cast<const ui::Event&>(release_event)));
|
|
|
| // The event should not have been dispatched to the delegate.
|
| - ASSERT_EQ(nullptr, event_dispatcher_delegate.last_target());
|
| -
|
| - // Press in the client area and verify the window gets it.
|
| - const ui::MouseEvent press_event2(
|
| - ui::ET_MOUSE_PRESSED, gfx::PointF(21.f, 22.f), gfx::PointF(21.f, 22.f),
|
| - base::TimeDelta(), ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
|
| - dispatcher.OnEvent(
|
| - mojo::Event::From(static_cast<const ui::Event&>(press_event2)));
|
| ASSERT_EQ(&child, event_dispatcher_delegate.last_target());
|
| -}
|
| -
|
| -TEST(EventDispatcherTest, DestroyWindowWhileMoving) {
|
| - TestServerWindowDelegate window_delegate;
|
| - ServerWindow root(&window_delegate, WindowId(1, 2));
|
| - window_delegate.set_root_window(&root);
|
| - root.SetVisible(true);
|
| -
|
| - scoped_ptr<ServerWindow> child(
|
| - new ServerWindow(&window_delegate, WindowId(1, 3)));
|
| - root.Add(child.get());
|
| - child->SetVisible(true);
|
| -
|
| - root.SetBounds(gfx::Rect(0, 0, 100, 100));
|
| - child->SetBounds(gfx::Rect(10, 10, 20, 20));
|
| -
|
| - root.set_is_draggable_window_container(true);
|
| - child->SetClientArea(gfx::Rect(5, 5, 10, 10));
|
| -
|
| - TestEventDispatcherDelegate event_dispatcher_delegate(&root);
|
| - EventDispatcher dispatcher(&event_dispatcher_delegate);
|
| - dispatcher.set_root(&root);
|
| -
|
| - // Start move loop by sending mouse event over non-client area.
|
| - const ui::MouseEvent press_event(
|
| - ui::ET_MOUSE_PRESSED, gfx::PointF(12.f, 12.f), gfx::PointF(12.f, 12.f),
|
| - base::TimeDelta(), ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
|
| - dispatcher.OnEvent(
|
| - mojo::Event::From(static_cast<const ui::Event&>(press_event)));
|
| -
|
| - // The event should not have been dispatched to the delegate.
|
| - ASSERT_EQ(nullptr, event_dispatcher_delegate.last_target());
|
| -
|
| - // Destroy the child, no events should be propagated until after the release.
|
| - child.reset();
|
| -
|
| - const ui::MouseEvent move_event(ui::ET_MOUSE_MOVED, gfx::PointF(17.f, 18.f),
|
| - gfx::PointF(17.f, 18.f), base::TimeDelta(),
|
| - ui::EF_LEFT_MOUSE_BUTTON, 0);
|
| - dispatcher.OnEvent(
|
| - mojo::Event::From(static_cast<const ui::Event&>(move_event)));
|
| - ASSERT_EQ(nullptr, event_dispatcher_delegate.last_target());
|
| -
|
| - const ui::MouseEvent release_event(
|
| - ui::ET_MOUSE_RELEASED, gfx::PointF(17.f, 18.f), gfx::PointF(17.f, 18.f),
|
| - base::TimeDelta(), ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
|
| - dispatcher.OnEvent(
|
| - mojo::Event::From(static_cast<const ui::Event&>(release_event)));
|
| - ASSERT_EQ(nullptr, event_dispatcher_delegate.last_target());
|
| + EXPECT_TRUE(event_dispatcher_delegate.GetAndClearLastInNonclientArea());
|
|
|
| + // Press in the client area and verify target/client area.
|
| const ui::MouseEvent press_event2(
|
| ui::ET_MOUSE_PRESSED, gfx::PointF(21.f, 22.f), gfx::PointF(21.f, 22.f),
|
| base::TimeDelta(), ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
|
| dispatcher.OnEvent(
|
| mojo::Event::From(static_cast<const ui::Event&>(press_event2)));
|
| - ASSERT_EQ(&root, event_dispatcher_delegate.last_target());
|
| + ASSERT_EQ(&child, event_dispatcher_delegate.last_target());
|
| + EXPECT_FALSE(event_dispatcher_delegate.GetAndClearLastInNonclientArea());
|
| }
|
|
|
| } // namespace ws
|
|
|