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)) |