| 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 |