Index: components/mus/ws/window_manager_state_unittest.cc |
diff --git a/components/mus/ws/window_manager_state_unittest.cc b/components/mus/ws/window_manager_state_unittest.cc |
deleted file mode 100644 |
index 20980f75b4c3a132fbe1a007986465a1963dd553..0000000000000000000000000000000000000000 |
--- a/components/mus/ws/window_manager_state_unittest.cc |
+++ /dev/null |
@@ -1,419 +0,0 @@ |
-// Copyright 2016 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "components/mus/ws/window_manager_state.h" |
- |
-#include <memory> |
- |
-#include "base/macros.h" |
-#include "base/memory/ptr_util.h" |
-#include "base/memory/ref_counted.h" |
-#include "base/test/test_simple_task_runner.h" |
-#include "base/threading/thread_task_runner_handle.h" |
-#include "components/mus/common/event_matcher_util.h" |
-#include "components/mus/surfaces/surfaces_state.h" |
-#include "components/mus/ws/accelerator.h" |
-#include "components/mus/ws/display.h" |
-#include "components/mus/ws/display_binding.h" |
-#include "components/mus/ws/platform_display.h" |
-#include "components/mus/ws/platform_display_init_params.h" |
-#include "components/mus/ws/server_window_surface_manager_test_api.h" |
-#include "components/mus/ws/test_change_tracker.h" |
-#include "components/mus/ws/test_server_window_delegate.h" |
-#include "components/mus/ws/test_utils.h" |
-#include "components/mus/ws/window_manager_access_policy.h" |
-#include "components/mus/ws/window_manager_display_root.h" |
-#include "components/mus/ws/window_manager_state.h" |
-#include "components/mus/ws/window_server.h" |
-#include "components/mus/ws/window_tree.h" |
-#include "services/shell/public/interfaces/connector.mojom.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "ui/events/event.h" |
- |
-namespace mus { |
-namespace ws { |
-namespace test { |
- |
-class WindowManagerStateTest : public testing::Test { |
- public: |
- WindowManagerStateTest(); |
- ~WindowManagerStateTest() override {} |
- |
- std::unique_ptr<Accelerator> CreateAccelerator(); |
- |
- // Creates a child |server_window| with associataed |window_tree| and |
- // |test_client|. The window is setup for processing input. |
- void CreateSecondaryTree(TestWindowTreeClient** test_client, |
- WindowTree** window_tree, |
- ServerWindow** server_window); |
- |
- void DispatchInputEventToWindow(ServerWindow* target, |
- const ui::Event& event, |
- Accelerator* accelerator); |
- void OnEventAckTimeout(ClientSpecificId client_id); |
- |
- WindowTree* tree() { |
- return window_event_targeting_helper_.window_server()->GetTreeWithId(1); |
- } |
- WindowTree* window_tree() { return window_tree_; } |
- TestWindowTreeClient* window_tree_client() { return window_tree_client_; } |
- ServerWindow* window() { return window_; } |
- TestWindowManager* window_manager() { return &window_manager_; } |
- TestWindowTreeClient* wm_client() { |
- return window_event_targeting_helper_.wm_client(); |
- } |
- TestWindowTreeClient* last_tree_client() { |
- return window_event_targeting_helper_.last_window_tree_client(); |
- } |
- WindowTree* last_tree() { |
- return window_event_targeting_helper_.last_binding()->tree(); |
- } |
- WindowManagerState* window_manager_state() { return window_manager_state_; } |
- |
- void EmbedAt(WindowTree* tree, |
- const ClientWindowId& embed_window_id, |
- uint32_t embed_flags, |
- WindowTree** embed_tree, |
- TestWindowTreeClient** embed_client_proxy) { |
- mojom::WindowTreeClientPtr embed_client; |
- mojom::WindowTreeClientRequest client_request = GetProxy(&embed_client); |
- ASSERT_TRUE( |
- tree->Embed(embed_window_id, std::move(embed_client), embed_flags)); |
- TestWindowTreeClient* client = |
- window_event_targeting_helper_.last_window_tree_client(); |
- ASSERT_EQ(1u, client->tracker()->changes()->size()); |
- EXPECT_EQ(CHANGE_TYPE_EMBED, (*client->tracker()->changes())[0].type); |
- client->tracker()->changes()->clear(); |
- *embed_client_proxy = client; |
- *embed_tree = window_event_targeting_helper_.last_binding()->tree(); |
- } |
- |
- // testing::Test: |
- void SetUp() override; |
- |
- private: |
- WindowEventTargetingHelper window_event_targeting_helper_; |
- |
- WindowManagerState* window_manager_state_; |
- |
- // Handles WindowStateManager ack timeouts. |
- scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
- TestWindowManager window_manager_; |
- ServerWindow* window_ = nullptr; |
- WindowTree* window_tree_ = nullptr; |
- TestWindowTreeClient* window_tree_client_ = nullptr; |
- |
- DISALLOW_COPY_AND_ASSIGN(WindowManagerStateTest); |
-}; |
- |
-WindowManagerStateTest::WindowManagerStateTest() |
- : task_runner_(new base::TestSimpleTaskRunner) {} |
- |
-std::unique_ptr<Accelerator> WindowManagerStateTest::CreateAccelerator() { |
- mojom::EventMatcherPtr matcher = mus::CreateKeyMatcher( |
- ui::mojom::KeyboardCode::W, ui::mojom::kEventFlagControlDown); |
- matcher->accelerator_phase = ui::mojom::AcceleratorPhase::POST_TARGET; |
- uint32_t accelerator_id = 1; |
- std::unique_ptr<Accelerator> accelerator( |
- new Accelerator(accelerator_id, *matcher)); |
- return accelerator; |
-} |
- |
-void WindowManagerStateTest::CreateSecondaryTree( |
- TestWindowTreeClient** test_client, |
- WindowTree** window_tree, |
- ServerWindow** server_window) { |
- window_event_targeting_helper_.CreateSecondaryTree( |
- window_, gfx::Rect(20, 20, 20, 20), test_client, window_tree, |
- server_window); |
-} |
- |
-void WindowManagerStateTest::DispatchInputEventToWindow( |
- ServerWindow* target, |
- const ui::Event& event, |
- Accelerator* accelerator) { |
- WindowManagerStateTestApi test_api(window_manager_state_); |
- ClientSpecificId client_id = test_api.GetEventTargetClientId(target, false); |
- test_api.DispatchInputEventToWindow(target, client_id, event, accelerator); |
-} |
- |
-void WindowManagerStateTest::OnEventAckTimeout( |
- ClientSpecificId client_id) { |
- WindowManagerStateTestApi test_api(window_manager_state_); |
- test_api.OnEventAckTimeout(client_id); |
-} |
- |
-void WindowManagerStateTest::SetUp() { |
- window_event_targeting_helper_.SetTaskRunner(task_runner_); |
- window_manager_state_ = window_event_targeting_helper_.display() |
- ->GetActiveWindowManagerDisplayRoot() |
- ->window_manager_state(); |
- window_ = window_event_targeting_helper_.CreatePrimaryTree( |
- gfx::Rect(0, 0, 100, 100), gfx::Rect(0, 0, 50, 50)); |
- window_tree_ = window_event_targeting_helper_.last_binding()->tree(); |
- window_tree_client_ = |
- window_event_targeting_helper_.last_window_tree_client(); |
- DCHECK(window_tree_->HasRoot(window_)); |
- |
- WindowTreeTestApi(tree()).set_window_manager_internal(&window_manager_); |
- wm_client()->tracker()->changes()->clear(); |
- window_tree_client_->tracker()->changes()->clear(); |
-} |
- |
-// Tests that when an event is dispatched with no accelerator, that post target |
-// accelerator is not triggered. |
-TEST_F(WindowManagerStateTest, NullAccelerator) { |
- WindowManagerState* state = window_manager_state(); |
- EXPECT_TRUE(state); |
- |
- ServerWindow* target = window(); |
- ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
- DispatchInputEventToWindow(target, key, nullptr); |
- WindowTree* target_tree = window_tree(); |
- TestChangeTracker* tracker = window_tree_client()->tracker(); |
- ASSERT_EQ(1u, tracker->changes()->size()); |
- EXPECT_EQ("InputEvent window=1,1 event_action=7", |
- ChangesToDescription1(*tracker->changes())[0]); |
- |
- WindowTreeTestApi(target_tree).AckOldestEvent(); |
- EXPECT_FALSE(window_manager()->on_accelerator_called()); |
-} |
- |
-// Tests that when a post target accelerator is provided on an event, that it is |
-// called on ack. |
-TEST_F(WindowManagerStateTest, PostTargetAccelerator) { |
- ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
- std::unique_ptr<Accelerator> accelerator = CreateAccelerator(); |
- |
- ServerWindow* target = window(); |
- DispatchInputEventToWindow(target, key, accelerator.get()); |
- TestChangeTracker* tracker = window_tree_client()->tracker(); |
- ASSERT_EQ(1u, tracker->changes()->size()); |
- EXPECT_EQ("InputEvent window=1,1 event_action=7", |
- ChangesToDescription1(*tracker->changes())[0]); |
- |
- WindowTreeTestApi(window_tree()).AckOldestEvent(); |
- EXPECT_TRUE(window_manager()->on_accelerator_called()); |
- EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id()); |
-} |
- |
-// Tests that when a client handles an event that post target accelerators are |
-// not called. |
-TEST_F(WindowManagerStateTest, ClientHandlesEvent) { |
- ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
- std::unique_ptr<Accelerator> accelerator = CreateAccelerator(); |
- |
- ServerWindow* target = window(); |
- DispatchInputEventToWindow(target, key, accelerator.get()); |
- TestChangeTracker* tracker = window_tree_client()->tracker(); |
- ASSERT_EQ(1u, tracker->changes()->size()); |
- EXPECT_EQ("InputEvent window=1,1 event_action=7", |
- ChangesToDescription1(*tracker->changes())[0]); |
- |
- window_manager_state()->OnEventAck(tree(), mojom::EventResult::HANDLED); |
- EXPECT_FALSE(window_manager()->on_accelerator_called()); |
-} |
- |
-// Tests that when an accelerator is deleted before an ack, that it is not |
-// called. |
-TEST_F(WindowManagerStateTest, AcceleratorDeleted) { |
- ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
- std::unique_ptr<Accelerator> accelerator(CreateAccelerator()); |
- |
- ServerWindow* target = window(); |
- DispatchInputEventToWindow(target, key, accelerator.get()); |
- TestChangeTracker* tracker = window_tree_client()->tracker(); |
- ASSERT_EQ(1u, tracker->changes()->size()); |
- EXPECT_EQ("InputEvent window=1,1 event_action=7", |
- ChangesToDescription1(*tracker->changes())[0]); |
- |
- accelerator.reset(); |
- window_manager_state()->OnEventAck(tree(), mojom::EventResult::UNHANDLED); |
- EXPECT_FALSE(window_manager()->on_accelerator_called()); |
-} |
- |
-// Tests that a events arriving before an ack don't notify the tree until the |
-// ack arrives, and that the correct accelerator is called. |
-TEST_F(WindowManagerStateTest, EnqueuedAccelerators) { |
- ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
- std::unique_ptr<Accelerator> accelerator(CreateAccelerator()); |
- |
- ServerWindow* target = window(); |
- DispatchInputEventToWindow(target, key, accelerator.get()); |
- TestChangeTracker* tracker = window_tree_client()->tracker(); |
- ASSERT_EQ(1u, tracker->changes()->size()); |
- EXPECT_EQ("InputEvent window=1,1 event_action=7", |
- ChangesToDescription1(*tracker->changes())[0]); |
- |
- tracker->changes()->clear(); |
- ui::KeyEvent key2(ui::ET_KEY_PRESSED, ui::VKEY_Y, ui::EF_CONTROL_DOWN); |
- mojom::EventMatcherPtr matcher = mus::CreateKeyMatcher( |
- ui::mojom::KeyboardCode::Y, ui::mojom::kEventFlagControlDown); |
- matcher->accelerator_phase = ui::mojom::AcceleratorPhase::POST_TARGET; |
- uint32_t accelerator_id = 2; |
- std::unique_ptr<Accelerator> accelerator2( |
- new Accelerator(accelerator_id, *matcher)); |
- DispatchInputEventToWindow(target, key2, accelerator2.get()); |
- EXPECT_TRUE(tracker->changes()->empty()); |
- |
- WindowTreeTestApi(window_tree()).AckOldestEvent(); |
- ASSERT_EQ(1u, tracker->changes()->size()); |
- EXPECT_EQ("InputEvent window=1,1 event_action=7", |
- ChangesToDescription1(*tracker->changes())[0]); |
- EXPECT_TRUE(window_manager()->on_accelerator_called()); |
- EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id()); |
-} |
- |
-// Tests that the accelerator is not sent when the tree is dying. |
-TEST_F(WindowManagerStateTest, DeleteTree) { |
- ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
- std::unique_ptr<Accelerator> accelerator = CreateAccelerator(); |
- |
- ServerWindow* target = window(); |
- DispatchInputEventToWindow(target, key, accelerator.get()); |
- TestChangeTracker* tracker = window_tree_client()->tracker(); |
- ASSERT_EQ(1u, tracker->changes()->size()); |
- EXPECT_EQ("InputEvent window=1,1 event_action=7", |
- ChangesToDescription1(*tracker->changes())[0]); |
- |
- window_manager_state()->OnWillDestroyTree(tree()); |
- EXPECT_FALSE(window_manager()->on_accelerator_called()); |
-} |
- |
-// Tests that if a tree is destroyed before acking, that the accelerator is |
-// still sent if it is not the root tree. |
-TEST_F(WindowManagerStateTest, DeleteNonRootTree) { |
- TestWindowTreeClient* embed_connection = nullptr; |
- WindowTree* target_tree = nullptr; |
- ServerWindow* target = nullptr; |
- CreateSecondaryTree(&embed_connection, &target_tree, &target); |
- TestWindowManager target_window_manager; |
- WindowTreeTestApi(target_tree) |
- .set_window_manager_internal(&target_window_manager); |
- |
- ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
- std::unique_ptr<Accelerator> accelerator = CreateAccelerator(); |
- DispatchInputEventToWindow(target, key, accelerator.get()); |
- TestChangeTracker* tracker = embed_connection->tracker(); |
- ASSERT_EQ(1u, tracker->changes()->size()); |
- EXPECT_EQ("InputEvent window=2,1 event_action=7", |
- ChangesToDescription1(*tracker->changes())[0]); |
- EXPECT_TRUE(wm_client()->tracker()->changes()->empty()); |
- |
- window_manager_state()->OnWillDestroyTree(target_tree); |
- EXPECT_FALSE(target_window_manager.on_accelerator_called()); |
- EXPECT_TRUE(window_manager()->on_accelerator_called()); |
-} |
- |
-// Tests that when an ack times out that the accelerator is notified. |
-TEST_F(WindowManagerStateTest, AckTimeout) { |
- ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
- std::unique_ptr<Accelerator> accelerator = CreateAccelerator(); |
- DispatchInputEventToWindow(window(), key, accelerator.get()); |
- TestChangeTracker* tracker = window_tree_client()->tracker(); |
- ASSERT_EQ(1u, tracker->changes()->size()); |
- EXPECT_EQ("InputEvent window=1,1 event_action=7", |
- ChangesToDescription1(*tracker->changes())[0]); |
- |
- OnEventAckTimeout(window()->id().client_id); |
- EXPECT_TRUE(window_manager()->on_accelerator_called()); |
- EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id()); |
-} |
- |
-TEST_F(WindowManagerStateTest, InterceptingEmbedderReceivesEvents) { |
- WindowTree* embedder_tree = tree(); |
- ServerWindow* embedder_root = window(); |
- const ClientWindowId embed_window_id( |
- WindowIdToTransportId(WindowId(embedder_tree->id(), 12))); |
- embedder_tree->NewWindow(embed_window_id, ServerWindow::Properties()); |
- ServerWindow* embedder_window = |
- embedder_tree->GetWindowByClientId(embed_window_id); |
- ASSERT_TRUE(embedder_tree->AddWindow( |
- ClientWindowId(WindowIdToTransportId(embedder_root->id())), |
- embed_window_id)); |
- |
- TestWindowTreeClient* embedder_client = wm_client(); |
- |
- { |
- // Do a normal embed. |
- const uint32_t embed_flags = 0; |
- WindowTree* embed_tree = nullptr; |
- TestWindowTreeClient* embed_client_proxy = nullptr; |
- EmbedAt(embedder_tree, embed_window_id, embed_flags, &embed_tree, |
- &embed_client_proxy); |
- ASSERT_TRUE(embed_client_proxy); |
- |
- // Send an event to the embed window. It should go to the embedded client. |
- ui::MouseEvent mouse(ui::ET_MOUSE_MOVED, gfx::Point(), gfx::Point(), |
- base::TimeTicks(), 0, 0); |
- DispatchInputEventToWindow(embedder_window, mouse, nullptr); |
- ASSERT_EQ(1u, embed_client_proxy->tracker()->changes()->size()); |
- EXPECT_EQ(CHANGE_TYPE_INPUT_EVENT, |
- (*embed_client_proxy->tracker()->changes())[0].type); |
- WindowTreeTestApi(embed_tree).AckLastEvent(mojom::EventResult::UNHANDLED); |
- embed_client_proxy->tracker()->changes()->clear(); |
- } |
- |
- { |
- // Do an embed where the embedder wants to intercept events to the embedded |
- // tree. |
- const uint32_t embed_flags = mojom::kEmbedFlagEmbedderInterceptsEvents; |
- WindowTree* embed_tree = nullptr; |
- TestWindowTreeClient* embed_client_proxy = nullptr; |
- EmbedAt(embedder_tree, embed_window_id, embed_flags, &embed_tree, |
- &embed_client_proxy); |
- ASSERT_TRUE(embed_client_proxy); |
- embedder_client->tracker()->changes()->clear(); |
- |
- // Send an event to the embed window. But this time, it should reach the |
- // embedder. |
- ui::MouseEvent mouse(ui::ET_MOUSE_MOVED, gfx::Point(), gfx::Point(), |
- base::TimeTicks(), 0, 0); |
- DispatchInputEventToWindow(embedder_window, mouse, nullptr); |
- ASSERT_EQ(0u, embed_client_proxy->tracker()->changes()->size()); |
- ASSERT_EQ(1u, embedder_client->tracker()->changes()->size()); |
- EXPECT_EQ(CHANGE_TYPE_INPUT_EVENT, |
- (*embedder_client->tracker()->changes())[0].type); |
- WindowTreeTestApi(embedder_tree) |
- .AckLastEvent(mojom::EventResult::UNHANDLED); |
- embedder_client->tracker()->changes()->clear(); |
- |
- // Embed another tree in the embedded tree. |
- const ClientWindowId nested_embed_window_id( |
- WindowIdToTransportId(WindowId(embed_tree->id(), 23))); |
- embed_tree->NewWindow(nested_embed_window_id, ServerWindow::Properties()); |
- const ClientWindowId embed_root_id( |
- WindowIdToTransportId((*embed_tree->roots().begin())->id())); |
- ASSERT_TRUE(embed_tree->AddWindow(embed_root_id, nested_embed_window_id)); |
- |
- WindowTree* nested_embed_tree = nullptr; |
- TestWindowTreeClient* nested_embed_client_proxy = nullptr; |
- EmbedAt(embed_tree, nested_embed_window_id, embed_flags, &nested_embed_tree, |
- &nested_embed_client_proxy); |
- ASSERT_TRUE(nested_embed_client_proxy); |
- embed_client_proxy->tracker()->changes()->clear(); |
- embedder_client->tracker()->changes()->clear(); |
- |
- // Send an event to the nested embed window. The event should still reach |
- // the outermost embedder. |
- ServerWindow* nested_embed_window = |
- embed_tree->GetWindowByClientId(nested_embed_window_id); |
- DCHECK(nested_embed_window->parent()); |
- mouse = ui::MouseEvent(ui::ET_MOUSE_MOVED, gfx::Point(), gfx::Point(), |
- base::TimeTicks(), 0, 0); |
- DispatchInputEventToWindow(nested_embed_window, mouse, nullptr); |
- ASSERT_EQ(0u, nested_embed_client_proxy->tracker()->changes()->size()); |
- ASSERT_EQ(0u, embed_client_proxy->tracker()->changes()->size()); |
- |
- ASSERT_EQ(1u, embedder_client->tracker()->changes()->size()); |
- EXPECT_EQ(CHANGE_TYPE_INPUT_EVENT, |
- (*embedder_client->tracker()->changes())[0].type); |
- WindowTreeTestApi(embedder_tree) |
- .AckLastEvent(mojom::EventResult::UNHANDLED); |
- } |
-} |
- |
-} // namespace test |
-} // namespace ws |
-} // namespace mus |