Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5425)

Unified Diff: chrome/common/extensions/docs/server2/api_models.py

Issue 375133002: Docserver: Display API features that are available to content scripts (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Moar changes Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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))

Powered by Google App Engine
This is Rietveld 408576698