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 3 // found in the LICENSE file. 4 5 #include "mojo/services/view_manager/default_access_policy.h" 6 7 #include "mojo/services/view_manager/access_policy_delegate.h" 8 #include "mojo/services/view_manager/server_view.h" 9 10 namespace mojo { 11 namespace service { 12 13 DefaultAccessPolicy::DefaultAccessPolicy(ConnectionSpecificId connection_id, 14 AccessPolicyDelegate* delegate) 15 : connection_id_(connection_id), 16 delegate_(delegate) { 17 } 18 19 DefaultAccessPolicy::~DefaultAccessPolicy() { 20 } 21 22 bool DefaultAccessPolicy::CanRemoveViewFromParent( 23 const ServerView* view) const { 24 if (!WasCreatedByThisConnection(view)) 25 return false; // Can only unparent views we created. 26 27 return IsViewInRoots(view->parent()) || 28 WasCreatedByThisConnection(view->parent()); 29 } 30 31 bool DefaultAccessPolicy::CanAddView(const ServerView* parent, 32 const ServerView* child) const { 33 return WasCreatedByThisConnection(child) && 34 (IsViewInRoots(parent) || 35 (WasCreatedByThisConnection(parent) && 36 !delegate_->IsViewRootOfAnotherConnectionForAccessPolicy(parent))); 37 } 38 39 bool DefaultAccessPolicy::CanReorderView(const ServerView* view, 40 const ServerView* relative_view, 41 OrderDirection direction) const { 42 return WasCreatedByThisConnection(view) && 43 WasCreatedByThisConnection(relative_view); 44 } 45 46 bool DefaultAccessPolicy::CanDeleteView(const ServerView* view) const { 47 return WasCreatedByThisConnection(view); 48 } 49 50 bool DefaultAccessPolicy::CanGetViewTree(const ServerView* view) const { 51 return WasCreatedByThisConnection(view) || IsViewInRoots(view); 52 } 53 54 bool DefaultAccessPolicy::CanDescendIntoViewForViewTree( 55 const ServerView* view) const { 56 return WasCreatedByThisConnection(view) && 57 !delegate_->IsViewRootOfAnotherConnectionForAccessPolicy(view); 58 } 59 60 bool DefaultAccessPolicy::CanEmbed(const ServerView* view) const { 61 return WasCreatedByThisConnection(view); 62 } 63 64 bool DefaultAccessPolicy::CanChangeViewVisibility( 65 const ServerView* view) const { 66 return WasCreatedByThisConnection(view) || IsViewInRoots(view); 67 } 68 69 bool DefaultAccessPolicy::CanSetViewSurfaceId(const ServerView* view) const { 70 // Once a view embeds another app, the embedder app is no longer able to 71 // call SetViewSurfaceId() - this ability is transferred to the embedded app. 72 if (delegate_->IsViewRootOfAnotherConnectionForAccessPolicy(view)) 73 return false; 74 return WasCreatedByThisConnection(view) || IsViewInRoots(view); 75 } 76 77 bool DefaultAccessPolicy::CanSetViewBounds(const ServerView* view) const { 78 return WasCreatedByThisConnection(view); 79 } 80 81 bool DefaultAccessPolicy::ShouldNotifyOnHierarchyChange( 82 const ServerView* view, 83 const ServerView** new_parent, 84 const ServerView** old_parent) const { 85 if (!WasCreatedByThisConnection(view)) 86 return false; 87 88 if (*new_parent && !WasCreatedByThisConnection(*new_parent) && 89 !IsViewInRoots(*new_parent)) { 90 *new_parent = NULL; 91 } 92 93 if (*old_parent && !WasCreatedByThisConnection(*old_parent) && 94 !IsViewInRoots(*old_parent)) { 95 *old_parent = NULL; 96 } 97 return true; 98 } 99 100 bool DefaultAccessPolicy::IsViewInRoots(const ServerView* view) const { 101 return delegate_->GetRootsForAccessPolicy().count( 102 ViewIdToTransportId(view->id())) > 0; 103 } 104 105 } // namespace service 106 } // namespace mojo 107