OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "components/mus/ws/server_window_drawn_tracker.h" | |
6 | |
7 #include <stddef.h> | |
8 | |
9 #include "base/macros.h" | |
10 #include "components/mus/ws/server_window.h" | |
11 #include "components/mus/ws/server_window_drawn_tracker_observer.h" | |
12 #include "components/mus/ws/test_server_window_delegate.h" | |
13 #include "testing/gtest/include/gtest/gtest.h" | |
14 | |
15 namespace mus { | |
16 | |
17 namespace ws { | |
18 namespace { | |
19 | |
20 class TestServerWindowDrawnTrackerObserver | |
21 : public ServerWindowDrawnTrackerObserver { | |
22 public: | |
23 TestServerWindowDrawnTrackerObserver() | |
24 : change_count_(0u), | |
25 ancestor_(nullptr), | |
26 window_(nullptr), | |
27 is_drawn_(false) {} | |
28 | |
29 void clear_change_count() { change_count_ = 0u; } | |
30 size_t change_count() const { return change_count_; } | |
31 const ServerWindow* ancestor() const { return ancestor_; } | |
32 const ServerWindow* window() const { return window_; } | |
33 bool is_drawn() const { return is_drawn_; } | |
34 | |
35 private: | |
36 // ServerWindowDrawnTrackerObserver: | |
37 void OnDrawnStateWillChange(ServerWindow* ancestor, | |
38 ServerWindow* window, | |
39 bool is_drawn) override { | |
40 change_count_++; | |
41 ancestor_ = ancestor; | |
42 window_ = window; | |
43 is_drawn_ = is_drawn; | |
44 } | |
45 | |
46 void OnDrawnStateChanged(ServerWindow* ancestor, | |
47 ServerWindow* window, | |
48 bool is_drawn) override { | |
49 EXPECT_EQ(ancestor_, ancestor); | |
50 EXPECT_EQ(window_, window); | |
51 EXPECT_EQ(is_drawn_, is_drawn); | |
52 } | |
53 | |
54 size_t change_count_; | |
55 const ServerWindow* ancestor_; | |
56 const ServerWindow* window_; | |
57 bool is_drawn_; | |
58 | |
59 DISALLOW_COPY_AND_ASSIGN(TestServerWindowDrawnTrackerObserver); | |
60 }; | |
61 | |
62 } // namespace | |
63 | |
64 TEST(ServerWindowDrawnTrackerTest, ChangeBecauseOfDeletionAndVisibility) { | |
65 TestServerWindowDelegate server_window_delegate; | |
66 std::unique_ptr<ServerWindow> window( | |
67 new ServerWindow(&server_window_delegate, WindowId())); | |
68 server_window_delegate.set_root_window(window.get()); | |
69 TestServerWindowDrawnTrackerObserver drawn_observer; | |
70 ServerWindowDrawnTracker tracker(window.get(), &drawn_observer); | |
71 window->SetVisible(true); | |
72 EXPECT_EQ(1u, drawn_observer.change_count()); | |
73 EXPECT_EQ(window.get(), drawn_observer.window()); | |
74 EXPECT_EQ(nullptr, drawn_observer.ancestor()); | |
75 EXPECT_TRUE(drawn_observer.is_drawn()); | |
76 drawn_observer.clear_change_count(); | |
77 | |
78 window->SetVisible(false); | |
79 EXPECT_EQ(1u, drawn_observer.change_count()); | |
80 EXPECT_EQ(window.get(), drawn_observer.window()); | |
81 EXPECT_EQ(nullptr, drawn_observer.ancestor()); | |
82 EXPECT_FALSE(drawn_observer.is_drawn()); | |
83 drawn_observer.clear_change_count(); | |
84 | |
85 window->SetVisible(true); | |
86 EXPECT_EQ(1u, drawn_observer.change_count()); | |
87 EXPECT_EQ(window.get(), drawn_observer.window()); | |
88 EXPECT_EQ(nullptr, drawn_observer.ancestor()); | |
89 EXPECT_TRUE(drawn_observer.is_drawn()); | |
90 drawn_observer.clear_change_count(); | |
91 | |
92 ServerWindow* old_window = window.get(); | |
93 window.reset(); | |
94 EXPECT_EQ(1u, drawn_observer.change_count()); | |
95 EXPECT_EQ(old_window, drawn_observer.window()); | |
96 EXPECT_EQ(nullptr, drawn_observer.ancestor()); | |
97 EXPECT_FALSE(drawn_observer.is_drawn()); | |
98 } | |
99 | |
100 TEST(ServerWindowDrawnTrackerTest, ChangeBecauseOfRemovingFromRoot) { | |
101 TestServerWindowDelegate server_window_delegate; | |
102 ServerWindow root(&server_window_delegate, WindowId()); | |
103 server_window_delegate.set_root_window(&root); | |
104 root.SetVisible(true); | |
105 ServerWindow child(&server_window_delegate, WindowId()); | |
106 child.SetVisible(true); | |
107 root.Add(&child); | |
108 | |
109 TestServerWindowDrawnTrackerObserver drawn_observer; | |
110 ServerWindowDrawnTracker tracker(&child, &drawn_observer); | |
111 root.Remove(&child); | |
112 EXPECT_EQ(1u, drawn_observer.change_count()); | |
113 EXPECT_EQ(&child, drawn_observer.window()); | |
114 EXPECT_EQ(&root, drawn_observer.ancestor()); | |
115 EXPECT_FALSE(drawn_observer.is_drawn()); | |
116 drawn_observer.clear_change_count(); | |
117 | |
118 root.Add(&child); | |
119 EXPECT_EQ(1u, drawn_observer.change_count()); | |
120 EXPECT_EQ(&child, drawn_observer.window()); | |
121 EXPECT_EQ(nullptr, drawn_observer.ancestor()); | |
122 EXPECT_TRUE(drawn_observer.is_drawn()); | |
123 } | |
124 | |
125 TEST(ServerWindowDrawnTrackerTest, ChangeBecauseOfRemovingAncestorFromRoot) { | |
126 TestServerWindowDelegate server_window_delegate; | |
127 ServerWindow root(&server_window_delegate, WindowId()); | |
128 server_window_delegate.set_root_window(&root); | |
129 root.SetVisible(true); | |
130 ServerWindow child(&server_window_delegate, WindowId()); | |
131 child.SetVisible(true); | |
132 root.Add(&child); | |
133 | |
134 ServerWindow child_child(&server_window_delegate, WindowId()); | |
135 child_child.SetVisible(true); | |
136 child.Add(&child_child); | |
137 | |
138 TestServerWindowDrawnTrackerObserver drawn_observer; | |
139 ServerWindowDrawnTracker tracker(&child_child, &drawn_observer); | |
140 root.Remove(&child); | |
141 EXPECT_EQ(1u, drawn_observer.change_count()); | |
142 EXPECT_EQ(&child_child, drawn_observer.window()); | |
143 EXPECT_EQ(&root, drawn_observer.ancestor()); | |
144 EXPECT_FALSE(drawn_observer.is_drawn()); | |
145 drawn_observer.clear_change_count(); | |
146 | |
147 root.Add(&child_child); | |
148 EXPECT_EQ(1u, drawn_observer.change_count()); | |
149 EXPECT_EQ(&child_child, drawn_observer.window()); | |
150 EXPECT_EQ(nullptr, drawn_observer.ancestor()); | |
151 EXPECT_TRUE(drawn_observer.is_drawn()); | |
152 } | |
153 | |
154 TEST(ServerWindowDrawnTrackerTest, VisibilityChangeFromNonParentAncestor) { | |
155 TestServerWindowDelegate server_window_delegate; | |
156 ServerWindow root(&server_window_delegate, WindowId()); | |
157 ServerWindow child1(&server_window_delegate, WindowId()); | |
158 ServerWindow child2(&server_window_delegate, WindowId()); | |
159 ServerWindow child3(&server_window_delegate, WindowId()); | |
160 server_window_delegate.set_root_window(&root); | |
161 | |
162 root.Add(&child1); | |
163 child1.Add(&child2); | |
164 child2.Add(&child3); | |
165 | |
166 root.SetVisible(true); | |
167 child1.SetVisible(false); | |
168 child2.SetVisible(false); | |
169 child3.SetVisible(true); | |
170 | |
171 TestServerWindowDrawnTrackerObserver drawn_observer; | |
172 ServerWindowDrawnTracker tracker(&child3, &drawn_observer); | |
173 | |
174 EXPECT_FALSE(child3.IsDrawn()); | |
175 | |
176 // Make |child1| visible. |child3| should still be not drawn, since |child2| | |
177 // is still invisible. | |
178 child1.SetVisible(true); | |
179 EXPECT_EQ(0u, drawn_observer.change_count()); | |
180 EXPECT_EQ(nullptr, drawn_observer.window()); | |
181 EXPECT_EQ(nullptr, drawn_observer.ancestor()); | |
182 EXPECT_FALSE(drawn_observer.is_drawn()); | |
183 EXPECT_FALSE(child3.IsDrawn()); | |
184 | |
185 child2.SetVisible(true); | |
186 EXPECT_EQ(1u, drawn_observer.change_count()); | |
187 EXPECT_EQ(&child3, drawn_observer.window()); | |
188 EXPECT_EQ(nullptr, drawn_observer.ancestor()); | |
189 EXPECT_TRUE(drawn_observer.is_drawn()); | |
190 EXPECT_TRUE(child3.IsDrawn()); | |
191 } | |
192 | |
193 TEST(ServerWindowDrawnTrackerTest, TreeHierarchyChangeFromNonParentAncestor) { | |
194 TestServerWindowDelegate server_window_delegate; | |
195 ServerWindow root(&server_window_delegate, WindowId()); | |
196 ServerWindow child1(&server_window_delegate, WindowId()); | |
197 ServerWindow child2(&server_window_delegate, WindowId()); | |
198 ServerWindow child11(&server_window_delegate, WindowId()); | |
199 ServerWindow child111(&server_window_delegate, WindowId()); | |
200 server_window_delegate.set_root_window(&root); | |
201 | |
202 root.Add(&child1); | |
203 root.Add(&child2); | |
204 child1.Add(&child11); | |
205 child11.Add(&child111); | |
206 | |
207 root.SetVisible(true); | |
208 child1.SetVisible(false); | |
209 child2.SetVisible(true); | |
210 child11.SetVisible(false); | |
211 child111.SetVisible(true); | |
212 | |
213 TestServerWindowDrawnTrackerObserver drawn_observer; | |
214 ServerWindowDrawnTracker tracker(&child111, &drawn_observer); | |
215 EXPECT_FALSE(child111.IsDrawn()); | |
216 | |
217 // Move |child11| as a child of |child2|. |child111| should remain not drawn. | |
218 child2.Add(&child11); | |
219 EXPECT_EQ(0u, drawn_observer.change_count()); | |
220 EXPECT_EQ(nullptr, drawn_observer.window()); | |
221 EXPECT_EQ(nullptr, drawn_observer.ancestor()); | |
222 EXPECT_FALSE(drawn_observer.is_drawn()); | |
223 EXPECT_FALSE(child111.IsDrawn()); | |
224 | |
225 child11.SetVisible(true); | |
226 EXPECT_EQ(1u, drawn_observer.change_count()); | |
227 EXPECT_EQ(&child111, drawn_observer.window()); | |
228 EXPECT_EQ(nullptr, drawn_observer.ancestor()); | |
229 EXPECT_TRUE(drawn_observer.is_drawn()); | |
230 EXPECT_TRUE(child111.IsDrawn()); | |
231 } | |
232 | |
233 } // namespace ws | |
234 | |
235 } // namespace mus | |
OLD | NEW |