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..52962de37edea87159b4f4e6a00e52ccea60bcef 100644 |
| --- a/chrome/common/extensions/docs/server2/api_models.py |
| +++ b/chrome/common/extensions/docs/server2/api_models.py |
| @@ -5,17 +5,29 @@ |
| import posixpath |
| from compiled_file_system import SingleFile, Unicode |
| -from docs_server_utils import StringIdentity |
| +from docs_server_utils import StringIdentity, MarkLast, MarkFirst |
| 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. |
| + ''' |
| + def __init__(self, name): |
| + self.name = name |
| + self.restrictedTo = None |
| + |
| + def __eq__(self, o): |
|
not at google - send to devlin
2014/07/15 21:34:40
when you override __eq__ you also need to override
|
| + return self.name == o.name and self.restrictedTo == o.restrictedTo |
| + |
| + |
| class APIModels(object): |
| '''Tracks APIs and their Models. |
| ''' |
| @@ -24,11 +36,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 +111,64 @@ 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 object>, |
|
not at google - send to devlin
2014/07/15 21:34:40
maybe define str/repr for ContentScriptAPI...
|
| + ... |
| + } |
| + |
| + where a ContentScriptAPI object's restrictedTo attribute items look like: |
| + |
| + { |
| + 'parent': 'extension', |
| + 'node': 'sendMessage' |
| + } |
| + ''' |
| + 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(): |
| + if 'content_script' not in feature.get('contexts', ()): |
| + continue |
| + parent = GetParentFeature(feature['name'], feature, api_features) |
| + # If it has no parent, then the API is fully supported. |
| + if parent is None: |
| + # Store the __dict__ attribute, because Handlebar expects |
|
not at google - send to devlin
2014/07/15 21:34:40
the dict creation should be only inside the data s
|
| + # dictionary-like objects. |
| + content_script_apis[feature['name']] = ContentScriptAPI( |
| + feature['name']).__dict__ |
| + else: |
| + # Creates a dict for the individual node. |
| + node = {'parent': parent, 'node': feature['name'][len(parent) + 1:]} |
| + # Initializes the supportedNodes list if it doesn't exist yet. |
| + if parent not in content_script_apis: |
| + content_script_apis[parent] = ContentScriptAPI(parent).__dict__ |
| + if content_script_apis[parent]['restrictedTo']: |
| + content_script_apis[parent]['restrictedTo'].append(node) |
| + else: |
| + content_script_apis[parent]['restrictedTo'] = [node] |
| + |
| + # Sort all of the supportedNodes. |
| + for content_script_api in content_script_apis.itervalues(): |
| + restricted_nodes = content_script_api['restrictedTo'] |
| + if restricted_nodes: |
| + restricted_nodes.sort(key=itemgetter('node')) |
| + MarkFirst(restricted_nodes) |
| + MarkLast(restricted_nodes) |
|
not at google - send to devlin
2014/07/15 21:34:40
this sorting should go into the API list data sour
|
| + |
| + 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)) |