Index: mojo/services/public/cpp/view_manager/lib/view_tree_node.cc |
diff --git a/mojo/services/public/cpp/view_manager/lib/view_tree_node.cc b/mojo/services/public/cpp/view_manager/lib/view_tree_node.cc |
index 33d90a9bb6a258382fe6444e34acde6bd13c8a8c..74e88a96bf076d06d9300554ccf12cc258429f97 100644 |
--- a/mojo/services/public/cpp/view_manager/lib/view_tree_node.cc |
+++ b/mojo/services/public/cpp/view_manager/lib/view_tree_node.cc |
@@ -90,36 +90,19 @@ void RemoveChildImpl(ViewTreeNode* child, ViewTreeNode::Children* children) { |
//////////////////////////////////////////////////////////////////////////////// |
// ViewTreeNode, public: |
-ViewTreeNode::ViewTreeNode() |
- : manager_(NULL), |
- id_(-1), |
- owned_by_parent_(true), |
- parent_(NULL) {} |
- |
-ViewTreeNode::ViewTreeNode(ViewManager* manager) |
- : manager_(manager), |
- id_(ViewManagerPrivate(manager).synchronizer()->CreateViewTreeNode()), |
- owned_by_parent_(true), |
- parent_(NULL) {} |
- |
-ViewTreeNode::~ViewTreeNode() { |
- while (!children_.empty()) { |
- ViewTreeNode* child = children_.front(); |
- if (child->owned_by_parent_) { |
- delete child; |
- // Deleting the child also removes it from our child list. |
- DCHECK(std::find(children_.begin(), children_.end(), child) == |
- children_.end()); |
- } else { |
- RemoveChild(child); |
- } |
- } |
- |
- if (parent_) |
- parent_->RemoveChild(this); |
+// static |
+ViewTreeNode* ViewTreeNode::Create(ViewManager* view_manager) { |
+ ViewTreeNode* node = new ViewTreeNode(view_manager); |
+ ViewManagerPrivate(view_manager).AddNode(node->id(), node); |
+ return node; |
+} |
+void ViewTreeNode::Destroy() { |
if (manager_) |
ViewManagerPrivate(manager_).synchronizer()->DestroyViewTreeNode(id_); |
+ while (!children_.empty()) |
+ children_.front()->Destroy(); |
+ LocalDestroy(); |
} |
void ViewTreeNode::AddObserver(ViewTreeNodeObserver* observer) { |
@@ -164,8 +147,40 @@ ViewTreeNode* ViewTreeNode::GetChildById(TransportNodeId id) { |
} |
//////////////////////////////////////////////////////////////////////////////// |
+// ViewTreeNode, protected: |
+ |
+ViewTreeNode::ViewTreeNode() |
+ : manager_(NULL), |
+ id_(-1), |
+ parent_(NULL) {} |
+ |
+ViewTreeNode::~ViewTreeNode() { |
+ FOR_EACH_OBSERVER( |
+ ViewTreeNodeObserver, |
+ observers_, |
+ OnNodeDestroy(this, ViewTreeNodeObserver::DISPOSITION_CHANGING)); |
+ if (parent_) |
+ parent_->LocalRemoveChild(this); |
+ FOR_EACH_OBSERVER( |
+ ViewTreeNodeObserver, |
+ observers_, |
+ OnNodeDestroy(this, ViewTreeNodeObserver::DISPOSITION_CHANGED)); |
+ if (manager_) |
+ ViewManagerPrivate(manager_).RemoveNode(id_); |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
// ViewTreeNode, private: |
+ViewTreeNode::ViewTreeNode(ViewManager* manager) |
+ : manager_(manager), |
+ id_(ViewManagerPrivate(manager).synchronizer()->CreateViewTreeNode()), |
+ parent_(NULL) {} |
+ |
+void ViewTreeNode::LocalDestroy() { |
+ delete this; |
+} |
+ |
void ViewTreeNode::LocalAddChild(ViewTreeNode* child) { |
ScopedTreeNotifier notifier(child, child->parent(), this); |
if (child->parent()) |