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