Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(184)

Side by Side Diff: mojo/services/public/cpp/view_manager/tests/view_manager_unittest.cc

Issue 338093008: Client side name cleanup (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698