OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "mojo/services/public/cpp/view_manager/node.h" | 5 #include "mojo/services/public/cpp/view_manager/node.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
9 #include "mojo/services/public/cpp/view_manager/lib/node_private.h" | 9 #include "mojo/services/public/cpp/view_manager/lib/node_private.h" |
10 #include "mojo/services/public/cpp/view_manager/node_observer.h" | 10 #include "mojo/services/public/cpp/view_manager/node_observer.h" |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 EXPECT_EQ(&v111, v1.GetChildById(v111.id())); | 86 EXPECT_EQ(&v111, v1.GetChildById(v111.id())); |
87 } | 87 } |
88 | 88 |
89 // NodeObserver -------------------------------------------------------- | 89 // NodeObserver -------------------------------------------------------- |
90 | 90 |
91 typedef testing::Test NodeObserverTest; | 91 typedef testing::Test NodeObserverTest; |
92 | 92 |
93 bool TreeChangeParamsMatch(const NodeObserver::TreeChangeParams& lhs, | 93 bool TreeChangeParamsMatch(const NodeObserver::TreeChangeParams& lhs, |
94 const NodeObserver::TreeChangeParams& rhs) { | 94 const NodeObserver::TreeChangeParams& rhs) { |
95 return lhs.target == rhs.target && lhs.old_parent == rhs.old_parent && | 95 return lhs.target == rhs.target && lhs.old_parent == rhs.old_parent && |
96 lhs.new_parent == rhs.new_parent && lhs.receiver == rhs.receiver && | 96 lhs.new_parent == rhs.new_parent && lhs.receiver == rhs.receiver; |
97 lhs.phase == rhs.phase; | |
98 } | 97 } |
99 | 98 |
100 class TreeChangeObserver : public NodeObserver { | 99 class TreeChangeObserver : public NodeObserver { |
101 public: | 100 public: |
102 explicit TreeChangeObserver(Node* observee) : observee_(observee) { | 101 explicit TreeChangeObserver(Node* observee) : observee_(observee) { |
103 observee_->AddObserver(this); | 102 observee_->AddObserver(this); |
104 } | 103 } |
105 virtual ~TreeChangeObserver() { | 104 virtual ~TreeChangeObserver() { |
106 observee_->RemoveObserver(this); | 105 observee_->RemoveObserver(this); |
107 } | 106 } |
108 | 107 |
109 void Reset() { | 108 void Reset() { |
110 received_params_.clear(); | 109 received_params_.clear(); |
111 } | 110 } |
112 | 111 |
113 const std::vector<TreeChangeParams>& received_params() { | 112 const std::vector<TreeChangeParams>& received_params() { |
114 return received_params_; | 113 return received_params_; |
115 } | 114 } |
116 | 115 |
117 private: | 116 private: |
118 // Overridden from NodeObserver: | 117 // Overridden from NodeObserver: |
119 virtual void OnTreeChange(const TreeChangeParams& params) OVERRIDE { | 118 virtual void OnTreeChanging(const TreeChangeParams& params) OVERRIDE { |
| 119 received_params_.push_back(params); |
| 120 } |
| 121 virtual void OnTreeChanged(const TreeChangeParams& params) OVERRIDE { |
120 received_params_.push_back(params); | 122 received_params_.push_back(params); |
121 } | 123 } |
122 | 124 |
123 Node* observee_; | 125 Node* observee_; |
124 std::vector<TreeChangeParams> received_params_; | 126 std::vector<TreeChangeParams> received_params_; |
125 | 127 |
126 DISALLOW_COPY_AND_ASSIGN(TreeChangeObserver); | 128 DISALLOW_COPY_AND_ASSIGN(TreeChangeObserver); |
127 }; | 129 }; |
128 | 130 |
129 // Adds/Removes v11 to v1. | 131 // Adds/Removes v11 to v1. |
130 TEST_F(NodeObserverTest, TreeChange_SimpleAddRemove) { | 132 TEST_F(NodeObserverTest, TreeChange_SimpleAddRemove) { |
131 TestNode v1; | 133 TestNode v1; |
132 TreeChangeObserver o1(&v1); | 134 TreeChangeObserver o1(&v1); |
133 EXPECT_TRUE(o1.received_params().empty()); | 135 EXPECT_TRUE(o1.received_params().empty()); |
134 | 136 |
135 TestNode v11; | 137 TestNode v11; |
136 TreeChangeObserver o11(&v11); | 138 TreeChangeObserver o11(&v11); |
137 EXPECT_TRUE(o11.received_params().empty()); | 139 EXPECT_TRUE(o11.received_params().empty()); |
138 | 140 |
139 // Add. | 141 // Add. |
140 | 142 |
141 v1.AddChild(&v11); | 143 v1.AddChild(&v11); |
142 | 144 |
143 EXPECT_EQ(2U, o1.received_params().size()); | 145 EXPECT_EQ(2U, o1.received_params().size()); |
144 NodeObserver::TreeChangeParams p1; | 146 NodeObserver::TreeChangeParams p1; |
145 p1.target = &v11; | 147 p1.target = &v11; |
146 p1.receiver = &v1; | 148 p1.receiver = &v1; |
147 p1.old_parent = NULL; | 149 p1.old_parent = NULL; |
148 p1.new_parent = &v1; | 150 p1.new_parent = &v1; |
149 p1.phase = NodeObserver::DISPOSITION_CHANGED; | |
150 EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().back())); | 151 EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().back())); |
151 | 152 |
152 EXPECT_EQ(2U, o11.received_params().size()); | 153 EXPECT_EQ(2U, o11.received_params().size()); |
153 NodeObserver::TreeChangeParams p11 = p1; | 154 NodeObserver::TreeChangeParams p11 = p1; |
154 p11.receiver = &v11; | 155 p11.receiver = &v11; |
155 p11.phase = NodeObserver::DISPOSITION_CHANGING; | |
156 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().front())); | 156 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().front())); |
157 p11.phase = NodeObserver::DISPOSITION_CHANGED; | |
158 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().back())); | 157 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().back())); |
159 | 158 |
160 o1.Reset(); | 159 o1.Reset(); |
161 o11.Reset(); | 160 o11.Reset(); |
162 EXPECT_TRUE(o1.received_params().empty()); | 161 EXPECT_TRUE(o1.received_params().empty()); |
163 EXPECT_TRUE(o11.received_params().empty()); | 162 EXPECT_TRUE(o11.received_params().empty()); |
164 | 163 |
165 // Remove. | 164 // Remove. |
166 | 165 |
167 v1.RemoveChild(&v11); | 166 v1.RemoveChild(&v11); |
168 | 167 |
169 EXPECT_EQ(2U, o1.received_params().size()); | 168 EXPECT_EQ(2U, o1.received_params().size()); |
170 p1.target = &v11; | 169 p1.target = &v11; |
171 p1.receiver = &v1; | 170 p1.receiver = &v1; |
172 p1.old_parent = &v1; | 171 p1.old_parent = &v1; |
173 p1.new_parent = NULL; | 172 p1.new_parent = NULL; |
174 p1.phase = NodeObserver::DISPOSITION_CHANGING; | |
175 EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().front())); | 173 EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().front())); |
176 | 174 |
177 EXPECT_EQ(2U, o11.received_params().size()); | 175 EXPECT_EQ(2U, o11.received_params().size()); |
178 p11 = p1; | 176 p11 = p1; |
179 p11.receiver = &v11; | 177 p11.receiver = &v11; |
180 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().front())); | 178 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().front())); |
181 p11.phase = NodeObserver::DISPOSITION_CHANGED; | |
182 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().back())); | 179 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().back())); |
183 } | 180 } |
184 | 181 |
185 // Creates these two trees: | 182 // Creates these two trees: |
186 // v1 | 183 // v1 |
187 // +- v11 | 184 // +- v11 |
188 // v111 | 185 // v111 |
189 // +- v1111 | 186 // +- v1111 |
190 // +- v1112 | 187 // +- v1112 |
191 // Then adds/removes v111 from v11. | 188 // Then adds/removes v111 from v11. |
(...skipping 13 matching lines...) Expand all Loading... |
205 | 202 |
206 // Add. | 203 // Add. |
207 | 204 |
208 v11.AddChild(&v111); | 205 v11.AddChild(&v111); |
209 | 206 |
210 EXPECT_EQ(2U, o1.received_params().size()); | 207 EXPECT_EQ(2U, o1.received_params().size()); |
211 p1.target = &v111; | 208 p1.target = &v111; |
212 p1.receiver = &v1; | 209 p1.receiver = &v1; |
213 p1.old_parent = NULL; | 210 p1.old_parent = NULL; |
214 p1.new_parent = &v11; | 211 p1.new_parent = &v11; |
215 p1.phase = NodeObserver::DISPOSITION_CHANGED; | |
216 EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().back())); | 212 EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().back())); |
217 | 213 |
218 EXPECT_EQ(2U, o11.received_params().size()); | 214 EXPECT_EQ(2U, o11.received_params().size()); |
219 p11 = p1; | 215 p11 = p1; |
220 p11.receiver = &v11; | 216 p11.receiver = &v11; |
221 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().back())); | 217 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().back())); |
222 | 218 |
223 EXPECT_EQ(2U, o111.received_params().size()); | 219 EXPECT_EQ(2U, o111.received_params().size()); |
224 p111 = p11; | 220 p111 = p11; |
225 p111.receiver = &v111; | 221 p111.receiver = &v111; |
226 p111.phase = NodeObserver::DISPOSITION_CHANGING; | |
227 EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().front())); | 222 EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().front())); |
228 p111.phase = NodeObserver::DISPOSITION_CHANGED; | |
229 EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().back())); | 223 EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().back())); |
230 | 224 |
231 EXPECT_EQ(2U, o1111.received_params().size()); | 225 EXPECT_EQ(2U, o1111.received_params().size()); |
232 p1111 = p111; | 226 p1111 = p111; |
233 p1111.receiver = &v1111; | 227 p1111.receiver = &v1111; |
234 p1111.phase = NodeObserver::DISPOSITION_CHANGING; | |
235 EXPECT_TRUE(TreeChangeParamsMatch(p1111, o1111.received_params().front())); | 228 EXPECT_TRUE(TreeChangeParamsMatch(p1111, o1111.received_params().front())); |
236 p1111.phase = NodeObserver::DISPOSITION_CHANGED; | |
237 EXPECT_TRUE(TreeChangeParamsMatch(p1111, o1111.received_params().back())); | 229 EXPECT_TRUE(TreeChangeParamsMatch(p1111, o1111.received_params().back())); |
238 | 230 |
239 EXPECT_EQ(2U, o1112.received_params().size()); | 231 EXPECT_EQ(2U, o1112.received_params().size()); |
240 p1112 = p111; | 232 p1112 = p111; |
241 p1112.receiver = &v1112; | 233 p1112.receiver = &v1112; |
242 p1112.phase = NodeObserver::DISPOSITION_CHANGING; | |
243 EXPECT_TRUE(TreeChangeParamsMatch(p1112, o1112.received_params().front())); | 234 EXPECT_TRUE(TreeChangeParamsMatch(p1112, o1112.received_params().front())); |
244 p1112.phase = NodeObserver::DISPOSITION_CHANGED; | |
245 EXPECT_TRUE(TreeChangeParamsMatch(p1112, o1112.received_params().back())); | 235 EXPECT_TRUE(TreeChangeParamsMatch(p1112, o1112.received_params().back())); |
246 | 236 |
247 // Remove. | 237 // Remove. |
248 o1.Reset(); | 238 o1.Reset(); |
249 o11.Reset(); | 239 o11.Reset(); |
250 o111.Reset(); | 240 o111.Reset(); |
251 o1111.Reset(); | 241 o1111.Reset(); |
252 o1112.Reset(); | 242 o1112.Reset(); |
253 EXPECT_TRUE(o1.received_params().empty()); | 243 EXPECT_TRUE(o1.received_params().empty()); |
254 EXPECT_TRUE(o11.received_params().empty()); | 244 EXPECT_TRUE(o11.received_params().empty()); |
255 EXPECT_TRUE(o111.received_params().empty()); | 245 EXPECT_TRUE(o111.received_params().empty()); |
256 EXPECT_TRUE(o1111.received_params().empty()); | 246 EXPECT_TRUE(o1111.received_params().empty()); |
257 EXPECT_TRUE(o1112.received_params().empty()); | 247 EXPECT_TRUE(o1112.received_params().empty()); |
258 | 248 |
259 v11.RemoveChild(&v111); | 249 v11.RemoveChild(&v111); |
260 | 250 |
261 EXPECT_EQ(2U, o1.received_params().size()); | 251 EXPECT_EQ(2U, o1.received_params().size()); |
262 p1.target = &v111; | 252 p1.target = &v111; |
263 p1.receiver = &v1; | 253 p1.receiver = &v1; |
264 p1.old_parent = &v11; | 254 p1.old_parent = &v11; |
265 p1.new_parent = NULL; | 255 p1.new_parent = NULL; |
266 p1.phase = NodeObserver::DISPOSITION_CHANGING; | |
267 EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().front())); | 256 EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().front())); |
268 | 257 |
269 EXPECT_EQ(2U, o11.received_params().size()); | 258 EXPECT_EQ(2U, o11.received_params().size()); |
270 p11 = p1; | 259 p11 = p1; |
271 p11.receiver = &v11; | 260 p11.receiver = &v11; |
272 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().front())); | 261 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().front())); |
273 | 262 |
274 EXPECT_EQ(2U, o111.received_params().size()); | 263 EXPECT_EQ(2U, o111.received_params().size()); |
275 p111 = p11; | 264 p111 = p11; |
276 p111.receiver = &v111; | 265 p111.receiver = &v111; |
277 p111.phase = NodeObserver::DISPOSITION_CHANGING; | |
278 EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().front())); | 266 EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().front())); |
279 p111.phase = NodeObserver::DISPOSITION_CHANGED; | |
280 EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().back())); | 267 EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().back())); |
281 | 268 |
282 EXPECT_EQ(2U, o1111.received_params().size()); | 269 EXPECT_EQ(2U, o1111.received_params().size()); |
283 p1111 = p111; | 270 p1111 = p111; |
284 p1111.receiver = &v1111; | 271 p1111.receiver = &v1111; |
285 p1111.phase = NodeObserver::DISPOSITION_CHANGING; | |
286 EXPECT_TRUE(TreeChangeParamsMatch(p1111, o1111.received_params().front())); | 272 EXPECT_TRUE(TreeChangeParamsMatch(p1111, o1111.received_params().front())); |
287 p1111.phase = NodeObserver::DISPOSITION_CHANGED; | |
288 EXPECT_TRUE(TreeChangeParamsMatch(p1111, o1111.received_params().back())); | 273 EXPECT_TRUE(TreeChangeParamsMatch(p1111, o1111.received_params().back())); |
289 | 274 |
290 EXPECT_EQ(2U, o1112.received_params().size()); | 275 EXPECT_EQ(2U, o1112.received_params().size()); |
291 p1112 = p111; | 276 p1112 = p111; |
292 p1112.receiver = &v1112; | 277 p1112.receiver = &v1112; |
293 p1112.phase = NodeObserver::DISPOSITION_CHANGING; | |
294 EXPECT_TRUE(TreeChangeParamsMatch(p1112, o1112.received_params().front())); | 278 EXPECT_TRUE(TreeChangeParamsMatch(p1112, o1112.received_params().front())); |
295 p1112.phase = NodeObserver::DISPOSITION_CHANGED; | |
296 EXPECT_TRUE(TreeChangeParamsMatch(p1112, o1112.received_params().back())); | 279 EXPECT_TRUE(TreeChangeParamsMatch(p1112, o1112.received_params().back())); |
297 } | 280 } |
298 | 281 |
299 TEST_F(NodeObserverTest, TreeChange_Reparent) { | 282 TEST_F(NodeObserverTest, TreeChange_Reparent) { |
300 TestNode v1, v11, v12, v111; | 283 TestNode v1, v11, v12, v111; |
301 v1.AddChild(&v11); | 284 v1.AddChild(&v11); |
302 v1.AddChild(&v12); | 285 v1.AddChild(&v12); |
303 v11.AddChild(&v111); | 286 v11.AddChild(&v111); |
304 | 287 |
305 TreeChangeObserver o1(&v1), o11(&v11), o12(&v12), o111(&v111); | 288 TreeChangeObserver o1(&v1), o11(&v11), o12(&v12), o111(&v111); |
306 | 289 |
307 // Reparent. | 290 // Reparent. |
308 v12.AddChild(&v111); | 291 v12.AddChild(&v111); |
309 | 292 |
310 // v1 (root) should see both changing and changed notifications. | 293 // v1 (root) should see both changing and changed notifications. |
311 EXPECT_EQ(4U, o1.received_params().size()); | 294 EXPECT_EQ(4U, o1.received_params().size()); |
312 NodeObserver::TreeChangeParams p1; | 295 NodeObserver::TreeChangeParams p1; |
313 p1.target = &v111; | 296 p1.target = &v111; |
314 p1.receiver = &v1; | 297 p1.receiver = &v1; |
315 p1.old_parent = &v11; | 298 p1.old_parent = &v11; |
316 p1.new_parent = &v12; | 299 p1.new_parent = &v12; |
317 p1.phase = NodeObserver::DISPOSITION_CHANGING; | |
318 EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().front())); | 300 EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().front())); |
319 p1.phase = NodeObserver::DISPOSITION_CHANGED; | |
320 EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().back())); | 301 EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().back())); |
321 | 302 |
322 // v11 should see changing notifications. | 303 // v11 should see changing notifications. |
323 EXPECT_EQ(2U, o11.received_params().size()); | 304 EXPECT_EQ(2U, o11.received_params().size()); |
324 NodeObserver::TreeChangeParams p11; | 305 NodeObserver::TreeChangeParams p11; |
325 p11 = p1; | 306 p11 = p1; |
326 p11.receiver = &v11; | 307 p11.receiver = &v11; |
327 p11.phase = NodeObserver::DISPOSITION_CHANGING; | |
328 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().front())); | 308 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().front())); |
329 | 309 |
330 // v12 should see changed notifications. | 310 // v12 should see changed notifications. |
331 EXPECT_EQ(2U, o12.received_params().size()); | 311 EXPECT_EQ(2U, o12.received_params().size()); |
332 NodeObserver::TreeChangeParams p12; | 312 NodeObserver::TreeChangeParams p12; |
333 p12 = p1; | 313 p12 = p1; |
334 p12.receiver = &v12; | 314 p12.receiver = &v12; |
335 p12.phase = NodeObserver::DISPOSITION_CHANGED; | |
336 EXPECT_TRUE(TreeChangeParamsMatch(p12, o12.received_params().back())); | 315 EXPECT_TRUE(TreeChangeParamsMatch(p12, o12.received_params().back())); |
337 | 316 |
338 // v111 should see both changing and changed notifications. | 317 // v111 should see both changing and changed notifications. |
339 EXPECT_EQ(2U, o111.received_params().size()); | 318 EXPECT_EQ(2U, o111.received_params().size()); |
340 NodeObserver::TreeChangeParams p111; | 319 NodeObserver::TreeChangeParams p111; |
341 p111 = p1; | 320 p111 = p1; |
342 p111.receiver = &v111; | 321 p111.receiver = &v111; |
343 p111.phase = NodeObserver::DISPOSITION_CHANGING; | |
344 EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().front())); | 322 EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().front())); |
345 p111.phase = NodeObserver::DISPOSITION_CHANGED; | |
346 EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().back())); | 323 EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().back())); |
347 } | 324 } |
348 | 325 |
349 namespace { | 326 namespace { |
350 | 327 |
351 class OrderChangeObserver : public NodeObserver { | 328 class OrderChangeObserver : public NodeObserver { |
352 public: | 329 public: |
353 struct Change { | 330 struct Change { |
354 Node* node; | 331 Node* node; |
355 Node* relative_node; | 332 Node* relative_node; |
356 OrderDirection direction; | 333 OrderDirection direction; |
357 DispositionChangePhase phase; | |
358 }; | 334 }; |
359 typedef std::vector<Change> Changes; | 335 typedef std::vector<Change> Changes; |
360 | 336 |
361 explicit OrderChangeObserver(Node* observee) : observee_(observee) { | 337 explicit OrderChangeObserver(Node* observee) : observee_(observee) { |
362 observee_->AddObserver(this); | 338 observee_->AddObserver(this); |
363 } | 339 } |
364 virtual ~OrderChangeObserver() { | 340 virtual ~OrderChangeObserver() { |
365 observee_->RemoveObserver(this); | 341 observee_->RemoveObserver(this); |
366 } | 342 } |
367 | 343 |
368 Changes GetAndClearChanges() { | 344 Changes GetAndClearChanges() { |
369 Changes changes; | 345 Changes changes; |
370 changes_.swap(changes); | 346 changes_.swap(changes); |
371 return changes; | 347 return changes; |
372 } | 348 } |
373 | 349 |
374 private: | 350 private: |
375 // Overridden from NodeObserver: | 351 // Overridden from NodeObserver: |
376 virtual void OnNodeReordered(Node* node, | 352 virtual void OnNodeReordered(Node* node, |
377 Node* relative_node, | 353 Node* relative_node, |
378 OrderDirection direction, | 354 OrderDirection direction) OVERRIDE { |
379 DispositionChangePhase phase) OVERRIDE { | |
380 Change change; | 355 Change change; |
381 change.node = node; | 356 change.node = node; |
382 change.relative_node = relative_node; | 357 change.relative_node = relative_node; |
383 change.direction = direction; | 358 change.direction = direction; |
384 change.phase = phase; | |
385 changes_.push_back(change); | 359 changes_.push_back(change); |
386 } | 360 } |
387 | 361 |
388 Node* observee_; | 362 Node* observee_; |
389 Changes changes_; | 363 Changes changes_; |
390 | 364 |
391 DISALLOW_COPY_AND_ASSIGN(OrderChangeObserver); | 365 DISALLOW_COPY_AND_ASSIGN(OrderChangeObserver); |
392 }; | 366 }; |
393 | 367 |
394 } // namespace | 368 } // namespace |
(...skipping 16 matching lines...) Expand all Loading... |
411 // Resulting order: v12, v13, v11 | 385 // Resulting order: v12, v13, v11 |
412 v11.MoveToFront(); | 386 v11.MoveToFront(); |
413 EXPECT_EQ(&v12, v1.children().front()); | 387 EXPECT_EQ(&v12, v1.children().front()); |
414 EXPECT_EQ(&v11, v1.children().back()); | 388 EXPECT_EQ(&v11, v1.children().back()); |
415 | 389 |
416 OrderChangeObserver::Changes changes = observer.GetAndClearChanges(); | 390 OrderChangeObserver::Changes changes = observer.GetAndClearChanges(); |
417 EXPECT_EQ(2U, changes.size()); | 391 EXPECT_EQ(2U, changes.size()); |
418 EXPECT_EQ(&v11, changes[0].node); | 392 EXPECT_EQ(&v11, changes[0].node); |
419 EXPECT_EQ(&v13, changes[0].relative_node); | 393 EXPECT_EQ(&v13, changes[0].relative_node); |
420 EXPECT_EQ(ORDER_ABOVE, changes[0].direction); | 394 EXPECT_EQ(ORDER_ABOVE, changes[0].direction); |
421 EXPECT_EQ(NodeObserver::DISPOSITION_CHANGING, changes[0].phase); | |
422 | 395 |
423 EXPECT_EQ(&v11, changes[1].node); | 396 EXPECT_EQ(&v11, changes[1].node); |
424 EXPECT_EQ(&v13, changes[1].relative_node); | 397 EXPECT_EQ(&v13, changes[1].relative_node); |
425 EXPECT_EQ(ORDER_ABOVE, changes[1].direction); | 398 EXPECT_EQ(ORDER_ABOVE, changes[1].direction); |
426 EXPECT_EQ(NodeObserver::DISPOSITION_CHANGED, changes[1].phase); | |
427 } | 399 } |
428 | 400 |
429 { | 401 { |
430 OrderChangeObserver observer(&v11); | 402 OrderChangeObserver observer(&v11); |
431 | 403 |
432 // Move v11 to back. | 404 // Move v11 to back. |
433 // Resulting order: v11, v12, v13 | 405 // Resulting order: v11, v12, v13 |
434 v11.MoveToBack(); | 406 v11.MoveToBack(); |
435 EXPECT_EQ(&v11, v1.children().front()); | 407 EXPECT_EQ(&v11, v1.children().front()); |
436 EXPECT_EQ(&v13, v1.children().back()); | 408 EXPECT_EQ(&v13, v1.children().back()); |
437 | 409 |
438 OrderChangeObserver::Changes changes = observer.GetAndClearChanges(); | 410 OrderChangeObserver::Changes changes = observer.GetAndClearChanges(); |
439 EXPECT_EQ(2U, changes.size()); | 411 EXPECT_EQ(2U, changes.size()); |
440 EXPECT_EQ(&v11, changes[0].node); | 412 EXPECT_EQ(&v11, changes[0].node); |
441 EXPECT_EQ(&v12, changes[0].relative_node); | 413 EXPECT_EQ(&v12, changes[0].relative_node); |
442 EXPECT_EQ(ORDER_BELOW, changes[0].direction); | 414 EXPECT_EQ(ORDER_BELOW, changes[0].direction); |
443 EXPECT_EQ(NodeObserver::DISPOSITION_CHANGING, changes[0].phase); | |
444 | 415 |
445 EXPECT_EQ(&v11, changes[1].node); | 416 EXPECT_EQ(&v11, changes[1].node); |
446 EXPECT_EQ(&v12, changes[1].relative_node); | 417 EXPECT_EQ(&v12, changes[1].relative_node); |
447 EXPECT_EQ(ORDER_BELOW, changes[1].direction); | 418 EXPECT_EQ(ORDER_BELOW, changes[1].direction); |
448 EXPECT_EQ(NodeObserver::DISPOSITION_CHANGED, changes[1].phase); | |
449 } | 419 } |
450 | 420 |
451 { | 421 { |
452 OrderChangeObserver observer(&v11); | 422 OrderChangeObserver observer(&v11); |
453 | 423 |
454 // Move v11 above v12. | 424 // Move v11 above v12. |
455 // Resulting order: v12. v11, v13 | 425 // Resulting order: v12. v11, v13 |
456 v11.Reorder(&v12, ORDER_ABOVE); | 426 v11.Reorder(&v12, ORDER_ABOVE); |
457 EXPECT_EQ(&v12, v1.children().front()); | 427 EXPECT_EQ(&v12, v1.children().front()); |
458 EXPECT_EQ(&v13, v1.children().back()); | 428 EXPECT_EQ(&v13, v1.children().back()); |
459 | 429 |
460 OrderChangeObserver::Changes changes = observer.GetAndClearChanges(); | 430 OrderChangeObserver::Changes changes = observer.GetAndClearChanges(); |
461 EXPECT_EQ(2U, changes.size()); | 431 EXPECT_EQ(2U, changes.size()); |
462 EXPECT_EQ(&v11, changes[0].node); | 432 EXPECT_EQ(&v11, changes[0].node); |
463 EXPECT_EQ(&v12, changes[0].relative_node); | 433 EXPECT_EQ(&v12, changes[0].relative_node); |
464 EXPECT_EQ(ORDER_ABOVE, changes[0].direction); | 434 EXPECT_EQ(ORDER_ABOVE, changes[0].direction); |
465 EXPECT_EQ(NodeObserver::DISPOSITION_CHANGING, changes[0].phase); | |
466 | 435 |
467 EXPECT_EQ(&v11, changes[1].node); | 436 EXPECT_EQ(&v11, changes[1].node); |
468 EXPECT_EQ(&v12, changes[1].relative_node); | 437 EXPECT_EQ(&v12, changes[1].relative_node); |
469 EXPECT_EQ(ORDER_ABOVE, changes[1].direction); | 438 EXPECT_EQ(ORDER_ABOVE, changes[1].direction); |
470 EXPECT_EQ(NodeObserver::DISPOSITION_CHANGED, changes[1].phase); | |
471 } | 439 } |
472 | 440 |
473 { | 441 { |
474 OrderChangeObserver observer(&v11); | 442 OrderChangeObserver observer(&v11); |
475 | 443 |
476 // Move v11 below v12. | 444 // Move v11 below v12. |
477 // Resulting order: v11, v12, v13 | 445 // Resulting order: v11, v12, v13 |
478 v11.Reorder(&v12, ORDER_BELOW); | 446 v11.Reorder(&v12, ORDER_BELOW); |
479 EXPECT_EQ(&v11, v1.children().front()); | 447 EXPECT_EQ(&v11, v1.children().front()); |
480 EXPECT_EQ(&v13, v1.children().back()); | 448 EXPECT_EQ(&v13, v1.children().back()); |
481 | 449 |
482 OrderChangeObserver::Changes changes = observer.GetAndClearChanges(); | 450 OrderChangeObserver::Changes changes = observer.GetAndClearChanges(); |
483 EXPECT_EQ(2U, changes.size()); | 451 EXPECT_EQ(2U, changes.size()); |
484 EXPECT_EQ(&v11, changes[0].node); | 452 EXPECT_EQ(&v11, changes[0].node); |
485 EXPECT_EQ(&v12, changes[0].relative_node); | 453 EXPECT_EQ(&v12, changes[0].relative_node); |
486 EXPECT_EQ(ORDER_BELOW, changes[0].direction); | 454 EXPECT_EQ(ORDER_BELOW, changes[0].direction); |
487 EXPECT_EQ(NodeObserver::DISPOSITION_CHANGING, changes[0].phase); | |
488 | 455 |
489 EXPECT_EQ(&v11, changes[1].node); | 456 EXPECT_EQ(&v11, changes[1].node); |
490 EXPECT_EQ(&v12, changes[1].relative_node); | 457 EXPECT_EQ(&v12, changes[1].relative_node); |
491 EXPECT_EQ(ORDER_BELOW, changes[1].direction); | 458 EXPECT_EQ(ORDER_BELOW, changes[1].direction); |
492 EXPECT_EQ(NodeObserver::DISPOSITION_CHANGED, changes[1].phase); | |
493 } | 459 } |
494 } | 460 } |
495 | 461 |
496 namespace { | 462 namespace { |
497 | 463 |
498 typedef std::vector<std::string> Changes; | 464 typedef std::vector<std::string> Changes; |
499 | 465 |
500 std::string NodeIdToString(Id id) { | 466 std::string NodeIdToString(Id id) { |
501 return (id == 0) ? "null" : | 467 return (id == 0) ? "null" : |
502 base::StringPrintf("%d,%d", HiWord(id), LoWord(id)); | 468 base::StringPrintf("%d,%d", HiWord(id), LoWord(id)); |
503 } | 469 } |
504 | 470 |
505 std::string RectToString(const gfx::Rect& rect) { | 471 std::string RectToString(const gfx::Rect& rect) { |
506 return base::StringPrintf("%d,%d %dx%d", | 472 return base::StringPrintf("%d,%d %dx%d", |
507 rect.x(), rect.y(), rect.width(), rect.height()); | 473 rect.x(), rect.y(), rect.width(), rect.height()); |
508 } | 474 } |
509 | 475 |
510 std::string PhaseToString(NodeObserver::DispositionChangePhase phase) { | |
511 return phase == NodeObserver::DISPOSITION_CHANGING ? | |
512 "changing" : "changed"; | |
513 } | |
514 | |
515 class BoundsChangeObserver : public NodeObserver { | 476 class BoundsChangeObserver : public NodeObserver { |
516 public: | 477 public: |
517 explicit BoundsChangeObserver(Node* node) : node_(node) { | 478 explicit BoundsChangeObserver(Node* node) : node_(node) { |
518 node_->AddObserver(this); | 479 node_->AddObserver(this); |
519 } | 480 } |
520 virtual ~BoundsChangeObserver() { | 481 virtual ~BoundsChangeObserver() { |
521 node_->RemoveObserver(this); | 482 node_->RemoveObserver(this); |
522 } | 483 } |
523 | 484 |
524 Changes GetAndClearChanges() { | 485 Changes GetAndClearChanges() { |
525 Changes changes; | 486 Changes changes; |
526 changes.swap(changes_); | 487 changes.swap(changes_); |
527 return changes; | 488 return changes; |
528 } | 489 } |
529 | 490 |
530 private: | 491 private: |
531 // Overridden from NodeObserver: | 492 // Overridden from NodeObserver: |
532 virtual void OnNodeBoundsChange(Node* node, | 493 virtual void OnNodeBoundsChanging(Node* node, |
533 const gfx::Rect& old_bounds, | 494 const gfx::Rect& old_bounds, |
534 const gfx::Rect& new_bounds, | 495 const gfx::Rect& new_bounds) OVERRIDE { |
535 DispositionChangePhase phase) OVERRIDE { | |
536 changes_.push_back( | 496 changes_.push_back( |
537 base::StringPrintf( | 497 base::StringPrintf( |
538 "node=%s old_bounds=%s new_bounds=%s phase=%s", | 498 "node=%s old_bounds=%s new_bounds=%s phase=changing", |
539 NodeIdToString(node->id()).c_str(), | 499 NodeIdToString(node->id()).c_str(), |
540 RectToString(old_bounds).c_str(), | 500 RectToString(old_bounds).c_str(), |
541 RectToString(new_bounds).c_str(), | 501 RectToString(new_bounds).c_str())); |
542 PhaseToString(phase).c_str())); | 502 } |
| 503 virtual void OnNodeBoundsChanged(Node* node, |
| 504 const gfx::Rect& old_bounds, |
| 505 const gfx::Rect& new_bounds) OVERRIDE { |
| 506 changes_.push_back( |
| 507 base::StringPrintf( |
| 508 "node=%s old_bounds=%s new_bounds=%s phase=changed", |
| 509 NodeIdToString(node->id()).c_str(), |
| 510 RectToString(old_bounds).c_str(), |
| 511 RectToString(new_bounds).c_str())); |
543 } | 512 } |
544 | 513 |
545 Node* node_; | 514 Node* node_; |
546 Changes changes_; | 515 Changes changes_; |
547 | 516 |
548 DISALLOW_COPY_AND_ASSIGN(BoundsChangeObserver); | 517 DISALLOW_COPY_AND_ASSIGN(BoundsChangeObserver); |
549 }; | 518 }; |
550 | 519 |
551 } // namespace | 520 } // namespace |
552 | 521 |
553 TEST_F(NodeObserverTest, SetBounds) { | 522 TEST_F(NodeObserverTest, SetBounds) { |
554 TestNode v1; | 523 TestNode v1; |
555 { | 524 { |
556 BoundsChangeObserver observer(&v1); | 525 BoundsChangeObserver observer(&v1); |
557 v1.SetBounds(gfx::Rect(0, 0, 100, 100)); | 526 v1.SetBounds(gfx::Rect(0, 0, 100, 100)); |
558 | 527 |
559 Changes changes = observer.GetAndClearChanges(); | 528 Changes changes = observer.GetAndClearChanges(); |
560 EXPECT_EQ(2U, changes.size()); | 529 EXPECT_EQ(2U, changes.size()); |
561 EXPECT_EQ( | 530 EXPECT_EQ( |
562 "node=0,1 old_bounds=0,0 0x0 new_bounds=0,0 100x100 phase=changing", | 531 "node=0,1 old_bounds=0,0 0x0 new_bounds=0,0 100x100 phase=changing", |
563 changes[0]); | 532 changes[0]); |
564 EXPECT_EQ( | 533 EXPECT_EQ( |
565 "node=0,1 old_bounds=0,0 0x0 new_bounds=0,0 100x100 phase=changed", | 534 "node=0,1 old_bounds=0,0 0x0 new_bounds=0,0 100x100 phase=changed", |
566 changes[1]); | 535 changes[1]); |
567 } | 536 } |
568 } | 537 } |
569 | 538 |
570 } // namespace view_manager | 539 } // namespace view_manager |
571 } // namespace mojo | 540 } // namespace mojo |
OLD | NEW |