OLD | NEW |
1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 from copy import copy | 5 from copy import copy |
6 import logging | 6 import logging |
7 import os | 7 import os |
8 import posixpath | 8 import posixpath |
9 | 9 |
10 from data_source import DataSource | 10 from data_source import DataSource |
11 from docs_server_utils import StringIdentity | 11 from docs_server_utils import StringIdentity, MarkFirstAndLast |
12 from environment import IsPreviewServer, IsReleaseServer | 12 from environment import IsPreviewServer, IsReleaseServer |
13 from extensions_paths import JSON_TEMPLATES, PRIVATE_TEMPLATES | 13 from extensions_paths import JSON_TEMPLATES, PRIVATE_TEMPLATES |
14 from file_system import FileNotFoundError | 14 from file_system import FileNotFoundError |
15 from future import Future, Collect | 15 from future import Future, Collect |
| 16 from operator import itemgetter |
16 from platform_util import GetPlatforms | 17 from platform_util import GetPlatforms |
17 import third_party.json_schema_compiler.json_parse as json_parse | 18 import third_party.json_schema_compiler.json_parse as json_parse |
18 import third_party.json_schema_compiler.model as model | 19 import third_party.json_schema_compiler.model as model |
19 from third_party.json_schema_compiler.memoize import memoize | 20 from third_party.json_schema_compiler.memoize import memoize |
20 | 21 |
21 | 22 |
22 # The set of possible categories a node may belong to. | 23 # The set of possible categories a node may belong to. |
23 _NODE_CATEGORIES = ('types', 'functions', 'events', 'properties') | 24 _NODE_CATEGORIES = ('types', 'functions', 'events', 'properties') |
24 | 25 |
25 | 26 |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
271 def __repr__(self): | 272 def __repr__(self): |
272 return '%s > %s' % (self._namespace_name, ' > '.join(self._lookup_path)) | 273 return '%s > %s' % (self._namespace_name, ' > '.join(self._lookup_path)) |
273 | 274 |
274 | 275 |
275 class _JSCModel(object): | 276 class _JSCModel(object): |
276 '''Uses a Model from the JSON Schema Compiler and generates a dict that | 277 '''Uses a Model from the JSON Schema Compiler and generates a dict that |
277 a Handlebar template can use for a data source. | 278 a Handlebar template can use for a data source. |
278 ''' | 279 ''' |
279 | 280 |
280 def __init__(self, | 281 def __init__(self, |
| 282 content_script_apis, |
281 namespace, | 283 namespace, |
282 availability_finder, | 284 availability_finder, |
283 json_cache, | 285 json_cache, |
284 template_cache, | 286 template_cache, |
285 features_bundle, | 287 features_bundle, |
286 event_byname_future): | 288 event_byname_future): |
| 289 self._content_script_apis = content_script_apis |
287 self._availability = availability_finder.GetAPIAvailability(namespace.name) | 290 self._availability = availability_finder.GetAPIAvailability(namespace.name) |
288 self._current_node = _APINodeCursor(availability_finder, namespace.name) | 291 self._current_node = _APINodeCursor(availability_finder, namespace.name) |
289 self._api_availabilities = json_cache.GetFromFile( | 292 self._api_availabilities = json_cache.GetFromFile( |
290 posixpath.join(JSON_TEMPLATES, 'api_availabilities.json')) | 293 posixpath.join(JSON_TEMPLATES, 'api_availabilities.json')) |
291 self._intro_tables = json_cache.GetFromFile( | 294 self._intro_tables = json_cache.GetFromFile( |
292 posixpath.join(JSON_TEMPLATES, 'intro_tables.json')) | 295 posixpath.join(JSON_TEMPLATES, 'intro_tables.json')) |
293 self._api_features = features_bundle.GetAPIFeatures() | 296 self._api_features = features_bundle.GetAPIFeatures() |
294 self._template_cache = template_cache | 297 self._template_cache = template_cache |
295 self._event_byname_future = event_byname_future | 298 self._event_byname_future = event_byname_future |
296 self._namespace = namespace | 299 self._namespace = namespace |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
549 else: | 552 else: |
550 dst_dict['simple_type'] = type_.property_type.name | 553 dst_dict['simple_type'] = type_.property_type.name |
551 | 554 |
552 def _GetIntroTableList(self): | 555 def _GetIntroTableList(self): |
553 '''Create a generic data structure that can be traversed by the templates | 556 '''Create a generic data structure that can be traversed by the templates |
554 to create an API intro table. | 557 to create an API intro table. |
555 ''' | 558 ''' |
556 intro_rows = [ | 559 intro_rows = [ |
557 self._GetIntroDescriptionRow(), | 560 self._GetIntroDescriptionRow(), |
558 self._GetIntroAvailabilityRow() | 561 self._GetIntroAvailabilityRow() |
559 ] + self._GetIntroDependencyRows() | 562 ] + self._GetIntroDependencyRows() + self._GetIntroContentScriptRow() |
560 | 563 |
561 # Add rows using data from intro_tables.json, overriding any existing rows | 564 # Add rows using data from intro_tables.json, overriding any existing rows |
562 # if they share the same 'title' attribute. | 565 # if they share the same 'title' attribute. |
563 row_titles = [row['title'] for row in intro_rows] | 566 row_titles = [row['title'] for row in intro_rows] |
564 for misc_row in self._GetMiscIntroRows(): | 567 for misc_row in self._GetMiscIntroRows(): |
565 if misc_row['title'] in row_titles: | 568 if misc_row['title'] in row_titles: |
566 intro_rows[row_titles.index(misc_row['title'])] = misc_row | 569 intro_rows[row_titles.index(misc_row['title'])] = misc_row |
567 else: | 570 else: |
568 intro_rows.append(misc_row) | 571 intro_rows.append(misc_row) |
569 | 572 |
570 return intro_rows | 573 return intro_rows |
571 | 574 |
572 def _CreateAvailabilityTemplate(self, status, scheduled, version): | 575 def _CreateAvailabilityTemplate(self, status, scheduled, version): |
573 '''Returns an object suitable for use in templates to display availability | 576 '''Returns an object suitable for use in templates to display availability |
574 information. | 577 information. |
575 ''' | 578 ''' |
576 return { | 579 return { |
577 'partial': self._template_cache.GetFromFile( | 580 'partial': self._template_cache.GetFromFile( |
578 '%sintro_tables/%s_message.html' % (PRIVATE_TEMPLATES, status)).Get(), | 581 '%sintro_tables/%s_message.html' % (PRIVATE_TEMPLATES, status)).Get(), |
579 'scheduled': scheduled, | 582 'scheduled': scheduled, |
580 'version': version | 583 'version': version |
581 } | 584 } |
582 | 585 |
| 586 def _GetIntroContentScriptRow(self): |
| 587 content_script_support = self._content_script_apis.get(self._namespace.name) |
| 588 if content_script_support is None: |
| 589 return [] |
| 590 if content_script_support.restrictedTo: |
| 591 content_script_support.restrictedTo.sort(key=itemgetter('node')) |
| 592 MarkFirstAndLast(content_script_support.restrictedTo) |
| 593 return [{ |
| 594 'title': 'Content Scripts', |
| 595 'content': [{ |
| 596 'partial': self._template_cache.GetFromFile( |
| 597 posixpath.join(PRIVATE_TEMPLATES, |
| 598 'intro_tables', |
| 599 'content_scripts.html')).Get(), |
| 600 'contentScriptSupport': content_script_support.__dict__ |
| 601 }] |
| 602 }] |
583 def _GetAvailabilityTemplate(self): | 603 def _GetAvailabilityTemplate(self): |
584 '''Gets availability for the current node and returns an appropriate | 604 '''Gets availability for the current node and returns an appropriate |
585 template object. | 605 template object. |
586 ''' | 606 ''' |
587 # Displaying deprecated status takes precedence over when the API | 607 # Displaying deprecated status takes precedence over when the API |
588 # became stable. | 608 # became stable. |
589 availability_info = self._current_node.GetDeprecated() | 609 availability_info = self._current_node.GetDeprecated() |
590 if availability_info is not None: | 610 if availability_info is not None: |
591 status = 'deprecated' | 611 status = 'deprecated' |
592 else: | 612 else: |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
749 from Event in events.json. | 769 from Event in events.json. |
750 ''' | 770 ''' |
751 if platform not in self._event_byname_futures: | 771 if platform not in self._event_byname_futures: |
752 future = self._GetSchemaModel(platform, 'events') | 772 future = self._GetSchemaModel(platform, 'events') |
753 self._event_byname_futures[platform] = Future( | 773 self._event_byname_futures[platform] = Future( |
754 callback=lambda: _GetEventByNameFromEvents(future.Get())) | 774 callback=lambda: _GetEventByNameFromEvents(future.Get())) |
755 return self._event_byname_futures[platform] | 775 return self._event_byname_futures[platform] |
756 | 776 |
757 def _GetSchemaModel(self, platform, api_name): | 777 def _GetSchemaModel(self, platform, api_name): |
758 object_store_key = '/'.join((platform, api_name)) | 778 object_store_key = '/'.join((platform, api_name)) |
| 779 api_models = self._platform_bundle.GetAPIModels(platform) |
759 jsc_model_future = self._model_cache.Get(object_store_key) | 780 jsc_model_future = self._model_cache.Get(object_store_key) |
760 model_future = self._platform_bundle.GetAPIModels(platform).GetModel( | 781 model_future = api_models.GetModel(api_name) |
761 api_name) | 782 content_script_apis_future = api_models.GetContentScriptAPIs() |
762 def resolve(): | 783 def resolve(): |
763 jsc_model = jsc_model_future.Get() | 784 jsc_model = jsc_model_future.Get() |
764 if jsc_model is None: | 785 if jsc_model is None: |
765 jsc_model = _JSCModel( | 786 jsc_model = _JSCModel( |
| 787 content_script_apis_future.Get(), |
766 model_future.Get(), | 788 model_future.Get(), |
767 self._platform_bundle.GetAvailabilityFinder(platform), | 789 self._platform_bundle.GetAvailabilityFinder(platform), |
768 self._json_cache, | 790 self._json_cache, |
769 self._template_cache, | 791 self._template_cache, |
770 self._platform_bundle.GetFeaturesBundle(platform), | 792 self._platform_bundle.GetFeaturesBundle(platform), |
771 self._LoadEventByName(platform)).ToDict() | 793 self._LoadEventByName(platform)).ToDict() |
772 self._model_cache.Set(object_store_key, jsc_model) | 794 self._model_cache.Set(object_store_key, jsc_model) |
773 return jsc_model | 795 return jsc_model |
774 return Future(callback=resolve) | 796 return Future(callback=resolve) |
775 | 797 |
(...skipping 17 matching lines...) Expand all Loading... |
793 getter = lambda: 0 | 815 getter = lambda: 0 |
794 getter.get = lambda api_name: self._GetImpl(platform, api_name).Get() | 816 getter.get = lambda api_name: self._GetImpl(platform, api_name).Get() |
795 return getter | 817 return getter |
796 | 818 |
797 def Cron(self): | 819 def Cron(self): |
798 futures = [] | 820 futures = [] |
799 for platform in GetPlatforms(): | 821 for platform in GetPlatforms(): |
800 futures += [self._GetImpl(platform, name) | 822 futures += [self._GetImpl(platform, name) |
801 for name in self._platform_bundle.GetAPIModels(platform).GetNames()] | 823 for name in self._platform_bundle.GetAPIModels(platform).GetNames()] |
802 return Collect(futures, except_pass=FileNotFoundError) | 824 return Collect(futures, except_pass=FileNotFoundError) |
OLD | NEW |