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

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

Issue 2068093002: mus: Allow embedder to intercept events. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 4 years, 6 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
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 <memory> 7 #include <memory>
8 8
9 #include "base/macros.h" 9 #include "base/macros.h"
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 void OnEventAckTimeout(ClientSpecificId client_id); 53 void OnEventAckTimeout(ClientSpecificId client_id);
54 54
55 WindowTree* tree() { 55 WindowTree* tree() {
56 return window_event_targeting_helper_.window_server()->GetTreeWithId(1); 56 return window_event_targeting_helper_.window_server()->GetTreeWithId(1);
57 } 57 }
58 ServerWindow* window() { return window_; } 58 ServerWindow* window() { return window_; }
59 TestWindowManager* window_manager() { return &window_manager_; } 59 TestWindowManager* window_manager() { return &window_manager_; }
60 TestWindowTreeClient* wm_client() { 60 TestWindowTreeClient* wm_client() {
61 return window_event_targeting_helper_.wm_client(); 61 return window_event_targeting_helper_.wm_client();
62 } 62 }
63 TestWindowTreeClient* last_wm_client() {
64 return window_event_targeting_helper_.last_window_tree_client();
65 }
66 WindowTree* last_tree() {
67 return window_event_targeting_helper_.last_binding()->tree();
68 }
63 WindowManagerState* window_manager_state() { return window_manager_state_; } 69 WindowManagerState* window_manager_state() { return window_manager_state_; }
64 70
71 void EmbedAt(WindowTree* tree,
72 const ClientWindowId& embed_window_id,
73 uint32_t embed_flags,
74 WindowTree** embed_tree,
75 TestWindowTreeClient** embed_client_proxy) {
76 mojom::WindowTreeClientPtr embed_client;
77 mojom::WindowTreeClientRequest client_request = GetProxy(&embed_client);
78 ASSERT_TRUE(
79 tree->Embed(embed_window_id, std::move(embed_client), embed_flags));
80 TestWindowTreeClient* client =
81 window_event_targeting_helper_.last_window_tree_client();
82 ASSERT_EQ(1u, client->tracker()->changes()->size());
83 EXPECT_EQ(CHANGE_TYPE_EMBED, (*client->tracker()->changes())[0].type);
84 client->tracker()->changes()->clear();
85 *embed_client_proxy = client;
86 *embed_tree = window_event_targeting_helper_.last_binding()->tree();
87 }
88
65 // testing::Test: 89 // testing::Test:
66 void SetUp() override; 90 void SetUp() override;
67 91
68 private: 92 private:
69 WindowEventTargetingHelper window_event_targeting_helper_; 93 WindowEventTargetingHelper window_event_targeting_helper_;
70 94
71 WindowManagerState* window_manager_state_; 95 WindowManagerState* window_manager_state_;
72 96
73 // Handles WindowStateManager ack timeouts. 97 // Handles WindowStateManager ack timeouts.
74 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; 98 scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
284 TestChangeTracker* tracker = wm_client()->tracker(); 308 TestChangeTracker* tracker = wm_client()->tracker();
285 EXPECT_EQ(1u, tracker->changes()->size()); 309 EXPECT_EQ(1u, tracker->changes()->size());
286 EXPECT_EQ("InputEvent window=1,1 event_action=7", 310 EXPECT_EQ("InputEvent window=1,1 event_action=7",
287 ChangesToDescription1(*tracker->changes())[0]); 311 ChangesToDescription1(*tracker->changes())[0]);
288 312
289 OnEventAckTimeout(window()->id().client_id); 313 OnEventAckTimeout(window()->id().client_id);
290 EXPECT_TRUE(window_manager()->on_accelerator_called()); 314 EXPECT_TRUE(window_manager()->on_accelerator_called());
291 EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id()); 315 EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id());
292 } 316 }
293 317
318 TEST_F(WindowManagerStateTest, InterceptingEmbedderReceivesEvents) {
319 WindowTree* embedder_tree = tree();
320 ServerWindow* embedder_root = window();
321 const ClientWindowId embed_window_id(
322 WindowIdToTransportId(WindowId(embedder_tree->id(), 12)));
323 embedder_tree->NewWindow(embed_window_id, ServerWindow::Properties());
324 ServerWindow* embedder_window =
325 embedder_tree->GetWindowByClientId(embed_window_id);
326 ASSERT_TRUE(embedder_tree->AddWindow(
327 ClientWindowId(WindowIdToTransportId(embedder_root->id())),
328 embed_window_id));
329
330 TestWindowTreeClient* embedder_client = wm_client();
331
332 {
333 // Do a normal embed.
334 const uint32_t embed_flags = 0;
335 WindowTree* embed_tree = nullptr;
336 TestWindowTreeClient* embed_client_proxy = nullptr;
337 EmbedAt(embedder_tree, embed_window_id, embed_flags, &embed_tree,
338 &embed_client_proxy);
339 ASSERT_TRUE(embed_client_proxy);
340
341 // Send an event to the embed window. It should go to the embedded client.
342 ui::MouseEvent mouse(ui::ET_MOUSE_MOVED, gfx::Point(), gfx::Point(),
343 base::TimeTicks(), 0, 0);
344 DispatchInputEventToWindow(embedder_window, false, mouse, nullptr);
345 ASSERT_EQ(1u, embed_client_proxy->tracker()->changes()->size());
346 EXPECT_EQ(CHANGE_TYPE_INPUT_EVENT,
347 (*embed_client_proxy->tracker()->changes())[0].type);
348 WindowTreeTestApi(embed_tree).AckLastEvent(mojom::EventResult::UNHANDLED);
349 embed_client_proxy->tracker()->changes()->clear();
350 }
351
352 {
353 // Do an embed where the embedder wants to intercept events to the embedded
354 // tree.
355 const uint32_t embed_flags = mojom::kEmbedFlagEmbedderInterceptsEvents;
356 WindowTree* embed_tree = nullptr;
357 TestWindowTreeClient* embed_client_proxy = nullptr;
358 EmbedAt(embedder_tree, embed_window_id, embed_flags, &embed_tree,
359 &embed_client_proxy);
360 ASSERT_TRUE(embed_client_proxy);
361 embedder_client->tracker()->changes()->clear();
362
363 // Send an event to the embed window. But this time, it should reach the
364 // embedder.
365 ui::MouseEvent mouse(ui::ET_MOUSE_MOVED, gfx::Point(), gfx::Point(),
366 base::TimeTicks(), 0, 0);
367 DispatchInputEventToWindow(embedder_window, false, mouse, nullptr);
368 ASSERT_EQ(0u, embed_client_proxy->tracker()->changes()->size());
369 ASSERT_EQ(1u, embedder_client->tracker()->changes()->size());
370 EXPECT_EQ(CHANGE_TYPE_INPUT_EVENT,
371 (*embedder_client->tracker()->changes())[0].type);
372 WindowTreeTestApi(embedder_tree)
373 .AckLastEvent(mojom::EventResult::UNHANDLED);
374 embedder_client->tracker()->changes()->clear();
375
376 // Embed another tree in the embedded tree.
377 const ClientWindowId nested_embed_window_id(
378 WindowIdToTransportId(WindowId(embed_tree->id(), 23)));
379 embed_tree->NewWindow(nested_embed_window_id, ServerWindow::Properties());
380 const ClientWindowId embed_root_id(
381 WindowIdToTransportId((*embed_tree->roots().begin())->id()));
382 ASSERT_TRUE(embed_tree->AddWindow(embed_root_id, nested_embed_window_id));
383
384 WindowTree* nested_embed_tree = nullptr;
385 TestWindowTreeClient* nested_embed_client_proxy = nullptr;
386 EmbedAt(embed_tree, nested_embed_window_id, embed_flags, &nested_embed_tree,
387 &nested_embed_client_proxy);
388 ASSERT_TRUE(nested_embed_client_proxy);
389 embed_client_proxy->tracker()->changes()->clear();
390 embedder_client->tracker()->changes()->clear();
391
392 // Send an event to the nested embed window. The event should still reach
393 // the outermost embedder.
394 ServerWindow* nested_embed_window =
395 embed_tree->GetWindowByClientId(nested_embed_window_id);
396 DCHECK(nested_embed_window->parent());
397 mouse = ui::MouseEvent(ui::ET_MOUSE_MOVED, gfx::Point(), gfx::Point(),
398 base::TimeTicks(), 0, 0);
399 DispatchInputEventToWindow(nested_embed_window, false, mouse, nullptr);
400 ASSERT_EQ(0u, nested_embed_client_proxy->tracker()->changes()->size());
401 ASSERT_EQ(0u, embed_client_proxy->tracker()->changes()->size());
402
403 ASSERT_EQ(1u, embedder_client->tracker()->changes()->size());
404 EXPECT_EQ(CHANGE_TYPE_INPUT_EVENT,
405 (*embedder_client->tracker()->changes())[0].type);
406 WindowTreeTestApi(embedder_tree)
407 .AckLastEvent(mojom::EventResult::UNHANDLED);
408 }
409 }
410
294 } // namespace test 411 } // namespace test
295 } // namespace ws 412 } // namespace ws
296 } // namespace mus 413 } // namespace mus
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698