| 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();
|
| }
|
|
|