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

Unified Diff: mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.cc

Issue 290703002: Map new subtrees when they are attached to the node hierarchy visible to a connection. (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 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

Powered by Google App Engine
This is Rietveld 408576698