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

Unified Diff: mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.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_manager_synchronizer.cc
diff --git a/mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.cc b/mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.cc
index 1f82fd80ab137e4a685f91ebd86f5801bf9a8afd..793255c511c39240aba3bc2bb1f357a19a7125e1 100644
--- a/mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.cc
+++ b/mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.cc
@@ -185,6 +185,7 @@ ViewManagerSynchronizer::ViewManagerSynchronizer(ViewManager* view_manager)
connection_id_(0),
next_id_(1),
next_change_id_(0),
+ sync_factory_(this),
init_loop_(NULL) {
InterfacePipe<services::view_manager::IViewManager, AnyInterface>
view_manager_pipe;
@@ -204,6 +205,7 @@ ViewManagerSynchronizer::ViewManagerSynchronizer(ViewManager* view_manager)
}
ViewManagerSynchronizer::~ViewManagerSynchronizer() {
+ DoSync();
}
TransportNodeId ViewManagerSynchronizer::CreateViewTreeNode() {
@@ -243,6 +245,10 @@ void ViewManagerSynchronizer::RemoveChild(TransportNodeId child_id,
ScheduleSync();
}
+bool ViewManagerSynchronizer::OwnsNode(TransportNodeId id) const {
+ return HiWord(id) == connection_id_;
+}
+
////////////////////////////////////////////////////////////////////////////////
// ViewManagerSynchronizer, IViewManagerClient implementation:
@@ -257,24 +263,26 @@ void ViewManagerSynchronizer::OnNodeHierarchyChanged(uint32_t node_id,
uint32_t old_parent_id,
uint32_t change_id) {
if (change_id == 0) {
- ViewTreeNode* new_parent =
- view_manager_->tree()->GetChildById(new_parent_id);
- ViewTreeNode* old_parent =
- view_manager_->tree()->GetChildById(old_parent_id);
+ ViewTreeNode* new_parent = view_manager_->GetNodeById(new_parent_id);
+ ViewTreeNode* old_parent = view_manager_->GetNodeById(old_parent_id);
ViewTreeNode* node = NULL;
if (old_parent) {
// Existing node, mapped in this connection's tree.
// TODO(beng): verify this is actually true.
- node = view_manager_->tree()->GetChildById(node_id);
+ node = view_manager_->GetNodeById(node_id);
DCHECK_EQ(node->parent(), old_parent);
} else {
// New node, originating from another connection.
- node = new ViewTreeNode;
+ node = ViewTreeNodePrivate::LocalCreate();
ViewTreeNodePrivate private_node(node);
private_node.set_view_manager(view_manager_);
private_node.set_id(node_id);
+ ViewManagerPrivate(view_manager_).AddNode(node->id(), node);
}
- ViewTreeNodePrivate(new_parent).LocalAddChild(node);
+ if (new_parent)
+ ViewTreeNodePrivate(new_parent).LocalAddChild(node);
+ else
+ ViewTreeNodePrivate(old_parent).LocalRemoveChild(node);
}
}
@@ -285,13 +293,24 @@ void ViewManagerSynchronizer::OnNodeViewReplaced(uint32_t node,
// ..
}
+void ViewManagerSynchronizer::OnNodeDeleted(uint32_t node_id,
+ uint32_t change_id) {
+ if (change_id == 0) {
+ ViewTreeNode* node = view_manager_->GetNodeById(node_id);
+ if (node)
+ ViewTreeNodePrivate(node).LocalDestroy();
+ }
+}
+
////////////////////////////////////////////////////////////////////////////////
// ViewManagerSynchronizer, private:
void ViewManagerSynchronizer::ScheduleSync() {
+ if (sync_factory_.HasWeakPtrs())
+ return;
base::MessageLoop::current()->PostTask(
FROM_HERE,
- base::Bind(&ViewManagerSynchronizer::DoSync, base::Unretained(this)));
+ base::Bind(&ViewManagerSynchronizer::DoSync, sync_factory_.GetWeakPtr()));
}
void ViewManagerSynchronizer::DoSync() {
@@ -336,7 +355,7 @@ void ViewManagerSynchronizer::OnRootTreeReceived(
}
// We don't use the ctor that takes a ViewManager here, since it will call
// back to the service and attempt to create a new node.
- ViewTreeNode* node = new ViewTreeNode;
+ ViewTreeNode* node = ViewTreeNodePrivate::LocalCreate();
ViewTreeNodePrivate private_node(node);
private_node.set_view_manager(view_manager_);
private_node.set_id(nodes[i].node_id());
@@ -345,8 +364,9 @@ void ViewManagerSynchronizer::OnRootTreeReceived(
if (!last_node)
root = node;
last_node = node;
+ ViewManagerPrivate(view_manager_).AddNode(node->id(), node);
}
- ViewManagerPrivate(view_manager_).SetRoot(root);
+ ViewManagerPrivate(view_manager_).set_root(root);
if (init_loop_)
init_loop_->Quit();
}

Powered by Google App Engine
This is Rietveld 408576698