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

Unified 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 side-by-side diff with in-line comments
Download patch
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())

Powered by Google App Engine
This is Rietveld 408576698