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

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

Issue 286973009: Revert 270925 "Tweaks to ViewManager:" (Closed) Base URL: svn://svn.chromium.org/chrome/
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 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/type_converters.h"
12 #include "mojo/services/view_manager/view.h" 11 #include "mojo/services/view_manager/view.h"
13 #include "third_party/skia/include/core/SkBitmap.h" 12 #include "third_party/skia/include/core/SkBitmap.h"
14 #include "ui/aura/window.h" 13 #include "ui/aura/window.h"
15 #include "ui/gfx/codec/png_codec.h" 14 #include "ui/gfx/codec/png_codec.h"
16 15
17 namespace mojo { 16 namespace mojo {
18 namespace view_manager { 17 namespace view_manager {
19 namespace service { 18 namespace service {
20 namespace { 19 namespace {
21 20
22 // Places |node| in |nodes| and recurses through the children. 21 // Implementation of NodeCount(). |count| is the current count.
23 void GetDescendants(Node* node, std::vector<Node*>* nodes) { 22 void NodeCountImpl(Node* node, size_t* count) {
23 (*count)++;
24 std::vector<Node*> children(node->GetChildren());
25 for (size_t i = 0 ; i < children.size(); ++i)
26 NodeCountImpl(children[i], count);
27 }
28
29 // Returns the number of descendants of |node|.
30 size_t NodeCount(Node* node) {
31 size_t count = 0;
32 if (node)
33 NodeCountImpl(node, &count);
34 return count;
35 }
36
37 // Converts a Node to an INode, putting the result at |index| in
38 // |array_builder|. This then recurses through the children.
39 void NodeToINode(Node* node,
40 Array<INode>::Builder* array_builder,
41 size_t* index) {
24 if (!node) 42 if (!node)
25 return; 43 return;
26 44
27 nodes->push_back(node); 45 INode::Builder builder;
46 Node* parent = node->GetParent();
47 builder.set_parent_id(NodeIdToTransportId(parent ? parent->id() : NodeId()));
48 builder.set_node_id(NodeIdToTransportId(node->id()));
49 builder.set_view_id(ViewIdToTransportId(
50 node->view() ? node->view()->id() : ViewId()));
51 (*array_builder)[*index] = builder.Finish();
28 52
29 std::vector<Node*> children(node->GetChildren()); 53 std::vector<Node*> children(node->GetChildren());
30 for (size_t i = 0 ; i < children.size(); ++i) 54 for (size_t i = 0 ; i < children.size(); ++i) {
31 GetDescendants(children[i], nodes); 55 (*index)++;
56 NodeToINode(children[i], array_builder, index);
57 }
32 } 58 }
33 59
34 } // namespace 60 } // namespace
35 61
36 ViewManagerConnection::ViewManagerConnection() : id_(0) { 62 ViewManagerConnection::ViewManagerConnection() : id_(0) {
37 } 63 }
38 64
39 ViewManagerConnection::~ViewManagerConnection() { 65 ViewManagerConnection::~ViewManagerConnection() {
40 // Delete any views we own. 66 // Delete any views we own.
41 while (!view_map_.empty()) { 67 while (!view_map_.empty()) {
(...skipping 10 matching lines...) Expand all
52 } 78 }
53 79
54 STLDeleteContainerPairSecondPointers(node_map_.begin(), node_map_.end()); 80 STLDeleteContainerPairSecondPointers(node_map_.begin(), node_map_.end());
55 context()->RemoveConnection(this); 81 context()->RemoveConnection(this);
56 } 82 }
57 83
58 void ViewManagerConnection::Initialize() { 84 void ViewManagerConnection::Initialize() {
59 DCHECK_EQ(0, id_); // Should only get Initialize() once. 85 DCHECK_EQ(0, id_); // Should only get Initialize() once.
60 id_ = context()->GetAndAdvanceNextConnectionId(); 86 id_ = context()->GetAndAdvanceNextConnectionId();
61 context()->AddConnection(this); 87 context()->AddConnection(this);
62 std::vector<Node*> to_send; 88 client()->OnConnectionEstablished(id_, context()->next_server_change_id());
63 GetUnknownNodesFrom(context()->root(), &to_send);
64 AllocationScope allocation_scope;
65 client()->OnConnectionEstablished(id_,
66 context()->next_server_change_id(),
67 Array<INode>::From(to_send));
68 } 89 }
69 90
70 Node* ViewManagerConnection::GetNode(const NodeId& id) { 91 Node* ViewManagerConnection::GetNode(const NodeId& id) {
71 if (id_ == id.connection_id) { 92 if (id_ == id.connection_id) {
72 NodeMap::iterator i = node_map_.find(id.node_id); 93 NodeMap::iterator i = node_map_.find(id.node_id);
73 return i == node_map_.end() ? NULL : i->second; 94 return i == node_map_.end() ? NULL : i->second;
74 } 95 }
75 return context()->GetNode(id); 96 return context()->GetNode(id);
76 } 97 }
77 98
78 View* ViewManagerConnection::GetView(const ViewId& id) { 99 View* ViewManagerConnection::GetView(const ViewId& id) {
79 if (id_ == id.connection_id) { 100 if (id_ == id.connection_id) {
80 ViewMap::const_iterator i = view_map_.find(id.view_id); 101 ViewMap::const_iterator i = view_map_.find(id.view_id);
81 return i == view_map_.end() ? NULL : i->second; 102 return i == view_map_.end() ? NULL : i->second;
82 } 103 }
83 return context()->GetView(id); 104 return context()->GetView(id);
84 } 105 }
85 106
86 void ViewManagerConnection::ProcessNodeHierarchyChanged( 107 void ViewManagerConnection::NotifyNodeHierarchyChanged(
87 const NodeId& node_id, 108 const NodeId& node,
88 const NodeId& new_parent_id, 109 const NodeId& new_parent,
89 const NodeId& old_parent_id, 110 const NodeId& old_parent,
90 TransportChangeId server_change_id, 111 TransportChangeId server_change_id) {
91 bool originated_change) { 112 client()->OnNodeHierarchyChanged(NodeIdToTransportId(node),
92 if (originated_change || context()->is_processing_delete_node()) 113 NodeIdToTransportId(new_parent),
93 return; 114 NodeIdToTransportId(old_parent),
94 std::vector<Node*> to_send; 115 server_change_id);
95 if (!ShouldNotifyOnHierarchyChange(node_id, new_parent_id, old_parent_id,
96 &to_send)) {
97 if (context()->IsProcessingChange()) {
98 client()->OnServerChangeIdAdvanced(
99 context()->next_server_change_id() + 1);
100 }
101 return;
102 }
103 AllocationScope allocation_scope;
104 client()->OnNodeHierarchyChanged(NodeIdToTransportId(node_id),
105 NodeIdToTransportId(new_parent_id),
106 NodeIdToTransportId(old_parent_id),
107 server_change_id,
108 Array<INode>::From(to_send));
109 } 116 }
110 117
111 void ViewManagerConnection::ProcessNodeViewReplaced( 118 void ViewManagerConnection::NotifyNodeViewReplaced(
112 const NodeId& node, 119 const NodeId& node,
113 const ViewId& new_view_id, 120 const ViewId& new_view_id,
114 const ViewId& old_view_id, 121 const ViewId& old_view_id) {
115 bool originated_change) {
116 if (originated_change)
117 return;
118 client()->OnNodeViewReplaced(NodeIdToTransportId(node), 122 client()->OnNodeViewReplaced(NodeIdToTransportId(node),
119 ViewIdToTransportId(new_view_id), 123 ViewIdToTransportId(new_view_id),
120 ViewIdToTransportId(old_view_id)); 124 ViewIdToTransportId(old_view_id));
121 } 125 }
122 126
123 void ViewManagerConnection::ProcessNodeDeleted( 127 void ViewManagerConnection::NotifyNodeDeleted(
124 const NodeId& node, 128 const NodeId& node,
125 TransportChangeId server_change_id, 129 TransportChangeId server_change_id) {
126 bool originated_change) { 130 client()->OnNodeDeleted(NodeIdToTransportId(node), server_change_id);
127 const bool in_known = known_nodes_.erase(NodeIdToTransportId(node)) > 0;
128
129 if (originated_change)
130 return;
131
132 if (in_known)
133 client()->OnNodeDeleted(NodeIdToTransportId(node), server_change_id);
134 else if (context()->IsProcessingChange())
135 client()->OnServerChangeIdAdvanced(context()->next_server_change_id() + 1);
136 } 131 }
137 132
138 void ViewManagerConnection::ProcessViewDeleted(const ViewId& view, 133 void ViewManagerConnection::NotifyViewDeleted(const ViewId& view) {
139 bool originated_change) {
140 if (originated_change)
141 return;
142 client()->OnViewDeleted(ViewIdToTransportId(view)); 134 client()->OnViewDeleted(ViewIdToTransportId(view));
143 } 135 }
144 136
145 bool ViewManagerConnection::DeleteNodeImpl(ViewManagerConnection* source, 137 bool ViewManagerConnection::DeleteNodeImpl(ViewManagerConnection* source,
146 const NodeId& node_id) { 138 const NodeId& node_id) {
147 DCHECK_EQ(node_id.connection_id, id_); 139 DCHECK_EQ(node_id.connection_id, id_);
148 Node* node = GetNode(node_id); 140 Node* node = GetNode(node_id);
149 if (!node) 141 if (!node)
150 return false; 142 return false;
151 RootNodeManager::ScopedChange change( 143 RootNodeManager::ScopedChange change(
152 source, context(), RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID, 144 source, context(), RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID);
153 true);
154 if (node->GetParent()) 145 if (node->GetParent())
155 node->GetParent()->Remove(node); 146 node->GetParent()->Remove(node);
156 std::vector<Node*> children(node->GetChildren()); 147 std::vector<Node*> children(node->GetChildren());
157 for (size_t i = 0; i < children.size(); ++i) 148 for (size_t i = 0; i < children.size(); ++i)
158 node->Remove(children[i]); 149 node->Remove(children[i]);
159 DCHECK(node->GetChildren().empty()); 150 DCHECK(node->GetChildren().empty());
160 node_map_.erase(node_id.node_id); 151 node_map_.erase(node_id.node_id);
161 delete node; 152 delete node;
162 node = NULL; 153 node = NULL;
163 context()->ProcessNodeDeleted(node_id); 154 context()->NotifyNodeDeleted(node_id);
164 return true; 155 return true;
165 } 156 }
166 157
167 bool ViewManagerConnection::DeleteViewImpl(ViewManagerConnection* source, 158 bool ViewManagerConnection::DeleteViewImpl(ViewManagerConnection* source,
168 const ViewId& view_id) { 159 const ViewId& view_id) {
169 DCHECK_EQ(view_id.connection_id, id_); 160 DCHECK_EQ(view_id.connection_id, id_);
170 View* view = GetView(view_id); 161 View* view = GetView(view_id);
171 if (!view) 162 if (!view)
172 return false; 163 return false;
173 RootNodeManager::ScopedChange change( 164 RootNodeManager::ScopedChange change(
174 source, context(), 165 source, context(),
175 RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID, false); 166 RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID);
176 if (view->node()) 167 if (view->node())
177 view->node()->SetView(NULL); 168 view->node()->SetView(NULL);
178 view_map_.erase(view_id.view_id); 169 view_map_.erase(view_id.view_id);
179 // Make a copy of |view_id| as once we delete view |view_id| may no longer be 170 // Make a copy of |view_id| as once we delete view |view_id| may no longer be
180 // valid. 171 // valid.
181 const ViewId view_id_copy(view_id); 172 const ViewId view_id_copy(view_id);
182 delete view; 173 delete view;
183 context()->ProcessViewDeleted(view_id_copy); 174 context()->NotifyViewDeleted(view_id_copy);
184 return true; 175 return true;
185 } 176 }
186 177
187 bool ViewManagerConnection::SetViewImpl(const NodeId& node_id, 178 bool ViewManagerConnection::SetViewImpl(const NodeId& node_id,
188 const ViewId& view_id) { 179 const ViewId& view_id) {
189 Node* node = GetNode(node_id); 180 Node* node = GetNode(node_id);
190 if (!node) 181 if (!node)
191 return false; 182 return false;
192 View* view = GetView(view_id); 183 View* view = GetView(view_id);
193 if (!view && view_id != ViewId()) 184 if (!view && view_id != ViewId())
194 return false; 185 return false;
195 RootNodeManager::ScopedChange change( 186 RootNodeManager::ScopedChange change(
196 this, context(), 187 this, context(),
197 RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID, false); 188 RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID);
198 node->SetView(view); 189 node->SetView(view);
199 return true; 190 return true;
200 } 191 }
201 192
202 void ViewManagerConnection::GetUnknownNodesFrom(
203 Node* node,
204 std::vector<Node*>* nodes) {
205 const TransportNodeId transport_id = NodeIdToTransportId(node->id());
206 if (known_nodes_.count(transport_id) == 1)
207 return;
208 nodes->push_back(node);
209 known_nodes_.insert(transport_id);
210 std::vector<Node*> children(node->GetChildren());
211 for (size_t i = 0 ; i < children.size(); ++i)
212 GetUnknownNodesFrom(children[i], nodes);
213 }
214
215 bool ViewManagerConnection::ShouldNotifyOnHierarchyChange(
216 const NodeId& node_id,
217 const NodeId& new_parent_id,
218 const NodeId& old_parent_id,
219 std::vector<Node*>* to_send) {
220 Node* new_parent = GetNode(new_parent_id);
221 if (new_parent) {
222 // On getting a new parent we may need to communicate new nodes to the
223 // client. We do that in the following cases:
224 // . New parent is a descendant of the root. In this case the client already
225 // knows all ancestors, so we only have to communicate descendants of node
226 // the client doesn't know about.
227 // . If the client knew about the parent, we have to do the same.
228 // . If the client knows about the node and is added to a tree the client
229 // doesn't know about we have to communicate from the root down (the
230 // client is learning about a new root).
231 if (context()->root()->Contains(new_parent) ||
232 known_nodes_.count(NodeIdToTransportId(new_parent_id))) {
233 GetUnknownNodesFrom(GetNode(node_id), to_send);
234 return true;
235 }
236 // If parent wasn't known we have to communicate from the root down.
237 if (known_nodes_.count(NodeIdToTransportId(node_id))) {
238 GetUnknownNodesFrom(new_parent->GetRoot(), to_send);
239 return true;
240 }
241 }
242 // Otherwise only communicate the change if the node was known. We shouldn't
243 // need to communicate any nodes on a remove.
244 return known_nodes_.count(NodeIdToTransportId(node_id));
245 }
246
247 void ViewManagerConnection::CreateNode( 193 void ViewManagerConnection::CreateNode(
248 TransportNodeId transport_node_id, 194 TransportNodeId transport_node_id,
249 const Callback<void(bool)>& callback) { 195 const Callback<void(bool)>& callback) {
250 const NodeId node_id(NodeIdFromTransportId(transport_node_id)); 196 const NodeId node_id(NodeIdFromTransportId(transport_node_id));
251 if (node_id.connection_id != id_ || 197 if (node_id.connection_id != id_ ||
252 node_map_.find(node_id.node_id) != node_map_.end()) { 198 node_map_.find(node_id.node_id) != node_map_.end()) {
253 callback.Run(false); 199 callback.Run(false);
254 return; 200 return;
255 } 201 }
256 node_map_[node_id.node_id] = new Node(this, node_id); 202 node_map_[node_id.node_id] = new Node(this, node_id);
257 callback.Run(true); 203 callback.Run(true);
258 } 204 }
259 205
260 void ViewManagerConnection::DeleteNode( 206 void ViewManagerConnection::DeleteNode(
261 TransportNodeId transport_node_id, 207 TransportNodeId transport_node_id,
262 const Callback<void(bool)>& callback) { 208 const Callback<void(bool)>& callback) {
263 AllocationScope allocation_scope;
264 const NodeId node_id(NodeIdFromTransportId(transport_node_id)); 209 const NodeId node_id(NodeIdFromTransportId(transport_node_id));
265 ViewManagerConnection* connection = context()->GetConnection( 210 ViewManagerConnection* connection = context()->GetConnection(
266 node_id.connection_id); 211 node_id.connection_id);
267 callback.Run(connection && 212 callback.Run(connection &&
268 connection->DeleteNodeImpl(this, node_id)); 213 connection->DeleteNodeImpl(this, node_id));
269 } 214 }
270 215
271 void ViewManagerConnection::AddNode( 216 void ViewManagerConnection::AddNode(
272 TransportNodeId parent_id, 217 TransportNodeId parent_id,
273 TransportNodeId child_id, 218 TransportNodeId child_id,
274 TransportChangeId server_change_id, 219 TransportChangeId server_change_id,
275 const Callback<void(bool)>& callback) { 220 const Callback<void(bool)>& callback) {
276 bool success = false; 221 bool success = false;
277 if (server_change_id == context()->next_server_change_id()) { 222 if (server_change_id == context()->next_server_change_id()) {
278 Node* parent = GetNode(NodeIdFromTransportId(parent_id)); 223 Node* parent = GetNode(NodeIdFromTransportId(parent_id));
279 Node* child = GetNode(NodeIdFromTransportId(child_id)); 224 Node* child = GetNode(NodeIdFromTransportId(child_id));
280 if (parent && child && child->GetParent() != parent && 225 if (parent && child && child->GetParent() != parent &&
281 !child->window()->Contains(parent->window())) { 226 !child->window()->Contains(parent->window())) {
282 success = true; 227 success = true;
283 RootNodeManager::ScopedChange change( 228 RootNodeManager::ScopedChange change(
284 this, context(), 229 this, context(),
285 RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID, false); 230 RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID);
286 parent->Add(child); 231 parent->Add(child);
287 } 232 }
288 } 233 }
289 callback.Run(success); 234 callback.Run(success);
290 } 235 }
291 236
292 void ViewManagerConnection::RemoveNodeFromParent( 237 void ViewManagerConnection::RemoveNodeFromParent(
293 TransportNodeId node_id, 238 TransportNodeId node_id,
294 TransportChangeId server_change_id, 239 TransportChangeId server_change_id,
295 const Callback<void(bool)>& callback) { 240 const Callback<void(bool)>& callback) {
296 bool success = false; 241 bool success = false;
297 if (server_change_id == context()->next_server_change_id()) { 242 if (server_change_id == context()->next_server_change_id()) {
298 Node* node = GetNode(NodeIdFromTransportId(node_id)); 243 Node* node = GetNode(NodeIdFromTransportId(node_id));
299 if (node && node->GetParent()) { 244 if (node && node->GetParent()) {
300 success = true; 245 success = true;
301 RootNodeManager::ScopedChange change( 246 RootNodeManager::ScopedChange change(
302 this, context(), 247 this, context(),
303 RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID, false); 248 RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID);
304 node->GetParent()->Remove(node); 249 node->GetParent()->Remove(node);
305 } 250 }
306 } 251 }
307 callback.Run(success); 252 callback.Run(success);
308 } 253 }
309 254
310 void ViewManagerConnection::GetNodeTree( 255 void ViewManagerConnection::GetNodeTree(
311 TransportNodeId node_id, 256 TransportNodeId node_id,
312 const Callback<void(Array<INode>)>& callback) { 257 const Callback<void(Array<INode>)>& callback) {
313 AllocationScope allocation_scope; 258 AllocationScope allocation_scope;
314 Node* node = GetNode(NodeIdFromTransportId(node_id)); 259 Node* node = GetNode(NodeIdFromTransportId(node_id));
315 std::vector<Node*> nodes; 260 Array<INode>::Builder array_builder(NodeCount(node));
316 GetDescendants(node, &nodes); 261 {
317 for (size_t i = 0; i < nodes.size(); ++i) 262 size_t index = 0;
318 known_nodes_.insert(NodeIdToTransportId(nodes[i]->id())); 263 NodeToINode(node, &array_builder, &index);
319 callback.Run(Array<INode>::From(nodes)); 264 }
265 callback.Run(array_builder.Finish());
320 } 266 }
321 267
322 void ViewManagerConnection::CreateView( 268 void ViewManagerConnection::CreateView(
323 TransportViewId transport_view_id, 269 TransportViewId transport_view_id,
324 const Callback<void(bool)>& callback) { 270 const Callback<void(bool)>& callback) {
325 const ViewId view_id(ViewIdFromTransportId(transport_view_id)); 271 const ViewId view_id(ViewIdFromTransportId(transport_view_id));
326 if (view_id.connection_id != id_ || view_map_.count(view_id.view_id)) { 272 if (view_id.connection_id != id_ || view_map_.count(view_id.view_id)) {
327 callback.Run(false); 273 callback.Run(false);
328 return; 274 return;
329 } 275 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 SkBitmap bitmap; 309 SkBitmap bitmap;
364 gfx::PNGCodec::Decode(static_cast<const unsigned char*>(handle_data), 310 gfx::PNGCodec::Decode(static_cast<const unsigned char*>(handle_data),
365 buffer_size, &bitmap); 311 buffer_size, &bitmap);
366 view->SetBitmap(bitmap); 312 view->SetBitmap(bitmap);
367 UnmapBuffer(handle_data); 313 UnmapBuffer(handle_data);
368 } 314 }
369 315
370 void ViewManagerConnection::OnNodeHierarchyChanged(const NodeId& node, 316 void ViewManagerConnection::OnNodeHierarchyChanged(const NodeId& node,
371 const NodeId& new_parent, 317 const NodeId& new_parent,
372 const NodeId& old_parent) { 318 const NodeId& old_parent) {
373 context()->ProcessNodeHierarchyChanged(node, new_parent, old_parent); 319 context()->NotifyNodeHierarchyChanged(node, new_parent, old_parent);
374 } 320 }
375 321
376 void ViewManagerConnection::OnNodeViewReplaced(const NodeId& node, 322 void ViewManagerConnection::OnNodeViewReplaced(const NodeId& node,
377 const ViewId& new_view_id, 323 const ViewId& new_view_id,
378 const ViewId& old_view_id) { 324 const ViewId& old_view_id) {
379 context()->ProcessNodeViewReplaced(node, new_view_id, old_view_id); 325 context()->NotifyNodeViewReplaced(node, new_view_id, old_view_id);
380 } 326 }
381 327
382 } // namespace service 328 } // namespace service
383 } // namespace view_manager 329 } // namespace view_manager
384 } // namespace mojo 330 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698