| // Copyright 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| |
| #include "base/sys_info.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "ui/aura/test/aura_test_base.h" |
| #include "ui/aura/window.h" |
| #include "ui/aura/window_event_dispatcher.h" |
| #include "ui/aura/window_tree_host_x11.h" |
| #include "ui/events/event_processor.h" |
| #include "ui/events/event_target.h" |
| #include "ui/events/event_target_iterator.h" |
| #include "ui/events/test/events_test_utils_x11.h" |
| |
| namespace { |
| |
| class RootWindowEventHandler : public ui::EventHandler { |
| public: |
| RootWindowEventHandler() : last_touch_type_(ui::ET_UNKNOWN), |
| last_touch_id_(-1), |
| last_touch_location_(0, 0) { |
| } |
| virtual ~RootWindowEventHandler () {} |
| |
| // ui::EventHandler: |
| virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE { |
| last_touch_id_ = event->touch_id(); |
| last_touch_type_ = event->type(); |
| last_touch_location_ = event->location(); |
| } |
| |
| ui::EventType last_touch_type() { |
| return last_touch_type_; |
| } |
| |
| int last_touch_id() { |
| return last_touch_id_; |
| } |
| |
| gfx::Point last_touch_location() { |
| return last_touch_location_; |
| } |
| |
| private: |
| ui::EventType last_touch_type_; |
| int last_touch_id_; |
| gfx::Point last_touch_location_; |
| |
| DISALLOW_COPY_AND_ASSIGN(RootWindowEventHandler); |
| }; |
| |
| } // namespace |
| |
| namespace aura { |
| |
| typedef test::AuraTestBase WindowTreeHostX11Test; |
| |
| // Send X touch events to one WindowTreeHost. The WindowTreeHost's |
| // delegate will get corresponding ui::TouchEvent if the touch events |
| // are winthin the bound of the WindowTreeHost. |
| TEST_F(WindowTreeHostX11Test, DispatchTouchEventToOneRootWindow) { |
| #if defined(OS_CHROMEOS) |
| // Fake a ChromeOS running env. |
| const char* kLsbRelease = "CHROMEOS_RELEASE_NAME=Chromium OS\n"; |
| base::SysInfo::SetChromeOSVersionInfoForTest(kLsbRelease, base::Time()); |
| #endif // defined(OS_CHROMEOS) |
| |
| scoped_ptr<WindowTreeHostX11> window_tree_host( |
| new WindowTreeHostX11(gfx::Rect(0, 0, 2560, 1700))); |
| window_tree_host->InitHost(); |
| scoped_ptr<RootWindowEventHandler> handler(new RootWindowEventHandler()); |
| window_tree_host->window()->AddPreTargetHandler(handler.get()); |
| |
| std::vector<unsigned int> devices; |
| devices.push_back(0); |
| ui::SetUpTouchDevicesForTest(devices); |
| std::vector<ui::Valuator> valuators; |
| |
| EXPECT_EQ(ui::ET_UNKNOWN, handler->last_touch_type()); |
| EXPECT_EQ(-1, handler->last_touch_id()); |
| |
| ui::ScopedXI2Event scoped_xevent; |
| #if defined(OS_CHROMEOS) |
| // This touch is out of bounds. |
| scoped_xevent.InitTouchEvent( |
| 0, XI_TouchBegin, 5, gfx::Point(1500, 2500), valuators); |
| window_tree_host->Dispatch(scoped_xevent); |
| EXPECT_EQ(ui::ET_UNKNOWN, handler->last_touch_type()); |
| EXPECT_EQ(-1, handler->last_touch_id()); |
| EXPECT_EQ(gfx::Point(0, 0), handler->last_touch_location()); |
| #endif // defined(OS_CHROMEOS) |
| |
| // Following touchs are within bounds and are passed to delegate. |
| scoped_xevent.InitTouchEvent( |
| 0, XI_TouchBegin, 5, gfx::Point(1500, 1500), valuators); |
| window_tree_host->Dispatch(scoped_xevent); |
| EXPECT_EQ(ui::ET_TOUCH_PRESSED, handler->last_touch_type()); |
| EXPECT_EQ(0, handler->last_touch_id()); |
| EXPECT_EQ(gfx::Point(1500, 1500), handler->last_touch_location()); |
| |
| scoped_xevent.InitTouchEvent( |
| 0, XI_TouchUpdate, 5, gfx::Point(1500, 1600), valuators); |
| window_tree_host->Dispatch(scoped_xevent); |
| EXPECT_EQ(ui::ET_TOUCH_MOVED, handler->last_touch_type()); |
| EXPECT_EQ(0, handler->last_touch_id()); |
| EXPECT_EQ(gfx::Point(1500, 1600), handler->last_touch_location()); |
| |
| scoped_xevent.InitTouchEvent( |
| 0, XI_TouchEnd, 5, gfx::Point(1500, 1600), valuators); |
| window_tree_host->Dispatch(scoped_xevent); |
| EXPECT_EQ(ui::ET_TOUCH_RELEASED, handler->last_touch_type()); |
| EXPECT_EQ(0, handler->last_touch_id()); |
| EXPECT_EQ(gfx::Point(1500, 1600), handler->last_touch_location()); |
| |
| // Revert the CrOS testing env otherwise the following non-CrOS aura |
| // tests will fail. |
| #if defined(OS_CHROMEOS) |
| // Fake a ChromeOS running env. |
| kLsbRelease = ""; |
| base::SysInfo::SetChromeOSVersionInfoForTest(kLsbRelease, base::Time()); |
| #endif // defined(OS_CHROMEOS) |
| } |
| |
| // Send X touch events to two WindowTreeHost. The WindowTreeHost which is |
| // the event target of the X touch events should generate the corresponding |
| // ui::TouchEvent for its delegate. |
| #if defined(OS_CHROMEOS) |
| TEST_F(WindowTreeHostX11Test, DispatchTouchEventToTwoRootWindow) { |
| // Fake a ChromeOS running env. |
| const char* kLsbRelease = "CHROMEOS_RELEASE_NAME=Chromium OS\n"; |
| base::SysInfo::SetChromeOSVersionInfoForTest(kLsbRelease, base::Time()); |
| |
| scoped_ptr<WindowTreeHostX11> window_tree_host1( |
| new WindowTreeHostX11(gfx::Rect(0, 0, 2560, 1700))); |
| window_tree_host1->InitHost(); |
| scoped_ptr<RootWindowEventHandler> handler1(new RootWindowEventHandler()); |
| window_tree_host1->window()->AddPreTargetHandler(handler1.get()); |
| |
| int host2_y_offset = 1700; |
| scoped_ptr<WindowTreeHostX11> window_tree_host2( |
| new WindowTreeHostX11(gfx::Rect(0, host2_y_offset, 1920, 1080))); |
| window_tree_host2->InitHost(); |
| scoped_ptr<RootWindowEventHandler> handler2(new RootWindowEventHandler()); |
| window_tree_host2->window()->AddPreTargetHandler(handler2.get()); |
| |
| std::vector<unsigned int> devices; |
| devices.push_back(0); |
| ui::SetUpTouchDevicesForTest(devices); |
| std::vector<ui::Valuator> valuators; |
| |
| EXPECT_EQ(ui::ET_UNKNOWN, handler1->last_touch_type()); |
| EXPECT_EQ(-1, handler1->last_touch_id()); |
| EXPECT_EQ(ui::ET_UNKNOWN, handler2->last_touch_type()); |
| EXPECT_EQ(-1, handler2->last_touch_id()); |
| |
| // 2 Touch events are targeted at the second WindowTreeHost. |
| ui::ScopedXI2Event scoped_xevent; |
| scoped_xevent.InitTouchEvent( |
| 0, XI_TouchBegin, 5, gfx::Point(1500, 2500), valuators); |
| window_tree_host1->Dispatch(scoped_xevent); |
| window_tree_host2->Dispatch(scoped_xevent); |
| EXPECT_EQ(ui::ET_UNKNOWN, handler1->last_touch_type()); |
| EXPECT_EQ(-1, handler1->last_touch_id()); |
| EXPECT_EQ(gfx::Point(0, 0), handler1->last_touch_location()); |
| EXPECT_EQ(ui::ET_TOUCH_PRESSED, handler2->last_touch_type()); |
| EXPECT_EQ(0, handler2->last_touch_id()); |
| EXPECT_EQ(gfx::Point(1500, 2500 - host2_y_offset), |
| handler2->last_touch_location()); |
| |
| scoped_xevent.InitTouchEvent( |
| 0, XI_TouchBegin, 6, gfx::Point(1600, 2600), valuators); |
| window_tree_host1->Dispatch(scoped_xevent); |
| window_tree_host2->Dispatch(scoped_xevent); |
| EXPECT_EQ(ui::ET_UNKNOWN, handler1->last_touch_type()); |
| EXPECT_EQ(-1, handler1->last_touch_id()); |
| EXPECT_EQ(gfx::Point(0, 0), handler1->last_touch_location()); |
| EXPECT_EQ(ui::ET_TOUCH_PRESSED, handler2->last_touch_type()); |
| EXPECT_EQ(1, handler2->last_touch_id()); |
| EXPECT_EQ(gfx::Point(1600, 2600 - host2_y_offset), |
| handler2->last_touch_location()); |
| |
| scoped_xevent.InitTouchEvent( |
| 0, XI_TouchUpdate, 5, gfx::Point(1500, 2550), valuators); |
| window_tree_host1->Dispatch(scoped_xevent); |
| window_tree_host2->Dispatch(scoped_xevent); |
| EXPECT_EQ(ui::ET_UNKNOWN, handler1->last_touch_type()); |
| EXPECT_EQ(-1, handler1->last_touch_id()); |
| EXPECT_EQ(gfx::Point(0, 0), handler1->last_touch_location()); |
| EXPECT_EQ(ui::ET_TOUCH_MOVED, handler2->last_touch_type()); |
| EXPECT_EQ(0, handler2->last_touch_id()); |
| EXPECT_EQ(gfx::Point(1500, 2550 - host2_y_offset), |
| handler2->last_touch_location()); |
| |
| scoped_xevent.InitTouchEvent( |
| 0, XI_TouchUpdate, 6, gfx::Point(1600, 2650), valuators); |
| window_tree_host1->Dispatch(scoped_xevent); |
| window_tree_host2->Dispatch(scoped_xevent); |
| EXPECT_EQ(ui::ET_UNKNOWN, handler1->last_touch_type()); |
| EXPECT_EQ(-1, handler1->last_touch_id()); |
| EXPECT_EQ(gfx::Point(0, 0), handler1->last_touch_location()); |
| EXPECT_EQ(ui::ET_TOUCH_MOVED, handler2->last_touch_type()); |
| EXPECT_EQ(1, handler2->last_touch_id()); |
| EXPECT_EQ(gfx::Point(1600, 2650 - host2_y_offset), |
| handler2->last_touch_location()); |
| |
| scoped_xevent.InitTouchEvent( |
| 0, XI_TouchEnd, 5, gfx::Point(1500, 2550), valuators); |
| window_tree_host1->Dispatch(scoped_xevent); |
| window_tree_host2->Dispatch(scoped_xevent); |
| EXPECT_EQ(ui::ET_UNKNOWN, handler1->last_touch_type()); |
| EXPECT_EQ(-1, handler1->last_touch_id()); |
| EXPECT_EQ(gfx::Point(0, 0), handler1->last_touch_location()); |
| EXPECT_EQ(ui::ET_TOUCH_RELEASED, handler2->last_touch_type()); |
| EXPECT_EQ(0, handler2->last_touch_id()); |
| EXPECT_EQ(gfx::Point(1500, 2550 - host2_y_offset), |
| handler2->last_touch_location()); |
| |
| scoped_xevent.InitTouchEvent( |
| 0, XI_TouchEnd, 6, gfx::Point(1600, 2650), valuators); |
| window_tree_host1->Dispatch(scoped_xevent); |
| window_tree_host2->Dispatch(scoped_xevent); |
| EXPECT_EQ(ui::ET_UNKNOWN, handler1->last_touch_type()); |
| EXPECT_EQ(-1, handler1->last_touch_id()); |
| EXPECT_EQ(gfx::Point(0, 0), handler1->last_touch_location()); |
| EXPECT_EQ(ui::ET_TOUCH_RELEASED, handler2->last_touch_type()); |
| EXPECT_EQ(1, handler2->last_touch_id()); |
| EXPECT_EQ(gfx::Point(1600, 2650 - host2_y_offset), |
| handler2->last_touch_location()); |
| |
| // Revert the CrOS testing env otherwise the following non-CrOS aura |
| // tests will fail. |
| // Fake a ChromeOS running env. |
| kLsbRelease = ""; |
| base::SysInfo::SetChromeOSVersionInfoForTest(kLsbRelease, base::Time()); |
| } |
| #endif // defined(OS_CHROMEOS) |
| |
| } // namespace aura |