| 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 69495c5f50fe5e7a522768f8852319b71e131469..e1229d3a98c321ef39f01e1bc3a404d6bdc35688 100644
|
| --- a/mojo/services/view_manager/view_manager_service_impl.cc
|
| +++ b/mojo/services/view_manager/view_manager_service_impl.cc
|
| @@ -214,32 +214,6 @@ void ViewManagerServiceImpl::RemoveFromKnown(
|
| RemoveFromKnown(children[i], local_views);
|
| }
|
|
|
| -void ViewManagerServiceImpl::AddRoot(
|
| - const ViewId& view_id,
|
| - InterfaceRequest<ServiceProvider> service_provider) {
|
| - const Id transport_view_id(ViewIdToTransportId(view_id));
|
| - CHECK(roots_.count(transport_view_id) == 0);
|
| -
|
| - CHECK_EQ(creator_id_, view_id.connection_id);
|
| - roots_.insert(transport_view_id);
|
| - const ServerView* view = GetView(view_id);
|
| - CHECK(view);
|
| - std::vector<const ServerView*> to_send;
|
| - if (!IsViewKnown(view)) {
|
| - GetUnknownViewsFrom(view, &to_send);
|
| - } else {
|
| - // Even though the connection knows about the new root we need to tell it
|
| - // |view| is now a root.
|
| - to_send.push_back(view);
|
| - }
|
| -
|
| - client()->OnEmbed(id_,
|
| - creator_url_,
|
| - ViewToViewData(to_send.front()),
|
| - service_provider.Pass());
|
| - connection_manager_->OnConnectionMessagedClient(id_);
|
| -}
|
| -
|
| void ViewManagerServiceImpl::RemoveRoot(const ViewId& view_id) {
|
| const Id transport_view_id(ViewIdToTransportId(view_id));
|
| CHECK(roots_.count(transport_view_id) > 0);
|
| @@ -464,33 +438,25 @@ void ViewManagerServiceImpl::Embed(
|
| return;
|
| }
|
| const ServerView* view = GetView(ViewIdFromTransportId(transport_view_id));
|
| - bool success = view && access_policy_->CanEmbed(view);
|
| - if (success) {
|
| - // Only allow a view to be the root for one connection.
|
| - const ViewId view_id(ViewIdFromTransportId(transport_view_id));
|
| - ViewManagerServiceImpl* connection_by_url =
|
| - connection_manager_->GetConnectionByCreator(id_, url.To<std::string>());
|
| - ViewManagerServiceImpl* connection_with_view_as_root =
|
| - connection_manager_->GetConnectionWithRoot(view_id);
|
| - if ((connection_by_url != connection_with_view_as_root ||
|
| - (!connection_by_url && !connection_with_view_as_root)) &&
|
| - (!connection_by_url || !connection_by_url->HasRoot(view_id))) {
|
| - ConnectionManager::ScopedChange change(this, connection_manager_, true);
|
| - RemoveChildrenAsPartOfEmbed(view_id);
|
| - // Never message the originating connection.
|
| - connection_manager_->OnConnectionMessagedClient(id_);
|
| - if (connection_with_view_as_root)
|
| - connection_with_view_as_root->RemoveRoot(view_id);
|
| - if (connection_by_url) {
|
| - connection_by_url->AddRoot(view_id, spir.Pass());
|
| - } else {
|
| - connection_manager_->Embed(id_, url, transport_view_id, spir.Pass());
|
| - }
|
| - } else {
|
| - success = false;
|
| - }
|
| + if (!view || !access_policy_->CanEmbed(view)) {
|
| + callback.Run(false);
|
| + return;
|
| }
|
| - callback.Run(success);
|
| +
|
| + // Only allow a node to be the root for one connection.
|
| + const ViewId view_id(ViewIdFromTransportId(transport_view_id));
|
| + ViewManagerServiceImpl* existing_owner =
|
| + connection_manager_->GetConnectionWithRoot(view_id);
|
| +
|
| + ConnectionManager::ScopedChange change(this, connection_manager_, true);
|
| + RemoveChildrenAsPartOfEmbed(view_id);
|
| + if (existing_owner) {
|
| + // Never message the originating connection.
|
| + connection_manager_->OnConnectionMessagedClient(id_);
|
| + existing_owner->RemoveRoot(view_id);
|
| + }
|
| + connection_manager_->Embed(id_, url, transport_view_id, spir.Pass());
|
| + callback.Run(true);
|
| }
|
|
|
| void ViewManagerServiceImpl::DispatchOnViewInputEvent(Id transport_view_id,
|
|
|