| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |