| 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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 | 52 |
| 53 std::vector<Node*> children(node->GetChildren()); | 53 std::vector<Node*> children(node->GetChildren()); |
| 54 for (size_t i = 0 ; i < children.size(); ++i) { | 54 for (size_t i = 0 ; i < children.size(); ++i) { |
| 55 (*index)++; | 55 (*index)++; |
| 56 NodeToINode(children[i], array_builder, index); | 56 NodeToINode(children[i], array_builder, index); |
| 57 } | 57 } |
| 58 } | 58 } |
| 59 | 59 |
| 60 } // namespace | 60 } // namespace |
| 61 | 61 |
| 62 ViewManagerConnection::ViewManagerConnection() : client_(NULL), id_(0) { | 62 ViewManagerConnection::ViewManagerConnection(RootNodeManager* root_node_manager) |
| 63 : root_node_manager_(root_node_manager), |
| 64 client_(NULL), |
| 65 id_(0) { |
| 63 } | 66 } |
| 64 | 67 |
| 65 ViewManagerConnection::~ViewManagerConnection() { | 68 ViewManagerConnection::~ViewManagerConnection() { |
| 66 // Delete any views we own. | 69 // Delete any views we own. |
| 67 while (!view_map_.empty()) { | 70 while (!view_map_.empty()) { |
| 68 bool result = DeleteViewImpl(this, view_map_.begin()->second->id(), 0); | 71 bool result = DeleteViewImpl(this, view_map_.begin()->second->id(), 0); |
| 69 DCHECK(result); | 72 DCHECK(result); |
| 70 } | 73 } |
| 71 | 74 |
| 72 // We're about to destroy all our nodes. Detach any views from them. | 75 // We're about to destroy all our nodes. Detach any views from them. |
| 73 for (NodeMap::iterator i = node_map_.begin(); i != node_map_.end(); ++i) { | 76 for (NodeMap::iterator i = node_map_.begin(); i != node_map_.end(); ++i) { |
| 74 if (i->second->view()) { | 77 if (i->second->view()) { |
| 75 bool result = SetViewImpl(i->second->id(), ViewId(), 0); | 78 bool result = SetViewImpl(i->second->id(), ViewId(), 0); |
| 76 DCHECK(result); | 79 DCHECK(result); |
| 77 } | 80 } |
| 78 } | 81 } |
| 79 | 82 |
| 80 STLDeleteContainerPairSecondPointers(node_map_.begin(), node_map_.end()); | 83 STLDeleteContainerPairSecondPointers(node_map_.begin(), node_map_.end()); |
| 81 context()->RemoveConnection(this); | 84 root_node_manager_->RemoveConnection(this); |
| 82 } | 85 } |
| 83 | 86 |
| 87 void ViewManagerConnection::OnConnectionError() {} |
| 88 |
| 84 void ViewManagerConnection::Initialize() { | 89 void ViewManagerConnection::Initialize() { |
| 85 DCHECK_EQ(0, id_); // Should only get Initialize() once. | 90 DCHECK_EQ(0, id_); // Should only get Initialize() once. |
| 86 id_ = context()->GetAndAdvanceNextConnectionId(); | 91 id_ = root_node_manager_->GetAndAdvanceNextConnectionId(); |
| 87 context()->AddConnection(this); | 92 root_node_manager_->AddConnection(this); |
| 88 client_->OnConnectionEstablished(id_, context()->next_server_change_id()); | 93 client_->OnConnectionEstablished(id_, |
| 94 root_node_manager_->next_server_change_id()); |
| 89 } | 95 } |
| 90 | 96 |
| 91 Node* ViewManagerConnection::GetNode(const NodeId& id) { | 97 Node* ViewManagerConnection::GetNode(const NodeId& id) { |
| 92 if (id_ == id.connection_id) { | 98 if (id_ == id.connection_id) { |
| 93 NodeMap::iterator i = node_map_.find(id.node_id); | 99 NodeMap::iterator i = node_map_.find(id.node_id); |
| 94 return i == node_map_.end() ? NULL : i->second; | 100 return i == node_map_.end() ? NULL : i->second; |
| 95 } | 101 } |
| 96 return context()->GetNode(id); | 102 return root_node_manager_->GetNode(id); |
| 97 } | 103 } |
| 98 | 104 |
| 99 View* ViewManagerConnection::GetView(const ViewId& id) { | 105 View* ViewManagerConnection::GetView(const ViewId& id) { |
| 100 if (id_ == id.connection_id) { | 106 if (id_ == id.connection_id) { |
| 101 ViewMap::const_iterator i = view_map_.find(id.view_id); | 107 ViewMap::const_iterator i = view_map_.find(id.view_id); |
| 102 return i == view_map_.end() ? NULL : i->second; | 108 return i == view_map_.end() ? NULL : i->second; |
| 103 } | 109 } |
| 104 return context()->GetView(id); | 110 return root_node_manager_->GetView(id); |
| 105 } | 111 } |
| 106 | 112 |
| 107 void ViewManagerConnection::NotifyNodeHierarchyChanged( | 113 void ViewManagerConnection::NotifyNodeHierarchyChanged( |
| 108 const NodeId& node, | 114 const NodeId& node, |
| 109 const NodeId& new_parent, | 115 const NodeId& new_parent, |
| 110 const NodeId& old_parent, | 116 const NodeId& old_parent, |
| 111 TransportChangeId server_change_id, | 117 TransportChangeId server_change_id, |
| 112 TransportChangeId client_change_id) { | 118 TransportChangeId client_change_id) { |
| 113 client_->OnNodeHierarchyChanged(NodeIdToTransportId(node), | 119 client_->OnNodeHierarchyChanged(NodeIdToTransportId(node), |
| 114 NodeIdToTransportId(new_parent), | 120 NodeIdToTransportId(new_parent), |
| (...skipping 22 matching lines...) Expand all Loading... |
| 137 } | 143 } |
| 138 | 144 |
| 139 bool ViewManagerConnection::DeleteNodeImpl(ViewManagerConnection* source, | 145 bool ViewManagerConnection::DeleteNodeImpl(ViewManagerConnection* source, |
| 140 const NodeId& node_id, | 146 const NodeId& node_id, |
| 141 TransportChangeId change_id) { | 147 TransportChangeId change_id) { |
| 142 DCHECK_EQ(node_id.connection_id, id_); | 148 DCHECK_EQ(node_id.connection_id, id_); |
| 143 Node* node = GetNode(node_id); | 149 Node* node = GetNode(node_id); |
| 144 if (!node) | 150 if (!node) |
| 145 return false; | 151 return false; |
| 146 RootNodeManager::ScopedChange change( | 152 RootNodeManager::ScopedChange change( |
| 147 source, context(), change_id, | 153 source, root_node_manager_, change_id, |
| 148 RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID); | 154 RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID); |
| 149 if (node->GetParent()) | 155 if (node->GetParent()) |
| 150 node->GetParent()->Remove(node); | 156 node->GetParent()->Remove(node); |
| 151 std::vector<Node*> children(node->GetChildren()); | 157 std::vector<Node*> children(node->GetChildren()); |
| 152 for (size_t i = 0; i < children.size(); ++i) | 158 for (size_t i = 0; i < children.size(); ++i) |
| 153 node->Remove(children[i]); | 159 node->Remove(children[i]); |
| 154 DCHECK(node->GetChildren().empty()); | 160 DCHECK(node->GetChildren().empty()); |
| 155 node_map_.erase(node_id.node_id); | 161 node_map_.erase(node_id.node_id); |
| 156 delete node; | 162 delete node; |
| 157 node = NULL; | 163 node = NULL; |
| 158 context()->NotifyNodeDeleted(node_id); | 164 root_node_manager_->NotifyNodeDeleted(node_id); |
| 159 return true; | 165 return true; |
| 160 } | 166 } |
| 161 | 167 |
| 162 bool ViewManagerConnection::DeleteViewImpl(ViewManagerConnection* source, | 168 bool ViewManagerConnection::DeleteViewImpl(ViewManagerConnection* source, |
| 163 const ViewId& view_id, | 169 const ViewId& view_id, |
| 164 TransportChangeId change_id) { | 170 TransportChangeId change_id) { |
| 165 DCHECK_EQ(view_id.connection_id, id_); | 171 DCHECK_EQ(view_id.connection_id, id_); |
| 166 View* view = GetView(view_id); | 172 View* view = GetView(view_id); |
| 167 if (!view) | 173 if (!view) |
| 168 return false; | 174 return false; |
| 169 RootNodeManager::ScopedChange change( | 175 RootNodeManager::ScopedChange change( |
| 170 source, context(), change_id, | 176 source, root_node_manager_, change_id, |
| 171 RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID); | 177 RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID); |
| 172 if (view->node()) | 178 if (view->node()) |
| 173 view->node()->SetView(NULL); | 179 view->node()->SetView(NULL); |
| 174 view_map_.erase(view_id.view_id); | 180 view_map_.erase(view_id.view_id); |
| 175 delete view; | 181 delete view; |
| 176 return true; | 182 return true; |
| 177 } | 183 } |
| 178 | 184 |
| 179 bool ViewManagerConnection::SetViewImpl(const NodeId& node_id, | 185 bool ViewManagerConnection::SetViewImpl(const NodeId& node_id, |
| 180 const ViewId& view_id, | 186 const ViewId& view_id, |
| 181 TransportChangeId change_id) { | 187 TransportChangeId change_id) { |
| 182 Node* node = GetNode(node_id); | 188 Node* node = GetNode(node_id); |
| 183 if (!node) | 189 if (!node) |
| 184 return false; | 190 return false; |
| 185 View* view = GetView(view_id); | 191 View* view = GetView(view_id); |
| 186 if (!view && view_id != ViewId()) | 192 if (!view && view_id != ViewId()) |
| 187 return false; | 193 return false; |
| 188 RootNodeManager::ScopedChange change( | 194 RootNodeManager::ScopedChange change( |
| 189 this, context(), change_id, | 195 this, root_node_manager_, change_id, |
| 190 RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID); | 196 RootNodeManager::CHANGE_TYPE_DONT_ADVANCE_SERVER_CHANGE_ID); |
| 191 node->SetView(view); | 197 node->SetView(view); |
| 192 return true; | 198 return true; |
| 193 } | 199 } |
| 194 | 200 |
| 195 void ViewManagerConnection::SetClient(IViewManagerClient* client) { | 201 void ViewManagerConnection::SetClient(IViewManagerClient* client) { |
| 196 client_ = client; | 202 client_ = client; |
| 197 } | 203 } |
| 198 | 204 |
| 199 void ViewManagerConnection::CreateNode( | 205 void ViewManagerConnection::CreateNode( |
| 200 TransportConnectionSpecificNodeId node_id, | 206 TransportConnectionSpecificNodeId node_id, |
| 201 const Callback<void(bool)>& callback) { | 207 const Callback<void(bool)>& callback) { |
| 202 // Negative values are reserved. | 208 // Negative values are reserved. |
| 203 if (node_map_.find(node_id) != node_map_.end()) { | 209 if (node_map_.find(node_id) != node_map_.end()) { |
| 204 callback.Run(false); | 210 callback.Run(false); |
| 205 return; | 211 return; |
| 206 } | 212 } |
| 207 node_map_[node_id] = new Node(this, NodeId(id_, node_id)); | 213 node_map_[node_id] = new Node(this, NodeId(id_, node_id)); |
| 208 callback.Run(true); | 214 callback.Run(true); |
| 209 } | 215 } |
| 210 | 216 |
| 211 void ViewManagerConnection::DeleteNode( | 217 void ViewManagerConnection::DeleteNode( |
| 212 TransportNodeId transport_node_id, | 218 TransportNodeId transport_node_id, |
| 213 TransportChangeId change_id, | 219 TransportChangeId change_id, |
| 214 const Callback<void(bool)>& callback) { | 220 const Callback<void(bool)>& callback) { |
| 215 const NodeId node_id(NodeIdFromTransportId(transport_node_id)); | 221 const NodeId node_id(NodeIdFromTransportId(transport_node_id)); |
| 216 ViewManagerConnection* connection = context()->GetConnection( | 222 ViewManagerConnection* connection = root_node_manager_->GetConnection( |
| 217 node_id.connection_id); | 223 node_id.connection_id); |
| 218 callback.Run(connection && | 224 callback.Run(connection && |
| 219 connection->DeleteNodeImpl(this, node_id, change_id)); | 225 connection->DeleteNodeImpl(this, node_id, change_id)); |
| 220 } | 226 } |
| 221 | 227 |
| 222 void ViewManagerConnection::AddNode( | 228 void ViewManagerConnection::AddNode( |
| 223 TransportNodeId parent_id, | 229 TransportNodeId parent_id, |
| 224 TransportNodeId child_id, | 230 TransportNodeId child_id, |
| 225 TransportChangeId server_change_id, | 231 TransportChangeId server_change_id, |
| 226 TransportChangeId client_change_id, | 232 TransportChangeId client_change_id, |
| 227 const Callback<void(bool)>& callback) { | 233 const Callback<void(bool)>& callback) { |
| 228 bool success = false; | 234 bool success = false; |
| 229 if (server_change_id == context()->next_server_change_id()) { | 235 if (server_change_id == root_node_manager_->next_server_change_id()) { |
| 230 Node* parent = GetNode(NodeIdFromTransportId(parent_id)); | 236 Node* parent = GetNode(NodeIdFromTransportId(parent_id)); |
| 231 Node* child = GetNode(NodeIdFromTransportId(child_id)); | 237 Node* child = GetNode(NodeIdFromTransportId(child_id)); |
| 232 if (parent && child && child->GetParent() != parent && | 238 if (parent && child && child->GetParent() != parent && |
| 233 !child->window()->Contains(parent->window())) { | 239 !child->window()->Contains(parent->window())) { |
| 234 success = true; | 240 success = true; |
| 235 RootNodeManager::ScopedChange change( | 241 RootNodeManager::ScopedChange change( |
| 236 this, context(), client_change_id, | 242 this, root_node_manager_, client_change_id, |
| 237 RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID); | 243 RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID); |
| 238 parent->Add(child); | 244 parent->Add(child); |
| 239 } | 245 } |
| 240 } | 246 } |
| 241 callback.Run(success); | 247 callback.Run(success); |
| 242 } | 248 } |
| 243 | 249 |
| 244 void ViewManagerConnection::RemoveNodeFromParent( | 250 void ViewManagerConnection::RemoveNodeFromParent( |
| 245 TransportNodeId node_id, | 251 TransportNodeId node_id, |
| 246 TransportChangeId server_change_id, | 252 TransportChangeId server_change_id, |
| 247 TransportChangeId client_change_id, | 253 TransportChangeId client_change_id, |
| 248 const Callback<void(bool)>& callback) { | 254 const Callback<void(bool)>& callback) { |
| 249 bool success = false; | 255 bool success = false; |
| 250 if (server_change_id == context()->next_server_change_id()) { | 256 if (server_change_id == root_node_manager_->next_server_change_id()) { |
| 251 Node* node = GetNode(NodeIdFromTransportId(node_id)); | 257 Node* node = GetNode(NodeIdFromTransportId(node_id)); |
| 252 if (node && node->GetParent()) { | 258 if (node && node->GetParent()) { |
| 253 success = true; | 259 success = true; |
| 254 RootNodeManager::ScopedChange change( | 260 RootNodeManager::ScopedChange change( |
| 255 this, context(), client_change_id, | 261 this, root_node_manager_, client_change_id, |
| 256 RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID); | 262 RootNodeManager::CHANGE_TYPE_ADVANCE_SERVER_CHANGE_ID); |
| 257 node->GetParent()->Remove(node); | 263 node->GetParent()->Remove(node); |
| 258 } | 264 } |
| 259 } | 265 } |
| 260 callback.Run(success); | 266 callback.Run(success); |
| 261 } | 267 } |
| 262 | 268 |
| 263 void ViewManagerConnection::GetNodeTree( | 269 void ViewManagerConnection::GetNodeTree( |
| 264 TransportNodeId node_id, | 270 TransportNodeId node_id, |
| 265 const Callback<void(Array<INode>)>& callback) { | 271 const Callback<void(Array<INode>)>& callback) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 282 } | 288 } |
| 283 view_map_[view_id] = new View(ViewId(id_, view_id)); | 289 view_map_[view_id] = new View(ViewId(id_, view_id)); |
| 284 callback.Run(true); | 290 callback.Run(true); |
| 285 } | 291 } |
| 286 | 292 |
| 287 void ViewManagerConnection::DeleteView( | 293 void ViewManagerConnection::DeleteView( |
| 288 TransportViewId transport_view_id, | 294 TransportViewId transport_view_id, |
| 289 TransportChangeId change_id, | 295 TransportChangeId change_id, |
| 290 const Callback<void(bool)>& callback) { | 296 const Callback<void(bool)>& callback) { |
| 291 const ViewId view_id(ViewIdFromTransportId(transport_view_id)); | 297 const ViewId view_id(ViewIdFromTransportId(transport_view_id)); |
| 292 ViewManagerConnection* connection = context()->GetConnection( | 298 ViewManagerConnection* connection = root_node_manager_->GetConnection( |
| 293 view_id.connection_id); | 299 view_id.connection_id); |
| 294 callback.Run(connection && | 300 callback.Run(connection && |
| 295 connection->DeleteViewImpl(this, view_id, change_id)); | 301 connection->DeleteViewImpl(this, view_id, change_id)); |
| 296 } | 302 } |
| 297 | 303 |
| 298 void ViewManagerConnection::SetView( | 304 void ViewManagerConnection::SetView( |
| 299 TransportNodeId transport_node_id, | 305 TransportNodeId transport_node_id, |
| 300 TransportViewId transport_view_id, | 306 TransportViewId transport_view_id, |
| 301 TransportChangeId change_id, | 307 TransportChangeId change_id, |
| 302 const Callback<void(bool)>& callback) { | 308 const Callback<void(bool)>& callback) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 320 SkBitmap bitmap; | 326 SkBitmap bitmap; |
| 321 gfx::PNGCodec::Decode(static_cast<const unsigned char*>(handle_data), | 327 gfx::PNGCodec::Decode(static_cast<const unsigned char*>(handle_data), |
| 322 buffer_size, &bitmap); | 328 buffer_size, &bitmap); |
| 323 view->SetBitmap(bitmap); | 329 view->SetBitmap(bitmap); |
| 324 UnmapBuffer(handle_data); | 330 UnmapBuffer(handle_data); |
| 325 } | 331 } |
| 326 | 332 |
| 327 void ViewManagerConnection::OnNodeHierarchyChanged(const NodeId& node, | 333 void ViewManagerConnection::OnNodeHierarchyChanged(const NodeId& node, |
| 328 const NodeId& new_parent, | 334 const NodeId& new_parent, |
| 329 const NodeId& old_parent) { | 335 const NodeId& old_parent) { |
| 330 context()->NotifyNodeHierarchyChanged(node, new_parent, old_parent); | 336 root_node_manager_->NotifyNodeHierarchyChanged(node, new_parent, old_parent); |
| 331 } | 337 } |
| 332 | 338 |
| 333 void ViewManagerConnection::OnNodeViewReplaced(const NodeId& node, | 339 void ViewManagerConnection::OnNodeViewReplaced(const NodeId& node, |
| 334 const ViewId& new_view_id, | 340 const ViewId& new_view_id, |
| 335 const ViewId& old_view_id) { | 341 const ViewId& old_view_id) { |
| 336 context()->NotifyNodeViewReplaced(node, new_view_id, old_view_id); | 342 root_node_manager_->NotifyNodeViewReplaced(node, new_view_id, old_view_id); |
| 337 } | 343 } |
| 338 | 344 |
| 339 } // namespace view_manager | 345 } // namespace view_manager |
| 340 } // namespace services | 346 } // namespace services |
| 341 } // namespace mojo | 347 } // namespace mojo |
| OLD | NEW |