1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Use of this source code is governed by a BSD-style license that can be 3 # found in the LICENSE file. 4 5 from data_source import DataSource 6 from future import Future 7 from operator import itemgetter 8 from platform_util import GetPlatforms 9 10 from docs_server_utils import MarkFirstAndLast, MarkLast 11 12 class APIListDataSource(DataSource): 13 """ This class creates a list of chrome.* APIs and chrome.experimental.* APIs 14 for extensions and apps that are used in the api_index.html, 15 experimental.html, and private_apis.html pages. 16 17 An API is considered listable if it is listed in _api_features.json, 18 it has a corresponding HTML file in the public template path, and one of 19 the following conditions is met: 20 - It has no "dependencies" or "extension_types" properties in _api_features 21 - It has an "extension_types" property in _api_features with either/both 22 "extension"/"platform_app" values present. 23 - It has a dependency in _{api,manifest,permission}_features with an 24 "extension_types" property where either/both "extension"/"platform_app" 25 values are present. 26 """ 27 def __init__(self, server_instance, _): 28 self._platform_bundle = server_instance.platform_bundle 29 self._object_store = server_instance.object_store_creator.Create( 30 # Update the model when the API or Features model updates. 31 APIListDataSource, category=self._platform_bundle.GetIdentity()) 32 33 def _GenerateAPIDict(self): 34 def make_list_for_content_scripts(): 35 def convert_to_list(content_script_apis): 36 content_script_apis_list = [csa.__dict__ for api_name, csa 37 in content_script_apis.iteritems() 38 if self._platform_bundle.GetAPICategorizer( 39 'extensions').IsDocumented(api_name)] 40 content_script_apis_list.sort(key=itemgetter('name')) 41 for csa in content_script_apis_list: 42 restricted_nodes = csa['restrictedTo'] 43 if restricted_nodes: 44 restricted_nodes.sort(key=itemgetter('node')) 45 MarkFirstAndLast(restricted_nodes) 46 else: 47 del csa['restrictedTo'] 48 return content_script_apis_list 49 50 return (self._platform_bundle.GetAPIModels('extensions') 51 .GetContentScriptAPIs() 52 .Then(convert_to_list)) 53 54 def make_dict_for_platform(platform): 55 platform_dict = { 56 'chrome': {'stable': [], 'beta': [], 'dev': [], 'master': []}, 57 } 58 private_apis = [] 59 experimental_apis = [] 60 all_apis = [] 61 for api_name, api_model in self._platform_bundle.GetAPIModels( 62 platform).IterModels(): 63 if not self._platform_bundle.GetAPICategorizer(platform).IsDocumented( 64 api_name): 65 continue 66 api = { 67 'name': api_name, 68 'description': api_model.description, 69 } 70 category = self._platform_bundle.GetAPICategorizer( 71 platform).GetCategory(api_name) 72 if category == 'chrome': 73 channel_info = self._platform_bundle.GetAvailabilityFinder( 74 platform).GetAPIAvailability(api_name).channel_info 75 channel = channel_info.channel 76 if channel == 'stable': 77 version = channel_info.version 78 api['version'] = version 79 platform_dict[category][channel].append(api) 80 all_apis.append(api) 81 elif category == 'experimental': 82 experimental_apis.append(api) 83 all_apis.append(api) 84 elif category == 'private': 85 private_apis.append(api) 86 87 for channel, apis_by_channel in platform_dict['chrome'].iteritems(): 88 apis_by_channel.sort(key=itemgetter('name')) 89 MarkLast(apis_by_channel) 90 platform_dict['chrome'][channel] = apis_by_channel 91 92 for key, apis in (('all', all_apis), 93 ('private', private_apis), 94 ('experimental', experimental_apis)): 95 apis.sort(key=itemgetter('name')) 96 MarkLast(apis) 97 platform_dict[key] = apis 98 99 return platform_dict 100 101 def make_api_dict(content_script_apis): 102 api_dict = dict((platform, make_dict_for_platform(platform)) 103 for platform in GetPlatforms()) 104 api_dict['contentScripts'] = content_script_apis 105 return api_dict 106 107 return make_list_for_content_scripts().Then(make_api_dict) 108 109 def _GetCachedAPIData(self): 110 def persist_and_return(data): 111 self._object_store.Set('api_data', data) 112 return data 113 def return_or_generate(data): 114 if data is None: 115 return self._GenerateAPIDict().Then(persist_and_return) 116 return data 117 return self._object_store.Get('api_data').Then(return_or_generate) 118 119 def get(self, key): 120 return self._GetCachedAPIData().Get().get(key) 121 122 def Refresh(self, path): 123 return self._GetCachedAPIData() 124