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

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

Powered by Google App Engine
This is Rietveld 408576698