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

Side by Side Diff: services/ui/ws/window_finder_unittest.cc

Issue 2884463002: Make event-targeting asynchronous in window server. (Closed)
Patch Set: rebase and comments Created 3 years, 6 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "services/ui/ws/window_finder.h" 5 #include "services/ui/ws/window_finder.h"
6 6
7 #include "services/ui/ws/server_window.h" 7 #include "services/ui/ws/server_window.h"
8 #include "services/ui/ws/server_window_compositor_frame_sink_manager.h" 8 #include "services/ui/ws/server_window_compositor_frame_sink_manager.h"
9 #include "services/ui/ws/test_server_window_delegate.h" 9 #include "services/ui/ws/test_server_window_delegate.h"
10 #include "services/ui/ws/window_finder.h" 10 #include "services/ui/ws/window_finder.h"
(...skipping 16 matching lines...) Expand all
27 child1.SetVisible(true); 27 child1.SetVisible(true);
28 child1.SetBounds(gfx::Rect(10, 10, 20, 20), base::nullopt); 28 child1.SetBounds(gfx::Rect(10, 10, 20, 20), base::nullopt);
29 29
30 ServerWindow child2(&window_delegate, WindowId(1, 4)); 30 ServerWindow child2(&window_delegate, WindowId(1, 4));
31 root.Add(&child2); 31 root.Add(&child2);
32 child2.SetVisible(true); 32 child2.SetVisible(true);
33 child2.SetBounds(gfx::Rect(15, 15, 20, 20), base::nullopt); 33 child2.SetBounds(gfx::Rect(15, 15, 20, 20), base::nullopt);
34 34
35 EXPECT_EQ( 35 EXPECT_EQ(
36 &child2, 36 &child2,
37 FindDeepestVisibleWindowForEvents(&root, gfx::Point(16, 16)).window); 37 FindDeepestVisibleWindowForLocation(&root, gfx::Point(16, 16)).window);
38 38
39 EXPECT_EQ( 39 EXPECT_EQ(
40 &child1, 40 &child1,
41 FindDeepestVisibleWindowForEvents(&root, gfx::Point(13, 14)).window); 41 FindDeepestVisibleWindowForLocation(&root, gfx::Point(13, 14)).window);
42 42
43 child1.set_event_targeting_policy(mojom::EventTargetingPolicy::NONE); 43 child1.set_event_targeting_policy(mojom::EventTargetingPolicy::NONE);
44 EXPECT_EQ( 44 EXPECT_EQ(
45 nullptr, 45 nullptr,
46 FindDeepestVisibleWindowForEvents(&root, gfx::Point(13, 14)).window); 46 FindDeepestVisibleWindowForLocation(&root, gfx::Point(13, 14)).window);
47 47
48 child2.set_extended_hit_test_region(gfx::Insets(10, 10, 10, 10)); 48 child2.set_extended_hit_test_region(gfx::Insets(10, 10, 10, 10));
49 EXPECT_EQ( 49 EXPECT_EQ(
50 &child2, 50 &child2,
51 FindDeepestVisibleWindowForEvents(&root, gfx::Point(13, 14)).window); 51 FindDeepestVisibleWindowForLocation(&root, gfx::Point(13, 14)).window);
52 } 52 }
53 53
54 TEST(WindowFinderTest, FindDeepestVisibleWindowNonClientArea) { 54 TEST(WindowFinderTest, FindDeepestVisibleWindowNonClientArea) {
55 TestServerWindowDelegate window_delegate; 55 TestServerWindowDelegate window_delegate;
56 ServerWindow root(&window_delegate, WindowId(1, 2)); 56 ServerWindow root(&window_delegate, WindowId(1, 2));
57 window_delegate.set_root_window(&root); 57 window_delegate.set_root_window(&root);
58 root.SetVisible(true); 58 root.SetVisible(true);
59 root.SetBounds(gfx::Rect(0, 0, 100, 100), base::nullopt); 59 root.SetBounds(gfx::Rect(0, 0, 100, 100), base::nullopt);
60 60
61 ServerWindow child1(&window_delegate, WindowId(1, 3)); 61 ServerWindow child1(&window_delegate, WindowId(1, 3));
62 root.Add(&child1); 62 root.Add(&child1);
63 child1.SetVisible(true); 63 child1.SetVisible(true);
64 child1.SetBounds(gfx::Rect(10, 10, 20, 20), base::nullopt); 64 child1.SetBounds(gfx::Rect(10, 10, 20, 20), base::nullopt);
65 65
66 DeepestWindow result = 66 DeepestWindow result =
67 FindDeepestVisibleWindowForEvents(&root, gfx::Point(13, 14)); 67 FindDeepestVisibleWindowForLocation(&root, gfx::Point(13, 14));
68 EXPECT_EQ(&child1, result.window); 68 EXPECT_EQ(&child1, result.window);
69 EXPECT_FALSE(result.in_non_client_area); 69 EXPECT_FALSE(result.in_non_client_area);
70 70
71 result = FindDeepestVisibleWindowForEvents(&root, gfx::Point(11, 11)); 71 result = FindDeepestVisibleWindowForLocation(&root, gfx::Point(11, 11));
72 EXPECT_EQ(&child1, result.window); 72 EXPECT_EQ(&child1, result.window);
73 EXPECT_FALSE(result.in_non_client_area); 73 EXPECT_FALSE(result.in_non_client_area);
74 74
75 // 11, 11 is over the non-client area. 75 // 11, 11 is over the non-client area.
76 child1.SetClientArea(gfx::Insets(2, 3, 4, 5), std::vector<gfx::Rect>()); 76 child1.SetClientArea(gfx::Insets(2, 3, 4, 5), std::vector<gfx::Rect>());
77 result = FindDeepestVisibleWindowForEvents(&root, gfx::Point(11, 11)); 77 result = FindDeepestVisibleWindowForLocation(&root, gfx::Point(11, 11));
78 EXPECT_EQ(&child1, result.window); 78 EXPECT_EQ(&child1, result.window);
79 EXPECT_TRUE(result.in_non_client_area); 79 EXPECT_TRUE(result.in_non_client_area);
80 80
81 // 15, 15 is over the client area. 81 // 15, 15 is over the client area.
82 result = FindDeepestVisibleWindowForEvents(&root, gfx::Point(15, 15)); 82 result = FindDeepestVisibleWindowForLocation(&root, gfx::Point(15, 15));
83 EXPECT_EQ(&child1, result.window); 83 EXPECT_EQ(&child1, result.window);
84 EXPECT_FALSE(result.in_non_client_area); 84 EXPECT_FALSE(result.in_non_client_area);
85 85
86 // EventTargetingPolicy::NONE should not impact the result for the 86 // EventTargetingPolicy::NONE should not impact the result for the
87 // non-client area. 87 // non-client area.
88 child1.set_event_targeting_policy(mojom::EventTargetingPolicy::NONE); 88 child1.set_event_targeting_policy(mojom::EventTargetingPolicy::NONE);
89 result = FindDeepestVisibleWindowForEvents(&root, gfx::Point(11, 11)); 89 result = FindDeepestVisibleWindowForLocation(&root, gfx::Point(11, 11));
90 child1.SetClientArea(gfx::Insets(2, 3, 4, 5), std::vector<gfx::Rect>()); 90 child1.SetClientArea(gfx::Insets(2, 3, 4, 5), std::vector<gfx::Rect>());
91 EXPECT_EQ(&child1, result.window); 91 EXPECT_EQ(&child1, result.window);
92 EXPECT_TRUE(result.in_non_client_area); 92 EXPECT_TRUE(result.in_non_client_area);
93 93
94 // EventTargetingPolicy::NONE means the client area won't be matched though. 94 // EventTargetingPolicy::NONE means the client area won't be matched though.
95 result = FindDeepestVisibleWindowForEvents(&root, gfx::Point(15, 15)); 95 result = FindDeepestVisibleWindowForLocation(&root, gfx::Point(15, 15));
96 EXPECT_EQ(&root, result.window); 96 EXPECT_EQ(&root, result.window);
97 EXPECT_FALSE(result.in_non_client_area); 97 EXPECT_FALSE(result.in_non_client_area);
98 } 98 }
99 99
100 TEST(WindowFinderTest, FindDeepestVisibleWindowHitTestMask) { 100 TEST(WindowFinderTest, FindDeepestVisibleWindowHitTestMask) {
101 TestServerWindowDelegate window_delegate; 101 TestServerWindowDelegate window_delegate;
102 ServerWindow root(&window_delegate, WindowId(1, 2)); 102 ServerWindow root(&window_delegate, WindowId(1, 2));
103 window_delegate.set_root_window(&root); 103 window_delegate.set_root_window(&root);
104 root.SetVisible(true); 104 root.SetVisible(true);
105 root.SetBounds(gfx::Rect(0, 0, 100, 100), base::nullopt); 105 root.SetBounds(gfx::Rect(0, 0, 100, 100), base::nullopt);
106 106
107 ServerWindow child_with_mask(&window_delegate, WindowId(1, 4)); 107 ServerWindow child_with_mask(&window_delegate, WindowId(1, 4));
108 root.Add(&child_with_mask); 108 root.Add(&child_with_mask);
109 child_with_mask.SetVisible(true); 109 child_with_mask.SetVisible(true);
110 child_with_mask.SetBounds(gfx::Rect(10, 10, 20, 20), base::nullopt); 110 child_with_mask.SetBounds(gfx::Rect(10, 10, 20, 20), base::nullopt);
111 child_with_mask.SetHitTestMask(gfx::Rect(2, 2, 16, 16)); 111 child_with_mask.SetHitTestMask(gfx::Rect(2, 2, 16, 16));
112 112
113 // Test a point inside the window but outside the mask. 113 // Test a point inside the window but outside the mask.
114 EXPECT_EQ( 114 EXPECT_EQ(
115 &root, 115 &root,
116 FindDeepestVisibleWindowForEvents(&root, gfx::Point(11, 11)).window); 116 FindDeepestVisibleWindowForLocation(&root, gfx::Point(11, 11)).window);
117 117
118 // Test a point inside the window and inside the mask. 118 // Test a point inside the window and inside the mask.
119 EXPECT_EQ( 119 EXPECT_EQ(
120 &child_with_mask, 120 &child_with_mask,
121 FindDeepestVisibleWindowForEvents(&root, gfx::Point(15, 15)).window); 121 FindDeepestVisibleWindowForLocation(&root, gfx::Point(15, 15)).window);
122 } 122 }
123 123
124 TEST(WindowFinderTest, FindDeepestVisibleWindowOverNonTarget) { 124 TEST(WindowFinderTest, FindDeepestVisibleWindowOverNonTarget) {
125 TestServerWindowDelegate window_delegate; 125 TestServerWindowDelegate window_delegate;
126 ServerWindow root(&window_delegate, WindowId(1, 2)); 126 ServerWindow root(&window_delegate, WindowId(1, 2));
127 window_delegate.set_root_window(&root); 127 window_delegate.set_root_window(&root);
128 root.SetVisible(true); 128 root.SetVisible(true);
129 root.SetBounds(gfx::Rect(0, 0, 100, 100), base::nullopt); 129 root.SetBounds(gfx::Rect(0, 0, 100, 100), base::nullopt);
130 130
131 // Create two windows, |child1| and |child2|. The two overlap but |child2| is 131 // Create two windows, |child1| and |child2|. The two overlap but |child2| is
132 // not a valid event target. 132 // not a valid event target.
133 ServerWindow child1(&window_delegate, WindowId(1, 3)); 133 ServerWindow child1(&window_delegate, WindowId(1, 3));
134 root.Add(&child1); 134 root.Add(&child1);
135 child1.SetVisible(true); 135 child1.SetVisible(true);
136 child1.SetBounds(gfx::Rect(10, 10, 20, 20), base::nullopt); 136 child1.SetBounds(gfx::Rect(10, 10, 20, 20), base::nullopt);
137 137
138 ServerWindow child2(&window_delegate, WindowId(1, 4)); 138 ServerWindow child2(&window_delegate, WindowId(1, 4));
139 root.Add(&child2); 139 root.Add(&child2);
140 child2.set_event_targeting_policy(mojom::EventTargetingPolicy::NONE); 140 child2.set_event_targeting_policy(mojom::EventTargetingPolicy::NONE);
141 child2.SetVisible(true); 141 child2.SetVisible(true);
142 child2.SetBounds(gfx::Rect(15, 15, 20, 20), base::nullopt); 142 child2.SetBounds(gfx::Rect(15, 15, 20, 20), base::nullopt);
143 143
144 // 16, 16 is over |child2| and |child1|, but as |child2| isn't a valid event 144 // 16, 16 is over |child2| and |child1|, but as |child2| isn't a valid event
145 // target |child1| should be picked. 145 // target |child1| should be picked.
146 EXPECT_EQ( 146 EXPECT_EQ(
147 &child1, 147 &child1,
148 FindDeepestVisibleWindowForEvents(&root, gfx::Point(16, 16)).window); 148 FindDeepestVisibleWindowForLocation(&root, gfx::Point(16, 16)).window);
149 } 149 }
150 150
151 TEST(WindowFinderTest, NonClientPreferredOverChild) { 151 TEST(WindowFinderTest, NonClientPreferredOverChild) {
152 TestServerWindowDelegate window_delegate; 152 TestServerWindowDelegate window_delegate;
153 ServerWindow root(&window_delegate, WindowId(1, 2)); 153 ServerWindow root(&window_delegate, WindowId(1, 2));
154 window_delegate.set_root_window(&root); 154 window_delegate.set_root_window(&root);
155 root.SetVisible(true); 155 root.SetVisible(true);
156 root.SetBounds(gfx::Rect(0, 0, 100, 100), base::nullopt); 156 root.SetBounds(gfx::Rect(0, 0, 100, 100), base::nullopt);
157 157
158 // Create two windows, |child| and |child_child|; |child| is a child of the 158 // Create two windows, |child| and |child_child|; |child| is a child of the
159 // root and |child_child| and child of |child|. All share the same size with 159 // root and |child_child| and child of |child|. All share the same size with
160 // |child| having a non-client area. 160 // |child| having a non-client area.
161 ServerWindow child(&window_delegate, WindowId(1, 3)); 161 ServerWindow child(&window_delegate, WindowId(1, 3));
162 root.Add(&child); 162 root.Add(&child);
163 child.SetVisible(true); 163 child.SetVisible(true);
164 child.SetBounds(gfx::Rect(0, 0, 100, 100), base::nullopt); 164 child.SetBounds(gfx::Rect(0, 0, 100, 100), base::nullopt);
165 child.SetClientArea(gfx::Insets(2, 3, 4, 5), std::vector<gfx::Rect>()); 165 child.SetClientArea(gfx::Insets(2, 3, 4, 5), std::vector<gfx::Rect>());
166 166
167 ServerWindow child_child(&window_delegate, WindowId(1, 4)); 167 ServerWindow child_child(&window_delegate, WindowId(1, 4));
168 child.Add(&child_child); 168 child.Add(&child_child);
169 child_child.SetVisible(true); 169 child_child.SetVisible(true);
170 child_child.SetBounds(gfx::Rect(0, 0, 100, 100), base::nullopt); 170 child_child.SetBounds(gfx::Rect(0, 0, 100, 100), base::nullopt);
171 171
172 // |child| was should be returned as the event is over the non-client area. 172 // |child| was should be returned as the event is over the non-client area.
173 EXPECT_EQ(&child, 173 EXPECT_EQ(
174 FindDeepestVisibleWindowForEvents(&root, gfx::Point(1, 1)).window); 174 &child,
175 FindDeepestVisibleWindowForLocation(&root, gfx::Point(1, 1)).window);
175 } 176 }
176 177
177 TEST(WindowFinderTest, FindDeepestVisibleWindowWithTransform) { 178 TEST(WindowFinderTest, FindDeepestVisibleWindowWithTransform) {
178 TestServerWindowDelegate window_delegate; 179 TestServerWindowDelegate window_delegate;
179 ServerWindow root(&window_delegate, WindowId(1, 2)); 180 ServerWindow root(&window_delegate, WindowId(1, 2));
180 root.set_event_targeting_policy( 181 root.set_event_targeting_policy(
181 mojom::EventTargetingPolicy::DESCENDANTS_ONLY); 182 mojom::EventTargetingPolicy::DESCENDANTS_ONLY);
182 window_delegate.set_root_window(&root); 183 window_delegate.set_root_window(&root);
183 root.SetVisible(true); 184 root.SetVisible(true);
184 root.SetBounds(gfx::Rect(0, 0, 100, 100), base::nullopt); 185 root.SetBounds(gfx::Rect(0, 0, 100, 100), base::nullopt);
185 ServerWindow child(&window_delegate, WindowId(1, 3)); 186 ServerWindow child(&window_delegate, WindowId(1, 3));
186 root.Add(&child); 187 root.Add(&child);
187 child.SetVisible(true); 188 child.SetVisible(true);
188 child.SetBounds(gfx::Rect(10, 10, 20, 20), base::nullopt); 189 child.SetBounds(gfx::Rect(10, 10, 20, 20), base::nullopt);
189 gfx::Transform transform; 190 gfx::Transform transform;
190 transform.Scale(SkIntToMScalar(2), SkIntToMScalar(2)); 191 transform.Scale(SkIntToMScalar(2), SkIntToMScalar(2));
191 child.SetTransform(transform); 192 child.SetTransform(transform);
192 193
193 EXPECT_EQ( 194 EXPECT_EQ(
194 &child, 195 &child,
195 FindDeepestVisibleWindowForEvents(&root, gfx::Point(49, 49)).window); 196 FindDeepestVisibleWindowForLocation(&root, gfx::Point(49, 49)).window);
196 EXPECT_EQ(nullptr, 197 EXPECT_EQ(
197 FindDeepestVisibleWindowForEvents(&root, gfx::Point(9, 9)).window); 198 nullptr,
199 FindDeepestVisibleWindowForLocation(&root, gfx::Point(9, 9)).window);
198 200
199 // Verify extended hit test with transform is picked up. 201 // Verify extended hit test with transform is picked up.
200 child.set_extended_hit_test_region(gfx::Insets(2, 2, 2, 2)); 202 child.set_extended_hit_test_region(gfx::Insets(2, 2, 2, 2));
201 EXPECT_EQ(&child, 203 EXPECT_EQ(
202 FindDeepestVisibleWindowForEvents(&root, gfx::Point(7, 7)).window); 204 &child,
203 EXPECT_EQ(nullptr, 205 FindDeepestVisibleWindowForLocation(&root, gfx::Point(7, 7)).window);
204 FindDeepestVisibleWindowForEvents(&root, gfx::Point(4, 4)).window); 206 EXPECT_EQ(
207 nullptr,
208 FindDeepestVisibleWindowForLocation(&root, gfx::Point(4, 4)).window);
205 } 209 }
206 210
207 } // namespace ws 211 } // namespace ws
208 } // namespace ui 212 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698