Home | History | Annotate | Download | only in view_manager
      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