| 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 3e1a06c9a9bf08119c529164632de75db57e759d..5ef7e09f73911956e173aba172dfe18437c54d48 100644
|
| --- a/mojo/services/view_manager/view_manager_service_impl.cc
|
| +++ b/mojo/services/view_manager/view_manager_service_impl.cc
|
| @@ -31,14 +31,12 @@ ViewManagerServiceImpl::ViewManagerServiceImpl(
|
| creator_id_(creator_id),
|
| creator_url_(creator_url),
|
| delete_on_connection_error_(false) {
|
| - // TODO: http://crbug.com/397660 .
|
| - if (root_id != InvalidNodeId()) {
|
| - CHECK(GetNode(root_id));
|
| - roots_.insert(NodeIdToTransportId(root_id));
|
| - access_policy_.reset(new DefaultAccessPolicy(id_, this));
|
| - } else {
|
| + CHECK(GetNode(root_id));
|
| + roots_.insert(NodeIdToTransportId(root_id));
|
| + if (root_id == RootNodeId())
|
| access_policy_.reset(new WindowManagerAccessPolicy(id_, this));
|
| - }
|
| + else
|
| + access_policy_.reset(new DefaultAccessPolicy(id_, this));
|
| }
|
|
|
| ViewManagerServiceImpl::~ViewManagerServiceImpl() {
|
| @@ -81,7 +79,7 @@ bool ViewManagerServiceImpl::HasRoot(const NodeId& id) const {
|
| void ViewManagerServiceImpl::OnViewManagerServiceImplDestroyed(
|
| ConnectionSpecificId id) {
|
| if (creator_id_ == id)
|
| - creator_id_ = kRootConnection;
|
| + creator_id_ = kInvalidConnectionId;
|
| }
|
|
|
| void ViewManagerServiceImpl::ProcessNodeBoundsChanged(
|
| @@ -101,6 +99,11 @@ void ViewManagerServiceImpl::ProcessNodeHierarchyChanged(
|
| const Node* new_parent,
|
| const Node* old_parent,
|
| bool originated_change) {
|
| + if (originated_change && !IsNodeKnown(node) && new_parent &&
|
| + IsNodeKnown(new_parent)) {
|
| + std::vector<const Node*> unused;
|
| + GetUnknownNodesFrom(node, &unused);
|
| + }
|
| if (originated_change || root_node_manager_->is_processing_delete_node() ||
|
| root_node_manager_->DidConnectionMessageClient(id_)) {
|
| return;
|
| @@ -158,11 +161,7 @@ void ViewManagerServiceImpl::ProcessNodeDeleted(const NodeId& node,
|
| node_map_.erase(node.node_id);
|
|
|
| const bool in_known = known_nodes_.erase(NodeIdToTransportId(node)) > 0;
|
| - const bool in_roots = roots_.erase(NodeIdToTransportId(node)) > 0;
|
| -
|
| - // TODO(sky): cleanup!
|
| - if (in_roots && roots_.empty())
|
| - roots_.insert(NodeIdToTransportId(InvalidNodeId()));
|
| + roots_.erase(NodeIdToTransportId(node));
|
|
|
| if (originated_change)
|
| return;
|
| @@ -266,10 +265,12 @@ bool ViewManagerServiceImpl::SetViewImpl(Node* node, View* view) {
|
| void ViewManagerServiceImpl::GetUnknownNodesFrom(
|
| const Node* node,
|
| std::vector<const Node*>* nodes) {
|
| - if (IsNodeKnown(node))
|
| + if (IsNodeKnown(node) || !access_policy_->CanGetNodeTree(node))
|
| return;
|
| nodes->push_back(node);
|
| known_nodes_.insert(NodeIdToTransportId(node->id()));
|
| + if (!access_policy_->CanDescendIntoNodeForNodeTree(node))
|
| + return;
|
| std::vector<const Node*> children(node->GetChildren());
|
| for (size_t i = 0 ; i < children.size(); ++i)
|
| GetUnknownNodesFrom(children[i], nodes);
|
| @@ -314,8 +315,6 @@ void ViewManagerServiceImpl::RemoveRoot(const NodeId& node_id) {
|
| CHECK(roots_.count(transport_node_id) > 0);
|
|
|
| roots_.erase(transport_node_id);
|
| - if (roots_.empty())
|
| - roots_.insert(NodeIdToTransportId(InvalidNodeId()));
|
|
|
| // No need to do anything if we created the node.
|
| if (node_id.connection_id == id_)
|
| @@ -334,10 +333,6 @@ void ViewManagerServiceImpl::RemoveRoot(const NodeId& node_id) {
|
|
|
| void ViewManagerServiceImpl::RemoveChildrenAsPartOfEmbed(
|
| const NodeId& node_id) {
|
| - // Let the root do what it wants.
|
| - if (roots_.empty())
|
| - return;
|
| -
|
| Node* node = GetNode(node_id);
|
| CHECK(node);
|
| CHECK(node->id().connection_id == node_id.connection_id);
|
| @@ -633,12 +628,8 @@ void ViewManagerServiceImpl::OnConnectionEstablished() {
|
| root_node_manager_->AddConnection(this);
|
|
|
| std::vector<const Node*> to_send;
|
| - if (roots_.empty()) {
|
| - GetUnknownNodesFrom(root_node_manager_->root(), &to_send);
|
| - } else {
|
| - for (NodeIdSet::const_iterator i = roots_.begin(); i != roots_.end(); ++i)
|
| - GetUnknownNodesFrom(GetNode(NodeIdFromTransportId(*i)), &to_send);
|
| - }
|
| + for (NodeIdSet::const_iterator i = roots_.begin(); i != roots_.end(); ++i)
|
| + GetUnknownNodesFrom(GetNode(NodeIdFromTransportId(*i)), &to_send);
|
|
|
| client()->OnViewManagerConnectionEstablished(
|
| id_,
|
|
|