| 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" |
| 11 #include "mojo/service_manager/service_manager.h" | 11 #include "mojo/service_manager/service_manager.h" |
| 12 #include "mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.h" | 12 #include "mojo/services/public/cpp/view_manager/lib/node_private.h" |
| 13 #include "mojo/services/public/cpp/view_manager/lib/view_tree_node_private.h" | 13 #include "mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.h" |
| 14 #include "mojo/services/public/cpp/view_manager/node_observer.h" |
| 14 #include "mojo/services/public/cpp/view_manager/util.h" | 15 #include "mojo/services/public/cpp/view_manager/util.h" |
| 15 #include "mojo/services/public/cpp/view_manager/view.h" | 16 #include "mojo/services/public/cpp/view_manager/view.h" |
| 16 #include "mojo/services/public/cpp/view_manager/view_manager_delegate.h" | 17 #include "mojo/services/public/cpp/view_manager/view_manager_delegate.h" |
| 17 #include "mojo/services/public/cpp/view_manager/view_observer.h" | 18 #include "mojo/services/public/cpp/view_manager/view_observer.h" |
| 18 #include "mojo/services/public/cpp/view_manager/view_tree_node_observer.h" | |
| 19 #include "mojo/shell/shell_test_helper.h" | 19 #include "mojo/shell/shell_test_helper.h" |
| 20 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
| 21 | 21 |
| 22 namespace mojo { | 22 namespace mojo { |
| 23 namespace view_manager { | 23 namespace view_manager { |
| 24 namespace { | 24 namespace { |
| 25 | 25 |
| 26 const char kWindowManagerURL[] = "mojo:window_manager"; | 26 const char kWindowManagerURL[] = "mojo:window_manager"; |
| 27 const char kEmbeddedApp1URL[] = "mojo:embedded_app_1"; | 27 const char kEmbeddedApp1URL[] = "mojo:embedded_app_1"; |
| 28 | 28 |
| 29 base::RunLoop* current_run_loop = NULL; | 29 base::RunLoop* current_run_loop = NULL; |
| 30 | 30 |
| 31 void DoRunLoop() { | 31 void DoRunLoop() { |
| 32 base::RunLoop run_loop; | 32 base::RunLoop run_loop; |
| 33 current_run_loop = &run_loop; | 33 current_run_loop = &run_loop; |
| 34 current_run_loop->Run(); | 34 current_run_loop->Run(); |
| 35 current_run_loop = NULL; | 35 current_run_loop = NULL; |
| 36 } | 36 } |
| 37 | 37 |
| 38 void QuitRunLoop() { | 38 void QuitRunLoop() { |
| 39 current_run_loop->Quit(); | 39 current_run_loop->Quit(); |
| 40 } | 40 } |
| 41 | 41 |
| 42 void WaitForAllChangesToBeAcked(ViewManagerSynchronizer* synchronizer) { | 42 void WaitForAllChangesToBeAcked(ViewManagerClientImpl* client) { |
| 43 synchronizer->set_changes_acked_callback(base::Bind(&QuitRunLoop)); | 43 client->set_changes_acked_callback(base::Bind(&QuitRunLoop)); |
| 44 DoRunLoop(); | 44 DoRunLoop(); |
| 45 synchronizer->ClearChangesAckedCallback(); | 45 client->ClearChangesAckedCallback(); |
| 46 } | 46 } |
| 47 | 47 |
| 48 class ConnectServiceLoader : public ServiceLoader, | 48 class ConnectServiceLoader : public ServiceLoader, |
| 49 public ViewManagerDelegate { | 49 public ViewManagerDelegate { |
| 50 public: | 50 public: |
| 51 typedef base::Callback<void(ViewManager*, ViewTreeNode*)> LoadedCallback; | 51 typedef base::Callback<void(ViewManager*, Node*)> LoadedCallback; |
| 52 | 52 |
| 53 explicit ConnectServiceLoader(const LoadedCallback& callback) | 53 explicit ConnectServiceLoader(const LoadedCallback& callback) |
| 54 : callback_(callback) { | 54 : callback_(callback) { |
| 55 } | 55 } |
| 56 virtual ~ConnectServiceLoader() {} | 56 virtual ~ConnectServiceLoader() {} |
| 57 | 57 |
| 58 private: | 58 private: |
| 59 // Overridden from ServiceLoader: | 59 // Overridden from ServiceLoader: |
| 60 virtual void LoadService(ServiceManager* manager, | 60 virtual void LoadService(ServiceManager* manager, |
| 61 const GURL& url, | 61 const GURL& url, |
| 62 ScopedMessagePipeHandle shell_handle) OVERRIDE { | 62 ScopedMessagePipeHandle shell_handle) OVERRIDE { |
| 63 scoped_ptr<Application> app(new Application(shell_handle.Pass())); | 63 scoped_ptr<Application> app(new Application(shell_handle.Pass())); |
| 64 ViewManager::Create(app.get(), this); | 64 ViewManager::Create(app.get(), this); |
| 65 apps_.push_back(app.release()); | 65 apps_.push_back(app.release()); |
| 66 } | 66 } |
| 67 virtual void OnServiceError(ServiceManager* manager, | 67 virtual void OnServiceError(ServiceManager* manager, |
| 68 const GURL& url) OVERRIDE { | 68 const GURL& url) OVERRIDE { |
| 69 } | 69 } |
| 70 | 70 |
| 71 // Overridden from ViewManagerDelegate: | 71 // Overridden from ViewManagerDelegate: |
| 72 virtual void OnRootAdded(ViewManager* view_manager, | 72 virtual void OnRootAdded(ViewManager* view_manager, |
| 73 ViewTreeNode* root) OVERRIDE { | 73 Node* root) OVERRIDE { |
| 74 callback_.Run(view_manager, root); | 74 callback_.Run(view_manager, root); |
| 75 } | 75 } |
| 76 | 76 |
| 77 ScopedVector<Application> apps_; | 77 ScopedVector<Application> apps_; |
| 78 LoadedCallback callback_; | 78 LoadedCallback callback_; |
| 79 | 79 |
| 80 DISALLOW_COPY_AND_ASSIGN(ConnectServiceLoader); | 80 DISALLOW_COPY_AND_ASSIGN(ConnectServiceLoader); |
| 81 }; | 81 }; |
| 82 | 82 |
| 83 class ActiveViewChangedObserver : public ViewTreeNodeObserver { | 83 class ActiveViewChangedObserver : public NodeObserver { |
| 84 public: | 84 public: |
| 85 explicit ActiveViewChangedObserver(ViewTreeNode* node) | 85 explicit ActiveViewChangedObserver(Node* node) |
| 86 : node_(node) {} | 86 : node_(node) {} |
| 87 virtual ~ActiveViewChangedObserver() {} | 87 virtual ~ActiveViewChangedObserver() {} |
| 88 | 88 |
| 89 private: | 89 private: |
| 90 // Overridden from ViewTreeNodeObserver: | 90 // Overridden from NodeObserver: |
| 91 virtual void OnNodeActiveViewChange(ViewTreeNode* node, | 91 virtual void OnNodeActiveViewChange(Node* node, |
| 92 View* old_view, | 92 View* old_view, |
| 93 View* new_view, | 93 View* new_view, |
| 94 DispositionChangePhase phase) OVERRIDE { | 94 DispositionChangePhase phase) OVERRIDE { |
| 95 DCHECK_EQ(node, node_); | 95 DCHECK_EQ(node, node_); |
| 96 QuitRunLoop(); | 96 QuitRunLoop(); |
| 97 } | 97 } |
| 98 | 98 |
| 99 ViewTreeNode* node_; | 99 Node* node_; |
| 100 | 100 |
| 101 DISALLOW_COPY_AND_ASSIGN(ActiveViewChangedObserver); | 101 DISALLOW_COPY_AND_ASSIGN(ActiveViewChangedObserver); |
| 102 }; | 102 }; |
| 103 | 103 |
| 104 // Waits until the active view id of the supplied node changes. | 104 // Waits until the active view id of the supplied node changes. |
| 105 void WaitForActiveViewToChange(ViewTreeNode* node) { | 105 void WaitForActiveViewToChange(Node* node) { |
| 106 ActiveViewChangedObserver observer(node); | 106 ActiveViewChangedObserver observer(node); |
| 107 node->AddObserver(&observer); | 107 node->AddObserver(&observer); |
| 108 DoRunLoop(); | 108 DoRunLoop(); |
| 109 node->RemoveObserver(&observer); | 109 node->RemoveObserver(&observer); |
| 110 } | 110 } |
| 111 | 111 |
| 112 class BoundsChangeObserver : public ViewTreeNodeObserver { | 112 class BoundsChangeObserver : public NodeObserver { |
| 113 public: | 113 public: |
| 114 explicit BoundsChangeObserver(ViewTreeNode* node) : node_(node) {} | 114 explicit BoundsChangeObserver(Node* node) : node_(node) {} |
| 115 virtual ~BoundsChangeObserver() {} | 115 virtual ~BoundsChangeObserver() {} |
| 116 | 116 |
| 117 private: | 117 private: |
| 118 // Overridden from ViewTreeNodeObserver: | 118 // Overridden from NodeObserver: |
| 119 virtual void OnNodeBoundsChange(ViewTreeNode* node, | 119 virtual void OnNodeBoundsChange(Node* node, |
| 120 const gfx::Rect& old_bounds, | 120 const gfx::Rect& old_bounds, |
| 121 const gfx::Rect& new_bounds, | 121 const gfx::Rect& new_bounds, |
| 122 DispositionChangePhase phase) OVERRIDE { | 122 DispositionChangePhase phase) OVERRIDE { |
| 123 DCHECK_EQ(node, node_); | 123 DCHECK_EQ(node, node_); |
| 124 if (phase != ViewTreeNodeObserver::DISPOSITION_CHANGED) | 124 if (phase != NodeObserver::DISPOSITION_CHANGED) |
| 125 return; | 125 return; |
| 126 QuitRunLoop(); | 126 QuitRunLoop(); |
| 127 } | 127 } |
| 128 | 128 |
| 129 ViewTreeNode* node_; | 129 Node* node_; |
| 130 | 130 |
| 131 DISALLOW_COPY_AND_ASSIGN(BoundsChangeObserver); | 131 DISALLOW_COPY_AND_ASSIGN(BoundsChangeObserver); |
| 132 }; | 132 }; |
| 133 | 133 |
| 134 // Wait until the bounds of the supplied node change. | 134 // Wait until the bounds of the supplied node change. |
| 135 void WaitForBoundsToChange(ViewTreeNode* node) { | 135 void WaitForBoundsToChange(Node* node) { |
| 136 BoundsChangeObserver observer(node); | 136 BoundsChangeObserver observer(node); |
| 137 node->AddObserver(&observer); | 137 node->AddObserver(&observer); |
| 138 DoRunLoop(); | 138 DoRunLoop(); |
| 139 node->RemoveObserver(&observer); | 139 node->RemoveObserver(&observer); |
| 140 } | 140 } |
| 141 | 141 |
| 142 // Spins a runloop until the tree beginning at |root| has |tree_size| nodes | 142 // Spins a runloop until the tree beginning at |root| has |tree_size| nodes |
| 143 // (including |root|). | 143 // (including |root|). |
| 144 class TreeSizeMatchesObserver : public ViewTreeNodeObserver { | 144 class TreeSizeMatchesObserver : public NodeObserver { |
| 145 public: | 145 public: |
| 146 TreeSizeMatchesObserver(ViewTreeNode* tree, size_t tree_size) | 146 TreeSizeMatchesObserver(Node* tree, size_t tree_size) |
| 147 : tree_(tree), | 147 : tree_(tree), |
| 148 tree_size_(tree_size) {} | 148 tree_size_(tree_size) {} |
| 149 virtual ~TreeSizeMatchesObserver() {} | 149 virtual ~TreeSizeMatchesObserver() {} |
| 150 | 150 |
| 151 bool IsTreeCorrectSize() { | 151 bool IsTreeCorrectSize() { |
| 152 return CountNodes(tree_) == tree_size_; | 152 return CountNodes(tree_) == tree_size_; |
| 153 } | 153 } |
| 154 | 154 |
| 155 private: | 155 private: |
| 156 // Overridden from ViewTreeNodeObserver: | 156 // Overridden from NodeObserver: |
| 157 virtual void OnTreeChange(const TreeChangeParams& params) OVERRIDE { | 157 virtual void OnTreeChange(const TreeChangeParams& params) OVERRIDE { |
| 158 if (IsTreeCorrectSize()) | 158 if (IsTreeCorrectSize()) |
| 159 QuitRunLoop(); | 159 QuitRunLoop(); |
| 160 } | 160 } |
| 161 | 161 |
| 162 size_t CountNodes(const ViewTreeNode* node) const { | 162 size_t CountNodes(const Node* node) const { |
| 163 size_t count = 1; | 163 size_t count = 1; |
| 164 ViewTreeNode::Children::const_iterator it = node->children().begin(); | 164 Node::Children::const_iterator it = node->children().begin(); |
| 165 for (; it != node->children().end(); ++it) | 165 for (; it != node->children().end(); ++it) |
| 166 count += CountNodes(*it); | 166 count += CountNodes(*it); |
| 167 return count; | 167 return count; |
| 168 } | 168 } |
| 169 | 169 |
| 170 ViewTreeNode* tree_; | 170 Node* tree_; |
| 171 size_t tree_size_; | 171 size_t tree_size_; |
| 172 | 172 |
| 173 DISALLOW_COPY_AND_ASSIGN(TreeSizeMatchesObserver); | 173 DISALLOW_COPY_AND_ASSIGN(TreeSizeMatchesObserver); |
| 174 }; | 174 }; |
| 175 | 175 |
| 176 void WaitForTreeSizeToMatch(ViewTreeNode* node, size_t tree_size) { | 176 void WaitForTreeSizeToMatch(Node* node, size_t tree_size) { |
| 177 TreeSizeMatchesObserver observer(node, tree_size); | 177 TreeSizeMatchesObserver observer(node, tree_size); |
| 178 if (observer.IsTreeCorrectSize()) | 178 if (observer.IsTreeCorrectSize()) |
| 179 return; | 179 return; |
| 180 node->AddObserver(&observer); | 180 node->AddObserver(&observer); |
| 181 DoRunLoop(); | 181 DoRunLoop(); |
| 182 node->RemoveObserver(&observer); | 182 node->RemoveObserver(&observer); |
| 183 } | 183 } |
| 184 | 184 |
| 185 | 185 |
| 186 // Utility class that waits for the destruction of some number of nodes and | 186 // Utility class that waits for the destruction of some number of nodes and |
| 187 // views. | 187 // views. |
| 188 class DestructionObserver : public ViewTreeNodeObserver, | 188 class DestructionObserver : public NodeObserver, public ViewObserver { |
| 189 public ViewObserver { | |
| 190 public: | 189 public: |
| 191 // |nodes| or |views| can be NULL. | 190 // |nodes| or |views| can be NULL. |
| 192 DestructionObserver(std::set<Id>* nodes, std::set<Id>* views) | 191 DestructionObserver(std::set<Id>* nodes, std::set<Id>* views) |
| 193 : nodes_(nodes), | 192 : nodes_(nodes), |
| 194 views_(views) {} | 193 views_(views) {} |
| 195 | 194 |
| 196 private: | 195 private: |
| 197 // Overridden from ViewTreeNodeObserver: | 196 // Overridden from NodeObserver: |
| 198 virtual void OnNodeDestroy( | 197 virtual void OnNodeDestroy( |
| 199 ViewTreeNode* node, | 198 Node* node, |
| 200 ViewTreeNodeObserver::DispositionChangePhase phase) OVERRIDE { | 199 NodeObserver::DispositionChangePhase phase) OVERRIDE { |
| 201 if (phase != ViewTreeNodeObserver::DISPOSITION_CHANGED) | 200 if (phase != NodeObserver::DISPOSITION_CHANGED) |
| 202 return; | 201 return; |
| 203 std::set<Id>::const_iterator it = nodes_->find(node->id()); | 202 std::set<Id>::const_iterator it = nodes_->find(node->id()); |
| 204 if (it != nodes_->end()) | 203 if (it != nodes_->end()) |
| 205 nodes_->erase(it); | 204 nodes_->erase(it); |
| 206 if (CanQuit()) | 205 if (CanQuit()) |
| 207 QuitRunLoop(); | 206 QuitRunLoop(); |
| 208 } | 207 } |
| 209 | 208 |
| 210 // Overridden from ViewObserver: | 209 // Overridden from ViewObserver: |
| 211 virtual void OnViewDestroy( | 210 virtual void OnViewDestroy( |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 243 } | 242 } |
| 244 if (views) { | 243 if (views) { |
| 245 for (std::set<Id>::const_iterator it = views->begin(); | 244 for (std::set<Id>::const_iterator it = views->begin(); |
| 246 it != views->end(); ++it) { | 245 it != views->end(); ++it) { |
| 247 view_manager->GetViewById(*it)->AddObserver(&observer); | 246 view_manager->GetViewById(*it)->AddObserver(&observer); |
| 248 } | 247 } |
| 249 } | 248 } |
| 250 DoRunLoop(); | 249 DoRunLoop(); |
| 251 } | 250 } |
| 252 | 251 |
| 253 class OrderChangeObserver : public ViewTreeNodeObserver { | 252 class OrderChangeObserver : public NodeObserver { |
| 254 public: | 253 public: |
| 255 OrderChangeObserver(ViewTreeNode* node) : node_(node) { | 254 OrderChangeObserver(Node* node) : node_(node) { |
| 256 node_->AddObserver(this); | 255 node_->AddObserver(this); |
| 257 } | 256 } |
| 258 virtual ~OrderChangeObserver() { | 257 virtual ~OrderChangeObserver() { |
| 259 node_->RemoveObserver(this); | 258 node_->RemoveObserver(this); |
| 260 } | 259 } |
| 261 | 260 |
| 262 private: | 261 private: |
| 263 // Overridden from ViewTreeNodeObserver: | 262 // Overridden from NodeObserver: |
| 264 virtual void OnNodeReordered(ViewTreeNode* node, | 263 virtual void OnNodeReordered(Node* node, |
| 265 ViewTreeNode* relative_node, | 264 Node* relative_node, |
| 266 OrderDirection direction, | 265 OrderDirection direction, |
| 267 DispositionChangePhase phase) OVERRIDE { | 266 DispositionChangePhase phase) OVERRIDE { |
| 268 if (phase != ViewTreeNodeObserver::DISPOSITION_CHANGED) | 267 if (phase != NodeObserver::DISPOSITION_CHANGED) |
| 269 return; | 268 return; |
| 270 | 269 |
| 271 DCHECK_EQ(node, node_); | 270 DCHECK_EQ(node, node_); |
| 272 QuitRunLoop(); | 271 QuitRunLoop(); |
| 273 } | 272 } |
| 274 | 273 |
| 275 ViewTreeNode* node_; | 274 Node* node_; |
| 276 | 275 |
| 277 DISALLOW_COPY_AND_ASSIGN(OrderChangeObserver); | 276 DISALLOW_COPY_AND_ASSIGN(OrderChangeObserver); |
| 278 }; | 277 }; |
| 279 | 278 |
| 280 void WaitForOrderChange(ViewManager* view_manager, | 279 void WaitForOrderChange(ViewManager* view_manager, Node* node) { |
| 281 ViewTreeNode* node) { | |
| 282 OrderChangeObserver observer(node); | 280 OrderChangeObserver observer(node); |
| 283 DoRunLoop(); | 281 DoRunLoop(); |
| 284 } | 282 } |
| 285 | 283 |
| 286 // Tracks a node's destruction. Query is_valid() for current state. | 284 // Tracks a node's destruction. Query is_valid() for current state. |
| 287 class NodeTracker : public ViewTreeNodeObserver { | 285 class NodeTracker : public NodeObserver { |
| 288 public: | 286 public: |
| 289 explicit NodeTracker(ViewTreeNode* node) : node_(node) { | 287 explicit NodeTracker(Node* node) : node_(node) { |
| 290 node_->AddObserver(this); | 288 node_->AddObserver(this); |
| 291 } | 289 } |
| 292 virtual ~NodeTracker() { | 290 virtual ~NodeTracker() { |
| 293 if (node_) | 291 if (node_) |
| 294 node_->RemoveObserver(this); | 292 node_->RemoveObserver(this); |
| 295 } | 293 } |
| 296 | 294 |
| 297 bool is_valid() const { return !!node_; } | 295 bool is_valid() const { return !!node_; } |
| 298 | 296 |
| 299 private: | 297 private: |
| 300 // Overridden from ViewTreeNodeObserver: | 298 // Overridden from NodeObserver: |
| 301 virtual void OnNodeDestroy( | 299 virtual void OnNodeDestroy( |
| 302 ViewTreeNode* node, | 300 Node* node, |
| 303 ViewTreeNodeObserver::DispositionChangePhase phase) OVERRIDE { | 301 NodeObserver::DispositionChangePhase phase) OVERRIDE { |
| 304 if (phase != ViewTreeNodeObserver::DISPOSITION_CHANGED) | 302 if (phase != NodeObserver::DISPOSITION_CHANGED) |
| 305 return; | 303 return; |
| 306 DCHECK_EQ(node, node_); | 304 DCHECK_EQ(node, node_); |
| 307 node_ = NULL; | 305 node_ = NULL; |
| 308 } | 306 } |
| 309 | 307 |
| 310 int id_; | 308 int id_; |
| 311 ViewTreeNode* node_; | 309 Node* node_; |
| 312 | 310 |
| 313 DISALLOW_COPY_AND_ASSIGN(NodeTracker); | 311 DISALLOW_COPY_AND_ASSIGN(NodeTracker); |
| 314 }; | 312 }; |
| 315 | 313 |
| 316 } // namespace | 314 } // namespace |
| 317 | 315 |
| 318 // ViewManager ----------------------------------------------------------------- | 316 // ViewManager ----------------------------------------------------------------- |
| 319 | 317 |
| 320 // These tests model synchronization of two peer connections to the view manager | 318 // These tests model synchronization of two peer connections to the view manager |
| 321 // service, that are given access to some root node. | 319 // service, that are given access to some root node. |
| 322 | 320 |
| 323 class ViewManagerTest : public testing::Test { | 321 class ViewManagerTest : public testing::Test { |
| 324 public: | 322 public: |
| 325 ViewManagerTest() | 323 ViewManagerTest() |
| 326 : connect_loop_(NULL), | 324 : connect_loop_(NULL), |
| 327 loaded_view_manager_(NULL), | 325 loaded_view_manager_(NULL), |
| 328 window_manager_(NULL), | 326 window_manager_(NULL), |
| 329 commit_count_(0) {} | 327 commit_count_(0) {} |
| 330 | 328 |
| 331 protected: | 329 protected: |
| 332 ViewManager* window_manager() { return window_manager_; } | 330 ViewManager* window_manager() { return window_manager_; } |
| 333 | 331 |
| 334 ViewTreeNode* CreateNodeInParent(ViewTreeNode* parent) { | 332 Node* CreateNodeInParent(Node* parent) { |
| 335 ViewManager* parent_manager = ViewTreeNodePrivate(parent).view_manager(); | 333 ViewManager* parent_manager = NodePrivate(parent).view_manager(); |
| 336 ViewTreeNode* node = ViewTreeNode::Create(parent_manager); | 334 Node* node = Node::Create(parent_manager); |
| 337 parent->AddChild(node); | 335 parent->AddChild(node); |
| 338 return node; | 336 return node; |
| 339 } | 337 } |
| 340 | 338 |
| 341 // Embeds another version of the test app @ node. | 339 // Embeds another version of the test app @ node. |
| 342 ViewManager* Embed(ViewManager* view_manager, ViewTreeNode* node) { | 340 ViewManager* Embed(ViewManager* view_manager, Node* node) { |
| 343 DCHECK_EQ(view_manager, ViewTreeNodePrivate(node).view_manager()); | 341 DCHECK_EQ(view_manager, NodePrivate(node).view_manager()); |
| 344 node->Embed(kEmbeddedApp1URL); | 342 node->Embed(kEmbeddedApp1URL); |
| 345 RunRunLoop(); | 343 RunRunLoop(); |
| 346 return GetLoadedViewManager(); | 344 return GetLoadedViewManager(); |
| 347 } | 345 } |
| 348 | 346 |
| 349 // TODO(beng): remove these methods once all the tests are migrated. | 347 // TODO(beng): remove these methods once all the tests are migrated. |
| 350 void DestroyViewManager1() {} | 348 void DestroyViewManager1() {} |
| 351 ViewManager* view_manager_1() { return NULL; } | 349 ViewManager* view_manager_1() { return NULL; } |
| 352 ViewManager* view_manager_2() { return NULL; } | 350 ViewManager* view_manager_2() { return NULL; } |
| 353 | 351 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 bool result = false; | 388 bool result = false; |
| 391 view_manager_init->EmbedRoot( | 389 view_manager_init->EmbedRoot( |
| 392 url, | 390 url, |
| 393 base::Bind(&ViewManagerTest::EmbedRootCallback, base::Unretained(this), | 391 base::Bind(&ViewManagerTest::EmbedRootCallback, base::Unretained(this), |
| 394 &result)); | 392 &result)); |
| 395 RunRunLoop(); | 393 RunRunLoop(); |
| 396 window_manager_ = GetLoadedViewManager(); | 394 window_manager_ = GetLoadedViewManager(); |
| 397 return result; | 395 return result; |
| 398 } | 396 } |
| 399 | 397 |
| 400 void OnViewManagerLoaded(ViewManager* view_manager, ViewTreeNode* root) { | 398 void OnViewManagerLoaded(ViewManager* view_manager, Node* root) { |
| 401 loaded_view_manager_ = view_manager; | 399 loaded_view_manager_ = view_manager; |
| 402 connect_loop_->Quit(); | 400 connect_loop_->Quit(); |
| 403 } | 401 } |
| 404 | 402 |
| 405 void RunRunLoop() { | 403 void RunRunLoop() { |
| 406 base::RunLoop run_loop; | 404 base::RunLoop run_loop; |
| 407 connect_loop_ = &run_loop; | 405 connect_loop_ = &run_loop; |
| 408 connect_loop_->Run(); | 406 connect_loop_->Run(); |
| 409 connect_loop_ = NULL; | 407 connect_loop_ = NULL; |
| 410 } | 408 } |
| 411 | 409 |
| 412 base::MessageLoop loop_; | 410 base::MessageLoop loop_; |
| 413 base::RunLoop* connect_loop_; | 411 base::RunLoop* connect_loop_; |
| 414 shell::ShellTestHelper test_helper_; | 412 shell::ShellTestHelper test_helper_; |
| 415 ViewManagerInitServicePtr view_manager_init_; | 413 ViewManagerInitServicePtr view_manager_init_; |
| 416 // Used to receive the most recent view manager loaded by an embed action. | 414 // Used to receive the most recent view manager loaded by an embed action. |
| 417 ViewManager* loaded_view_manager_; | 415 ViewManager* loaded_view_manager_; |
| 418 // The View Manager connection held by the window manager (app running at the | 416 // The View Manager connection held by the window manager (app running at the |
| 419 // root node). | 417 // root node). |
| 420 ViewManager* window_manager_; | 418 ViewManager* window_manager_; |
| 421 int commit_count_; | 419 int commit_count_; |
| 422 | 420 |
| 423 DISALLOW_COPY_AND_ASSIGN(ViewManagerTest); | 421 DISALLOW_COPY_AND_ASSIGN(ViewManagerTest); |
| 424 }; | 422 }; |
| 425 | 423 |
| 426 TEST_F(ViewManagerTest, SetUp) {} | 424 TEST_F(ViewManagerTest, SetUp) {} |
| 427 | 425 |
| 428 TEST_F(ViewManagerTest, Embed) { | 426 TEST_F(ViewManagerTest, Embed) { |
| 429 ViewTreeNode* node = ViewTreeNode::Create(window_manager()); | 427 Node* node = Node::Create(window_manager()); |
| 430 window_manager()->GetRoots().front()->AddChild(node); | 428 window_manager()->GetRoots().front()->AddChild(node); |
| 431 ViewManager* embedded = Embed(window_manager(), node); | 429 ViewManager* embedded = Embed(window_manager(), node); |
| 432 EXPECT_TRUE(NULL != embedded); | 430 EXPECT_TRUE(NULL != embedded); |
| 433 | 431 |
| 434 ViewTreeNode* node_in_embedded = embedded->GetRoots().front(); | 432 Node* node_in_embedded = embedded->GetRoots().front(); |
| 435 EXPECT_EQ(node->parent(), window_manager()->GetRoots().front()); | 433 EXPECT_EQ(node->parent(), window_manager()->GetRoots().front()); |
| 436 EXPECT_EQ(NULL, node_in_embedded->parent()); | 434 EXPECT_EQ(NULL, node_in_embedded->parent()); |
| 437 } | 435 } |
| 438 | 436 |
| 439 // When Window Manager embeds A @ N, then creates N2 and parents to N, N becomes | 437 // When Window Manager embeds A @ N, then creates N2 and parents to N, N becomes |
| 440 // visible to A. | 438 // visible to A. |
| 441 // TODO(beng): verify whether or not this is a policy we like. | 439 // TODO(beng): verify whether or not this is a policy we like. |
| 442 TEST_F(ViewManagerTest, HierarchyChanged_NodeAdded) { | 440 TEST_F(ViewManagerTest, HierarchyChanged_NodeAdded) { |
| 443 ViewTreeNode* node = ViewTreeNode::Create(window_manager()); | 441 Node* node = Node::Create(window_manager()); |
| 444 window_manager()->GetRoots().front()->AddChild(node); | 442 window_manager()->GetRoots().front()->AddChild(node); |
| 445 ViewManager* embedded = Embed(window_manager(), node); | 443 ViewManager* embedded = Embed(window_manager(), node); |
| 446 ViewTreeNode* nested = ViewTreeNode::Create(window_manager()); | 444 Node* nested = Node::Create(window_manager()); |
| 447 node->AddChild(nested); | 445 node->AddChild(nested); |
| 448 WaitForTreeSizeToMatch(embedded->GetRoots().front(), 2); | 446 WaitForTreeSizeToMatch(embedded->GetRoots().front(), 2); |
| 449 EXPECT_EQ(embedded->GetRoots().front()->children().front()->id(), | 447 EXPECT_EQ(embedded->GetRoots().front()->children().front()->id(), |
| 450 nested->id()); | 448 nested->id()); |
| 451 } | 449 } |
| 452 | 450 |
| 453 // Window manager has two nodes, N1 & N2. Embeds A at N1. Creates node N21, | 451 // Window manager has two nodes, N1 & N2. Embeds A at N1. Creates node N21, |
| 454 // a child of N2. Reparents N2 to N1. N1 should become visible to A. | 452 // a child of N2. Reparents N2 to N1. N1 should become visible to A. |
| 455 // TODO(beng): verify whether or not this is a policy we like. | 453 // TODO(beng): verify whether or not this is a policy we like. |
| 456 TEST_F(ViewManagerTest, HierarchyChanged_NodeMoved) { | 454 TEST_F(ViewManagerTest, HierarchyChanged_NodeMoved) { |
| 457 ViewTreeNode* node1 = ViewTreeNode::Create(window_manager()); | 455 Node* node1 = Node::Create(window_manager()); |
| 458 window_manager()->GetRoots().front()->AddChild(node1); | 456 window_manager()->GetRoots().front()->AddChild(node1); |
| 459 ViewManager* embedded = Embed(window_manager(), node1); | 457 ViewManager* embedded = Embed(window_manager(), node1); |
| 460 WaitForTreeSizeToMatch(embedded->GetRoots().front(), 1); | 458 WaitForTreeSizeToMatch(embedded->GetRoots().front(), 1); |
| 461 | 459 |
| 462 ViewTreeNode* node2 = ViewTreeNode::Create(window_manager()); | 460 Node* node2 = Node::Create(window_manager()); |
| 463 window_manager()->GetRoots().front()->AddChild(node2); | 461 window_manager()->GetRoots().front()->AddChild(node2); |
| 464 WaitForTreeSizeToMatch(embedded->GetRoots().front(), 1); | 462 WaitForTreeSizeToMatch(embedded->GetRoots().front(), 1); |
| 465 EXPECT_TRUE(embedded->GetRoots().front()->children().empty()); | 463 EXPECT_TRUE(embedded->GetRoots().front()->children().empty()); |
| 466 | 464 |
| 467 ViewTreeNode* node21 = ViewTreeNode::Create(window_manager()); | 465 Node* node21 = Node::Create(window_manager()); |
| 468 node2->AddChild(node21); | 466 node2->AddChild(node21); |
| 469 WaitForTreeSizeToMatch(embedded->GetRoots().front(), 1); | 467 WaitForTreeSizeToMatch(embedded->GetRoots().front(), 1); |
| 470 EXPECT_TRUE(embedded->GetRoots().front()->children().empty()); | 468 EXPECT_TRUE(embedded->GetRoots().front()->children().empty()); |
| 471 | 469 |
| 472 // Makes node21 visible to |embedded|. | 470 // Makes node21 visible to |embedded|. |
| 473 node1->AddChild(node21); | 471 node1->AddChild(node21); |
| 474 WaitForTreeSizeToMatch(embedded->GetRoots().front(), 2); | 472 WaitForTreeSizeToMatch(embedded->GetRoots().front(), 2); |
| 475 EXPECT_FALSE(embedded->GetRoots().front()->children().empty()); | 473 EXPECT_FALSE(embedded->GetRoots().front()->children().empty()); |
| 476 EXPECT_EQ(embedded->GetRoots().front()->children().front()->id(), | 474 EXPECT_EQ(embedded->GetRoots().front()->children().front()->id(), |
| 477 node21->id()); | 475 node21->id()); |
| 478 } | 476 } |
| 479 | 477 |
| 480 // Window manager has two nodes, N1 and N11. Embeds A at N1. Removes N11 from | 478 // Window manager has two nodes, N1 and N11. Embeds A at N1. Removes N11 from |
| 481 // N1. N11 should disappear from A. | 479 // N1. N11 should disappear from A. |
| 482 // TODO(beng): verify whether or not this is a policy we like. | 480 // TODO(beng): verify whether or not this is a policy we like. |
| 483 TEST_F(ViewManagerTest, HierarchyChanged_NodeRemoved) { | 481 TEST_F(ViewManagerTest, HierarchyChanged_NodeRemoved) { |
| 484 ViewTreeNode* node = ViewTreeNode::Create(window_manager()); | 482 Node* node = Node::Create(window_manager()); |
| 485 window_manager()->GetRoots().front()->AddChild(node); | 483 window_manager()->GetRoots().front()->AddChild(node); |
| 486 ViewTreeNode* nested = ViewTreeNode::Create(window_manager()); | 484 Node* nested = Node::Create(window_manager()); |
| 487 node->AddChild(nested); | 485 node->AddChild(nested); |
| 488 | 486 |
| 489 ViewManager* embedded = Embed(window_manager(), node); | 487 ViewManager* embedded = Embed(window_manager(), node); |
| 490 EXPECT_EQ(embedded->GetRoots().front()->children().front()->id(), | 488 EXPECT_EQ(embedded->GetRoots().front()->children().front()->id(), |
| 491 nested->id()); | 489 nested->id()); |
| 492 | 490 |
| 493 node->RemoveChild(nested); | 491 node->RemoveChild(nested); |
| 494 WaitForTreeSizeToMatch(embedded->GetRoots().front(), 1); | 492 WaitForTreeSizeToMatch(embedded->GetRoots().front(), 1); |
| 495 EXPECT_TRUE(embedded->GetRoots().front()->children().empty()); | 493 EXPECT_TRUE(embedded->GetRoots().front()->children().empty()); |
| 496 } | 494 } |
| 497 | 495 |
| 498 // Window manager has two nodes, N1 and N11. Embeds A at N1. Destroys N11. | 496 // Window manager has two nodes, N1 and N11. Embeds A at N1. Destroys N11. |
| 499 // N11 should disappear from A. | 497 // N11 should disappear from A. |
| 500 // TODO(beng): verify whether or not this is a policy we like. | 498 // TODO(beng): verify whether or not this is a policy we like. |
| 501 TEST_F(ViewManagerTest, NodeDestroyed) { | 499 TEST_F(ViewManagerTest, NodeDestroyed) { |
| 502 ViewTreeNode* node = ViewTreeNode::Create(window_manager()); | 500 Node* node = Node::Create(window_manager()); |
| 503 window_manager()->GetRoots().front()->AddChild(node); | 501 window_manager()->GetRoots().front()->AddChild(node); |
| 504 ViewTreeNode* nested = ViewTreeNode::Create(window_manager()); | 502 Node* nested = Node::Create(window_manager()); |
| 505 node->AddChild(nested); | 503 node->AddChild(nested); |
| 506 | 504 |
| 507 ViewManager* embedded = Embed(window_manager(), node); | 505 ViewManager* embedded = Embed(window_manager(), node); |
| 508 EXPECT_EQ(embedded->GetRoots().front()->children().front()->id(), | 506 EXPECT_EQ(embedded->GetRoots().front()->children().front()->id(), |
| 509 nested->id()); | 507 nested->id()); |
| 510 | 508 |
| 511 // |nested| will be deleted after calling Destroy() below. | 509 // |nested| will be deleted after calling Destroy() below. |
| 512 Id id = nested->id(); | 510 Id id = nested->id(); |
| 513 nested->Destroy(); | 511 nested->Destroy(); |
| 514 | 512 |
| 515 std::set<Id> nodes; | 513 std::set<Id> nodes; |
| 516 nodes.insert(id); | 514 nodes.insert(id); |
| 517 WaitForDestruction(embedded, &nodes, NULL); | 515 WaitForDestruction(embedded, &nodes, NULL); |
| 518 | 516 |
| 519 EXPECT_TRUE(embedded->GetRoots().front()->children().empty()); | 517 EXPECT_TRUE(embedded->GetRoots().front()->children().empty()); |
| 520 EXPECT_EQ(NULL, embedded->GetNodeById(id)); | 518 EXPECT_EQ(NULL, embedded->GetNodeById(id)); |
| 521 } | 519 } |
| 522 | 520 |
| 523 TEST_F(ViewManagerTest, ViewManagerDestroyed_CleanupNode) { | 521 TEST_F(ViewManagerTest, ViewManagerDestroyed_CleanupNode) { |
| 524 ViewTreeNode* node = ViewTreeNode::Create(window_manager()); | 522 Node* node = Node::Create(window_manager()); |
| 525 window_manager()->GetRoots().front()->AddChild(node); | 523 window_manager()->GetRoots().front()->AddChild(node); |
| 526 ViewManager* embedded = Embed(window_manager(), node); | 524 ViewManager* embedded = Embed(window_manager(), node); |
| 527 | 525 |
| 528 Id node_id = node->id(); | 526 Id node_id = node->id(); |
| 529 | 527 |
| 530 UnloadApplication(GURL(kWindowManagerURL)); | 528 UnloadApplication(GURL(kWindowManagerURL)); |
| 531 | 529 |
| 532 std::set<Id> nodes; | 530 std::set<Id> nodes; |
| 533 nodes.insert(node_id); | 531 nodes.insert(node_id); |
| 534 WaitForDestruction(embedded, &nodes, NULL); | 532 WaitForDestruction(embedded, &nodes, NULL); |
| 535 | 533 |
| 536 EXPECT_TRUE(embedded->GetRoots().empty()); | 534 EXPECT_TRUE(embedded->GetRoots().empty()); |
| 537 } | 535 } |
| 538 | 536 |
| 539 TEST_F(ViewManagerTest, SetActiveView) { | 537 TEST_F(ViewManagerTest, SetActiveView) { |
| 540 ViewTreeNode* node = ViewTreeNode::Create(window_manager()); | 538 Node* node = Node::Create(window_manager()); |
| 541 window_manager()->GetRoots().front()->AddChild(node); | 539 window_manager()->GetRoots().front()->AddChild(node); |
| 542 ViewManager* embedded = Embed(window_manager(), node); | 540 ViewManager* embedded = Embed(window_manager(), node); |
| 543 | 541 |
| 544 View* view = View::Create(window_manager()); | 542 View* view = View::Create(window_manager()); |
| 545 node->SetActiveView(view); | 543 node->SetActiveView(view); |
| 546 | 544 |
| 547 ViewTreeNode* node_in_embedded = embedded->GetNodeById(node->id()); | 545 Node* node_in_embedded = embedded->GetNodeById(node->id()); |
| 548 WaitForActiveViewToChange(node_in_embedded); | 546 WaitForActiveViewToChange(node_in_embedded); |
| 549 | 547 |
| 550 EXPECT_EQ(node_in_embedded->active_view()->id(), view->id()); | 548 EXPECT_EQ(node_in_embedded->active_view()->id(), view->id()); |
| 551 } | 549 } |
| 552 | 550 |
| 553 TEST_F(ViewManagerTest, DestroyView) { | 551 TEST_F(ViewManagerTest, DestroyView) { |
| 554 ViewTreeNode* node = ViewTreeNode::Create(window_manager()); | 552 Node* node = Node::Create(window_manager()); |
| 555 window_manager()->GetRoots().front()->AddChild(node); | 553 window_manager()->GetRoots().front()->AddChild(node); |
| 556 ViewManager* embedded = Embed(window_manager(), node); | 554 ViewManager* embedded = Embed(window_manager(), node); |
| 557 | 555 |
| 558 View* view = View::Create(window_manager()); | 556 View* view = View::Create(window_manager()); |
| 559 node->SetActiveView(view); | 557 node->SetActiveView(view); |
| 560 | 558 |
| 561 ViewTreeNode* node_in_embedded = embedded->GetNodeById(node->id()); | 559 Node* node_in_embedded = embedded->GetNodeById(node->id()); |
| 562 WaitForActiveViewToChange(node_in_embedded); | 560 WaitForActiveViewToChange(node_in_embedded); |
| 563 | 561 |
| 564 EXPECT_EQ(node_in_embedded->active_view()->id(), view->id()); | 562 EXPECT_EQ(node_in_embedded->active_view()->id(), view->id()); |
| 565 | 563 |
| 566 Id view_id = view->id(); | 564 Id view_id = view->id(); |
| 567 view->Destroy(); | 565 view->Destroy(); |
| 568 | 566 |
| 569 std::set<Id> views; | 567 std::set<Id> views; |
| 570 views.insert(view_id); | 568 views.insert(view_id); |
| 571 WaitForDestruction(embedded, NULL, &views); | 569 WaitForDestruction(embedded, NULL, &views); |
| 572 EXPECT_EQ(NULL, node_in_embedded->active_view()); | 570 EXPECT_EQ(NULL, node_in_embedded->active_view()); |
| 573 EXPECT_EQ(NULL, embedded->GetViewById(view_id)); | 571 EXPECT_EQ(NULL, embedded->GetViewById(view_id)); |
| 574 } | 572 } |
| 575 | 573 |
| 576 // Destroying the connection that created a node and view should result in that | 574 // Destroying the connection that created a node and view should result in that |
| 577 // node and view disappearing from all connections that see them. | 575 // node and view disappearing from all connections that see them. |
| 578 TEST_F(ViewManagerTest, ViewManagerDestroyed_CleanupNodeAndView) { | 576 TEST_F(ViewManagerTest, ViewManagerDestroyed_CleanupNodeAndView) { |
| 579 ViewTreeNode* node = ViewTreeNode::Create(window_manager()); | 577 Node* node = Node::Create(window_manager()); |
| 580 window_manager()->GetRoots().front()->AddChild(node); | 578 window_manager()->GetRoots().front()->AddChild(node); |
| 581 View* view = View::Create(window_manager()); | 579 View* view = View::Create(window_manager()); |
| 582 node->SetActiveView(view); | 580 node->SetActiveView(view); |
| 583 ViewManager* embedded = Embed(window_manager(), node); | 581 ViewManager* embedded = Embed(window_manager(), node); |
| 584 | 582 |
| 585 Id node_id = node->id(); | 583 Id node_id = node->id(); |
| 586 Id view_id = view->id(); | 584 Id view_id = view->id(); |
| 587 | 585 |
| 588 UnloadApplication(GURL(kWindowManagerURL)); | 586 UnloadApplication(GURL(kWindowManagerURL)); |
| 589 | 587 |
| 590 std::set<Id> observed_nodes; | 588 std::set<Id> observed_nodes; |
| 591 observed_nodes.insert(node_id); | 589 observed_nodes.insert(node_id); |
| 592 std::set<Id> observed_views; | 590 std::set<Id> observed_views; |
| 593 observed_views.insert(view_id); | 591 observed_views.insert(view_id); |
| 594 WaitForDestruction(embedded, &observed_nodes, &observed_views); | 592 WaitForDestruction(embedded, &observed_nodes, &observed_views); |
| 595 | 593 |
| 596 EXPECT_TRUE(embedded->GetRoots().empty()); | 594 EXPECT_TRUE(embedded->GetRoots().empty()); |
| 597 EXPECT_EQ(NULL, embedded->GetNodeById(node_id)); | 595 EXPECT_EQ(NULL, embedded->GetNodeById(node_id)); |
| 598 EXPECT_EQ(NULL, embedded->GetViewById(view_id)); | 596 EXPECT_EQ(NULL, embedded->GetViewById(view_id)); |
| 599 } | 597 } |
| 600 | 598 |
| 601 // This test validates the following scenario: | 599 // This test validates the following scenario: |
| 602 // - a node originating from one connection | 600 // - a node originating from one connection |
| 603 // - a view originating from a second connection | 601 // - a view originating from a second connection |
| 604 // + the connection originating the node is destroyed | 602 // + the connection originating the node is destroyed |
| 605 // -> the view should still exist (since the second connection is live) but | 603 // -> the view should still exist (since the second connection is live) but |
| 606 // should be disconnected from any nodes. | 604 // should be disconnected from any nodes. |
| 607 TEST_F(ViewManagerTest, | 605 TEST_F(ViewManagerTest, |
| 608 ViewManagerDestroyed_CleanupNodeAndViewFromDifferentConnections) { | 606 ViewManagerDestroyed_CleanupNodeAndViewFromDifferentConnections) { |
| 609 ViewTreeNode* node = ViewTreeNode::Create(window_manager()); | 607 Node* node = Node::Create(window_manager()); |
| 610 window_manager()->GetRoots().front()->AddChild(node); | 608 window_manager()->GetRoots().front()->AddChild(node); |
| 611 ViewManager* embedded = Embed(window_manager(), node); | 609 ViewManager* embedded = Embed(window_manager(), node); |
| 612 View* view_in_embedded = View::Create(embedded); | 610 View* view_in_embedded = View::Create(embedded); |
| 613 ViewTreeNode* node_in_embedded = embedded->GetNodeById(node->id()); | 611 Node* node_in_embedded = embedded->GetNodeById(node->id()); |
| 614 node_in_embedded->SetActiveView(view_in_embedded); | 612 node_in_embedded->SetActiveView(view_in_embedded); |
| 615 | 613 |
| 616 WaitForActiveViewToChange(node); | 614 WaitForActiveViewToChange(node); |
| 617 | 615 |
| 618 Id node_id = node->id(); | 616 Id node_id = node->id(); |
| 619 Id view_id = view_in_embedded->id(); | 617 Id view_id = view_in_embedded->id(); |
| 620 | 618 |
| 621 UnloadApplication(GURL(kWindowManagerURL)); | 619 UnloadApplication(GURL(kWindowManagerURL)); |
| 622 std::set<Id> nodes; | 620 std::set<Id> nodes; |
| 623 nodes.insert(node_id); | 621 nodes.insert(node_id); |
| 624 WaitForDestruction(embedded, &nodes, NULL); | 622 WaitForDestruction(embedded, &nodes, NULL); |
| 625 | 623 |
| 626 EXPECT_TRUE(embedded->GetRoots().empty()); | 624 EXPECT_TRUE(embedded->GetRoots().empty()); |
| 627 // node was owned by the window manager, so it should be gone. | 625 // node was owned by the window manager, so it should be gone. |
| 628 EXPECT_EQ(NULL, embedded->GetNodeById(node_id)); | 626 EXPECT_EQ(NULL, embedded->GetNodeById(node_id)); |
| 629 // view_in_embedded was owned by the embedded app, so it should still exist, | 627 // view_in_embedded was owned by the embedded app, so it should still exist, |
| 630 // but disconnected from the node tree. | 628 // but disconnected from the node tree. |
| 631 EXPECT_EQ(view_in_embedded, embedded->GetViewById(view_id)); | 629 EXPECT_EQ(view_in_embedded, embedded->GetViewById(view_id)); |
| 632 EXPECT_EQ(NULL, view_in_embedded->node()); | 630 EXPECT_EQ(NULL, view_in_embedded->node()); |
| 633 } | 631 } |
| 634 | 632 |
| 635 // This test verifies that it is not possible to set the active view to a view | 633 // This test verifies that it is not possible to set the active view to a view |
| 636 // defined in a different connection. | 634 // defined in a different connection. |
| 637 // TODO(beng): write these tests for ViewTreeNode::AddChild(), RemoveChild() and | 635 // TODO(beng): write these tests for Node::AddChild(), RemoveChild() and |
| 638 // Contains(). | 636 // Contains(). |
| 639 TEST_F(ViewManagerTest, SetActiveViewAcrossConnection) { | 637 TEST_F(ViewManagerTest, SetActiveViewAcrossConnection) { |
| 640 ViewTreeNode* node = ViewTreeNode::Create(window_manager()); | 638 Node* node = Node::Create(window_manager()); |
| 641 window_manager()->GetRoots().front()->AddChild(node); | 639 window_manager()->GetRoots().front()->AddChild(node); |
| 642 ViewManager* embedded = Embed(window_manager(), node); | 640 ViewManager* embedded = Embed(window_manager(), node); |
| 643 | 641 |
| 644 View* view_in_embedded = View::Create(embedded); | 642 View* view_in_embedded = View::Create(embedded); |
| 645 EXPECT_DEATH(node->SetActiveView(view_in_embedded), ""); | 643 EXPECT_DEATH(node->SetActiveView(view_in_embedded), ""); |
| 646 } | 644 } |
| 647 | 645 |
| 648 // This test verifies that a node hierarchy constructed in one connection | 646 // This test verifies that a node hierarchy constructed in one connection |
| 649 // becomes entirely visible to the second connection when the hierarchy is | 647 // becomes entirely visible to the second connection when the hierarchy is |
| 650 // attached. | 648 // attached. |
| 651 TEST_F(ViewManagerTest, MapSubtreeOnAttach) { | 649 TEST_F(ViewManagerTest, MapSubtreeOnAttach) { |
| 652 ViewTreeNode* node = ViewTreeNode::Create(window_manager()); | 650 Node* node = Node::Create(window_manager()); |
| 653 window_manager()->GetRoots().front()->AddChild(node); | 651 window_manager()->GetRoots().front()->AddChild(node); |
| 654 ViewManager* embedded = Embed(window_manager(), node); | 652 ViewManager* embedded = Embed(window_manager(), node); |
| 655 | 653 |
| 656 // Create a subtree private to the window manager and make some changes to it. | 654 // Create a subtree private to the window manager and make some changes to it. |
| 657 ViewTreeNode* child1 = ViewTreeNode::Create(window_manager()); | 655 Node* child1 = Node::Create(window_manager()); |
| 658 ViewTreeNode* child11 = ViewTreeNode::Create(window_manager()); | 656 Node* child11 = Node::Create(window_manager()); |
| 659 child1->AddChild(child11); | 657 child1->AddChild(child11); |
| 660 gfx::Rect child11_bounds(800, 600); | 658 gfx::Rect child11_bounds(800, 600); |
| 661 child11->SetBounds(child11_bounds); | 659 child11->SetBounds(child11_bounds); |
| 662 View* view11 = View::Create(window_manager()); | 660 View* view11 = View::Create(window_manager()); |
| 663 child11->SetActiveView(view11); | 661 child11->SetActiveView(view11); |
| 664 WaitForAllChangesToBeAcked( | 662 WaitForAllChangesToBeAcked( |
| 665 static_cast<ViewManagerSynchronizer*>(window_manager())); | 663 static_cast<ViewManagerClientImpl*>(window_manager())); |
| 666 | 664 |
| 667 // When added to the shared node, the entire hierarchy and all property | 665 // When added to the shared node, the entire hierarchy and all property |
| 668 // changes should become visible to the embedded app. | 666 // changes should become visible to the embedded app. |
| 669 node->AddChild(child1); | 667 node->AddChild(child1); |
| 670 WaitForTreeSizeToMatch(embedded->GetRoots().front(), 3); | 668 WaitForTreeSizeToMatch(embedded->GetRoots().front(), 3); |
| 671 | 669 |
| 672 ViewTreeNode* child11_in_embedded = embedded->GetNodeById(child11->id()); | 670 Node* child11_in_embedded = embedded->GetNodeById(child11->id()); |
| 673 View* view11_in_embedded = embedded->GetViewById(view11->id()); | 671 View* view11_in_embedded = embedded->GetViewById(view11->id()); |
| 674 EXPECT_TRUE(child11_in_embedded != NULL); | 672 EXPECT_TRUE(child11_in_embedded != NULL); |
| 675 EXPECT_EQ(view11_in_embedded, child11_in_embedded->active_view()); | 673 EXPECT_EQ(view11_in_embedded, child11_in_embedded->active_view()); |
| 676 EXPECT_EQ(child11_bounds, child11_in_embedded->bounds()); | 674 EXPECT_EQ(child11_bounds, child11_in_embedded->bounds()); |
| 677 } | 675 } |
| 678 | 676 |
| 679 // Verifies that bounds changes applied to a node hierarchy in one connection | 677 // Verifies that bounds changes applied to a node hierarchy in one connection |
| 680 // are reflected to another. | 678 // are reflected to another. |
| 681 TEST_F(ViewManagerTest, SetBounds) { | 679 TEST_F(ViewManagerTest, SetBounds) { |
| 682 ViewTreeNode* node = ViewTreeNode::Create(window_manager()); | 680 Node* node = Node::Create(window_manager()); |
| 683 window_manager()->GetRoots().front()->AddChild(node); | 681 window_manager()->GetRoots().front()->AddChild(node); |
| 684 ViewManager* embedded = Embed(window_manager(), node); | 682 ViewManager* embedded = Embed(window_manager(), node); |
| 685 | 683 |
| 686 ViewTreeNode* node_in_embedded = embedded->GetNodeById(node->id()); | 684 Node* node_in_embedded = embedded->GetNodeById(node->id()); |
| 687 EXPECT_EQ(node->bounds(), node_in_embedded->bounds()); | 685 EXPECT_EQ(node->bounds(), node_in_embedded->bounds()); |
| 688 | 686 |
| 689 node->SetBounds(gfx::Rect(100, 100)); | 687 node->SetBounds(gfx::Rect(100, 100)); |
| 690 EXPECT_NE(node->bounds(), node_in_embedded->bounds()); | 688 EXPECT_NE(node->bounds(), node_in_embedded->bounds()); |
| 691 WaitForBoundsToChange(node_in_embedded); | 689 WaitForBoundsToChange(node_in_embedded); |
| 692 EXPECT_EQ(node->bounds(), node_in_embedded->bounds()); | 690 EXPECT_EQ(node->bounds(), node_in_embedded->bounds()); |
| 693 } | 691 } |
| 694 | 692 |
| 695 // Verifies that bounds changes applied to a node owned by a different | 693 // Verifies that bounds changes applied to a node owned by a different |
| 696 // connection are refused. | 694 // connection are refused. |
| 697 TEST_F(ViewManagerTest, SetBoundsSecurity) { | 695 TEST_F(ViewManagerTest, SetBoundsSecurity) { |
| 698 ViewTreeNode* node = ViewTreeNode::Create(window_manager()); | 696 Node* node = Node::Create(window_manager()); |
| 699 window_manager()->GetRoots().front()->AddChild(node); | 697 window_manager()->GetRoots().front()->AddChild(node); |
| 700 ViewManager* embedded = Embed(window_manager(), node); | 698 ViewManager* embedded = Embed(window_manager(), node); |
| 701 | 699 |
| 702 ViewTreeNode* node_in_embedded = embedded->GetNodeById(node->id()); | 700 Node* node_in_embedded = embedded->GetNodeById(node->id()); |
| 703 node->SetBounds(gfx::Rect(800, 600)); | 701 node->SetBounds(gfx::Rect(800, 600)); |
| 704 WaitForBoundsToChange(node_in_embedded); | 702 WaitForBoundsToChange(node_in_embedded); |
| 705 | 703 |
| 706 node_in_embedded->SetBounds(gfx::Rect(1024, 768)); | 704 node_in_embedded->SetBounds(gfx::Rect(1024, 768)); |
| 707 // Bounds change should have been rejected. | 705 // Bounds change should have been rejected. |
| 708 EXPECT_EQ(node->bounds(), node_in_embedded->bounds()); | 706 EXPECT_EQ(node->bounds(), node_in_embedded->bounds()); |
| 709 } | 707 } |
| 710 | 708 |
| 711 // Verifies that a node can only be destroyed by the connection that created it. | 709 // Verifies that a node can only be destroyed by the connection that created it. |
| 712 TEST_F(ViewManagerTest, DestroySecurity) { | 710 TEST_F(ViewManagerTest, DestroySecurity) { |
| 713 ViewTreeNode* node = ViewTreeNode::Create(window_manager()); | 711 Node* node = Node::Create(window_manager()); |
| 714 window_manager()->GetRoots().front()->AddChild(node); | 712 window_manager()->GetRoots().front()->AddChild(node); |
| 715 ViewManager* embedded = Embed(window_manager(), node); | 713 ViewManager* embedded = Embed(window_manager(), node); |
| 716 | 714 |
| 717 ViewTreeNode* node_in_embedded = embedded->GetNodeById(node->id()); | 715 Node* node_in_embedded = embedded->GetNodeById(node->id()); |
| 718 | 716 |
| 719 NodeTracker tracker2(node_in_embedded); | 717 NodeTracker tracker2(node_in_embedded); |
| 720 node_in_embedded->Destroy(); | 718 node_in_embedded->Destroy(); |
| 721 // Node should not have been destroyed. | 719 // Node should not have been destroyed. |
| 722 EXPECT_TRUE(tracker2.is_valid()); | 720 EXPECT_TRUE(tracker2.is_valid()); |
| 723 | 721 |
| 724 NodeTracker tracker1(node); | 722 NodeTracker tracker1(node); |
| 725 node->Destroy(); | 723 node->Destroy(); |
| 726 EXPECT_FALSE(tracker1.is_valid()); | 724 EXPECT_FALSE(tracker1.is_valid()); |
| 727 } | 725 } |
| 728 | 726 |
| 729 TEST_F(ViewManagerTest, MultiRoots) { | 727 TEST_F(ViewManagerTest, MultiRoots) { |
| 730 ViewTreeNode* node1 = ViewTreeNode::Create(window_manager()); | 728 Node* node1 = Node::Create(window_manager()); |
| 731 window_manager()->GetRoots().front()->AddChild(node1); | 729 window_manager()->GetRoots().front()->AddChild(node1); |
| 732 ViewTreeNode* node2 = ViewTreeNode::Create(window_manager()); | 730 Node* node2 = Node::Create(window_manager()); |
| 733 window_manager()->GetRoots().front()->AddChild(node2); | 731 window_manager()->GetRoots().front()->AddChild(node2); |
| 734 ViewManager* embedded1 = Embed(window_manager(), node1); | 732 ViewManager* embedded1 = Embed(window_manager(), node1); |
| 735 ViewManager* embedded2 = Embed(window_manager(), node2); | 733 ViewManager* embedded2 = Embed(window_manager(), node2); |
| 736 EXPECT_EQ(embedded1, embedded2); | 734 EXPECT_EQ(embedded1, embedded2); |
| 737 } | 735 } |
| 738 | 736 |
| 739 TEST_F(ViewManagerTest, EmbeddingIdentity) { | 737 TEST_F(ViewManagerTest, EmbeddingIdentity) { |
| 740 ViewTreeNode* node = ViewTreeNode::Create(window_manager()); | 738 Node* node = Node::Create(window_manager()); |
| 741 window_manager()->GetRoots().front()->AddChild(node); | 739 window_manager()->GetRoots().front()->AddChild(node); |
| 742 ViewManager* embedded = Embed(window_manager(), node); | 740 ViewManager* embedded = Embed(window_manager(), node); |
| 743 EXPECT_EQ(kWindowManagerURL, embedded->GetEmbedderURL()); | 741 EXPECT_EQ(kWindowManagerURL, embedded->GetEmbedderURL()); |
| 744 } | 742 } |
| 745 | 743 |
| 746 TEST_F(ViewManagerTest, Reorder) { | 744 TEST_F(ViewManagerTest, Reorder) { |
| 747 ViewTreeNode* node1 = ViewTreeNode::Create(window_manager()); | 745 Node* node1 = Node::Create(window_manager()); |
| 748 window_manager()->GetRoots().front()->AddChild(node1); | 746 window_manager()->GetRoots().front()->AddChild(node1); |
| 749 | 747 |
| 750 ViewTreeNode* node11 = ViewTreeNode::Create(window_manager()); | 748 Node* node11 = Node::Create(window_manager()); |
| 751 node1->AddChild(node11); | 749 node1->AddChild(node11); |
| 752 ViewTreeNode* node12 = ViewTreeNode::Create(window_manager()); | 750 Node* node12 = Node::Create(window_manager()); |
| 753 node1->AddChild(node12); | 751 node1->AddChild(node12); |
| 754 | 752 |
| 755 ViewManager* embedded = Embed(window_manager(), node1); | 753 ViewManager* embedded = Embed(window_manager(), node1); |
| 756 | 754 |
| 757 ViewTreeNode* node1_in_embedded = embedded->GetNodeById(node1->id()); | 755 Node* node1_in_embedded = embedded->GetNodeById(node1->id()); |
| 758 | 756 |
| 759 { | 757 { |
| 760 node11->MoveToFront(); | 758 node11->MoveToFront(); |
| 761 WaitForOrderChange(embedded, embedded->GetNodeById(node11->id())); | 759 WaitForOrderChange(embedded, embedded->GetNodeById(node11->id())); |
| 762 | 760 |
| 763 EXPECT_EQ(node1_in_embedded->children().front(), | 761 EXPECT_EQ(node1_in_embedded->children().front(), |
| 764 embedded->GetNodeById(node12->id())); | 762 embedded->GetNodeById(node12->id())); |
| 765 EXPECT_EQ(node1_in_embedded->children().back(), | 763 EXPECT_EQ(node1_in_embedded->children().back(), |
| 766 embedded->GetNodeById(node11->id())); | 764 embedded->GetNodeById(node11->id())); |
| 767 } | 765 } |
| 768 | 766 |
| 769 { | 767 { |
| 770 node11->MoveToBack(); | 768 node11->MoveToBack(); |
| 771 WaitForOrderChange(embedded, embedded->GetNodeById(node11->id())); | 769 WaitForOrderChange(embedded, embedded->GetNodeById(node11->id())); |
| 772 | 770 |
| 773 EXPECT_EQ(node1_in_embedded->children().front(), | 771 EXPECT_EQ(node1_in_embedded->children().front(), |
| 774 embedded->GetNodeById(node11->id())); | 772 embedded->GetNodeById(node11->id())); |
| 775 EXPECT_EQ(node1_in_embedded->children().back(), | 773 EXPECT_EQ(node1_in_embedded->children().back(), |
| 776 embedded->GetNodeById(node12->id())); | 774 embedded->GetNodeById(node12->id())); |
| 777 } | 775 } |
| 778 } | 776 } |
| 779 | 777 |
| 780 } // namespace view_manager | 778 } // namespace view_manager |
| 781 } // namespace mojo | 779 } // namespace mojo |
| OLD | NEW |