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

Unified Diff: components/mus/ws/window_manager_state_unittest.cc

Issue 1883263002: mash: Repost mouse pressed event when closing Ash system tray (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: cleanup Created 4 years, 8 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/mus/ws/window_manager_state.cc ('k') | components/mus/ws/window_tree.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
index c803d0ffc4d84fa016a171fac965b3c47a202949..0f2f94f4f426b0efc532df02ed43106f8d6655a0 100644
--- a/components/mus/ws/window_manager_state_unittest.cc
+++ b/components/mus/ws/window_manager_state_unittest.cc
@@ -38,7 +38,7 @@ class WindowManagerStateTest : public testing::Test {
scoped_ptr<Accelerator> CreateAccelerator();
- // Creates a child |server_window| with associataed |window_tree| and
+ // Creates a child |server_window| with associated |window_tree| and
// |test_client|. The window is setup for processing input.
void CreateSecondaryTree(TestWindowTreeClient** test_client,
WindowTree** window_tree,
@@ -51,7 +51,9 @@ class WindowManagerStateTest : public testing::Test {
void OnEventAckTimeout();
WindowTree* tree() { return tree_; }
- ServerWindow* window() { return window_; }
+ WindowServer* window_server() { return window_server_.get(); }
+ ServerWindow* target_window() { return target_window_; }
+ TestWindowTreeClient* target_window_client() { return target_window_client_; }
TestWindowManager* window_manager() { return &window_manager_; }
TestWindowTreeClient* wm_client() { return wm_client_; }
WindowManagerState* window_manager_state() { return window_manager_state_; }
@@ -82,9 +84,14 @@ class WindowManagerStateTest : public testing::Test {
scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
TestPlatformDisplayFactory platform_display_factory_;
TestWindowManager window_manager_;
- ServerWindow* window_;
+ // Test window created as a child of the window manager window.
+ ServerWindow* target_window_;
+ // TestWindowTreeClient for |target_window_|.
+ TestWindowTreeClient* target_window_client_;
// Needed to Bind to |wm_client_|
base::MessageLoop message_loop_;
+ // Needed for hit testing.
+ scoped_refptr<SurfacesState> surfaces_state_;
DISALLOW_COPY_AND_ASSIGN(WindowManagerStateTest);
};
@@ -92,7 +99,8 @@ class WindowManagerStateTest : public testing::Test {
WindowManagerStateTest::WindowManagerStateTest()
: cursor_id_(0),
task_runner_(new base::TestSimpleTaskRunner),
- platform_display_factory_(&cursor_id_) {}
+ platform_display_factory_(&cursor_id_),
+ surfaces_state_(new SurfacesState()) {}
scoped_ptr<Accelerator> WindowManagerStateTest::CreateAccelerator() {
mojom::EventMatcherPtr matcher = mus::CreateKeyMatcher(
@@ -108,7 +116,7 @@ void WindowManagerStateTest::CreateSecondaryTree(
TestWindowTreeClient** test_client,
WindowTree** window_tree,
ServerWindow** server_window) {
- WindowTree* tree1 = window_server_->GetTreeWithRoot(window_);
+ WindowTree* tree1 = window_server_->GetTreeWithRoot(target_window_);
ASSERT_TRUE(tree1 != nullptr);
ASSERT_NE(tree1, tree());
@@ -118,9 +126,9 @@ void WindowManagerStateTest::CreateSecondaryTree(
ServerWindow* child1 = tree1->GetWindowByClientId(child1_id);
ASSERT_TRUE(child1);
ClientWindowId window_id;
- tree1->IsWindowKnown(window_, &window_id);
+ tree1->IsWindowKnown(target_window_, &window_id);
EXPECT_TRUE(tree1->AddWindow(window_id, child1_id));
- tree1->GetDisplay(window_)->AddActivationParent(window_);
+ tree1->GetDisplay(target_window_)->AddActivationParent(target_window_);
child1->SetVisible(true);
child1->SetBounds(gfx::Rect(20, 20, 20, 20));
@@ -154,10 +162,11 @@ void WindowManagerStateTest::SetUp() {
message_loop_.SetTaskRunner(task_runner_);
PlatformDisplay::set_factory_for_testing(&platform_display_factory_);
- window_server_.reset(new WindowServer(&window_server_delegate_,
- scoped_refptr<SurfacesState>()));
+ window_server_.reset(
+ new WindowServer(&window_server_delegate_, surfaces_state_));
PlatformDisplayInitParams display_init_params;
+ display_init_params.surfaces_state = surfaces_state_;
display_ = new Display(window_server_.get(), display_init_params);
display_binding_ = new TestDisplayBinding(display_, window_server_.get());
display_->Init(make_scoped_ptr(display_binding_));
@@ -176,13 +185,16 @@ void WindowManagerStateTest::SetUp() {
EXPECT_TRUE(tree_->SetWindowVisibility(embed_window_id, true));
EXPECT_TRUE(tree_->AddWindow(root_id, embed_window_id));
- display_->root_window()->SetBounds(gfx::Rect(0, 0, 100, 100));
+ display_->root_window()->SetBounds(gfx::Rect(0, 0, 1024, 768));
mojom::WindowTreeClientPtr client;
mojom::WindowTreeClientRequest client_request = GetProxy(&client);
wm_client_->Bind(std::move(client_request));
tree_->Embed(embed_window_id, std::move(client));
- window_ = tree_->GetWindowByClientId(embed_window_id);
- window_->SetBounds(gfx::Rect(0, 0, 50, 50));
+ target_window_ = tree_->GetWindowByClientId(embed_window_id);
+ target_window_->SetBounds(gfx::Rect(10, 10, 50, 50));
+ EnableHitTest(target_window_);
+ target_window_client_ = window_server_delegate_.last_client();
+ target_window_client_->tracker()->changes()->clear();
WindowTreeTestApi(tree_).set_window_manager_internal(&window_manager_);
wm_client_->tracker()->changes()->clear();
@@ -194,7 +206,7 @@ TEST_F(WindowManagerStateTest, NullAccelerator) {
WindowManagerState* state = window_manager_state();
EXPECT_TRUE(state);
- ServerWindow* target = window();
+ ServerWindow* target = target_window();
ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN);
DispatchInputEventToWindow(target, true, key, nullptr);
WindowTree* target_tree = tree();
@@ -203,7 +215,7 @@ TEST_F(WindowManagerStateTest, NullAccelerator) {
EXPECT_EQ("InputEvent window=1,1 event_action=1",
ChangesToDescription1(*tracker->changes())[0]);
- state->OnEventAck(target_tree, false);
+ state->OnEventAck(target_tree, mojom::EventResult::UNHANDLED);
EXPECT_FALSE(window_manager()->on_accelerator_called());
}
@@ -213,14 +225,14 @@ TEST_F(WindowManagerStateTest, PostTargetAccelerator) {
ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN);
scoped_ptr<Accelerator> accelerator = CreateAccelerator();
- ServerWindow* target = window();
+ ServerWindow* target = target_window();
DispatchInputEventToWindow(target, true, key, accelerator.get());
TestChangeTracker* tracker = wm_client()->tracker();
EXPECT_EQ(1u, tracker->changes()->size());
EXPECT_EQ("InputEvent window=1,1 event_action=1",
ChangesToDescription1(*tracker->changes())[0]);
- window_manager_state()->OnEventAck(tree(), false);
+ window_manager_state()->OnEventAck(tree(), mojom::EventResult::UNHANDLED);
EXPECT_TRUE(window_manager()->on_accelerator_called());
EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id());
}
@@ -231,14 +243,14 @@ TEST_F(WindowManagerStateTest, ClientHandlesEvent) {
ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN);
scoped_ptr<Accelerator> accelerator = CreateAccelerator();
- ServerWindow* target = window();
+ ServerWindow* target = target_window();
DispatchInputEventToWindow(target, true, key, accelerator.get());
TestChangeTracker* tracker = wm_client()->tracker();
EXPECT_EQ(1u, tracker->changes()->size());
EXPECT_EQ("InputEvent window=1,1 event_action=1",
ChangesToDescription1(*tracker->changes())[0]);
- window_manager_state()->OnEventAck(tree(), true);
+ window_manager_state()->OnEventAck(tree(), mojom::EventResult::HANDLED);
EXPECT_FALSE(window_manager()->on_accelerator_called());
}
@@ -248,7 +260,7 @@ TEST_F(WindowManagerStateTest, AcceleratorDeleted) {
ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN);
scoped_ptr<Accelerator> accelerator(CreateAccelerator());
- ServerWindow* target = window();
+ ServerWindow* target = target_window();
DispatchInputEventToWindow(target, true, key, accelerator.get());
TestChangeTracker* tracker = wm_client()->tracker();
EXPECT_EQ(1u, tracker->changes()->size());
@@ -256,7 +268,7 @@ TEST_F(WindowManagerStateTest, AcceleratorDeleted) {
ChangesToDescription1(*tracker->changes())[0]);
accelerator.reset();
- window_manager_state()->OnEventAck(tree(), false);
+ window_manager_state()->OnEventAck(tree(), mojom::EventResult::UNHANDLED);
EXPECT_FALSE(window_manager()->on_accelerator_called());
}
@@ -268,7 +280,7 @@ TEST_F(WindowManagerStateTest, EnqueuedAccelerators) {
ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN);
scoped_ptr<Accelerator> accelerator(CreateAccelerator());
- ServerWindow* target = window();
+ ServerWindow* target = target_window();
DispatchInputEventToWindow(target, true, key, accelerator.get());
TestChangeTracker* tracker = wm_client()->tracker();
EXPECT_EQ(1u, tracker->changes()->size());
@@ -288,7 +300,7 @@ TEST_F(WindowManagerStateTest, EnqueuedAccelerators) {
WindowTree* target_tree = tree();
WindowTreeTestApi(target_tree).ClearAck();
- state->OnEventAck(target_tree, false);
+ state->OnEventAck(target_tree, mojom::EventResult::UNHANDLED);
EXPECT_EQ(1u, tracker->changes()->size());
EXPECT_EQ("InputEvent window=1,1 event_action=1",
ChangesToDescription1(*tracker->changes())[0]);
@@ -301,7 +313,7 @@ TEST_F(WindowManagerStateTest, DeleteTree) {
ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN);
scoped_ptr<Accelerator> accelerator = CreateAccelerator();
- ServerWindow* target = window();
+ ServerWindow* target = target_window();
DispatchInputEventToWindow(target, true, key, accelerator.get());
TestChangeTracker* tracker = wm_client()->tracker();
EXPECT_EQ(1u, tracker->changes()->size());
@@ -341,7 +353,7 @@ TEST_F(WindowManagerStateTest, DeleteNonRootTree) {
TEST_F(WindowManagerStateTest, AckTimeout) {
ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN);
scoped_ptr<Accelerator> accelerator = CreateAccelerator();
- DispatchInputEventToWindow(window(), true, key, accelerator.get());
+ DispatchInputEventToWindow(target_window(), true, key, accelerator.get());
TestChangeTracker* tracker = wm_client()->tracker();
EXPECT_EQ(1u, tracker->changes()->size());
EXPECT_EQ("InputEvent window=1,1 event_action=1",
@@ -352,6 +364,49 @@ TEST_F(WindowManagerStateTest, AckTimeout) {
EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id());
}
+// Tests that when a window returns an event as unhandled that event is
+// reposted.
+TEST_F(WindowManagerStateTest, RepostEvent) {
+ window_manager_state()->SetCapture(target_window(), false);
+
+ // Simulate a mouse release at a point outside of a target window. It will
+ // still process the event because it has capture.
+ ASSERT_EQ("10,10", target_window()->bounds().origin().ToString());
+ ui::PointerEvent mouse_event(ui::MouseEvent(
+ ui::ET_MOUSE_RELEASED, gfx::Point(5, 5), gfx::Point(5, 5),
+ base::TimeDelta(), ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON));
+ window_manager_state()->ProcessEvent(mouse_event);
+
+ // The event was sent to the target window.
+ TestChangeTracker* tracker = target_window_client()->tracker();
+ ASSERT_EQ(1u, tracker->changes()->size());
+ const Change& change1 = (*tracker->changes())[0];
+ EXPECT_EQ(static_cast<int>(mojom::EventType::POINTER_UP),
+ change1.event_action);
+ // The event has window-local coordinates.
+ EXPECT_EQ("-5,-5", change1.event_location.ToString());
+
+ window_manager_state()->SetCapture(nullptr, false);
+
+ // Ack the event and request reposting. Do this at the window tree level
+ // instead of directly in window_manager_state() because otherwise the window
+ // tree won't know the original event was handled and it will queue the
+ // reposted event instead of dispatching it.
+ WindowTree* target_tree = window_server()->GetTreeWithRoot(target_window());
+ WindowTreeTestApi(target_tree)
+ .OnWindowInputEventAck(change1.event_id, mojom::EventResult::REPOST);
+
+ // The event was reposted. Because its location was outside the target window
+ // bounds it was sent to the window manager.
+ TestChangeTracker* wm_tracker = wm_client()->tracker();
+ ASSERT_EQ(1u, wm_tracker->changes()->size());
+ const Change& change2 = (*wm_tracker->changes())[0];
+ EXPECT_EQ(static_cast<int>(mojom::EventType::POINTER_UP),
+ change2.event_action);
+ // The event has window-local coordinates.
+ EXPECT_EQ("5,5", change2.event_location.ToString());
+}
+
} // namespace test
} // namespace ws
} // namespace mus
« no previous file with comments | « components/mus/ws/window_manager_state.cc ('k') | components/mus/ws/window_tree.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698