|  | #!/usr/bin/python | 
|  | # Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file | 
|  | # for details. All rights reserved. Use of this source code is governed by a | 
|  | # BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | """This is the entry point to create Elemental APIs from the IDL database.""" | 
|  |  | 
|  | import elementalgenerator | 
|  | import database | 
|  | import logging.config | 
|  | import optparse | 
|  | import os | 
|  | import shutil | 
|  | import subprocess | 
|  | import sys | 
|  |  | 
|  | _logger = logging.getLogger('elementaldomgenerator') | 
|  |  | 
|  | _webkit_renames = { | 
|  | # W3C -> WebKit name conversion | 
|  | # TODO(vsm): Maybe Store these renames in the IDLs. | 
|  | 'ApplicationCache': 'DOMApplicationCache', | 
|  | 'BarProp': 'BarInfo', | 
|  | 'DedicatedWorkerGlobalScope': 'DedicatedWorkerContext', | 
|  | 'FormData': 'DOMFormData', | 
|  | 'Selection': 'DOMSelection', | 
|  | 'SharedWorkerGlobalScope': 'SharedWorkerContext', | 
|  | 'Window': 'DOMWindow', | 
|  | 'WorkerGlobalScope': 'WorkerContext'} | 
|  |  | 
|  | _html_strip_webkit_prefix_classes = [ | 
|  | 'Animation', | 
|  | 'AnimationEvent', | 
|  | 'AnimationList', | 
|  | 'BlobBuilder', | 
|  | 'CSSKeyframeRule', | 
|  | 'CSSKeyframesRule', | 
|  | 'CSSMatrix', | 
|  | 'CSSTransformValue', | 
|  | 'Flags', | 
|  | 'LoseContext', | 
|  | 'Point', | 
|  | 'TransitionEvent'] | 
|  |  | 
|  | def HasAncestor(interface, names_to_match, database): | 
|  | for parent in interface.parents: | 
|  | if (parent.type.id in names_to_match or | 
|  | (database.HasInterface(parent.type.id) and | 
|  | HasAncestor(database.GetInterface(parent.type.id), names_to_match, | 
|  | database))): | 
|  | return True | 
|  | return False | 
|  |  | 
|  | def _MakeHtmlRenames(common_database): | 
|  | html_renames = {} | 
|  |  | 
|  | for interface in common_database.GetInterfaces(): | 
|  | if (interface.id.startswith("HTML") and | 
|  | HasAncestor(interface, ['Element', 'Document'], common_database)): | 
|  | html_renames[interface.id] = interface.id[4:] | 
|  |  | 
|  | for subclass in _html_strip_webkit_prefix_classes: | 
|  | html_renames['WebKit' + subclass] = subclass | 
|  |  | 
|  | # TODO(jacobr): we almost want to add this commented out line back. | 
|  | #    html_renames['HTMLCollection'] = 'ElementList' | 
|  | #    html_renames['NodeList'] = 'ElementList' | 
|  | #    html_renames['HTMLOptionsCollection'] = 'ElementList' | 
|  | html_renames['DOMWindow'] = 'Window' | 
|  | html_renames['DOMSelection'] = 'Selection' | 
|  | html_renames['DOMFormData'] = 'FormData' | 
|  | html_renames['DOMApplicationCache'] = 'ApplicationCache' | 
|  | html_renames['BarInfo'] = 'BarProp' | 
|  | html_renames['DedicatedWorkerContext']='DedicatedWorkerGlobalScope' | 
|  | html_renames['SharedWorkerContext']='SharedWorkerGlobalScope' | 
|  | html_renames['WorkerContext']='WorkerGlobalScope' | 
|  |  | 
|  | return html_renames | 
|  |  | 
|  | def GenerateDOM(systems, generate_html_systems, output_dir, | 
|  | database_dir, use_database_cache): | 
|  | current_dir = os.path.dirname(__file__) | 
|  |  | 
|  | generator = elementalgenerator.ElementalGenerator( | 
|  | auxiliary_dir=os.path.join(current_dir, '..', 'src'), | 
|  | template_dir=os.path.join(current_dir, '..', 'templates'), | 
|  | base_package='') | 
|  | generator.LoadAuxiliary() | 
|  |  | 
|  | common_database = database.Database(database_dir) | 
|  | if use_database_cache: | 
|  | common_database.LoadFromCache() | 
|  | else: | 
|  | common_database.Load() | 
|  |  | 
|  | generator.FilterMembersWithUnidentifiedTypes(common_database) | 
|  | webkit_database = common_database.Clone() | 
|  |  | 
|  | # Generate Dart interfaces for the WebKit DOM. | 
|  | generator.FilterInterfaces(database = webkit_database, | 
|  | or_annotations = ['WebKit', 'Dart'], | 
|  | exclude_displaced = ['WebKit'], | 
|  | exclude_suppressed = ['WebKit', 'Dart']) | 
|  | generator.RenameTypes(webkit_database, _webkit_renames, True) | 
|  | html_renames = _MakeHtmlRenames(common_database) | 
|  | generator.RenameTypes(webkit_database, html_renames, True) | 
|  |  | 
|  | html_renames_inverse = dict((v,k) for k, v in html_renames.iteritems()) | 
|  | webkit_renames_inverse = dict((v,k) for k, v in _webkit_renames.iteritems()) | 
|  |  | 
|  | generator.Generate(database = webkit_database, | 
|  | output_dir = output_dir, | 
|  | lib_dir = output_dir, | 
|  | module_source_preference = ['WebKit', 'Dart'], | 
|  | source_filter = ['WebKit', 'Dart'], | 
|  | super_database = common_database, | 
|  | common_prefix = 'common', | 
|  | super_map = webkit_renames_inverse, | 
|  | html_map = html_renames_inverse, | 
|  | systems = systems) | 
|  |  | 
|  | generator.Flush() | 
|  |  | 
|  | def main(): | 
|  | parser = optparse.OptionParser() | 
|  | parser.add_option('--systems', dest='systems', | 
|  | action='store', type='string', | 
|  | default='gwt,gwtjso', | 
|  | help='Systems to generate (gwt)') | 
|  | parser.add_option('--output-dir', dest='output_dir', | 
|  | action='store', type='string', | 
|  | default=None, | 
|  | help='Directory to put the generated files') | 
|  | parser.add_option('--use-database-cache', dest='use_database_cache', | 
|  | action='store_true', | 
|  | default=False, | 
|  | help='''Use the cached database from the previous run to | 
|  | improve startup performance''') | 
|  | (options, args) = parser.parse_args() | 
|  |  | 
|  | current_dir = os.path.dirname(__file__) | 
|  | systems = options.systems.split(',') | 
|  | html_system_names = ['htmlgwt'] | 
|  | html_systems = [s for s in systems if s in html_system_names] | 
|  | dom_systems = [s for s in systems if s not in html_system_names] | 
|  |  | 
|  | database_dir = os.path.join(current_dir, '..', 'database') | 
|  | use_database_cache = options.use_database_cache | 
|  | logging.config.fileConfig(os.path.join(current_dir, 'logging.conf')) | 
|  |  | 
|  | if dom_systems: | 
|  | output_dir = options.output_dir or os.path.join(current_dir, | 
|  | '../generated') | 
|  | GenerateDOM(dom_systems, False, output_dir, | 
|  | database_dir, use_database_cache) | 
|  |  | 
|  | if html_systems: | 
|  | output_dir = options.output_dir or os.path.join(current_dir, | 
|  | '../generated') | 
|  | GenerateDOM(html_systems, True, output_dir, | 
|  | database_dir, use_database_cache or dom_systems) | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | sys.exit(main()) |