view_manager_unittest.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file.
4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "mojo/services/public/cpp/view_manager/view_manager.h"
6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/bind.h"
8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/logging.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "mojo/services/public/cpp/view_manager/lib/view_manager_private.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.h"
11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "mojo/services/public/cpp/view_manager/lib/view_tree_node_private.h"
12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "mojo/services/public/cpp/view_manager/util.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "mojo/services/public/cpp/view_manager/view.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "mojo/services/public/cpp/view_manager/view_observer.h"
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "mojo/services/public/cpp/view_manager/view_tree_node_observer.h"
16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "mojo/shell/shell_test_helper.h"
17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace mojo {
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace view_manager {
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)base::RunLoop* current_run_loop = NULL;
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void DoRunLoop() {
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::RunLoop run_loop;
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  current_run_loop = &run_loop;
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  current_run_loop->Run();
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  current_run_loop = NULL;
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void QuitRunLoop() {
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  current_run_loop->Quit();
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void QuitRunLoopOnChangesAcked() {
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  QuitRunLoop();
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WaitForAllChangesToBeAcked(ViewManager* manager) {
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewManagerPrivate(manager).synchronizer()->set_changes_acked_callback(
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Bind(&QuitRunLoopOnChangesAcked));
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DoRunLoop();
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewManagerPrivate(manager).synchronizer()->ClearChangesAckedCallback();
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ActiveViewChangedObserver : public ViewTreeNodeObserver {
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  explicit ActiveViewChangedObserver(ViewTreeNode* node)
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      : node_(node) {}
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~ActiveViewChangedObserver() {}
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Overridden from ViewTreeNodeObserver:
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnNodeActiveViewChange(ViewTreeNode* node,
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      View* old_view,
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      View* new_view,
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      DispositionChangePhase phase) OVERRIDE {
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK_EQ(node, node_);
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    QuitRunLoop();
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewTreeNode* node_;
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ActiveViewChangedObserver);
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Waits until the active view id of the supplied node changes.
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WaitForActiveViewToChange(ViewTreeNode* node) {
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ActiveViewChangedObserver observer(node);
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  node->AddObserver(&observer);
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DoRunLoop();
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  node->RemoveObserver(&observer);
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class BoundsChangeObserver : public ViewTreeNodeObserver {
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  explicit BoundsChangeObserver(ViewTreeNode* node) : node_(node) {}
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~BoundsChangeObserver() {}
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Overridden from ViewTreeNodeObserver:
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnNodeBoundsChange(ViewTreeNode* node,
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  const gfx::Rect& old_bounds,
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  const gfx::Rect& new_bounds,
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  DispositionChangePhase phase) OVERRIDE {
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK_EQ(node, node_);
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (phase != ViewTreeNodeObserver::DISPOSITION_CHANGED)
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    QuitRunLoop();
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewTreeNode* node_;
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BoundsChangeObserver);
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Wait until the bounds of the supplied node change.
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WaitForBoundsToChange(ViewTreeNode* node) {
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BoundsChangeObserver observer(node);
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  node->AddObserver(&observer);
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DoRunLoop();
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  node->RemoveObserver(&observer);
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Spins a runloop until the tree beginning at |root| has |tree_size| nodes
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// (including |root|).
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class TreeSizeMatchesObserver : public ViewTreeNodeObserver {
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TreeSizeMatchesObserver(ViewTreeNode* tree, size_t tree_size)
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      : tree_(tree),
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        tree_size_(tree_size) {}
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~TreeSizeMatchesObserver() {}
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool IsTreeCorrectSize() {
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return CountNodes(tree_) == tree_size_;
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Overridden from ViewTreeNodeObserver:
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnTreeChange(const TreeChangeParams& params) OVERRIDE {
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (params.phase != ViewTreeNodeObserver::DISPOSITION_CHANGED)
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (IsTreeCorrectSize())
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      QuitRunLoop();
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  size_t CountNodes(const ViewTreeNode* node) const {
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    size_t count = 1;
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ViewTreeNode::Children::const_iterator it = node->children().begin();
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for (; it != node->children().end(); ++it)
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      count += CountNodes(*it);
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return count;
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewTreeNode* tree_;
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  size_t tree_size_;
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TreeSizeMatchesObserver);
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WaitForTreeSizeToMatch(ViewTreeNode* node, size_t tree_size) {
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TreeSizeMatchesObserver observer(node, tree_size);
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (observer.IsTreeCorrectSize())
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  node->AddObserver(&observer);
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DoRunLoop();
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  node->RemoveObserver(&observer);
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Utility class that waits for the destruction of some number of nodes and
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// views.
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class DestructionObserver : public ViewTreeNodeObserver,
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            public ViewObserver {
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // |nodes| or |views| can be NULL.
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DestructionObserver(std::set<TransportNodeId>* nodes,
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                      std::set<TransportViewId>* views)
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      : nodes_(nodes),
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        views_(views) {}
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Overridden from ViewTreeNodeObserver:
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnNodeDestroy(
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ViewTreeNode* node,
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ViewTreeNodeObserver::DispositionChangePhase phase) OVERRIDE {
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (phase != ViewTreeNodeObserver::DISPOSITION_CHANGED)
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::set<TransportNodeId>::const_iterator it = nodes_->find(node->id());
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (it != nodes_->end())
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      nodes_->erase(it);
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (CanQuit())
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      QuitRunLoop();
174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Overridden from ViewObserver:
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnViewDestroy(
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      View* view,
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ViewObserver::DispositionChangePhase phase) OVERRIDE {
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (phase != ViewObserver::DISPOSITION_CHANGED)
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::set<TransportViewId>::const_iterator it = views_->find(view->id());
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (it != views_->end())
184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      views_->erase(it);
185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (CanQuit())
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      QuitRunLoop();
187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool CanQuit() {
190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return (!nodes_ || nodes_->empty()) && (!views_ || views_->empty());
191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::set<TransportNodeId>* nodes_;
194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::set<TransportViewId>* views_;
195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DestructionObserver);
197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WaitForDestruction(ViewManager* view_manager,
200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        std::set<TransportNodeId>* nodes,
201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        std::set<TransportViewId>* views) {
202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DestructionObserver observer(nodes, views);
203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(nodes || views);
204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (nodes) {
205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for (std::set<TransportNodeId>::const_iterator it = nodes->begin();
206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          it != nodes->end(); ++it) {
207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      view_manager->GetNodeById(*it)->AddObserver(&observer);
208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (views) {
211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for (std::set<TransportViewId>::const_iterator it = views->begin();
212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          it != views->end(); ++it) {
213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      view_manager->GetViewById(*it)->AddObserver(&observer);
214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DoRunLoop();
217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Tracks a node's destruction. Query is_valid() for current state.
220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class NodeTracker : public ViewTreeNodeObserver {
221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  explicit NodeTracker(ViewTreeNode* node) : node_(node) {
223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    node_->AddObserver(this);
224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~NodeTracker() {
226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (node_)
227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      node_->RemoveObserver(this);
228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool is_valid() const { return !!node_; }
231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Overridden from ViewTreeNodeObserver:
234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnNodeDestroy(
235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ViewTreeNode* node,
236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ViewTreeNodeObserver::DispositionChangePhase phase) OVERRIDE {
237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (phase != ViewTreeNodeObserver::DISPOSITION_CHANGED)
238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK_EQ(node, node_);
240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    node_ = NULL;
241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int id_;
244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewTreeNode* node_;
245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NodeTracker);
247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace
250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
251010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// ViewManager -----------------------------------------------------------------
252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2530de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)// These tests model synchronization of two peer connections to the view manager
2540de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)// service, that are given access to some root node.
2550de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class ViewManagerTest : public testing::Test {
257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public:
258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ViewManagerTest() : commit_count_(0) {}
259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) protected:
261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ViewManager* view_manager_1() { return view_manager_1_.get(); }
262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ViewManager* view_manager_2() { return view_manager_2_.get(); }
263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2640de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  ViewTreeNode* CreateNodeInParent(ViewTreeNode* parent) {
265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ViewManager* parent_manager = ViewTreeNodePrivate(parent).view_manager();
2660de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    ViewTreeNode* node = ViewTreeNode::Create(parent_manager);
2670de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    parent->AddChild(node);
2680de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    return node;
2690de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  }
2700de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
2710de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  void DestroyViewManager1() {
2720de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    view_manager_1_.reset();
273010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private:
276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Overridden from testing::Test:
277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    test_helper_.Init();
279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    view_manager_1_.reset(new ViewManager(test_helper_.service_provider()));
280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    view_manager_2_.reset(new ViewManager(test_helper_.service_provider()));
281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    view_manager_1_->Init();
282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    view_manager_2_->Init();
283010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::MessageLoop loop_;
286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  shell::ShellTestHelper test_helper_;
287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<ViewManager> view_manager_1_;
288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<ViewManager> view_manager_2_;
289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  int commit_count_;
290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ViewManagerTest);
292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Base class for helpers that quit the current runloop after a specific tree
295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// change is observed by a view manager.
296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class TreeObserverBase : public ViewTreeNodeObserver {
297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public:
298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  explicit TreeObserverBase(ViewManager* view_manager)
299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      : view_manager_(view_manager) {
300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    view_manager_->tree()->AddObserver(this);
301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ~TreeObserverBase() {
303010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    view_manager_->tree()->RemoveObserver(this);
304010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) protected:
307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual bool ShouldQuitRunLoop(const TreeChangeParams& params) = 0;
308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ViewManager* view_manager() { return view_manager_; }
310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private:
312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Overridden from ViewTreeNodeObserver:
313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void OnTreeChange(const TreeChangeParams& params) OVERRIDE {
314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (ShouldQuitRunLoop(params))
315010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      QuitRunLoop();
316010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
317010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ViewManager* view_manager_;
319010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TreeObserverBase);
320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class HierarchyChanged_NodeCreatedObserver : public TreeObserverBase {
323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public:
324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  explicit HierarchyChanged_NodeCreatedObserver(ViewManager* view_manager)
325010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      : TreeObserverBase(view_manager) {}
326010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ~HierarchyChanged_NodeCreatedObserver() {}
327010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
328010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private:
329010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Overridden from TreeObserverBase:
330010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual bool ShouldQuitRunLoop(const TreeChangeParams& params) OVERRIDE {
3310de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    if (params.phase != ViewTreeNodeObserver::DISPOSITION_CHANGED)
3320de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)      return false;
333010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return params.receiver == view_manager()->tree() &&
334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        !params.old_parent &&
335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        params.new_parent == view_manager()->tree();
336010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(HierarchyChanged_NodeCreatedObserver);
339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// TODO(beng): reenable these once converted to new way of connecting.
342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ViewManagerTest, DISABLED_HierarchyChanged_NodeCreated) {
344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  HierarchyChanged_NodeCreatedObserver observer(view_manager_2());
3450de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  ViewTreeNode* node1 = ViewTreeNode::Create(view_manager_1());
3460de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  view_manager_1()->tree()->AddChild(node1);
347010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoRunLoop();
348010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(view_manager_2()->tree()->children().front()->id(), node1->id());
350010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
352010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Quits the current runloop when the root is notified about a node moved from
353010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// |old_parent_id| to |new_parent_id|.
354010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class HierarchyChanged_NodeMovedObserver : public TreeObserverBase {
355010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public:
356010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  HierarchyChanged_NodeMovedObserver(ViewManager* view_manager,
357010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     TransportNodeId old_parent_id,
358010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     TransportNodeId new_parent_id)
359010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      : TreeObserverBase(view_manager),
360010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        old_parent_id_(old_parent_id),
361010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        new_parent_id_(new_parent_id) {}
362010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ~HierarchyChanged_NodeMovedObserver() {}
363010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
364010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private:
365010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Overridden from TreeObserverBase:
366010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual bool ShouldQuitRunLoop(const TreeChangeParams& params) OVERRIDE {
3670de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    if (params.phase != ViewTreeNodeObserver::DISPOSITION_CHANGED)
3680de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)      return false;
369010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return params.receiver == view_manager()->tree() &&
370010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        params.old_parent->id() == old_parent_id_&&
371010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        params.new_parent->id() == new_parent_id_;
372010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
373010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
374010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TransportNodeId old_parent_id_;
375010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TransportNodeId new_parent_id_;
376010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
377010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(HierarchyChanged_NodeMovedObserver);
378010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
379010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ViewManagerTest, DISABLED_HierarchyChanged_NodeMoved) {
3810de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  ViewTreeNode* node1 = CreateNodeInParent(view_manager_1()->tree());
3820de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  ViewTreeNode* node2 = CreateNodeInParent(view_manager_1()->tree());
3830de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  ViewTreeNode* node21 = CreateNodeInParent(node2);
384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForTreeSizeToMatch(view_manager_2()->tree(), 4);
385010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
386010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  HierarchyChanged_NodeMovedObserver observer(view_manager_2(),
387010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                              node2->id(),
388010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                              node1->id());
389010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3900de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  node1->AddChild(node21);
391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoRunLoop();
392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ViewTreeNode* tree2 = view_manager_2()->tree();
394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
395010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(tree2->children().size(), 2u);
396010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ViewTreeNode* tree2_node1 = tree2->GetChildById(node1->id());
397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(tree2_node1->children().size(), 1u);
398010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ViewTreeNode* tree2_node2 = tree2->GetChildById(node2->id());
399010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(tree2_node2->children().empty());
400010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ViewTreeNode* tree2_node21 = tree2->GetChildById(node21->id());
401010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(tree2_node21->parent(), tree2_node1);
402010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
403010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4040de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)class HierarchyChanged_NodeRemovedObserver : public TreeObserverBase {
4050de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) public:
4060de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  HierarchyChanged_NodeRemovedObserver(ViewManager* view_manager)
4070de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)      : TreeObserverBase(view_manager) {}
4080de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  virtual ~HierarchyChanged_NodeRemovedObserver() {}
4090de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
4100de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) private:
4110de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  // Overridden from TreeObserverBase:
4120de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  virtual bool ShouldQuitRunLoop(const TreeChangeParams& params) OVERRIDE {
4130de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    if (params.phase != ViewTreeNodeObserver::DISPOSITION_CHANGING)
4140de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)      return false;
4150de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    return params.receiver == view_manager()->tree() &&
4160de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)        params.old_parent->id() == params.receiver->id() &&
4170de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)        params.new_parent == 0;
4180de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  }
4190de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
4200de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(HierarchyChanged_NodeRemovedObserver);
4210de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)};
4220de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
423cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ViewManagerTest, DISABLED_HierarchyChanged_NodeRemoved) {
4240de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  ViewTreeNode* node1 = CreateNodeInParent(view_manager_1()->tree());
425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForTreeSizeToMatch(view_manager_2()->tree(), 2);
4260de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
4270de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  HierarchyChanged_NodeRemovedObserver observer(view_manager_2());
4280de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
4290de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  view_manager_1()->tree()->RemoveChild(node1);
4300de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  DoRunLoop();
4310de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
4320de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  ViewTreeNode* tree2 = view_manager_2()->tree();
4330de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
4340de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  EXPECT_TRUE(tree2->children().empty());
4350de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)}
4360de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ViewManagerTest, DISABLED_NodeDestroyed) {
438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewTreeNode* node1 = CreateNodeInParent(view_manager_1()->tree());
439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForTreeSizeToMatch(view_manager_2()->tree(), 2);
4400de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // |node1| will be deleted after calling Destroy() below.
442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TransportNodeId id = node1->id();
443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  node1->Destroy();
4440de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::set<TransportNodeId> nodes;
446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  nodes.insert(id);
447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForDestruction(view_manager_2(), &nodes, NULL);
4480de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
449cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(view_manager_2()->tree()->children().empty());
450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(NULL, view_manager_2()->GetNodeById(id));
451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
4520de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
453cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ViewManagerTest, DISABLED_ViewManagerDestroyed_CleanupNode) {
4540de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  ViewTreeNode* node1 = CreateNodeInParent(view_manager_1()->tree());
455cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForTreeSizeToMatch(view_manager_2()->tree(), 2);
4560de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
4570de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  TransportNodeId id = node1->id();
458cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DestroyViewManager1();
459cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::set<TransportNodeId> nodes;
460cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  nodes.insert(id);
461cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForDestruction(view_manager_2(), &nodes, NULL);
4620de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
463cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // tree() should still be valid, since it's owned by neither connection.
4640de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  EXPECT_TRUE(view_manager_2()->tree()->children().empty());
4650de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)}
4660de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
467cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ViewManagerTest, DISABLED_SetActiveView) {
4680de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  ViewTreeNode* node1 = CreateNodeInParent(view_manager_1()->tree());
469cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForTreeSizeToMatch(view_manager_2()->tree(), 2);
470cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
471cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  View* view1 = View::Create(view_manager_1());
472cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  node1->SetActiveView(view1);
473cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
474cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewTreeNode* node1_2 = view_manager_2()->tree()->GetChildById(node1->id());
475cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForActiveViewToChange(node1_2);
476cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
477cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(node1_2->active_view()->id(), view1->id());
478cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
479cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
480cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ViewManagerTest, DISABLED_DestroyView) {
481cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewTreeNode* node1 = CreateNodeInParent(view_manager_1()->tree());
482cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForTreeSizeToMatch(view_manager_2()->tree(), 2);
483cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
484cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  View* view1 = View::Create(view_manager_1());
485cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  node1->SetActiveView(view1);
486cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
487cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewTreeNode* node1_2 = view_manager_2()->tree()->GetChildById(node1->id());
488cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForActiveViewToChange(node1_2);
489cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
490cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TransportViewId view1_id = view1->id();
491cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  view1->Destroy();
492cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
493cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::set<TransportViewId> views;
494cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  views.insert(view1_id);
495cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForDestruction(view_manager_2(), NULL, &views);
496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(NULL, node1_2->active_view());
497cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(NULL, view_manager_2()->GetViewById(view1_id));
498cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
499cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
500cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Destroying the connection that created a node and view should result in that
501cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// node and view disappearing from all connections that see them.
502cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ViewManagerTest, DISABLED_ViewManagerDestroyed_CleanupNodeAndView) {
503cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewTreeNode* node1 = CreateNodeInParent(view_manager_1()->tree());
504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForTreeSizeToMatch(view_manager_2()->tree(), 2);
505cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
506cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  View* view1 = View::Create(view_manager_1());
507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  node1->SetActiveView(view1);
508cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
509cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewTreeNode* node1_2 = view_manager_2()->tree()->GetChildById(node1->id());
510cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForActiveViewToChange(node1_2);
511cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
512cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TransportNodeId node1_id = node1->id();
513cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TransportViewId view1_id = view1->id();
514cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
515cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DestroyViewManager1();
516cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::set<TransportNodeId> observed_nodes;
517cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  observed_nodes.insert(node1_id);
518cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::set<TransportViewId> observed_views;
519cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  observed_views.insert(view1_id);
520cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForDestruction(view_manager_2(), &observed_nodes, &observed_views);
521cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
522cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // tree() should still be valid, since it's owned by neither connection.
523cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(view_manager_2()->tree()->children().empty());
524cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(NULL, view_manager_2()->GetNodeById(node1_id));
525cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(NULL, view_manager_2()->GetViewById(view1_id));
526cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
527cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
528cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This test validates the following scenario:
529cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// -  a node originating from one connection
530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// -  a view originating from a second connection
531cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// +  the connection originating the node is destroyed
532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// -> the view should still exist (since the second connection is live) but
533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//    should be disconnected from any nodes.
534cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ViewManagerTest,
535cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DISABLED_ViewManagerDestroyed_CleanupNodeAndViewFromDifferentConnections) {
536cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewTreeNode* node1 = CreateNodeInParent(view_manager_1()->tree());
537cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForTreeSizeToMatch(view_manager_2()->tree(), 2);
538cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
539cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  View* view1_2 = View::Create(view_manager_2());
540cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewTreeNode* node1_2 = view_manager_2()->tree()->GetChildById(node1->id());
541cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  node1_2->SetActiveView(view1_2);
542cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForActiveViewToChange(node1);
543cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TransportNodeId node1_id = node1->id();
545cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TransportViewId view1_2_id = view1_2->id();
5460de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
5470de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  DestroyViewManager1();
548cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::set<TransportNodeId> nodes;
549cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  nodes.insert(node1_id);
550cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForDestruction(view_manager_2(), &nodes, NULL);
5510de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
5520de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  // tree() should still be valid, since it's owned by neither connection.
5530de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  EXPECT_TRUE(view_manager_2()->tree()->children().empty());
554cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // node1 was owned by the first connection, so it should be gone.
555cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(NULL, view_manager_2()->GetNodeById(node1_id));
556cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // view1_2 was owned by the second connection, so it should still exist, but
557cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // disconnected from the node tree.
558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  View* another_view1_2 = view_manager_2()->GetViewById(view1_2_id);
559cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(view1_2, another_view1_2);
560cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(NULL, view1_2->node());
561cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
562cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This test verifies that it is not possible to set the active view to a view
564cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// defined in a different connection.
565cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// TODO(beng): write these tests for ViewTreeNode::AddChild(), RemoveChild() and
566cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//             Contains().
567cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ViewManagerTest, DISABLED_SetActiveViewAcrossConnection) {
568cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewTreeNode* node1 = CreateNodeInParent(view_manager_1()->tree());
569cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForTreeSizeToMatch(view_manager_2()->tree(), 2);
570cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
571cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  View* view1_2 = View::Create(view_manager_2());
572cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_DEATH(node1->SetActiveView(view1_2), "");
573cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
574cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
575cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This test verifies that a node hierarchy constructed in one connection
576cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// becomes entirely visible to the second connection when the hierarchy is
577cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// attached.
578cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ViewManagerTest, DISABLED_MapSubtreeOnAttach) {
579cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewTreeNode* node1 = ViewTreeNode::Create(view_manager_1());
580cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewTreeNode* node11 = CreateNodeInParent(node1);
581cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  View* view11 = View::Create(view_manager_1());
582cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  node11->SetActiveView(view11);
583cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Rect node11_bounds(800, 600);
584cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  node11->SetBounds(node11_bounds);
585cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForAllChangesToBeAcked(view_manager_1());
586cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
587cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Now attach this node tree to the root & wait for it to show up in the
588cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // second connection.
589cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  view_manager_1()->tree()->AddChild(node1);
590cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForTreeSizeToMatch(view_manager_2()->tree(), 3);
591cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewTreeNode* node11_2 = view_manager_2()->GetNodeById(node11->id());
593cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  View* view11_2 = view_manager_2()->GetViewById(view11->id());
594cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(node11_2 != NULL);
595cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(view11_2, node11_2->active_view());
596cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(node11_bounds, node11_2->bounds());
597cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
598cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
599cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Verifies that bounds changes applied to a node hierarchy in one connection
600cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// are reflected to another.
601cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ViewManagerTest, DISABLED_SetBounds) {
602cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewTreeNode* node1 = CreateNodeInParent(view_manager_1()->tree());
603cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForTreeSizeToMatch(view_manager_2()->tree(), 2);
604cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
605cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewTreeNode* node1_2 = view_manager_2()->GetNodeById(node1->id());
606cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(node1->bounds(), node1_2->bounds());
607cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
608cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  node1->SetBounds(gfx::Rect(0, 0, 100, 100));
609cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForBoundsToChange(node1_2);
610cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(node1->bounds(), node1_2->bounds());
611cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
612cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
613cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Verifies that bounds changes applied to a node owned by a different
614cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// connection are refused.
615cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ViewManagerTest, DISABLED_SetBoundsSecurity) {
616cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewTreeNode* node1 = CreateNodeInParent(view_manager_1()->tree());
617cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  node1->SetBounds(gfx::Rect(800, 600));
618cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForTreeSizeToMatch(view_manager_2()->tree(), 2);
619cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
620cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewTreeNode* node1_2 = view_manager_2()->GetNodeById(node1->id());
621cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  node1_2->SetBounds(gfx::Rect(1024, 768));
622cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Bounds change should have been rejected.
623cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(node1->bounds(), node1_2->bounds());
624cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
625cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
626cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Verifies that a node can only be destroyed by the connection that created it.
627cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ViewManagerTest, DISABLED_DestroySecurity) {
628cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewTreeNode* node1 = CreateNodeInParent(view_manager_1()->tree());
629cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WaitForTreeSizeToMatch(view_manager_2()->tree(), 2);
630cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
631cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ViewTreeNode* node1_2 = view_manager_2()->GetNodeById(node1->id());
632cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NodeTracker tracker2(node1_2);
633cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  node1_2->Destroy();
634cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Node should not have been destroyed.
635cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(tracker2.is_valid());
636cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
637cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NodeTracker tracker1(node1);
638cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  node1->Destroy();
639cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(tracker1.is_valid());
6400de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)}
641010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
642010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace view_manager
643010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace mojo
644