1 # Copyright 2013 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.
5 from itertools import ifilter
6 from operator import itemgetter
8 from data_source import DataSource
9 import features_utility as features
10 from svn_constants import PRIVATE_TEMPLATE_PATH
11 from third_party.json_schema_compiler.json_parse import Parse
13 def _ListifyPermissions(permissions):
14 '''Filter out any permissions that do not have a description or with a name
15 that ends with Private then sort permissions features by name into a list.
17 def filter_permissions(perm):
18 return 'description' in perm and not perm['name'].endswith('Private')
21 ifilter(filter_permissions, permissions.values()),
22 key=itemgetter('name'))
24 def _AddDependencyDescriptions(permissions, api_features):
25 '''Use |api_features| to determine the dependencies APIs have on permissions.
26 Add descriptions to |permissions| based on those dependencies.
28 for name, permission in permissions.iteritems():
29 # Don't overwrite the description created by expanding a partial template.
30 if 'partial' in permission or not permission['platforms']:
34 if name in api_features:
35 for dependency in api_features[name].get('dependencies', ()):
36 if dependency.startswith('permission:'):
40 permission['partial'] = 'permissions/generic_description.html'
42 class PermissionsDataSource(DataSource):
43 '''Load and format permissions features to be used by templates.
45 def __init__(self, server_instance, request):
46 self._features_bundle = server_instance.features_bundle
47 self._object_store = server_instance.object_store_creator.Create(
48 PermissionsDataSource)
49 self._template_cache = server_instance.compiled_fs_factory.ForTemplates(
50 server_instance.host_file_system_provider.GetTrunk())
52 def _CreatePermissionsData(self):
53 api_features = self._features_bundle.GetAPIFeatures()
54 permission_features = self._features_bundle.GetPermissionFeatures()
56 def filter_for_platform(permissions, platform):
57 return _ListifyPermissions(features.Filtered(permissions, platform))
59 _AddDependencyDescriptions(permission_features, api_features)
60 # Turn partial templates into descriptions, ensure anchors are set.
61 for permission in permission_features.values():
62 if not 'anchor' in permission:
63 permission['anchor'] = permission['name']
64 if 'partial' in permission:
65 permission['description'] = self._template_cache.GetFromFile('%s/%s' %
66 (PRIVATE_TEMPLATE_PATH, permission['partial'])).Get()
67 del permission['partial']
70 'declare_apps': filter_for_platform(permission_features, 'apps'),
71 'declare_extensions': filter_for_platform(
72 permission_features, 'extensions')
75 def _GetCachedPermissionsData(self):
76 data = self._object_store.Get('permissions_data').Get()
78 data = self._CreatePermissionsData()
79 self._object_store.Set('permissions_data', data)
83 # TODO(kalman): Implement this.
87 return self._GetCachedPermissionsData().get(key)