- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / common / extensions / docs / server2 / permissions_data_source.py
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.
4
5 from itertools import ifilter
6 from operator import itemgetter
7
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
12
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.
16   '''
17   def filter_permissions(perm):
18     return 'description' in perm and not perm['name'].endswith('Private')
19
20   return sorted(
21       ifilter(filter_permissions, permissions.values()),
22       key=itemgetter('name'))
23
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.
27   '''
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']:
31       continue
32
33     has_deps = False
34     if name in api_features:
35       for dependency in api_features[name].get('dependencies', ()):
36         if dependency.startswith('permission:'):
37           has_deps = True
38
39     if has_deps:
40       permission['partial'] = 'permissions/generic_description.html'
41
42 class PermissionsDataSource(DataSource):
43   '''Load and format permissions features to be used by templates.
44   '''
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())
51
52   def _CreatePermissionsData(self):
53     api_features = self._features_bundle.GetAPIFeatures()
54     permission_features = self._features_bundle.GetPermissionFeatures()
55
56     def filter_for_platform(permissions, platform):
57       return _ListifyPermissions(features.Filtered(permissions, platform))
58
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']
68
69     return {
70       'declare_apps': filter_for_platform(permission_features, 'apps'),
71       'declare_extensions': filter_for_platform(
72           permission_features, 'extensions')
73     }
74
75   def _GetCachedPermissionsData(self):
76     data = self._object_store.Get('permissions_data').Get()
77     if data is None:
78       data = self._CreatePermissionsData()
79       self._object_store.Set('permissions_data', data)
80     return data
81
82   def Cron(self):
83     # TODO(kalman): Implement this.
84     pass
85
86   def get(self, key):
87     return self._GetCachedPermissionsData().get(key)