| 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 0d2642f910064009be154119d4a619286cd8e2bd..8eea829d0dffffc6c39c4aa397b199f5e429dcc3 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
|
| @@ -51,6 +51,30 @@ ViewTreeNode* AddNodeToViewManager(ViewManager* manager,
|
| return node;
|
| }
|
|
|
| +ViewTreeNode* BuildNodeTree(ViewManager* manager,
|
| + const Array<INode>& nodes) {
|
| + std::vector<ViewTreeNode*> parents;
|
| + ViewTreeNode* root = NULL;
|
| + ViewTreeNode* last_node = NULL;
|
| + for (size_t i = 0; i < nodes.size(); ++i) {
|
| + if (last_node && nodes[i].parent_id() == last_node->id()) {
|
| + parents.push_back(last_node);
|
| + } else if (!parents.empty()) {
|
| + while (parents.back()->id() != nodes[i].parent_id())
|
| + parents.pop_back();
|
| + }
|
| + ViewTreeNode* node = AddNodeToViewManager(
|
| + manager,
|
| + !parents.empty() ? parents.back() : NULL,
|
| + nodes[i].node_id(),
|
| + nodes[i].view_id());
|
| + if (!last_node)
|
| + root = node;
|
| + last_node = node;
|
| + }
|
| + return root;
|
| +}
|
| +
|
| class ViewManagerTransaction {
|
| public:
|
| virtual ~ViewManagerTransaction() {}
|
| @@ -63,13 +87,6 @@ class ViewManagerTransaction {
|
|
|
| bool committed() const { return committed_; }
|
|
|
| - // General callback to be used for commits to the service.
|
| - void OnActionCompleted(bool success) {
|
| - DCHECK(success);
|
| - DoActionCompleted(success);
|
| - synchronizer_->RemoveFromPendingQueue(this);
|
| - }
|
| -
|
| protected:
|
| enum TransactionType {
|
| // View creation and destruction.
|
| @@ -105,7 +122,19 @@ class ViewManagerTransaction {
|
| return synchronizer_->next_server_change_id_++;
|
| }
|
|
|
| + base::Callback<void(bool)> ActionCompletedCallback() {
|
| + return base::Bind(&ViewManagerTransaction::OnActionCompleted,
|
| + base::Unretained(this));
|
| + }
|
| +
|
| private:
|
| + // General callback to be used for commits to the service.
|
| + void OnActionCompleted(bool success) {
|
| + DCHECK(success);
|
| + DoActionCompleted(success);
|
| + synchronizer_->RemoveFromPendingQueue(this);
|
| + }
|
| +
|
| const TransactionType transaction_type_;
|
| bool committed_;
|
| ViewManagerSynchronizer* synchronizer_;
|
| @@ -124,10 +153,7 @@ class CreateViewTransaction : public ViewManagerTransaction {
|
| private:
|
| // Overridden from ViewManagerTransaction:
|
| virtual void DoCommit() OVERRIDE {
|
| - service()->CreateView(
|
| - view_id_,
|
| - base::Bind(&ViewManagerTransaction::OnActionCompleted,
|
| - base::Unretained(this)));
|
| + service()->CreateView(view_id_, ActionCompletedCallback());
|
| }
|
| virtual void DoActionCompleted(bool success) OVERRIDE {
|
| // TODO(beng): failure.
|
| @@ -149,10 +175,7 @@ class DestroyViewTransaction : public ViewManagerTransaction {
|
| private:
|
| // Overridden from ViewManagerTransaction:
|
| virtual void DoCommit() OVERRIDE {
|
| - service()->DeleteView(
|
| - view_id_,
|
| - base::Bind(&ViewManagerTransaction::OnActionCompleted,
|
| - base::Unretained(this)));
|
| + service()->DeleteView(view_id_, ActionCompletedCallback());
|
| }
|
| virtual void DoActionCompleted(bool success) OVERRIDE {
|
| // TODO(beng): recovery?
|
| @@ -174,10 +197,7 @@ class CreateViewTreeNodeTransaction : public ViewManagerTransaction {
|
| private:
|
| // Overridden from ViewManagerTransaction:
|
| virtual void DoCommit() OVERRIDE {
|
| - service()->CreateNode(
|
| - node_id_,
|
| - base::Bind(&ViewManagerTransaction::OnActionCompleted,
|
| - base::Unretained(this)));
|
| + service()->CreateNode(node_id_, ActionCompletedCallback());
|
| }
|
| virtual void DoActionCompleted(bool success) OVERRIDE {
|
| // TODO(beng): Failure means we tried to create with an extant id for this
|
| @@ -202,10 +222,7 @@ class DestroyViewTreeNodeTransaction : public ViewManagerTransaction {
|
| private:
|
| // Overridden from ViewManagerTransaction:
|
| virtual void DoCommit() OVERRIDE {
|
| - service()->DeleteNode(
|
| - node_id_,
|
| - base::Bind(&ViewManagerTransaction::OnActionCompleted,
|
| - base::Unretained(this)));
|
| + service()->DeleteNode(node_id_, ActionCompletedCallback());
|
| }
|
| virtual void DoActionCompleted(bool success) OVERRIDE {
|
| // TODO(beng): recovery?
|
| @@ -240,15 +257,13 @@ class HierarchyTransaction : public ViewManagerTransaction {
|
| parent_id_,
|
| child_id_,
|
| GetAndAdvanceNextServerChangeId(),
|
| - base::Bind(&ViewManagerTransaction::OnActionCompleted,
|
| - base::Unretained(this)));
|
| + ActionCompletedCallback());
|
| break;
|
| case TYPE_REMOVE:
|
| service()->RemoveNodeFromParent(
|
| child_id_,
|
| GetAndAdvanceNextServerChangeId(),
|
| - base::Bind(&ViewManagerTransaction::OnActionCompleted,
|
| - base::Unretained(this)));
|
| + ActionCompletedCallback());
|
| break;
|
| }
|
| }
|
| @@ -278,11 +293,7 @@ class SetActiveViewTransaction : public ViewManagerTransaction {
|
| private:
|
| // Overridden from ViewManagerTransaction:
|
| virtual void DoCommit() OVERRIDE {
|
| - service()->SetView(
|
| - node_id_,
|
| - view_id_,
|
| - base::Bind(&ViewManagerTransaction::OnActionCompleted,
|
| - base::Unretained(this)));
|
| + service()->SetView(node_id_, view_id_, ActionCompletedCallback());
|
| }
|
| virtual void DoActionCompleted(bool success) OVERRIDE {
|
| // TODO(beng): recovery?
|
| @@ -394,32 +405,13 @@ void ViewManagerSynchronizer::SetActiveView(TransportNodeId node_id,
|
| void ViewManagerSynchronizer::OnConnectionEstablished(
|
| TransportConnectionId connection_id,
|
| TransportChangeId next_server_change_id,
|
| - const mojo::Array<INode>& nodes) {
|
| + const Array<INode>& nodes) {
|
| connected_ = true;
|
| connection_id_ = connection_id;
|
| next_server_change_id_ = next_server_change_id;
|
|
|
| - ViewManagerPrivate private_manager(view_manager_);
|
| - std::vector<ViewTreeNode*> parents;
|
| - ViewTreeNode* root = NULL;
|
| - ViewTreeNode* last_node = NULL;
|
| - for (size_t i = 0; i < nodes.size(); ++i) {
|
| - if (last_node && nodes[i].parent_id() == last_node->id()) {
|
| - parents.push_back(last_node);
|
| - } else if (!parents.empty()) {
|
| - while (parents.back()->id() != nodes[i].parent_id())
|
| - parents.pop_back();
|
| - }
|
| - ViewTreeNode* node =
|
| - AddNodeToViewManager(view_manager_,
|
| - !parents.empty() ? parents.back() : NULL,
|
| - nodes[i].node_id(),
|
| - nodes[i].view_id());
|
| - if (!last_node)
|
| - root = node;
|
| - last_node = node;
|
| - }
|
| - private_manager.set_root(root);
|
| + ViewManagerPrivate(view_manager_).set_root(
|
| + BuildNodeTree(view_manager_, nodes));
|
| if (init_loop_)
|
| init_loop_->Quit();
|
|
|
| @@ -436,30 +428,15 @@ void ViewManagerSynchronizer::OnNodeHierarchyChanged(
|
| uint32_t new_parent_id,
|
| uint32_t old_parent_id,
|
| TransportChangeId server_change_id,
|
| - const mojo::Array<INode>& nodes) {
|
| + const Array<INode>& nodes) {
|
| // TODO: deal with |nodes|.
|
| next_server_change_id_ = server_change_id + 1;
|
|
|
| - ViewTreeNode* new_parent =
|
| - view_manager_->tree()->GetChildById(new_parent_id);
|
| - ViewTreeNode* old_parent =
|
| - view_manager_->tree()->GetChildById(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_->GetNodeById(node_id);
|
| - DCHECK_EQ(node->parent(), old_parent);
|
| - } else {
|
| - // New node, originating from another connection.
|
| - 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);
|
| -
|
| - // TODO(beng): view changes.
|
| - }
|
| + BuildNodeTree(view_manager_, nodes);
|
| +
|
| + ViewTreeNode* new_parent = view_manager_->GetNodeById(new_parent_id);
|
| + ViewTreeNode* old_parent = view_manager_->GetNodeById(old_parent_id);
|
| + ViewTreeNode* node = view_manager_->GetNodeById(node_id);
|
| if (new_parent)
|
| ViewTreeNodePrivate(new_parent).LocalAddChild(node);
|
| else
|
| @@ -520,6 +497,8 @@ void ViewManagerSynchronizer::RemoveFromPendingQueue(
|
| ViewManagerTransaction* transaction) {
|
| DCHECK_EQ(transaction, pending_transactions_.front());
|
| pending_transactions_.erase(pending_transactions_.begin());
|
| + if (pending_transactions_.empty() && !changes_acked_callback_.is_null())
|
| + changes_acked_callback_.Run();
|
| }
|
|
|
| } // namespace view_manager
|
|
|