OLD | NEW |
| (Empty) |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "ui/wm/core/capture_controller.h" | |
6 | |
7 #include "base/logging.h" | |
8 #include "ui/aura/env.h" | |
9 #include "ui/aura/test/aura_test_base.h" | |
10 #include "ui/aura/test/test_screen.h" | |
11 #include "ui/aura/test/test_window_delegate.h" | |
12 #include "ui/aura/window.h" | |
13 #include "ui/aura/window_event_dispatcher.h" | |
14 #include "ui/events/event.h" | |
15 #include "ui/events/event_utils.h" | |
16 #include "ui/events/test/event_generator.h" | |
17 #include "ui/views/test/views_test_base.h" | |
18 #include "ui/views/view.h" | |
19 #include "ui/views/widget/root_view.h" | |
20 #include "ui/views/widget/widget.h" | |
21 | |
22 #if !defined(OS_CHROMEOS) | |
23 #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" | |
24 #include "ui/views/widget/desktop_aura/desktop_screen_position_client.h" | |
25 #endif | |
26 | |
27 namespace views { | |
28 | |
29 class CaptureControllerTest : public aura::test::AuraTestBase { | |
30 public: | |
31 CaptureControllerTest() {} | |
32 | |
33 void SetUp() override { | |
34 AuraTestBase::SetUp(); | |
35 capture_controller_.reset(new wm::ScopedCaptureClient(root_window())); | |
36 | |
37 second_host_.reset(aura::WindowTreeHost::Create(gfx::Rect(0, 0, 800, 600))); | |
38 second_host_->InitHost(); | |
39 second_host_->window()->Show(); | |
40 second_host_->SetBounds(gfx::Rect(800, 600)); | |
41 second_capture_controller_.reset( | |
42 new wm::ScopedCaptureClient(second_host_->window())); | |
43 | |
44 #if !defined(OS_CHROMEOS) | |
45 desktop_position_client_.reset( | |
46 new DesktopScreenPositionClient(root_window())); | |
47 | |
48 second_desktop_position_client_.reset( | |
49 new DesktopScreenPositionClient(second_host_->window())); | |
50 #endif | |
51 } | |
52 | |
53 void TearDown() override { | |
54 RunAllPendingInMessageLoop(); | |
55 | |
56 #if !defined(OS_CHROMEOS) | |
57 second_desktop_position_client_.reset(); | |
58 #endif | |
59 second_capture_controller_.reset(); | |
60 | |
61 // Kill any active compositors before we hit the compositor shutdown paths. | |
62 second_host_.reset(); | |
63 | |
64 #if !defined(OS_CHROMEOS) | |
65 desktop_position_client_.reset(); | |
66 #endif | |
67 capture_controller_.reset(); | |
68 | |
69 AuraTestBase::TearDown(); | |
70 } | |
71 | |
72 aura::Window* GetCaptureWindow() { | |
73 return capture_controller_->capture_client()->GetCaptureWindow(); | |
74 } | |
75 | |
76 aura::Window* GetSecondCaptureWindow() { | |
77 return second_capture_controller_->capture_client()->GetCaptureWindow(); | |
78 } | |
79 | |
80 scoped_ptr<wm::ScopedCaptureClient> capture_controller_; | |
81 scoped_ptr<aura::WindowTreeHost> second_host_; | |
82 scoped_ptr<wm::ScopedCaptureClient> second_capture_controller_; | |
83 #if !defined(OS_CHROMEOS) | |
84 scoped_ptr<aura::client::ScreenPositionClient> desktop_position_client_; | |
85 scoped_ptr<aura::client::ScreenPositionClient> | |
86 second_desktop_position_client_; | |
87 #endif | |
88 | |
89 DISALLOW_COPY_AND_ASSIGN(CaptureControllerTest); | |
90 }; | |
91 | |
92 // Makes sure that internal details that are set on mouse down (such as | |
93 // mouse_pressed_handler()) are cleared when another root window takes capture. | |
94 TEST_F(CaptureControllerTest, ResetMouseEventHandlerOnCapture) { | |
95 // Create a window inside the WindowEventDispatcher. | |
96 scoped_ptr<aura::Window> w1(CreateNormalWindow(1, root_window(), NULL)); | |
97 | |
98 // Make a synthesized mouse down event. Ensure that the WindowEventDispatcher | |
99 // will dispatch further mouse events to |w1|. | |
100 ui::MouseEvent mouse_pressed_event(ui::ET_MOUSE_PRESSED, gfx::Point(5, 5), | |
101 gfx::Point(5, 5), 0, 0); | |
102 DispatchEventUsingWindowDispatcher(&mouse_pressed_event); | |
103 EXPECT_EQ(w1.get(), host()->dispatcher()->mouse_pressed_handler()); | |
104 | |
105 // Build a window in the second WindowEventDispatcher. | |
106 scoped_ptr<aura::Window> w2( | |
107 CreateNormalWindow(2, second_host_->window(), NULL)); | |
108 | |
109 // The act of having the second window take capture should clear out mouse | |
110 // pressed handler in the first WindowEventDispatcher. | |
111 w2->SetCapture(); | |
112 EXPECT_EQ(NULL, host()->dispatcher()->mouse_pressed_handler()); | |
113 } | |
114 | |
115 // Makes sure that when one window gets capture, it forces the release on the | |
116 // other. This is needed has to be handled explicitly on Linux, and is a sanity | |
117 // check on Windows. | |
118 TEST_F(CaptureControllerTest, ResetOtherWindowCaptureOnCapture) { | |
119 // Create a window inside the WindowEventDispatcher. | |
120 scoped_ptr<aura::Window> w1(CreateNormalWindow(1, root_window(), NULL)); | |
121 w1->SetCapture(); | |
122 // Both capture clients should return the same capture window. | |
123 EXPECT_EQ(w1.get(), GetCaptureWindow()); | |
124 EXPECT_EQ(w1.get(), GetSecondCaptureWindow()); | |
125 | |
126 // Build a window in the second WindowEventDispatcher and give it capture. | |
127 // Both capture clients should return the same capture window. | |
128 scoped_ptr<aura::Window> w2( | |
129 CreateNormalWindow(2, second_host_->window(), NULL)); | |
130 w2->SetCapture(); | |
131 EXPECT_EQ(w2.get(), GetCaptureWindow()); | |
132 EXPECT_EQ(w2.get(), GetSecondCaptureWindow()); | |
133 } | |
134 | |
135 // Verifies the touch target for the WindowEventDispatcher gets reset on | |
136 // releasing capture. | |
137 TEST_F(CaptureControllerTest, TouchTargetResetOnCaptureChange) { | |
138 // Create a window inside the WindowEventDispatcher. | |
139 scoped_ptr<aura::Window> w1(CreateNormalWindow(1, root_window(), NULL)); | |
140 ui::test::EventGenerator event_generator1(root_window()); | |
141 event_generator1.PressTouch(); | |
142 w1->SetCapture(); | |
143 // Both capture clients should return the same capture window. | |
144 EXPECT_EQ(w1.get(), GetCaptureWindow()); | |
145 EXPECT_EQ(w1.get(), GetSecondCaptureWindow()); | |
146 | |
147 // Build a window in the second WindowEventDispatcher and give it capture. | |
148 // Both capture clients should return the same capture window. | |
149 scoped_ptr<aura::Window> w2( | |
150 CreateNormalWindow(2, second_host_->window(), NULL)); | |
151 w2->SetCapture(); | |
152 EXPECT_EQ(w2.get(), GetCaptureWindow()); | |
153 EXPECT_EQ(w2.get(), GetSecondCaptureWindow()); | |
154 | |
155 // Release capture on the window. Releasing capture should reset the touch | |
156 // target of the first WindowEventDispatcher (as it no longer contains the | |
157 // capture target). | |
158 w2->ReleaseCapture(); | |
159 EXPECT_EQ(static_cast<aura::Window*>(NULL), GetCaptureWindow()); | |
160 EXPECT_EQ(static_cast<aura::Window*>(NULL), GetSecondCaptureWindow()); | |
161 ui::TouchEvent touch_event( | |
162 ui::ET_TOUCH_PRESSED, gfx::Point(), 0, 0, ui::EventTimeForNow(), 1.0f, | |
163 1.0f, 1.0f, 1.0f); | |
164 EXPECT_EQ(static_cast<ui::GestureConsumer*>(w2.get()), | |
165 ui::GestureRecognizer::Get()->GetTouchLockedTarget(touch_event)); | |
166 } | |
167 | |
168 } // namespace views | |
OLD | NEW |