| #!/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()) |