OLD | NEW |
1 # Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 import posixpath | 5 import posixpath |
6 | 6 |
7 from compiled_file_system import SingleFile, Unicode | 7 from compiled_file_system import SingleFile, Unicode |
8 from extensions_paths import ( | 8 from extensions_paths import API_PATHS, JSON_TEMPLATES |
9 API_FEATURES, JSON_TEMPLATES, MANIFEST_FEATURES, PERMISSION_FEATURES) | |
10 import features_utility | 9 import features_utility |
11 from file_system import FileNotFoundError | 10 from file_system import FileNotFoundError |
12 from future import Future | 11 from future import Future |
13 from third_party.json_schema_compiler.json_parse import Parse | 12 from third_party.json_schema_compiler.json_parse import Parse |
14 | 13 |
15 | 14 |
| 15 _API_FEATURES = '_api_features.json' |
| 16 _MANIFEST_FEATURES = '_manifest_features.json' |
| 17 _PERMISSION_FEATURES = '_permission_features.json' |
| 18 |
| 19 |
| 20 def _GetFeaturePaths(feature_file, *extra_paths): |
| 21 paths = [posixpath.join(api_path, feature_file) for api_path in API_PATHS] |
| 22 paths.extend(extra_paths) |
| 23 return paths |
| 24 |
| 25 |
16 def _AddPlatformsFromDependencies(feature, | 26 def _AddPlatformsFromDependencies(feature, |
17 api_features, | 27 api_features, |
18 manifest_features, | 28 manifest_features, |
19 permission_features): | 29 permission_features): |
20 features_map = { | 30 features_map = { |
21 'api': api_features, | 31 'api': api_features, |
22 'manifest': manifest_features, | 32 'manifest': manifest_features, |
23 'permission': permission_features, | 33 'permission': permission_features, |
24 } | 34 } |
25 dependencies = feature.get('dependencies') | 35 dependencies = feature.get('dependencies') |
26 if dependencies is None: | 36 if dependencies is None: |
27 return ['apps', 'extensions'] | 37 return ['apps', 'extensions'] |
28 platforms = set() | 38 platforms = set() |
29 for dependency in dependencies: | 39 for dependency in dependencies: |
30 dep_type, dep_name = dependency.split(':') | 40 dep_type, dep_name = dependency.split(':') |
31 dependency_features = features_map[dep_type] | 41 dependency_features = features_map[dep_type] |
32 dependency_feature = dependency_features.get(dep_name) | 42 dependency_feature = dependency_features.get(dep_name) |
33 # If the dependency can't be resolved, it is inaccessible and therefore | 43 # If the dependency can't be resolved, it is inaccessible and therefore |
34 # so is this feature. | 44 # so is this feature. |
35 if dependency_feature is None: | 45 if dependency_feature is None: |
36 return [] | 46 return [] |
37 platforms = platforms.union(dependency_feature['platforms']) | 47 platforms = platforms.union(dependency_feature['platforms']) |
38 feature['platforms'] = list(platforms) | 48 feature['platforms'] = list(platforms) |
39 | 49 |
40 | 50 |
41 class _FeaturesCache(object): | 51 class _FeaturesCache(object): |
42 def __init__(self, file_system, compiled_fs_factory, *json_paths): | 52 def __init__(self, file_system, compiled_fs_factory, json_paths): |
43 populate = self._CreateCache | 53 populate = self._CreateCache |
44 if len(json_paths) == 1: | 54 if len(json_paths) == 1: |
45 populate = SingleFile(populate) | 55 populate = SingleFile(populate) |
46 | 56 |
47 self._cache = compiled_fs_factory.Create(file_system, populate, type(self)) | 57 self._cache = compiled_fs_factory.Create(file_system, populate, type(self)) |
48 self._text_cache = compiled_fs_factory.ForUnicode(file_system) | 58 self._text_cache = compiled_fs_factory.ForUnicode(file_system) |
49 self._json_path = json_paths[0] | 59 self._json_path = json_paths[0] |
50 self._extra_paths = json_paths[1:] | 60 self._extra_paths = json_paths[1:] |
51 | 61 |
52 @Unicode | 62 @Unicode |
(...skipping 17 matching lines...) Expand all Loading... |
70 return self._cache.GetFromFile(self._json_path) | 80 return self._cache.GetFromFile(self._json_path) |
71 | 81 |
72 | 82 |
73 class FeaturesBundle(object): | 83 class FeaturesBundle(object): |
74 '''Provides access to properties of API, Manifest, and Permission features. | 84 '''Provides access to properties of API, Manifest, and Permission features. |
75 ''' | 85 ''' |
76 def __init__(self, file_system, compiled_fs_factory, object_store_creator): | 86 def __init__(self, file_system, compiled_fs_factory, object_store_creator): |
77 self._api_cache = _FeaturesCache( | 87 self._api_cache = _FeaturesCache( |
78 file_system, | 88 file_system, |
79 compiled_fs_factory, | 89 compiled_fs_factory, |
80 API_FEATURES) | 90 _GetFeaturePaths(_API_FEATURES)) |
81 self._manifest_cache = _FeaturesCache( | 91 self._manifest_cache = _FeaturesCache( |
82 file_system, | 92 file_system, |
83 compiled_fs_factory, | 93 compiled_fs_factory, |
84 MANIFEST_FEATURES, | 94 _GetFeaturePaths(_MANIFEST_FEATURES, |
85 posixpath.join(JSON_TEMPLATES, 'manifest.json')) | 95 posixpath.join(JSON_TEMPLATES, 'manifest.json'))) |
86 self._permission_cache = _FeaturesCache( | 96 self._permission_cache = _FeaturesCache( |
87 file_system, | 97 file_system, |
88 compiled_fs_factory, | 98 compiled_fs_factory, |
89 PERMISSION_FEATURES, | 99 _GetFeaturePaths(_PERMISSION_FEATURES, |
90 posixpath.join(JSON_TEMPLATES, 'permissions.json')) | 100 posixpath.join(JSON_TEMPLATES, 'permissions.json'))) |
91 # Namespace the object store by the file system ID because this class is | 101 # Namespace the object store by the file system ID because this class is |
92 # used by the availability finder cross-channel. | 102 # used by the availability finder cross-channel. |
93 # TODO(kalman): Configure this at the ObjectStore level. | 103 # TODO(kalman): Configure this at the ObjectStore level. |
94 self._object_store = object_store_creator.Create( | 104 self._object_store = object_store_creator.Create( |
95 _FeaturesCache, category=file_system.GetIdentity()) | 105 _FeaturesCache, category=file_system.GetIdentity()) |
96 | 106 |
97 def GetPermissionFeatures(self): | 107 def GetPermissionFeatures(self): |
98 return self._permission_cache.GetFeatures() | 108 return self._permission_cache.GetFeatures() |
99 | 109 |
100 def GetManifestFeatures(self): | 110 def GetManifestFeatures(self): |
(...skipping 14 matching lines...) Expand all Loading... |
115 # TODO(rockot): Handle inter-API dependencies more gracefully. | 125 # TODO(rockot): Handle inter-API dependencies more gracefully. |
116 # Not yet a problem because there is only one such case (windows -> tabs). | 126 # Not yet a problem because there is only one such case (windows -> tabs). |
117 # If we don't store this value before annotating platforms, inter-API | 127 # If we don't store this value before annotating platforms, inter-API |
118 # dependencies will lead to infinite recursion. | 128 # dependencies will lead to infinite recursion. |
119 for feature in api_features.itervalues(): | 129 for feature in api_features.itervalues(): |
120 _AddPlatformsFromDependencies( | 130 _AddPlatformsFromDependencies( |
121 feature, api_features, manifest_features, permission_features) | 131 feature, api_features, manifest_features, permission_features) |
122 self._object_store.Set('api_features', api_features) | 132 self._object_store.Set('api_features', api_features) |
123 return api_features | 133 return api_features |
124 return Future(callback=resolve) | 134 return Future(callback=resolve) |
OLD | NEW |