| 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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |