OLD | NEW |
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" |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 } | 89 } |
90 | 90 |
91 Node* ViewManagerConnection::GetNode(const NodeId& id) { | 91 Node* ViewManagerConnection::GetNode(const NodeId& id) { |
92 if (id_ == id.connection_id) { | 92 if (id_ == id.connection_id) { |
93 NodeMap::iterator i = node_map_.find(id.node_id); | 93 NodeMap::iterator i = node_map_.find(id.node_id); |
94 return i == node_map_.end() ? NULL : i->second; | 94 return i == node_map_.end() ? NULL : i->second; |
95 } | 95 } |
96 return context()->GetNode(id); | 96 return context()->GetNode(id); |
97 } | 97 } |
98 | 98 |
99 View* ViewManagerConnection::GetView(const ViewId& id) { | 99 service::View* ViewManagerConnection::GetView(const ViewId& id) { |
100 if (id_ == id.connection_id) { | 100 if (id_ == id.connection_id) { |
101 ViewMap::const_iterator i = view_map_.find(id.view_id); | 101 ViewMap::const_iterator i = view_map_.find(id.view_id); |
102 return i == view_map_.end() ? NULL : i->second; | 102 return i == view_map_.end() ? NULL : i->second; |
103 } | 103 } |
104 return context()->GetView(id); | 104 return context()->GetView(id); |
105 } | 105 } |
106 | 106 |
107 void ViewManagerConnection::NotifyNodeHierarchyChanged( | 107 void ViewManagerConnection::NotifyNodeHierarchyChanged( |
108 const NodeId& node, | 108 const NodeId& node, |
109 const NodeId& new_parent, | 109 const NodeId& new_parent, |
(...skipping 19 matching lines...) Expand all Loading... |
129 } | 129 } |
130 | 130 |
131 void ViewManagerConnection::NotifyNodeDeleted( | 131 void ViewManagerConnection::NotifyNodeDeleted( |
132 const NodeId& node, | 132 const NodeId& node, |
133 TransportChangeId server_change_id, | 133 TransportChangeId server_change_id, |
134 TransportChangeId client_change_id) { | 134 TransportChangeId client_change_id) { |
135 client()->OnNodeDeleted(NodeIdToTransportId(node), server_change_id, | 135 client()->OnNodeDeleted(NodeIdToTransportId(node), server_change_id, |
136 client_change_id); | 136 client_change_id); |
137 } | 137 } |
138 | 138 |
| 139 void ViewManagerConnection::NotifyViewDeleted( |
| 140 const ViewId& view, |
| 141 TransportChangeId server_change_id, |
| 142 TransportChangeId client_change_id) { |
| 143 client()->OnViewDeleted(ViewIdToTransportId(view), server_change_id, |
| 144 client_change_id); |
| 145 } |
| 146 |
139 bool ViewManagerConnection::DeleteNodeImpl(ViewManagerConnection* source, | 147 bool ViewManagerConnection::DeleteNodeImpl(ViewManagerConnection* source, |
140 const NodeId& node_id, | 148 const NodeId& node_id, |
141 TransportChangeId change_id) { | 149 TransportChangeId change_id) { |
142 DCHECK_EQ(node_id.connection_id, id_); | 150 DCHECK_EQ(node_id.connection_id, id_); |
143 Node* node = GetNode(node_id); | 151 Node* node = GetNode(node_id); |
144 if (!node) | 152 if (!node) |
145 return false; | 153 return false; |
146 RootNodeManager::ScopedChange change( | 154 RootNodeManager::ScopedChange change( |
147 source, context(), change_id, | 155 source, context(), change_id, |
148 RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID); | 156 RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID); |
149 if (node->GetParent()) | 157 if (node->GetParent()) |
150 node->GetParent()->Remove(node); | 158 node->GetParent()->Remove(node); |
151 std::vector<Node*> children(node->GetChildren()); | 159 std::vector<Node*> children(node->GetChildren()); |
152 for (size_t i = 0; i < children.size(); ++i) | 160 for (size_t i = 0; i < children.size(); ++i) |
153 node->Remove(children[i]); | 161 node->Remove(children[i]); |
154 DCHECK(node->GetChildren().empty()); | 162 DCHECK(node->GetChildren().empty()); |
155 node_map_.erase(node_id.node_id); | 163 node_map_.erase(node_id.node_id); |
156 delete node; | 164 delete node; |
157 node = NULL; | 165 node = NULL; |
158 context()->NotifyNodeDeleted(node_id); | 166 context()->NotifyNodeDeleted(node_id); |
159 return true; | 167 return true; |
160 } | 168 } |
161 | 169 |
162 bool ViewManagerConnection::DeleteViewImpl(ViewManagerConnection* source, | 170 bool ViewManagerConnection::DeleteViewImpl(ViewManagerConnection* source, |
163 const ViewId& view_id, | 171 const ViewId& view_id, |
164 TransportChangeId change_id) { | 172 TransportChangeId change_id) { |
165 DCHECK_EQ(view_id.connection_id, id_); | 173 DCHECK_EQ(view_id.connection_id, id_); |
166 View* view = GetView(view_id); | 174 service::View* view = GetView(view_id); |
167 if (!view) | 175 if (!view) |
168 return false; | 176 return false; |
169 RootNodeManager::ScopedChange change( | 177 RootNodeManager::ScopedChange change( |
170 source, context(), change_id, | 178 source, context(), change_id, |
171 RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID); | 179 RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID); |
172 if (view->node()) | 180 if (view->node()) |
173 view->node()->SetView(NULL); | 181 view->node()->SetView(NULL); |
174 view_map_.erase(view_id.view_id); | 182 view_map_.erase(view_id.view_id); |
175 delete view; | 183 delete view; |
| 184 context()->NotifyViewDeleted(view_id); |
176 return true; | 185 return true; |
177 } | 186 } |
178 | 187 |
179 bool ViewManagerConnection::SetViewImpl(const NodeId& node_id, | 188 bool ViewManagerConnection::SetViewImpl(const NodeId& node_id, |
180 const ViewId& view_id, | 189 const ViewId& view_id, |
181 TransportChangeId change_id) { | 190 TransportChangeId change_id) { |
182 Node* node = GetNode(node_id); | 191 Node* node = GetNode(node_id); |
183 if (!node) | 192 if (!node) |
184 return false; | 193 return false; |
185 View* view = GetView(view_id); | 194 service::View* view = GetView(view_id); |
186 if (!view && view_id != ViewId()) | 195 if (!view && view_id != ViewId()) |
187 return false; | 196 return false; |
188 RootNodeManager::ScopedChange change( | 197 RootNodeManager::ScopedChange change( |
189 this, context(), change_id, | 198 this, context(), change_id, |
190 RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID); | 199 RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID); |
191 node->SetView(view); | 200 node->SetView(view); |
192 return true; | 201 return true; |
193 } | 202 } |
194 | 203 |
195 void ViewManagerConnection::CreateNode( | 204 void ViewManagerConnection::CreateNode( |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
269 callback.Run(array_builder.Finish()); | 278 callback.Run(array_builder.Finish()); |
270 } | 279 } |
271 | 280 |
272 void ViewManagerConnection::CreateView( | 281 void ViewManagerConnection::CreateView( |
273 TransportConnectionSpecificViewId view_id, | 282 TransportConnectionSpecificViewId view_id, |
274 const Callback<void(bool)>& callback) { | 283 const Callback<void(bool)>& callback) { |
275 if (view_map_.count(view_id)) { | 284 if (view_map_.count(view_id)) { |
276 callback.Run(false); | 285 callback.Run(false); |
277 return; | 286 return; |
278 } | 287 } |
279 view_map_[view_id] = new View(ViewId(id_, view_id)); | 288 view_map_[view_id] = new service::View(ViewId(id_, view_id)); |
280 callback.Run(true); | 289 callback.Run(true); |
281 } | 290 } |
282 | 291 |
283 void ViewManagerConnection::DeleteView( | 292 void ViewManagerConnection::DeleteView( |
284 TransportViewId transport_view_id, | 293 TransportViewId transport_view_id, |
285 TransportChangeId change_id, | 294 TransportChangeId change_id, |
286 const Callback<void(bool)>& callback) { | 295 const Callback<void(bool)>& callback) { |
287 const ViewId view_id(ViewIdFromTransportId(transport_view_id)); | 296 const ViewId view_id(ViewIdFromTransportId(transport_view_id)); |
288 ViewManagerConnection* connection = context()->GetConnection( | 297 ViewManagerConnection* connection = context()->GetConnection( |
289 view_id.connection_id); | 298 view_id.connection_id); |
290 callback.Run(connection && | 299 callback.Run(connection && |
291 connection->DeleteViewImpl(this, view_id, change_id)); | 300 connection->DeleteViewImpl(this, view_id, change_id)); |
292 } | 301 } |
293 | 302 |
294 void ViewManagerConnection::SetView( | 303 void ViewManagerConnection::SetView( |
295 TransportNodeId transport_node_id, | 304 TransportNodeId transport_node_id, |
296 TransportViewId transport_view_id, | 305 TransportViewId transport_view_id, |
297 TransportChangeId change_id, | 306 TransportChangeId change_id, |
298 const Callback<void(bool)>& callback) { | 307 const Callback<void(bool)>& callback) { |
299 const NodeId node_id(NodeIdFromTransportId(transport_node_id)); | 308 const NodeId node_id(NodeIdFromTransportId(transport_node_id)); |
300 callback.Run(SetViewImpl(node_id, ViewIdFromTransportId(transport_view_id), | 309 callback.Run(SetViewImpl(node_id, ViewIdFromTransportId(transport_view_id), |
301 change_id)); | 310 change_id)); |
302 } | 311 } |
303 | 312 |
304 void ViewManagerConnection::SetViewContents( | 313 void ViewManagerConnection::SetViewContents( |
305 TransportViewId view_id, | 314 TransportViewId view_id, |
306 ScopedSharedBufferHandle buffer, | 315 ScopedSharedBufferHandle buffer, |
307 uint32_t buffer_size) { | 316 uint32_t buffer_size) { |
308 View* view = GetView(ViewIdFromTransportId(view_id)); | 317 service::View* view = GetView(ViewIdFromTransportId(view_id)); |
309 if (!view) | 318 if (!view) |
310 return; | 319 return; |
311 void* handle_data; | 320 void* handle_data; |
312 if (MapBuffer(buffer.get(), 0, buffer_size, &handle_data, | 321 if (MapBuffer(buffer.get(), 0, buffer_size, &handle_data, |
313 MOJO_MAP_BUFFER_FLAG_NONE) != MOJO_RESULT_OK) { | 322 MOJO_MAP_BUFFER_FLAG_NONE) != MOJO_RESULT_OK) { |
314 return; | 323 return; |
315 } | 324 } |
316 SkBitmap bitmap; | 325 SkBitmap bitmap; |
317 gfx::PNGCodec::Decode(static_cast<const unsigned char*>(handle_data), | 326 gfx::PNGCodec::Decode(static_cast<const unsigned char*>(handle_data), |
318 buffer_size, &bitmap); | 327 buffer_size, &bitmap); |
319 view->SetBitmap(bitmap); | 328 view->SetBitmap(bitmap); |
320 UnmapBuffer(handle_data); | 329 UnmapBuffer(handle_data); |
321 } | 330 } |
322 | 331 |
323 void ViewManagerConnection::OnNodeHierarchyChanged(const NodeId& node, | 332 void ViewManagerConnection::OnNodeHierarchyChanged(const NodeId& node, |
324 const NodeId& new_parent, | 333 const NodeId& new_parent, |
325 const NodeId& old_parent) { | 334 const NodeId& old_parent) { |
326 context()->NotifyNodeHierarchyChanged(node, new_parent, old_parent); | 335 context()->NotifyNodeHierarchyChanged(node, new_parent, old_parent); |
327 } | 336 } |
328 | 337 |
329 void ViewManagerConnection::OnNodeViewReplaced(const NodeId& node, | 338 void ViewManagerConnection::OnNodeViewReplaced(const NodeId& node, |
330 const ViewId& new_view_id, | 339 const ViewId& new_view_id, |
331 const ViewId& old_view_id) { | 340 const ViewId& old_view_id) { |
332 context()->NotifyNodeViewReplaced(node, new_view_id, old_view_id); | 341 context()->NotifyNodeViewReplaced(node, new_view_id, old_view_id); |
333 } | 342 } |
334 | 343 |
335 } // namespace view_manager | 344 } // namespace view_manager |
336 } // namespace services | 345 } // namespace services |
337 } // namespace mojo | 346 } // namespace mojo |
OLD | NEW |