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 |