| Index: mojo/services/view_manager/view_manager_connection.cc
|
| diff --git a/mojo/services/view_manager/view_manager_connection.cc b/mojo/services/view_manager/view_manager_connection.cc
|
| index 6b92323e6335da7b5a5f067db7ae75fc8354e83b..6ea756fbc4a75cd6a7f69c58d9c3719d4722b761 100644
|
| --- a/mojo/services/view_manager/view_manager_connection.cc
|
| +++ b/mojo/services/view_manager/view_manager_connection.cc
|
| @@ -10,6 +10,7 @@
|
| #include "mojo/services/view_manager/root_node_manager.h"
|
| #include "mojo/services/view_manager/view.h"
|
| #include "third_party/skia/include/core/SkBitmap.h"
|
| +#include "ui/aura/window.h"
|
| #include "ui/gfx/codec/png_codec.h"
|
|
|
| namespace mojo {
|
| @@ -84,7 +85,7 @@ void ViewManagerConnection::Initialize() {
|
| DCHECK_EQ(0, id_); // Should only get Initialize() once.
|
| id_ = context()->GetAndAdvanceNextConnectionId();
|
| context()->AddConnection(this);
|
| - client_->OnConnectionEstablished(id_);
|
| + client_->OnConnectionEstablished(id_, context()->next_server_change_id());
|
| }
|
|
|
| Node* ViewManagerConnection::GetNode(const NodeId& id) {
|
| @@ -107,27 +108,32 @@ void ViewManagerConnection::NotifyNodeHierarchyChanged(
|
| const NodeId& node,
|
| const NodeId& new_parent,
|
| const NodeId& old_parent,
|
| - TransportChangeId change_id) {
|
| + TransportChangeId server_change_id,
|
| + TransportChangeId client_change_id) {
|
| client_->OnNodeHierarchyChanged(NodeIdToTransportId(node),
|
| - NodeIdToTransportId(new_parent),
|
| - NodeIdToTransportId(old_parent),
|
| - change_id);
|
| + NodeIdToTransportId(new_parent),
|
| + NodeIdToTransportId(old_parent),
|
| + server_change_id,
|
| + client_change_id);
|
| }
|
|
|
| void ViewManagerConnection::NotifyNodeViewReplaced(
|
| const NodeId& node,
|
| const ViewId& new_view_id,
|
| const ViewId& old_view_id,
|
| - TransportChangeId change_id) {
|
| + TransportChangeId client_change_id) {
|
| client_->OnNodeViewReplaced(NodeIdToTransportId(node),
|
| - ViewIdToTransportId(new_view_id),
|
| - ViewIdToTransportId(old_view_id),
|
| - change_id);
|
| + ViewIdToTransportId(new_view_id),
|
| + ViewIdToTransportId(old_view_id),
|
| + client_change_id);
|
| }
|
|
|
| -void ViewManagerConnection::NotifyNodeDeleted(const NodeId& node,
|
| - TransportChangeId change_id) {
|
| - client_->OnNodeDeleted(NodeIdToTransportId(node), change_id);
|
| +void ViewManagerConnection::NotifyNodeDeleted(
|
| + const NodeId& node,
|
| + TransportChangeId server_change_id,
|
| + TransportChangeId client_change_id) {
|
| + client_->OnNodeDeleted(NodeIdToTransportId(node), server_change_id,
|
| + client_change_id);
|
| }
|
|
|
| bool ViewManagerConnection::DeleteNodeImpl(ViewManagerConnection* source,
|
| @@ -137,7 +143,9 @@ bool ViewManagerConnection::DeleteNodeImpl(ViewManagerConnection* source,
|
| Node* node = GetNode(node_id);
|
| if (!node)
|
| return false;
|
| - RootNodeManager::ScopedChange change(source, context(), change_id);
|
| + RootNodeManager::ScopedChange change(
|
| + source, context(), change_id,
|
| + RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID);
|
| if (node->GetParent())
|
| node->GetParent()->Remove(node);
|
| std::vector<Node*> children(node->GetChildren());
|
| @@ -146,6 +154,7 @@ bool ViewManagerConnection::DeleteNodeImpl(ViewManagerConnection* source,
|
| DCHECK(node->GetChildren().empty());
|
| node_map_.erase(node_id.node_id);
|
| delete node;
|
| + node = NULL;
|
| context()->NotifyNodeDeleted(node_id);
|
| return true;
|
| }
|
| @@ -157,7 +166,9 @@ bool ViewManagerConnection::DeleteViewImpl(ViewManagerConnection* source,
|
| View* view = GetView(view_id);
|
| if (!view)
|
| return false;
|
| - RootNodeManager::ScopedChange change(source, context(), change_id);
|
| + RootNodeManager::ScopedChange change(
|
| + source, context(), change_id,
|
| + RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID);
|
| if (view->node())
|
| view->node()->SetView(NULL);
|
| view_map_.erase(view_id.view_id);
|
| @@ -174,7 +185,9 @@ bool ViewManagerConnection::SetViewImpl(const NodeId& node_id,
|
| View* view = GetView(view_id);
|
| if (!view && view_id != ViewId())
|
| return false;
|
| - RootNodeManager::ScopedChange change(this, context(), change_id);
|
| + RootNodeManager::ScopedChange change(
|
| + this, context(), change_id,
|
| + RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID);
|
| node->SetView(view);
|
| return true;
|
| }
|
| @@ -209,27 +222,40 @@ void ViewManagerConnection::DeleteNode(
|
| void ViewManagerConnection::AddNode(
|
| TransportNodeId parent_id,
|
| TransportNodeId child_id,
|
| - TransportChangeId change_id,
|
| + TransportChangeId server_change_id,
|
| + TransportChangeId client_change_id,
|
| const Callback<void(bool)>& callback) {
|
| - Node* parent = GetNode(NodeIdFromTransportId(parent_id));
|
| - Node* child = GetNode(NodeIdFromTransportId(child_id));
|
| - const bool success = parent && child && parent != child;
|
| - if (success) {
|
| - RootNodeManager::ScopedChange change(this, context(), change_id);
|
| - parent->Add(child);
|
| + bool success = false;
|
| + if (server_change_id == context()->next_server_change_id()) {
|
| + Node* parent = GetNode(NodeIdFromTransportId(parent_id));
|
| + Node* child = GetNode(NodeIdFromTransportId(child_id));
|
| + if (parent && child && child->GetParent() != parent &&
|
| + !child->window()->Contains(parent->window())) {
|
| + success = true;
|
| + RootNodeManager::ScopedChange change(
|
| + this, context(), client_change_id,
|
| + RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID);
|
| + parent->Add(child);
|
| + }
|
| }
|
| callback.Run(success);
|
| }
|
|
|
| void ViewManagerConnection::RemoveNodeFromParent(
|
| TransportNodeId node_id,
|
| - TransportChangeId change_id,
|
| + TransportChangeId server_change_id,
|
| + TransportChangeId client_change_id,
|
| const Callback<void(bool)>& callback) {
|
| - Node* node = GetNode(NodeIdFromTransportId(node_id));
|
| - const bool success = (node && node->GetParent());
|
| - if (success) {
|
| - RootNodeManager::ScopedChange change(this, context(), change_id);
|
| - node->GetParent()->Remove(node);
|
| + bool success = false;
|
| + if (server_change_id == context()->next_server_change_id()) {
|
| + Node* node = GetNode(NodeIdFromTransportId(node_id));
|
| + if (node && node->GetParent()) {
|
| + success = true;
|
| + RootNodeManager::ScopedChange change(
|
| + this, context(), client_change_id,
|
| + RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID);
|
| + node->GetParent()->Remove(node);
|
| + }
|
| }
|
| callback.Run(success);
|
| }
|
|
|