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/view_manager.h" | 5 #include "mojo/services/public/cpp/view_manager/view_manager.h" |
6 | 6 |
7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "mojo/public/cpp/application/application.h" | 10 #include "mojo/public/cpp/application/application.h" |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 } | 243 } |
244 if (views) { | 244 if (views) { |
245 for (std::set<Id>::const_iterator it = views->begin(); | 245 for (std::set<Id>::const_iterator it = views->begin(); |
246 it != views->end(); ++it) { | 246 it != views->end(); ++it) { |
247 view_manager->GetViewById(*it)->AddObserver(&observer); | 247 view_manager->GetViewById(*it)->AddObserver(&observer); |
248 } | 248 } |
249 } | 249 } |
250 DoRunLoop(); | 250 DoRunLoop(); |
251 } | 251 } |
252 | 252 |
| 253 class OrderChangeObserver : public ViewTreeNodeObserver { |
| 254 public: |
| 255 OrderChangeObserver(ViewTreeNode* node) : node_(node) { |
| 256 node_->AddObserver(this); |
| 257 } |
| 258 virtual ~OrderChangeObserver() { |
| 259 node_->RemoveObserver(this); |
| 260 } |
| 261 |
| 262 private: |
| 263 // Overridden from ViewTreeNodeObserver: |
| 264 virtual void OnNodeReordered(ViewTreeNode* node, |
| 265 ViewTreeNode* relative_node, |
| 266 OrderDirection direction, |
| 267 DispositionChangePhase phase) OVERRIDE { |
| 268 if (phase != ViewTreeNodeObserver::DISPOSITION_CHANGED) |
| 269 return; |
| 270 |
| 271 DCHECK_EQ(node, node_); |
| 272 QuitRunLoop(); |
| 273 } |
| 274 |
| 275 ViewTreeNode* node_; |
| 276 |
| 277 DISALLOW_COPY_AND_ASSIGN(OrderChangeObserver); |
| 278 }; |
| 279 |
| 280 void WaitForOrderChange(ViewManager* view_manager, |
| 281 ViewTreeNode* node) { |
| 282 OrderChangeObserver observer(node); |
| 283 DoRunLoop(); |
| 284 } |
| 285 |
253 // Tracks a node's destruction. Query is_valid() for current state. | 286 // Tracks a node's destruction. Query is_valid() for current state. |
254 class NodeTracker : public ViewTreeNodeObserver { | 287 class NodeTracker : public ViewTreeNodeObserver { |
255 public: | 288 public: |
256 explicit NodeTracker(ViewTreeNode* node) : node_(node) { | 289 explicit NodeTracker(ViewTreeNode* node) : node_(node) { |
257 node_->AddObserver(this); | 290 node_->AddObserver(this); |
258 } | 291 } |
259 virtual ~NodeTracker() { | 292 virtual ~NodeTracker() { |
260 if (node_) | 293 if (node_) |
261 node_->RemoveObserver(this); | 294 node_->RemoveObserver(this); |
262 } | 295 } |
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
702 EXPECT_EQ(embedded1, embedded2); | 735 EXPECT_EQ(embedded1, embedded2); |
703 } | 736 } |
704 | 737 |
705 TEST_F(ViewManagerTest, EmbeddingIdentity) { | 738 TEST_F(ViewManagerTest, EmbeddingIdentity) { |
706 ViewTreeNode* node = ViewTreeNode::Create(window_manager()); | 739 ViewTreeNode* node = ViewTreeNode::Create(window_manager()); |
707 window_manager()->GetRoots().front()->AddChild(node); | 740 window_manager()->GetRoots().front()->AddChild(node); |
708 ViewManager* embedded = Embed(window_manager(), node); | 741 ViewManager* embedded = Embed(window_manager(), node); |
709 EXPECT_EQ(kWindowManagerURL, embedded->GetEmbedderURL()); | 742 EXPECT_EQ(kWindowManagerURL, embedded->GetEmbedderURL()); |
710 } | 743 } |
711 | 744 |
| 745 TEST_F(ViewManagerTest, Reorder) { |
| 746 ViewTreeNode* node1 = ViewTreeNode::Create(window_manager()); |
| 747 window_manager()->GetRoots().front()->AddChild(node1); |
| 748 |
| 749 ViewTreeNode* node11 = ViewTreeNode::Create(window_manager()); |
| 750 node1->AddChild(node11); |
| 751 ViewTreeNode* node12 = ViewTreeNode::Create(window_manager()); |
| 752 node1->AddChild(node12); |
| 753 |
| 754 ViewManager* embedded = Embed(window_manager(), node1); |
| 755 |
| 756 ViewTreeNode* node1_in_embedded = embedded->GetNodeById(node1->id()); |
| 757 |
| 758 { |
| 759 node11->MoveToFront(); |
| 760 WaitForOrderChange(embedded, embedded->GetNodeById(node11->id())); |
| 761 |
| 762 EXPECT_EQ(node1_in_embedded->children().front(), |
| 763 embedded->GetNodeById(node12->id())); |
| 764 EXPECT_EQ(node1_in_embedded->children().back(), |
| 765 embedded->GetNodeById(node11->id())); |
| 766 } |
| 767 |
| 768 { |
| 769 node11->MoveToBack(); |
| 770 WaitForOrderChange(embedded, embedded->GetNodeById(node11->id())); |
| 771 |
| 772 EXPECT_EQ(node1_in_embedded->children().front(), |
| 773 embedded->GetNodeById(node11->id())); |
| 774 EXPECT_EQ(node1_in_embedded->children().back(), |
| 775 embedded->GetNodeById(node12->id())); |
| 776 } |
| 777 } |
| 778 |
712 } // namespace view_manager | 779 } // namespace view_manager |
713 } // namespace mojo | 780 } // namespace mojo |
OLD | NEW |