| Index: mojo/services/view_manager/view_manager_service_impl.cc
|
| diff --git a/mojo/services/view_manager/view_manager_service_impl.cc b/mojo/services/view_manager/view_manager_service_impl.cc
|
| index a4390262197533f4a17916edb60965b3ae0fcb03..8823691f2dc23e3fc4a05c5e56a0a0319612dc45 100644
|
| --- a/mojo/services/view_manager/view_manager_service_impl.cc
|
| +++ b/mojo/services/view_manager/view_manager_service_impl.cc
|
| @@ -37,13 +37,18 @@ ViewManagerServiceImpl::ViewManagerServiceImpl(
|
| RootNodeManager* root_node_manager,
|
| ConnectionSpecificId creator_id,
|
| const std::string& creator_url,
|
| - const std::string& url)
|
| + const std::string& url,
|
| + const NodeId& root_id)
|
| : root_node_manager_(root_node_manager),
|
| id_(root_node_manager_->GetAndAdvanceNextConnectionId()),
|
| url_(url),
|
| creator_id_(creator_id),
|
| creator_url_(creator_url),
|
| delete_on_connection_error_(false) {
|
| + if (root_id != InvalidNodeId()) {
|
| + CHECK(GetNode(root_id));
|
| + roots_.insert(NodeIdToTransportId(root_id));
|
| + }
|
| }
|
|
|
| ViewManagerServiceImpl::~ViewManagerServiceImpl() {
|
| @@ -81,16 +86,6 @@ const View* ViewManagerServiceImpl::GetView(const ViewId& id) const {
|
| return root_node_manager_->GetView(id);
|
| }
|
|
|
| -void ViewManagerServiceImpl::SetRoots(const Array<Id>& node_ids) {
|
| - DCHECK(roots_.empty());
|
| - NodeIdSet roots;
|
| - for (size_t i = 0; i < node_ids.size(); ++i) {
|
| - DCHECK(GetNode(NodeIdFromTransportId(node_ids[i])));
|
| - roots.insert(node_ids[i]);
|
| - }
|
| - roots_.swap(roots);
|
| -}
|
| -
|
| void ViewManagerServiceImpl::OnViewManagerServiceImplDestroyed(
|
| ConnectionSpecificId id) {
|
| if (creator_id_ == id)
|
| @@ -343,14 +338,9 @@ bool ViewManagerServiceImpl::CanGetNodeTree(const Node* node) const {
|
| (IsNodeDescendantOfRoots(node) || node->id().connection_id == id_);
|
| }
|
|
|
| -bool ViewManagerServiceImpl::CanEmbed(
|
| - const mojo::Array<uint32_t>& node_ids) const {
|
| - for (size_t i = 0; i < node_ids.size(); ++i) {
|
| - const Node* node = GetNode(NodeIdFromTransportId(node_ids[i]));
|
| - if (!node || node->id().connection_id != id_)
|
| - return false;
|
| - }
|
| - return node_ids.size() > 0;
|
| +bool ViewManagerServiceImpl::CanEmbed(Id transport_node_id) const {
|
| + const Node* node = GetNode(NodeIdFromTransportId(transport_node_id));
|
| + return node && node->id().connection_id == id_;
|
| }
|
|
|
| bool ViewManagerServiceImpl::CanSetNodeVisibility(const Node* node,
|
| @@ -426,32 +416,25 @@ void ViewManagerServiceImpl::RemoveFromKnown(const Node* node) {
|
| RemoveFromKnown(children[i]);
|
| }
|
|
|
| -bool ViewManagerServiceImpl::AddRoots(
|
| - const std::vector<Id>& node_ids) {
|
| - std::vector<const Node*> to_send;
|
| - bool did_add_root = false;
|
| - for (size_t i = 0; i < node_ids.size(); ++i) {
|
| - CHECK_EQ(creator_id_, NodeIdFromTransportId(node_ids[i]).connection_id);
|
| - if (roots_.count(node_ids[i]) > 0)
|
| - continue;
|
| +bool ViewManagerServiceImpl::AddRoot(Id transport_node_id) {
|
| + if (roots_.count(transport_node_id) > 0)
|
| + return false;
|
|
|
| - did_add_root = true;
|
| - roots_.insert(node_ids[i]);
|
| - Node* node = GetNode(NodeIdFromTransportId(node_ids[i]));
|
| - DCHECK(node);
|
| - if (known_nodes_.count(node_ids[i]) == 0) {
|
| - GetUnknownNodesFrom(node, &to_send);
|
| - } else {
|
| - // Even though the connection knows about the new root we need to tell it
|
| - // |node| is now a root.
|
| - to_send.push_back(node);
|
| - }
|
| + std::vector<const Node*> to_send;
|
| + const NodeId node_id(NodeIdFromTransportId(transport_node_id));
|
| + CHECK_EQ(creator_id_, node_id.connection_id);
|
| + roots_.insert(transport_node_id);
|
| + Node* node = GetNode(node_id);
|
| + CHECK(node);
|
| + if (known_nodes_.count(transport_node_id) == 0) {
|
| + GetUnknownNodesFrom(node, &to_send);
|
| + } else {
|
| + // Even though the connection knows about the new root we need to tell it
|
| + // |node| is now a root.
|
| + to_send.push_back(node);
|
| }
|
|
|
| - if (!did_add_root)
|
| - return false;
|
| -
|
| - client()->OnRootsAdded(NodesToNodeDatas(to_send));
|
| + client()->OnRootAdded(NodesToNodeDatas(to_send));
|
| return true;
|
| }
|
|
|
| @@ -750,17 +733,17 @@ void ViewManagerServiceImpl::SetNodeVisibility(
|
| }
|
|
|
| void ViewManagerServiceImpl::Embed(const String& url,
|
| - Array<uint32_t> node_ids,
|
| + Id transport_node_id,
|
| const Callback<void(bool)>& callback) {
|
| - bool success = CanEmbed(node_ids);
|
| + bool success = CanEmbed(transport_node_id);
|
| if (success) {
|
| // We may already have this connection, if so reuse it.
|
| ViewManagerServiceImpl* existing_connection =
|
| root_node_manager_->GetConnectionByCreator(id_, url.To<std::string>());
|
| if (existing_connection)
|
| - success = existing_connection->AddRoots(node_ids.storage());
|
| + success = existing_connection->AddRoot(transport_node_id);
|
| else
|
| - root_node_manager_->Embed(id_, url, node_ids);
|
| + root_node_manager_->Embed(id_, url, transport_node_id);
|
| }
|
| callback.Run(success);
|
| }
|
|
|