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

Side by Side Diff: mojo/services/view_manager/view_manager_connection.cc

Issue 277563006: Introduces another change id to hierarchy mutations (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: merge 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "mojo/services/view_manager/view_manager_connection.h" 5 #include "mojo/services/view_manager/view_manager_connection.h"
6 6
7 #include "base/stl_util.h" 7 #include "base/stl_util.h"
8 #include "mojo/public/cpp/bindings/allocation_scope.h" 8 #include "mojo/public/cpp/bindings/allocation_scope.h"
9 #include "mojo/services/view_manager/node.h" 9 #include "mojo/services/view_manager/node.h"
10 #include "mojo/services/view_manager/root_node_manager.h" 10 #include "mojo/services/view_manager/root_node_manager.h"
11 #include "mojo/services/view_manager/view.h" 11 #include "mojo/services/view_manager/view.h"
12 #include "third_party/skia/include/core/SkBitmap.h" 12 #include "third_party/skia/include/core/SkBitmap.h"
13 #include "ui/aura/window.h"
13 #include "ui/gfx/codec/png_codec.h" 14 #include "ui/gfx/codec/png_codec.h"
14 15
15 namespace mojo { 16 namespace mojo {
16 namespace services { 17 namespace services {
17 namespace view_manager { 18 namespace view_manager {
18 namespace { 19 namespace {
19 20
20 // Implementation of NodeCount(). |count| is the current count. 21 // Implementation of NodeCount(). |count| is the current count.
21 void NodeCountImpl(Node* node, size_t* count) { 22 void NodeCountImpl(Node* node, size_t* count) {
22 (*count)++; 23 (*count)++;
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 } 78 }
78 79
79 STLDeleteContainerPairSecondPointers(node_map_.begin(), node_map_.end()); 80 STLDeleteContainerPairSecondPointers(node_map_.begin(), node_map_.end());
80 context()->RemoveConnection(this); 81 context()->RemoveConnection(this);
81 } 82 }
82 83
83 void ViewManagerConnection::Initialize() { 84 void ViewManagerConnection::Initialize() {
84 DCHECK_EQ(0, id_); // Should only get Initialize() once. 85 DCHECK_EQ(0, id_); // Should only get Initialize() once.
85 id_ = context()->GetAndAdvanceNextConnectionId(); 86 id_ = context()->GetAndAdvanceNextConnectionId();
86 context()->AddConnection(this); 87 context()->AddConnection(this);
87 client_->OnConnectionEstablished(id_); 88 client_->OnConnectionEstablished(id_, context()->next_server_change_id());
88 } 89 }
89 90
90 Node* ViewManagerConnection::GetNode(const NodeId& id) { 91 Node* ViewManagerConnection::GetNode(const NodeId& id) {
91 if (id_ == id.connection_id) { 92 if (id_ == id.connection_id) {
92 NodeMap::iterator i = node_map_.find(id.node_id); 93 NodeMap::iterator i = node_map_.find(id.node_id);
93 return i == node_map_.end() ? NULL : i->second; 94 return i == node_map_.end() ? NULL : i->second;
94 } 95 }
95 return context()->GetNode(id); 96 return context()->GetNode(id);
96 } 97 }
97 98
98 View* ViewManagerConnection::GetView(const ViewId& id) { 99 View* ViewManagerConnection::GetView(const ViewId& id) {
99 if (id_ == id.connection_id) { 100 if (id_ == id.connection_id) {
100 ViewMap::const_iterator i = view_map_.find(id.view_id); 101 ViewMap::const_iterator i = view_map_.find(id.view_id);
101 return i == view_map_.end() ? NULL : i->second; 102 return i == view_map_.end() ? NULL : i->second;
102 } 103 }
103 return context()->GetView(id); 104 return context()->GetView(id);
104 } 105 }
105 106
106 void ViewManagerConnection::NotifyNodeHierarchyChanged( 107 void ViewManagerConnection::NotifyNodeHierarchyChanged(
107 const NodeId& node, 108 const NodeId& node,
108 const NodeId& new_parent, 109 const NodeId& new_parent,
109 const NodeId& old_parent, 110 const NodeId& old_parent,
110 TransportChangeId change_id) { 111 TransportChangeId server_change_id,
112 TransportChangeId client_change_id) {
111 client_->OnNodeHierarchyChanged(NodeIdToTransportId(node), 113 client_->OnNodeHierarchyChanged(NodeIdToTransportId(node),
112 NodeIdToTransportId(new_parent), 114 NodeIdToTransportId(new_parent),
113 NodeIdToTransportId(old_parent), 115 NodeIdToTransportId(old_parent),
114 change_id); 116 server_change_id,
117 client_change_id);
115 } 118 }
116 119
117 void ViewManagerConnection::NotifyNodeViewReplaced( 120 void ViewManagerConnection::NotifyNodeViewReplaced(
118 const NodeId& node, 121 const NodeId& node,
119 const ViewId& new_view_id, 122 const ViewId& new_view_id,
120 const ViewId& old_view_id, 123 const ViewId& old_view_id,
121 TransportChangeId change_id) { 124 TransportChangeId client_change_id) {
122 client_->OnNodeViewReplaced(NodeIdToTransportId(node), 125 client_->OnNodeViewReplaced(NodeIdToTransportId(node),
123 ViewIdToTransportId(new_view_id), 126 ViewIdToTransportId(new_view_id),
124 ViewIdToTransportId(old_view_id), 127 ViewIdToTransportId(old_view_id),
125 change_id); 128 client_change_id);
126 } 129 }
127 130
128 void ViewManagerConnection::NotifyNodeDeleted(const NodeId& node, 131 void ViewManagerConnection::NotifyNodeDeleted(
129 TransportChangeId change_id) { 132 const NodeId& node,
130 client_->OnNodeDeleted(NodeIdToTransportId(node), change_id); 133 TransportChangeId server_change_id,
134 TransportChangeId client_change_id) {
135 client_->OnNodeDeleted(NodeIdToTransportId(node), server_change_id,
136 client_change_id);
131 } 137 }
132 138
133 bool ViewManagerConnection::DeleteNodeImpl(ViewManagerConnection* source, 139 bool ViewManagerConnection::DeleteNodeImpl(ViewManagerConnection* source,
134 const NodeId& node_id, 140 const NodeId& node_id,
135 TransportChangeId change_id) { 141 TransportChangeId change_id) {
136 DCHECK_EQ(node_id.connection_id, id_); 142 DCHECK_EQ(node_id.connection_id, id_);
137 Node* node = GetNode(node_id); 143 Node* node = GetNode(node_id);
138 if (!node) 144 if (!node)
139 return false; 145 return false;
140 RootNodeManager::ScopedChange change(source, context(), change_id); 146 RootNodeManager::ScopedChange change(
147 source, context(), change_id,
148 RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID);
141 if (node->GetParent()) 149 if (node->GetParent())
142 node->GetParent()->Remove(node); 150 node->GetParent()->Remove(node);
143 std::vector<Node*> children(node->GetChildren()); 151 std::vector<Node*> children(node->GetChildren());
144 for (size_t i = 0; i < children.size(); ++i) 152 for (size_t i = 0; i < children.size(); ++i)
145 node->Remove(children[i]); 153 node->Remove(children[i]);
146 DCHECK(node->GetChildren().empty()); 154 DCHECK(node->GetChildren().empty());
147 node_map_.erase(node_id.node_id); 155 node_map_.erase(node_id.node_id);
148 delete node; 156 delete node;
157 node = NULL;
149 context()->NotifyNodeDeleted(node_id); 158 context()->NotifyNodeDeleted(node_id);
150 return true; 159 return true;
151 } 160 }
152 161
153 bool ViewManagerConnection::DeleteViewImpl(ViewManagerConnection* source, 162 bool ViewManagerConnection::DeleteViewImpl(ViewManagerConnection* source,
154 const ViewId& view_id, 163 const ViewId& view_id,
155 TransportChangeId change_id) { 164 TransportChangeId change_id) {
156 DCHECK_EQ(view_id.connection_id, id_); 165 DCHECK_EQ(view_id.connection_id, id_);
157 View* view = GetView(view_id); 166 View* view = GetView(view_id);
158 if (!view) 167 if (!view)
159 return false; 168 return false;
160 RootNodeManager::ScopedChange change(source, context(), change_id); 169 RootNodeManager::ScopedChange change(
170 source, context(), change_id,
171 RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID);
161 if (view->node()) 172 if (view->node())
162 view->node()->SetView(NULL); 173 view->node()->SetView(NULL);
163 view_map_.erase(view_id.view_id); 174 view_map_.erase(view_id.view_id);
164 delete view; 175 delete view;
165 return true; 176 return true;
166 } 177 }
167 178
168 bool ViewManagerConnection::SetViewImpl(const NodeId& node_id, 179 bool ViewManagerConnection::SetViewImpl(const NodeId& node_id,
169 const ViewId& view_id, 180 const ViewId& view_id,
170 TransportChangeId change_id) { 181 TransportChangeId change_id) {
171 Node* node = GetNode(node_id); 182 Node* node = GetNode(node_id);
172 if (!node) 183 if (!node)
173 return false; 184 return false;
174 View* view = GetView(view_id); 185 View* view = GetView(view_id);
175 if (!view && view_id != ViewId()) 186 if (!view && view_id != ViewId())
176 return false; 187 return false;
177 RootNodeManager::ScopedChange change(this, context(), change_id); 188 RootNodeManager::ScopedChange change(
189 this, context(), change_id,
190 RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID);
178 node->SetView(view); 191 node->SetView(view);
179 return true; 192 return true;
180 } 193 }
181 194
182 void ViewManagerConnection::SetClient(IViewManagerClient* client) { 195 void ViewManagerConnection::SetClient(IViewManagerClient* client) {
183 client_ = client; 196 client_ = client;
184 } 197 }
185 198
186 void ViewManagerConnection::CreateNode( 199 void ViewManagerConnection::CreateNode(
187 TransportConnectionSpecificNodeId node_id, 200 TransportConnectionSpecificNodeId node_id,
(...skipping 14 matching lines...) Expand all
202 const NodeId node_id(NodeIdFromTransportId(transport_node_id)); 215 const NodeId node_id(NodeIdFromTransportId(transport_node_id));
203 ViewManagerConnection* connection = context()->GetConnection( 216 ViewManagerConnection* connection = context()->GetConnection(
204 node_id.connection_id); 217 node_id.connection_id);
205 callback.Run(connection && 218 callback.Run(connection &&
206 connection->DeleteNodeImpl(this, node_id, change_id)); 219 connection->DeleteNodeImpl(this, node_id, change_id));
207 } 220 }
208 221
209 void ViewManagerConnection::AddNode( 222 void ViewManagerConnection::AddNode(
210 TransportNodeId parent_id, 223 TransportNodeId parent_id,
211 TransportNodeId child_id, 224 TransportNodeId child_id,
212 TransportChangeId change_id, 225 TransportChangeId server_change_id,
226 TransportChangeId client_change_id,
213 const Callback<void(bool)>& callback) { 227 const Callback<void(bool)>& callback) {
214 Node* parent = GetNode(NodeIdFromTransportId(parent_id)); 228 bool success = false;
215 Node* child = GetNode(NodeIdFromTransportId(child_id)); 229 if (server_change_id == context()->next_server_change_id()) {
216 const bool success = parent && child && parent != child; 230 Node* parent = GetNode(NodeIdFromTransportId(parent_id));
217 if (success) { 231 Node* child = GetNode(NodeIdFromTransportId(child_id));
218 RootNodeManager::ScopedChange change(this, context(), change_id); 232 if (parent && child && child->GetParent() != parent &&
219 parent->Add(child); 233 !child->window()->Contains(parent->window())) {
234 success = true;
235 RootNodeManager::ScopedChange change(
236 this, context(), client_change_id,
237 RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID);
238 parent->Add(child);
239 }
220 } 240 }
221 callback.Run(success); 241 callback.Run(success);
222 } 242 }
223 243
224 void ViewManagerConnection::RemoveNodeFromParent( 244 void ViewManagerConnection::RemoveNodeFromParent(
225 TransportNodeId node_id, 245 TransportNodeId node_id,
226 TransportChangeId change_id, 246 TransportChangeId server_change_id,
247 TransportChangeId client_change_id,
227 const Callback<void(bool)>& callback) { 248 const Callback<void(bool)>& callback) {
228 Node* node = GetNode(NodeIdFromTransportId(node_id)); 249 bool success = false;
229 const bool success = (node && node->GetParent()); 250 if (server_change_id == context()->next_server_change_id()) {
230 if (success) { 251 Node* node = GetNode(NodeIdFromTransportId(node_id));
231 RootNodeManager::ScopedChange change(this, context(), change_id); 252 if (node && node->GetParent()) {
232 node->GetParent()->Remove(node); 253 success = true;
254 RootNodeManager::ScopedChange change(
255 this, context(), client_change_id,
256 RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID);
257 node->GetParent()->Remove(node);
258 }
233 } 259 }
234 callback.Run(success); 260 callback.Run(success);
235 } 261 }
236 262
237 void ViewManagerConnection::GetNodeTree( 263 void ViewManagerConnection::GetNodeTree(
238 TransportNodeId node_id, 264 TransportNodeId node_id,
239 const Callback<void(Array<INode>)>& callback) { 265 const Callback<void(Array<INode>)>& callback) {
240 AllocationScope allocation_scope; 266 AllocationScope allocation_scope;
241 Node* node = GetNode(NodeIdFromTransportId(node_id)); 267 Node* node = GetNode(NodeIdFromTransportId(node_id));
242 Array<INode>::Builder array_builder(NodeCount(node)); 268 Array<INode>::Builder array_builder(NodeCount(node));
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
306 332
307 void ViewManagerConnection::OnNodeViewReplaced(const NodeId& node, 333 void ViewManagerConnection::OnNodeViewReplaced(const NodeId& node,
308 const ViewId& new_view_id, 334 const ViewId& new_view_id,
309 const ViewId& old_view_id) { 335 const ViewId& old_view_id) {
310 context()->NotifyNodeViewReplaced(node, new_view_id, old_view_id); 336 context()->NotifyNodeViewReplaced(node, new_view_id, old_view_id);
311 } 337 }
312 338
313 } // namespace view_manager 339 } // namespace view_manager
314 } // namespace services 340 } // namespace services
315 } // namespace mojo 341 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/services/view_manager/view_manager_connection.h ('k') | mojo/services/view_manager/view_manager_connection_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698