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