Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(628)

Side by Side Diff: components/mus/ws/window_manager_state_unittest.cc

Issue 1883263002: mash: Repost mouse pressed event when closing Ash system tray (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: cleanup Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « components/mus/ws/window_manager_state.cc ('k') | components/mus/ws/window_tree.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "components/mus/ws/window_manager_state.h" 5 #include "components/mus/ws/window_manager_state.h"
6 6
7 #include "base/macros.h" 7 #include "base/macros.h"
8 #include "base/memory/ref_counted.h" 8 #include "base/memory/ref_counted.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/test/test_simple_task_runner.h" 10 #include "base/test/test_simple_task_runner.h"
(...skipping 20 matching lines...) Expand all
31 namespace ws { 31 namespace ws {
32 namespace test { 32 namespace test {
33 33
34 class WindowManagerStateTest : public testing::Test { 34 class WindowManagerStateTest : public testing::Test {
35 public: 35 public:
36 WindowManagerStateTest(); 36 WindowManagerStateTest();
37 ~WindowManagerStateTest() override {} 37 ~WindowManagerStateTest() override {}
38 38
39 scoped_ptr<Accelerator> CreateAccelerator(); 39 scoped_ptr<Accelerator> CreateAccelerator();
40 40
41 // Creates a child |server_window| with associataed |window_tree| and 41 // Creates a child |server_window| with associated |window_tree| and
42 // |test_client|. The window is setup for processing input. 42 // |test_client|. The window is setup for processing input.
43 void CreateSecondaryTree(TestWindowTreeClient** test_client, 43 void CreateSecondaryTree(TestWindowTreeClient** test_client,
44 WindowTree** window_tree, 44 WindowTree** window_tree,
45 ServerWindow** server_window); 45 ServerWindow** server_window);
46 46
47 void DispatchInputEventToWindow(ServerWindow* target, 47 void DispatchInputEventToWindow(ServerWindow* target,
48 bool in_nonclient_area, 48 bool in_nonclient_area,
49 const ui::Event& event, 49 const ui::Event& event,
50 Accelerator* accelerator); 50 Accelerator* accelerator);
51 void OnEventAckTimeout(); 51 void OnEventAckTimeout();
52 52
53 WindowTree* tree() { return tree_; } 53 WindowTree* tree() { return tree_; }
54 ServerWindow* window() { return window_; } 54 WindowServer* window_server() { return window_server_.get(); }
55 ServerWindow* target_window() { return target_window_; }
56 TestWindowTreeClient* target_window_client() { return target_window_client_; }
55 TestWindowManager* window_manager() { return &window_manager_; } 57 TestWindowManager* window_manager() { return &window_manager_; }
56 TestWindowTreeClient* wm_client() { return wm_client_; } 58 TestWindowTreeClient* wm_client() { return wm_client_; }
57 WindowManagerState* window_manager_state() { return window_manager_state_; } 59 WindowManagerState* window_manager_state() { return window_manager_state_; }
58 60
59 // testing::Test: 61 // testing::Test:
60 void SetUp() override; 62 void SetUp() override;
61 63
62 private: 64 private:
63 int32_t cursor_id_; 65 int32_t cursor_id_;
64 66
(...skipping 10 matching lines...) Expand all
75 // TestWindowTreeClient that is used for the WM connection. Owned by 77 // TestWindowTreeClient that is used for the WM connection. Owned by
76 // |window_server_delegate_| 78 // |window_server_delegate_|
77 TestWindowTreeClient* wm_client_; 79 TestWindowTreeClient* wm_client_;
78 80
79 TestWindowServerDelegate window_server_delegate_; 81 TestWindowServerDelegate window_server_delegate_;
80 scoped_ptr<WindowServer> window_server_; 82 scoped_ptr<WindowServer> window_server_;
81 // Handles WindowStateManager ack timeouts. 83 // Handles WindowStateManager ack timeouts.
82 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; 84 scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
83 TestPlatformDisplayFactory platform_display_factory_; 85 TestPlatformDisplayFactory platform_display_factory_;
84 TestWindowManager window_manager_; 86 TestWindowManager window_manager_;
85 ServerWindow* window_; 87 // Test window created as a child of the window manager window.
88 ServerWindow* target_window_;
89 // TestWindowTreeClient for |target_window_|.
90 TestWindowTreeClient* target_window_client_;
86 // Needed to Bind to |wm_client_| 91 // Needed to Bind to |wm_client_|
87 base::MessageLoop message_loop_; 92 base::MessageLoop message_loop_;
93 // Needed for hit testing.
94 scoped_refptr<SurfacesState> surfaces_state_;
88 95
89 DISALLOW_COPY_AND_ASSIGN(WindowManagerStateTest); 96 DISALLOW_COPY_AND_ASSIGN(WindowManagerStateTest);
90 }; 97 };
91 98
92 WindowManagerStateTest::WindowManagerStateTest() 99 WindowManagerStateTest::WindowManagerStateTest()
93 : cursor_id_(0), 100 : cursor_id_(0),
94 task_runner_(new base::TestSimpleTaskRunner), 101 task_runner_(new base::TestSimpleTaskRunner),
95 platform_display_factory_(&cursor_id_) {} 102 platform_display_factory_(&cursor_id_),
103 surfaces_state_(new SurfacesState()) {}
96 104
97 scoped_ptr<Accelerator> WindowManagerStateTest::CreateAccelerator() { 105 scoped_ptr<Accelerator> WindowManagerStateTest::CreateAccelerator() {
98 mojom::EventMatcherPtr matcher = mus::CreateKeyMatcher( 106 mojom::EventMatcherPtr matcher = mus::CreateKeyMatcher(
99 mus::mojom::KeyboardCode::W, mus::mojom::kEventFlagControlDown); 107 mus::mojom::KeyboardCode::W, mus::mojom::kEventFlagControlDown);
100 matcher->accelerator_phase = mojom::AcceleratorPhase::POST_TARGET; 108 matcher->accelerator_phase = mojom::AcceleratorPhase::POST_TARGET;
101 uint32_t accelerator_id = 1; 109 uint32_t accelerator_id = 1;
102 scoped_ptr<Accelerator> accelerator( 110 scoped_ptr<Accelerator> accelerator(
103 new Accelerator(accelerator_id, *matcher)); 111 new Accelerator(accelerator_id, *matcher));
104 return accelerator; 112 return accelerator;
105 } 113 }
106 114
107 void WindowManagerStateTest::CreateSecondaryTree( 115 void WindowManagerStateTest::CreateSecondaryTree(
108 TestWindowTreeClient** test_client, 116 TestWindowTreeClient** test_client,
109 WindowTree** window_tree, 117 WindowTree** window_tree,
110 ServerWindow** server_window) { 118 ServerWindow** server_window) {
111 WindowTree* tree1 = window_server_->GetTreeWithRoot(window_); 119 WindowTree* tree1 = window_server_->GetTreeWithRoot(target_window_);
112 ASSERT_TRUE(tree1 != nullptr); 120 ASSERT_TRUE(tree1 != nullptr);
113 ASSERT_NE(tree1, tree()); 121 ASSERT_NE(tree1, tree());
114 122
115 const ClientWindowId child1_id( 123 const ClientWindowId child1_id(
116 WindowIdToTransportId(WindowId(tree1->id(), 1))); 124 WindowIdToTransportId(WindowId(tree1->id(), 1)));
117 EXPECT_TRUE(tree1->NewWindow(child1_id, ServerWindow::Properties())); 125 EXPECT_TRUE(tree1->NewWindow(child1_id, ServerWindow::Properties()));
118 ServerWindow* child1 = tree1->GetWindowByClientId(child1_id); 126 ServerWindow* child1 = tree1->GetWindowByClientId(child1_id);
119 ASSERT_TRUE(child1); 127 ASSERT_TRUE(child1);
120 ClientWindowId window_id; 128 ClientWindowId window_id;
121 tree1->IsWindowKnown(window_, &window_id); 129 tree1->IsWindowKnown(target_window_, &window_id);
122 EXPECT_TRUE(tree1->AddWindow(window_id, child1_id)); 130 EXPECT_TRUE(tree1->AddWindow(window_id, child1_id));
123 tree1->GetDisplay(window_)->AddActivationParent(window_); 131 tree1->GetDisplay(target_window_)->AddActivationParent(target_window_);
124 132
125 child1->SetVisible(true); 133 child1->SetVisible(true);
126 child1->SetBounds(gfx::Rect(20, 20, 20, 20)); 134 child1->SetBounds(gfx::Rect(20, 20, 20, 20));
127 135
128 TestWindowTreeClient* embed_connection = 136 TestWindowTreeClient* embed_connection =
129 window_server_delegate_.last_client(); 137 window_server_delegate_.last_client();
130 embed_connection->tracker()->changes()->clear(); 138 embed_connection->tracker()->changes()->clear();
131 wm_client()->tracker()->changes()->clear(); 139 wm_client()->tracker()->changes()->clear();
132 140
133 *test_client = embed_connection; 141 *test_client = embed_connection;
(...skipping 13 matching lines...) Expand all
147 155
148 void WindowManagerStateTest::OnEventAckTimeout() { 156 void WindowManagerStateTest::OnEventAckTimeout() {
149 WindowManagerStateTestApi test_api(window_manager_state_); 157 WindowManagerStateTestApi test_api(window_manager_state_);
150 test_api.OnEventAckTimeout(); 158 test_api.OnEventAckTimeout();
151 } 159 }
152 160
153 void WindowManagerStateTest::SetUp() { 161 void WindowManagerStateTest::SetUp() {
154 message_loop_.SetTaskRunner(task_runner_); 162 message_loop_.SetTaskRunner(task_runner_);
155 163
156 PlatformDisplay::set_factory_for_testing(&platform_display_factory_); 164 PlatformDisplay::set_factory_for_testing(&platform_display_factory_);
157 window_server_.reset(new WindowServer(&window_server_delegate_, 165 window_server_.reset(
158 scoped_refptr<SurfacesState>())); 166 new WindowServer(&window_server_delegate_, surfaces_state_));
159 167
160 PlatformDisplayInitParams display_init_params; 168 PlatformDisplayInitParams display_init_params;
169 display_init_params.surfaces_state = surfaces_state_;
161 display_ = new Display(window_server_.get(), display_init_params); 170 display_ = new Display(window_server_.get(), display_init_params);
162 display_binding_ = new TestDisplayBinding(display_, window_server_.get()); 171 display_binding_ = new TestDisplayBinding(display_, window_server_.get());
163 display_->Init(make_scoped_ptr(display_binding_)); 172 display_->Init(make_scoped_ptr(display_binding_));
164 173
165 wm_client_ = window_server_delegate_.last_client(); 174 wm_client_ = window_server_delegate_.last_client();
166 window_manager_state_ = display_->GetActiveWindowManagerState(); 175 window_manager_state_ = display_->GetActiveWindowManagerState();
167 176
168 tree_ = window_server_->GetTreeWithId(1); 177 tree_ = window_server_->GetTreeWithId(1);
169 const ClientWindowId embed_window_id(WindowIdToTransportId(WindowId(1, 1))); 178 const ClientWindowId embed_window_id(WindowIdToTransportId(WindowId(1, 1)));
170 EXPECT_TRUE(tree_->NewWindow(embed_window_id, ServerWindow::Properties())); 179 EXPECT_TRUE(tree_->NewWindow(embed_window_id, ServerWindow::Properties()));
171 ClientWindowId root_id; 180 ClientWindowId root_id;
172 if (tree_->roots().size() == 1u) { 181 if (tree_->roots().size() == 1u) {
173 // If window isn't known we'll return 0, which should then error out. 182 // If window isn't known we'll return 0, which should then error out.
174 tree_->IsWindowKnown(*(tree_->roots().begin()), &root_id); 183 tree_->IsWindowKnown(*(tree_->roots().begin()), &root_id);
175 } 184 }
176 185
177 EXPECT_TRUE(tree_->SetWindowVisibility(embed_window_id, true)); 186 EXPECT_TRUE(tree_->SetWindowVisibility(embed_window_id, true));
178 EXPECT_TRUE(tree_->AddWindow(root_id, embed_window_id)); 187 EXPECT_TRUE(tree_->AddWindow(root_id, embed_window_id));
179 display_->root_window()->SetBounds(gfx::Rect(0, 0, 100, 100)); 188 display_->root_window()->SetBounds(gfx::Rect(0, 0, 1024, 768));
180 mojom::WindowTreeClientPtr client; 189 mojom::WindowTreeClientPtr client;
181 mojom::WindowTreeClientRequest client_request = GetProxy(&client); 190 mojom::WindowTreeClientRequest client_request = GetProxy(&client);
182 wm_client_->Bind(std::move(client_request)); 191 wm_client_->Bind(std::move(client_request));
183 tree_->Embed(embed_window_id, std::move(client)); 192 tree_->Embed(embed_window_id, std::move(client));
184 window_ = tree_->GetWindowByClientId(embed_window_id); 193 target_window_ = tree_->GetWindowByClientId(embed_window_id);
185 window_->SetBounds(gfx::Rect(0, 0, 50, 50)); 194 target_window_->SetBounds(gfx::Rect(10, 10, 50, 50));
195 EnableHitTest(target_window_);
196 target_window_client_ = window_server_delegate_.last_client();
197 target_window_client_->tracker()->changes()->clear();
186 198
187 WindowTreeTestApi(tree_).set_window_manager_internal(&window_manager_); 199 WindowTreeTestApi(tree_).set_window_manager_internal(&window_manager_);
188 wm_client_->tracker()->changes()->clear(); 200 wm_client_->tracker()->changes()->clear();
189 } 201 }
190 202
191 // Tests that when an event is dispatched with no accelerator, that post target 203 // Tests that when an event is dispatched with no accelerator, that post target
192 // accelerator is not triggered. 204 // accelerator is not triggered.
193 TEST_F(WindowManagerStateTest, NullAccelerator) { 205 TEST_F(WindowManagerStateTest, NullAccelerator) {
194 WindowManagerState* state = window_manager_state(); 206 WindowManagerState* state = window_manager_state();
195 EXPECT_TRUE(state); 207 EXPECT_TRUE(state);
196 208
197 ServerWindow* target = window(); 209 ServerWindow* target = target_window();
198 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); 210 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN);
199 DispatchInputEventToWindow(target, true, key, nullptr); 211 DispatchInputEventToWindow(target, true, key, nullptr);
200 WindowTree* target_tree = tree(); 212 WindowTree* target_tree = tree();
201 TestChangeTracker* tracker = wm_client()->tracker(); 213 TestChangeTracker* tracker = wm_client()->tracker();
202 EXPECT_EQ(1u, tracker->changes()->size()); 214 EXPECT_EQ(1u, tracker->changes()->size());
203 EXPECT_EQ("InputEvent window=1,1 event_action=1", 215 EXPECT_EQ("InputEvent window=1,1 event_action=1",
204 ChangesToDescription1(*tracker->changes())[0]); 216 ChangesToDescription1(*tracker->changes())[0]);
205 217
206 state->OnEventAck(target_tree, false); 218 state->OnEventAck(target_tree, mojom::EventResult::UNHANDLED);
207 EXPECT_FALSE(window_manager()->on_accelerator_called()); 219 EXPECT_FALSE(window_manager()->on_accelerator_called());
208 } 220 }
209 221
210 // Tests that when a post target accelerator is provided on an event, that it is 222 // Tests that when a post target accelerator is provided on an event, that it is
211 // called on ack. 223 // called on ack.
212 TEST_F(WindowManagerStateTest, PostTargetAccelerator) { 224 TEST_F(WindowManagerStateTest, PostTargetAccelerator) {
213 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); 225 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN);
214 scoped_ptr<Accelerator> accelerator = CreateAccelerator(); 226 scoped_ptr<Accelerator> accelerator = CreateAccelerator();
215 227
216 ServerWindow* target = window(); 228 ServerWindow* target = target_window();
217 DispatchInputEventToWindow(target, true, key, accelerator.get()); 229 DispatchInputEventToWindow(target, true, key, accelerator.get());
218 TestChangeTracker* tracker = wm_client()->tracker(); 230 TestChangeTracker* tracker = wm_client()->tracker();
219 EXPECT_EQ(1u, tracker->changes()->size()); 231 EXPECT_EQ(1u, tracker->changes()->size());
220 EXPECT_EQ("InputEvent window=1,1 event_action=1", 232 EXPECT_EQ("InputEvent window=1,1 event_action=1",
221 ChangesToDescription1(*tracker->changes())[0]); 233 ChangesToDescription1(*tracker->changes())[0]);
222 234
223 window_manager_state()->OnEventAck(tree(), false); 235 window_manager_state()->OnEventAck(tree(), mojom::EventResult::UNHANDLED);
224 EXPECT_TRUE(window_manager()->on_accelerator_called()); 236 EXPECT_TRUE(window_manager()->on_accelerator_called());
225 EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id()); 237 EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id());
226 } 238 }
227 239
228 // Tests that when a client handles an event that post target accelerators are 240 // Tests that when a client handles an event that post target accelerators are
229 // not called. 241 // not called.
230 TEST_F(WindowManagerStateTest, ClientHandlesEvent) { 242 TEST_F(WindowManagerStateTest, ClientHandlesEvent) {
231 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); 243 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN);
232 scoped_ptr<Accelerator> accelerator = CreateAccelerator(); 244 scoped_ptr<Accelerator> accelerator = CreateAccelerator();
233 245
234 ServerWindow* target = window(); 246 ServerWindow* target = target_window();
235 DispatchInputEventToWindow(target, true, key, accelerator.get()); 247 DispatchInputEventToWindow(target, true, key, accelerator.get());
236 TestChangeTracker* tracker = wm_client()->tracker(); 248 TestChangeTracker* tracker = wm_client()->tracker();
237 EXPECT_EQ(1u, tracker->changes()->size()); 249 EXPECT_EQ(1u, tracker->changes()->size());
238 EXPECT_EQ("InputEvent window=1,1 event_action=1", 250 EXPECT_EQ("InputEvent window=1,1 event_action=1",
239 ChangesToDescription1(*tracker->changes())[0]); 251 ChangesToDescription1(*tracker->changes())[0]);
240 252
241 window_manager_state()->OnEventAck(tree(), true); 253 window_manager_state()->OnEventAck(tree(), mojom::EventResult::HANDLED);
242 EXPECT_FALSE(window_manager()->on_accelerator_called()); 254 EXPECT_FALSE(window_manager()->on_accelerator_called());
243 } 255 }
244 256
245 // Tests that when an accelerator is deleted before an ack, that it is not 257 // Tests that when an accelerator is deleted before an ack, that it is not
246 // called. 258 // called.
247 TEST_F(WindowManagerStateTest, AcceleratorDeleted) { 259 TEST_F(WindowManagerStateTest, AcceleratorDeleted) {
248 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); 260 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN);
249 scoped_ptr<Accelerator> accelerator(CreateAccelerator()); 261 scoped_ptr<Accelerator> accelerator(CreateAccelerator());
250 262
251 ServerWindow* target = window(); 263 ServerWindow* target = target_window();
252 DispatchInputEventToWindow(target, true, key, accelerator.get()); 264 DispatchInputEventToWindow(target, true, key, accelerator.get());
253 TestChangeTracker* tracker = wm_client()->tracker(); 265 TestChangeTracker* tracker = wm_client()->tracker();
254 EXPECT_EQ(1u, tracker->changes()->size()); 266 EXPECT_EQ(1u, tracker->changes()->size());
255 EXPECT_EQ("InputEvent window=1,1 event_action=1", 267 EXPECT_EQ("InputEvent window=1,1 event_action=1",
256 ChangesToDescription1(*tracker->changes())[0]); 268 ChangesToDescription1(*tracker->changes())[0]);
257 269
258 accelerator.reset(); 270 accelerator.reset();
259 window_manager_state()->OnEventAck(tree(), false); 271 window_manager_state()->OnEventAck(tree(), mojom::EventResult::UNHANDLED);
260 EXPECT_FALSE(window_manager()->on_accelerator_called()); 272 EXPECT_FALSE(window_manager()->on_accelerator_called());
261 } 273 }
262 274
263 // Tests that a events arriving before an ack don't notify the tree until the 275 // Tests that a events arriving before an ack don't notify the tree until the
264 // ack arrives, and that the correct accelerator is called. 276 // ack arrives, and that the correct accelerator is called.
265 TEST_F(WindowManagerStateTest, EnqueuedAccelerators) { 277 TEST_F(WindowManagerStateTest, EnqueuedAccelerators) {
266 WindowManagerState* state = window_manager_state(); 278 WindowManagerState* state = window_manager_state();
267 279
268 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); 280 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN);
269 scoped_ptr<Accelerator> accelerator(CreateAccelerator()); 281 scoped_ptr<Accelerator> accelerator(CreateAccelerator());
270 282
271 ServerWindow* target = window(); 283 ServerWindow* target = target_window();
272 DispatchInputEventToWindow(target, true, key, accelerator.get()); 284 DispatchInputEventToWindow(target, true, key, accelerator.get());
273 TestChangeTracker* tracker = wm_client()->tracker(); 285 TestChangeTracker* tracker = wm_client()->tracker();
274 EXPECT_EQ(1u, tracker->changes()->size()); 286 EXPECT_EQ(1u, tracker->changes()->size());
275 EXPECT_EQ("InputEvent window=1,1 event_action=1", 287 EXPECT_EQ("InputEvent window=1,1 event_action=1",
276 ChangesToDescription1(*tracker->changes())[0]); 288 ChangesToDescription1(*tracker->changes())[0]);
277 289
278 tracker->changes()->clear(); 290 tracker->changes()->clear();
279 ui::KeyEvent key2(ui::ET_KEY_PRESSED, ui::VKEY_Y, ui::EF_CONTROL_DOWN); 291 ui::KeyEvent key2(ui::ET_KEY_PRESSED, ui::VKEY_Y, ui::EF_CONTROL_DOWN);
280 mojom::EventMatcherPtr matcher = mus::CreateKeyMatcher( 292 mojom::EventMatcherPtr matcher = mus::CreateKeyMatcher(
281 mus::mojom::KeyboardCode::Y, mus::mojom::kEventFlagControlDown); 293 mus::mojom::KeyboardCode::Y, mus::mojom::kEventFlagControlDown);
282 matcher->accelerator_phase = mojom::AcceleratorPhase::POST_TARGET; 294 matcher->accelerator_phase = mojom::AcceleratorPhase::POST_TARGET;
283 uint32_t accelerator_id = 2; 295 uint32_t accelerator_id = 2;
284 scoped_ptr<Accelerator> accelerator2( 296 scoped_ptr<Accelerator> accelerator2(
285 new Accelerator(accelerator_id, *matcher)); 297 new Accelerator(accelerator_id, *matcher));
286 DispatchInputEventToWindow(target, true, key2, accelerator2.get()); 298 DispatchInputEventToWindow(target, true, key2, accelerator2.get());
287 EXPECT_TRUE(tracker->changes()->empty()); 299 EXPECT_TRUE(tracker->changes()->empty());
288 300
289 WindowTree* target_tree = tree(); 301 WindowTree* target_tree = tree();
290 WindowTreeTestApi(target_tree).ClearAck(); 302 WindowTreeTestApi(target_tree).ClearAck();
291 state->OnEventAck(target_tree, false); 303 state->OnEventAck(target_tree, mojom::EventResult::UNHANDLED);
292 EXPECT_EQ(1u, tracker->changes()->size()); 304 EXPECT_EQ(1u, tracker->changes()->size());
293 EXPECT_EQ("InputEvent window=1,1 event_action=1", 305 EXPECT_EQ("InputEvent window=1,1 event_action=1",
294 ChangesToDescription1(*tracker->changes())[0]); 306 ChangesToDescription1(*tracker->changes())[0]);
295 EXPECT_TRUE(window_manager()->on_accelerator_called()); 307 EXPECT_TRUE(window_manager()->on_accelerator_called());
296 EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id()); 308 EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id());
297 } 309 }
298 310
299 // Tests that the accelerator is not sent when the tree is dying. 311 // Tests that the accelerator is not sent when the tree is dying.
300 TEST_F(WindowManagerStateTest, DeleteTree) { 312 TEST_F(WindowManagerStateTest, DeleteTree) {
301 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); 313 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN);
302 scoped_ptr<Accelerator> accelerator = CreateAccelerator(); 314 scoped_ptr<Accelerator> accelerator = CreateAccelerator();
303 315
304 ServerWindow* target = window(); 316 ServerWindow* target = target_window();
305 DispatchInputEventToWindow(target, true, key, accelerator.get()); 317 DispatchInputEventToWindow(target, true, key, accelerator.get());
306 TestChangeTracker* tracker = wm_client()->tracker(); 318 TestChangeTracker* tracker = wm_client()->tracker();
307 EXPECT_EQ(1u, tracker->changes()->size()); 319 EXPECT_EQ(1u, tracker->changes()->size());
308 EXPECT_EQ("InputEvent window=1,1 event_action=1", 320 EXPECT_EQ("InputEvent window=1,1 event_action=1",
309 ChangesToDescription1(*tracker->changes())[0]); 321 ChangesToDescription1(*tracker->changes())[0]);
310 322
311 window_manager_state()->OnWillDestroyTree(tree()); 323 window_manager_state()->OnWillDestroyTree(tree());
312 EXPECT_FALSE(window_manager()->on_accelerator_called()); 324 EXPECT_FALSE(window_manager()->on_accelerator_called());
313 } 325 }
314 326
(...skipping 19 matching lines...) Expand all
334 346
335 window_manager_state()->OnWillDestroyTree(target_tree); 347 window_manager_state()->OnWillDestroyTree(target_tree);
336 EXPECT_FALSE(target_window_manager.on_accelerator_called()); 348 EXPECT_FALSE(target_window_manager.on_accelerator_called());
337 EXPECT_TRUE(window_manager()->on_accelerator_called()); 349 EXPECT_TRUE(window_manager()->on_accelerator_called());
338 } 350 }
339 351
340 // Tests that when an ack times out that the accelerator is notified. 352 // Tests that when an ack times out that the accelerator is notified.
341 TEST_F(WindowManagerStateTest, AckTimeout) { 353 TEST_F(WindowManagerStateTest, AckTimeout) {
342 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); 354 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN);
343 scoped_ptr<Accelerator> accelerator = CreateAccelerator(); 355 scoped_ptr<Accelerator> accelerator = CreateAccelerator();
344 DispatchInputEventToWindow(window(), true, key, accelerator.get()); 356 DispatchInputEventToWindow(target_window(), true, key, accelerator.get());
345 TestChangeTracker* tracker = wm_client()->tracker(); 357 TestChangeTracker* tracker = wm_client()->tracker();
346 EXPECT_EQ(1u, tracker->changes()->size()); 358 EXPECT_EQ(1u, tracker->changes()->size());
347 EXPECT_EQ("InputEvent window=1,1 event_action=1", 359 EXPECT_EQ("InputEvent window=1,1 event_action=1",
348 ChangesToDescription1(*tracker->changes())[0]); 360 ChangesToDescription1(*tracker->changes())[0]);
349 361
350 OnEventAckTimeout(); 362 OnEventAckTimeout();
351 EXPECT_TRUE(window_manager()->on_accelerator_called()); 363 EXPECT_TRUE(window_manager()->on_accelerator_called());
352 EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id()); 364 EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id());
353 } 365 }
354 366
367 // Tests that when a window returns an event as unhandled that event is
368 // reposted.
369 TEST_F(WindowManagerStateTest, RepostEvent) {
370 window_manager_state()->SetCapture(target_window(), false);
371
372 // Simulate a mouse release at a point outside of a target window. It will
373 // still process the event because it has capture.
374 ASSERT_EQ("10,10", target_window()->bounds().origin().ToString());
375 ui::PointerEvent mouse_event(ui::MouseEvent(
376 ui::ET_MOUSE_RELEASED, gfx::Point(5, 5), gfx::Point(5, 5),
377 base::TimeDelta(), ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON));
378 window_manager_state()->ProcessEvent(mouse_event);
379
380 // The event was sent to the target window.
381 TestChangeTracker* tracker = target_window_client()->tracker();
382 ASSERT_EQ(1u, tracker->changes()->size());
383 const Change& change1 = (*tracker->changes())[0];
384 EXPECT_EQ(static_cast<int>(mojom::EventType::POINTER_UP),
385 change1.event_action);
386 // The event has window-local coordinates.
387 EXPECT_EQ("-5,-5", change1.event_location.ToString());
388
389 window_manager_state()->SetCapture(nullptr, false);
390
391 // Ack the event and request reposting. Do this at the window tree level
392 // instead of directly in window_manager_state() because otherwise the window
393 // tree won't know the original event was handled and it will queue the
394 // reposted event instead of dispatching it.
395 WindowTree* target_tree = window_server()->GetTreeWithRoot(target_window());
396 WindowTreeTestApi(target_tree)
397 .OnWindowInputEventAck(change1.event_id, mojom::EventResult::REPOST);
398
399 // The event was reposted. Because its location was outside the target window
400 // bounds it was sent to the window manager.
401 TestChangeTracker* wm_tracker = wm_client()->tracker();
402 ASSERT_EQ(1u, wm_tracker->changes()->size());
403 const Change& change2 = (*wm_tracker->changes())[0];
404 EXPECT_EQ(static_cast<int>(mojom::EventType::POINTER_UP),
405 change2.event_action);
406 // The event has window-local coordinates.
407 EXPECT_EQ("5,5", change2.event_location.ToString());
408 }
409
355 } // namespace test 410 } // namespace test
356 } // namespace ws 411 } // namespace ws
357 } // namespace mus 412 } // namespace mus
OLDNEW
« no previous file with comments | « components/mus/ws/window_manager_state.cc ('k') | components/mus/ws/window_tree.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698