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

Side by Side Diff: mojo/services/public/cpp/view_manager/lib/view_tree_node.cc

Issue 274733004: Deletion/ownership (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "mojo/services/public/cpp/view_manager/view_tree_node.h" 5 #include "mojo/services/public/cpp/view_manager/view_tree_node.h"
6 6
7 #include "mojo/services/public/cpp/view_manager/lib/view_manager_private.h" 7 #include "mojo/services/public/cpp/view_manager/lib/view_manager_private.h"
8 #include "mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.h" 8 #include "mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.h"
9 #include "mojo/services/public/cpp/view_manager/lib/view_tree_node_private.h" 9 #include "mojo/services/public/cpp/view_manager/lib/view_tree_node_private.h"
10 #include "mojo/services/public/cpp/view_manager/view_tree_node_observer.h" 10 #include "mojo/services/public/cpp/view_manager/view_tree_node_observer.h"
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 std::find(children->begin(), children->end(), child); 83 std::find(children->begin(), children->end(), child);
84 if (it != children->end()) { 84 if (it != children->end()) {
85 children->erase(it); 85 children->erase(it);
86 ViewTreeNodePrivate(child).ClearParent(); 86 ViewTreeNodePrivate(child).ClearParent();
87 } 87 }
88 } 88 }
89 89
90 //////////////////////////////////////////////////////////////////////////////// 90 ////////////////////////////////////////////////////////////////////////////////
91 // ViewTreeNode, public: 91 // ViewTreeNode, public:
92 92
93 ViewTreeNode::ViewTreeNode() 93 // static
94 : manager_(NULL), 94 ViewTreeNode* ViewTreeNode::Create(ViewManager* view_manager) {
95 id_(-1), 95 ViewTreeNode* node = new ViewTreeNode(view_manager);
96 owned_by_parent_(true), 96 ViewManagerPrivate(view_manager).AddNode(node->id(), node);
97 parent_(NULL) {} 97 return node;
98 }
98 99
99 ViewTreeNode::ViewTreeNode(ViewManager* manager) 100 void ViewTreeNode::Destroy() {
100 : manager_(manager),
101 id_(ViewManagerPrivate(manager).synchronizer()->CreateViewTreeNode()),
102 owned_by_parent_(true),
103 parent_(NULL) {}
104
105 ViewTreeNode::~ViewTreeNode() {
106 while (!children_.empty()) {
107 ViewTreeNode* child = children_.front();
108 if (child->owned_by_parent_) {
109 delete child;
110 // Deleting the child also removes it from our child list.
111 DCHECK(std::find(children_.begin(), children_.end(), child) ==
112 children_.end());
113 } else {
114 RemoveChild(child);
115 }
116 }
117
118 if (parent_)
119 parent_->RemoveChild(this);
120
121 if (manager_) 101 if (manager_)
122 ViewManagerPrivate(manager_).synchronizer()->DestroyViewTreeNode(id_); 102 ViewManagerPrivate(manager_).synchronizer()->DestroyViewTreeNode(id_);
103 while (!children_.empty())
104 children_.front()->Destroy();
105 LocalDestroy();
123 } 106 }
124 107
125 void ViewTreeNode::AddObserver(ViewTreeNodeObserver* observer) { 108 void ViewTreeNode::AddObserver(ViewTreeNodeObserver* observer) {
126 observers_.AddObserver(observer); 109 observers_.AddObserver(observer);
127 } 110 }
128 111
129 void ViewTreeNode::RemoveObserver(ViewTreeNodeObserver* observer) { 112 void ViewTreeNode::RemoveObserver(ViewTreeNodeObserver* observer) {
130 observers_.RemoveObserver(observer); 113 observers_.RemoveObserver(observer);
131 } 114 }
132 115
(...skipping 24 matching lines...) Expand all
157 Children::const_iterator it = children_.begin(); 140 Children::const_iterator it = children_.begin();
158 for (; it != children_.end(); ++it) { 141 for (; it != children_.end(); ++it) {
159 ViewTreeNode* node = (*it)->GetChildById(id); 142 ViewTreeNode* node = (*it)->GetChildById(id);
160 if (node) 143 if (node)
161 return node; 144 return node;
162 } 145 }
163 return NULL; 146 return NULL;
164 } 147 }
165 148
166 //////////////////////////////////////////////////////////////////////////////// 149 ////////////////////////////////////////////////////////////////////////////////
150 // ViewTreeNode, protected:
151
152 ViewTreeNode::ViewTreeNode()
153 : manager_(NULL),
154 id_(-1),
155 parent_(NULL) {}
156
157 ViewTreeNode::~ViewTreeNode() {
158 FOR_EACH_OBSERVER(
159 ViewTreeNodeObserver,
160 observers_,
161 OnNodeDestroy(this, ViewTreeNodeObserver::DISPOSITION_CHANGING));
162 if (parent_)
163 parent_->LocalRemoveChild(this);
164 FOR_EACH_OBSERVER(
165 ViewTreeNodeObserver,
166 observers_,
167 OnNodeDestroy(this, ViewTreeNodeObserver::DISPOSITION_CHANGED));
168 if (manager_)
169 ViewManagerPrivate(manager_).RemoveNode(id_);
170 }
171
172 ////////////////////////////////////////////////////////////////////////////////
167 // ViewTreeNode, private: 173 // ViewTreeNode, private:
168 174
175 ViewTreeNode::ViewTreeNode(ViewManager* manager)
176 : manager_(manager),
177 id_(ViewManagerPrivate(manager).synchronizer()->CreateViewTreeNode()),
178 parent_(NULL) {}
179
180 void ViewTreeNode::LocalDestroy() {
181 delete this;
182 }
183
169 void ViewTreeNode::LocalAddChild(ViewTreeNode* child) { 184 void ViewTreeNode::LocalAddChild(ViewTreeNode* child) {
170 ScopedTreeNotifier notifier(child, child->parent(), this); 185 ScopedTreeNotifier notifier(child, child->parent(), this);
171 if (child->parent()) 186 if (child->parent())
172 RemoveChildImpl(child, &child->parent_->children_); 187 RemoveChildImpl(child, &child->parent_->children_);
173 children_.push_back(child); 188 children_.push_back(child);
174 child->parent_ = this; 189 child->parent_ = this;
175 } 190 }
176 191
177 void ViewTreeNode::LocalRemoveChild(ViewTreeNode* child) { 192 void ViewTreeNode::LocalRemoveChild(ViewTreeNode* child) {
178 DCHECK_EQ(this, child->parent()); 193 DCHECK_EQ(this, child->parent());
179 ScopedTreeNotifier(child, this, NULL); 194 ScopedTreeNotifier(child, this, NULL);
180 RemoveChildImpl(child, &children_); 195 RemoveChildImpl(child, &children_);
181 } 196 }
182 197
183 } // namespace view_manager 198 } // namespace view_manager
184 } // namespace services 199 } // namespace services
185 } // namespace mojo 200 } // namespace mojo
186 201
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698