Chromium Code Reviews| Index: chrome/common/extensions/docs/server2/api_models.py |
| diff --git a/chrome/common/extensions/docs/server2/api_models.py b/chrome/common/extensions/docs/server2/api_models.py |
| index 673dc434661fe18a297217db4f0bbf02d84716c2..c5a160cfbedea1dd67b2150efe3126081f95f6f2 100644 |
| --- a/chrome/common/extensions/docs/server2/api_models.py |
| +++ b/chrome/common/extensions/docs/server2/api_models.py |
| @@ -5,17 +5,42 @@ |
| import posixpath |
| from compiled_file_system import SingleFile, Unicode |
| -from docs_server_utils import StringIdentity |
| from extensions_paths import API_PATHS |
| -from features_bundle import HasParentFeature |
| +from features_bundle import HasParentFeature, GetParentFeature |
| from file_system import FileNotFoundError |
| from future import Collect, Future |
| +from operator import itemgetter |
| from platform_util import PlatformToExtensionType |
| from schema_util import ProcessSchema |
| from third_party.json_schema_compiler.json_schema import DeleteNodes |
| from third_party.json_schema_compiler.model import Namespace, UnixName |
| +class ContentScriptAPI(object): |
| + '''Represents an API available to content scripts. |
| + |
| + |name| is the name of the API or API node this object represents. |
| + |restrictedTo| is a list of dictionaries representing the nodes |
| + of this API that are available to content scripts, or None if the |
| + entire API is available to content scripts. |
| + ''' |
| + def __init__(self, name): |
| + self.name = name |
| + self.restrictedTo = None |
| + |
| + def __eq__(self, o): |
| + return self.name == o.name and self.restrictedTo == o.restrictedTo |
| + |
| + def __ne__(self, o): |
| + return not (self == o) |
| + |
| + def __repr__(self): |
| + return '<ContentScriptAPI name=%s, restrictedTo=%s>' % (name, restrictedTo) |
| + |
| + def __str__(self): |
| + return repr(self) |
| + |
| + |
| class APIModels(object): |
| '''Tracks APIs and their Models. |
| ''' |
| @@ -24,11 +49,13 @@ class APIModels(object): |
| features_bundle, |
| compiled_fs_factory, |
| file_system, |
| + object_store_creator, |
| platform): |
| self._features_bundle = features_bundle |
| self._platform = PlatformToExtensionType(platform) |
| self._model_cache = compiled_fs_factory.Create( |
| file_system, self._CreateAPIModel, APIModels, category=self._platform) |
| + self._object_store = object_store_creator.Create(APIModels) |
| @SingleFile |
| @Unicode |
| @@ -97,6 +124,46 @@ class APIModels(object): |
| futures[0].Get() |
| return Future(callback=resolve) |
| + def GetContentScriptAPIs(self): |
| + '''Creates a dict of APIs and nodes supported by content scripts in |
| + this format: |
| + |
| + { |
| + 'extension': '<ContentScriptAPI name='extension', |
| + restrictedTo=[{'node': 'onRequest'}]>', |
| + ... |
| + } |
| + ''' |
| + content_script_apis_future = self._object_store.Get('content_script_apis') |
| + api_features_future = self._features_bundle.GetAPIFeatures() |
| + def resolve(): |
| + content_script_apis = content_script_apis_future.Get() |
| + if content_script_apis is not None: |
| + return content_script_apis |
| + |
| + api_features = api_features_future.Get() |
| + content_script_apis = {} |
| + for feature in api_features.itervalues(): |
|
not at google - send to devlin
2014/07/21 17:51:20
maybe you should do "name, feature in api_features
|
| + if 'content_script' not in feature.get('contexts', ()): |
| + continue |
| + parent = GetParentFeature(feature['name'], feature, api_features) |
|
not at google - send to devlin
2014/07/21 17:51:19
can you rename GetParentFeature to GetParentFeatur
|
| + if parent is None: |
| + content_script_apis[feature['name']] = ContentScriptAPI( |
| + feature['name']) |
| + else: |
| + # Creates a dict for the individual node. |
| + node = {'node': feature['name'][len(parent) + 1:]} |
| + if parent not in content_script_apis: |
| + content_script_apis[parent] = ContentScriptAPI(parent) |
| + if content_script_apis[parent].restrictedTo: |
| + content_script_apis[parent].restrictedTo.append(node) |
| + else: |
| + content_script_apis[parent].restrictedTo = [node] |
| + |
| + self._object_store.Set('content_script_apis', content_script_apis) |
| + return content_script_apis |
| + return Future(callback=resolve) |
| + |
| def Cron(self): |
| futures = [self.GetModel(name) for name in self.GetNames()] |
| return Collect(futures, except_pass=(FileNotFoundError, ValueError)) |