Chromium Code Reviews| Index: client/dom/scripts/dartdomgenerator.py |
| diff --git a/client/dom/scripts/dartdomgenerator.py b/client/dom/scripts/dartdomgenerator.py |
| index 70cc4a43825910d797017f8837b648c519f4fca3..f8b3bb39a65471ab026365da2f28b3d91b2e8992 100755 |
| --- a/client/dom/scripts/dartdomgenerator.py |
| +++ b/client/dom/scripts/dartdomgenerator.py |
| @@ -28,10 +28,39 @@ _webkit_renames = { |
| 'Window': 'DOMWindow', |
| 'WorkerGlobalScope': 'WorkerContext'} |
| -_webkit_renames_inverse = dict((v,k) for k, v in _webkit_renames.iteritems()) |
| - |
| -def GenerateDOM(systems, output_dir): |
| - # TODO(sra): Make this entry point also generate HTML. |
| +_webkit_renames_inverse = None |
|
nweiz
2012/02/15 21:36:00
This doesn't need to be defined top-level; it's on
Jacob
2012/02/17 00:44:23
Done.
|
| + |
| +_html_strip_webkit_prefix_classes = [ |
| + 'Animation', |
| + 'AnimationEvent', |
| + 'AnimationList', |
| + 'BlobBuilder', |
| + 'CSSKeyframeRule', |
| + 'CSSKeyframesRule', |
| + 'CSSMatrix', |
| + 'CSSTransformValue', |
| + 'Flags', |
| + 'LoseContext', |
| + 'Point', |
| + 'TransitionEvent'] |
| + |
| +_html_renames = {} |
| +_html_renames_inverse = {} |
| + |
| +def _AddHtmlRename(source, dest): |
| + _html_renames[source] = dest |
| + _html_renames_inverse[dest] = source |
| + |
| +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 GenerateDOM(systems, generate_html_systems, output_dir, use_database_cache): |
| current_dir = os.path.dirname(__file__) |
| generator = dartgenerator.DartGenerator( |
| @@ -42,22 +71,29 @@ def GenerateDOM(systems, output_dir): |
| common_database = database.Database( |
| os.path.join(current_dir, '..', 'database')) |
| - common_database.Load() |
| + if use_database_cache: |
| + common_database.LoadFromCache() |
| + else: |
| + common_database.Load() |
| # Remove these types since they are mapped directly to dart. |
| common_database.DeleteInterface('DOMStringMap') |
| common_database.DeleteInterface('DOMStringList') |
| + |
| + _webkit_renames_inverse = dict((v,k) for k, v in _webkit_renames.iteritems()) |
| + |
| generator.RenameTypes(common_database, { |
| # W3C -> Dart renames |
| 'AbstractView': 'Window', |
| 'Function': 'EventListener', |
| 'DOMStringMap': 'Map<String, String>', |
| 'DOMStringList': 'List<String>', |
| - }) |
| + }, False) |
| generator.FilterMembersWithUnidentifiedTypes(common_database) |
| generator.ConvertToDartTypes(common_database) |
| webkit_database = common_database.Clone() |
| - generated_output_dir = os.path.join(output_dir, 'generated') |
| + generated_output_dir = os.path.join(output_dir, |
| + '../html/generated' if generate_html_systems else 'generated') |
| if os.path.exists(generated_output_dir): |
| _logger.info('Cleaning output directory %s' % generated_output_dir) |
| shutil.rmtree(generated_output_dir) |
| @@ -69,7 +105,24 @@ def GenerateDOM(systems, output_dir): |
| or_annotations = ['WebKit', 'Dart'], |
| exclude_displaced = ['WebKit'], |
| exclude_suppressed = ['WebKit', 'Dart']) |
| - generator.RenameTypes(webkit_database, _webkit_renames) |
| + generator.RenameTypes(webkit_database, _webkit_renames, False) |
| + |
| + if generate_html_systems: |
| + |
| + for interface in common_database.GetInterfaces(): |
|
sra1
2012/02/16 04:43:28
It would be nice to move this out of the main flow
Jacob
2012/02/17 00:44:23
Done.
Jacob
2012/02/17 00:44:23
Done.
|
| + if (interface.id.startswith("HTML") and |
| + HasAncestor(interface, ['Element', 'Document'], common_database)): |
| + _AddHtmlRename(interface.id, interface.id[4:]) |
| + |
| + for subclass in _html_strip_webkit_prefix_classes: |
| + _AddHtmlRename('WebKit' + subclass, subclass) |
| + |
| +# TODO(jacobr): we almost want to add this commented out line back. |
| +# _AddHtmlRename('HTMLCollection', 'ElementList') |
| +# _AddHtmlRename('NodeList', 'ElementList') |
| +# _AddHtmlRename('HTMLOptionsCollection', 'ElementList') |
| + _AddHtmlRename('DOMWindow', 'Window') |
| + generator.RenameTypes(webkit_database, _html_renames, True) |
| generator.Generate(database = webkit_database, |
| output_dir = webkit_output_dir, |
| @@ -79,35 +132,55 @@ def GenerateDOM(systems, output_dir): |
| super_database = common_database, |
| common_prefix = 'common', |
| super_map = _webkit_renames_inverse, |
| - systems = systems) |
| + html_map = _html_renames_inverse, |
| + systems = systems, |
| + generate_html_systems = generate_html_systems) |
| generator.Flush() |
| + if 'frog' in systems: |
| + _logger.info('Copy dom_frog to frog/') |
| + subprocess.call(['cd .. ; ../tools/copy_dart.py frog dom_frog.dart'], |
| + shell=True); |
| + |
| + if 'htmlfrog' in systems: |
| + _logger.info('Copy html_frog to ../html/frog/') |
| + subprocess.call(['cd ../../html ; ../tools/copy_dart.py frog html_frog.dart'], |
| + shell=True); |
| + |
| def main(): |
| parser = optparse.OptionParser() |
| parser.add_option('--systems', dest='systems', |
| action='store', type='string', |
| - default='frog,dummy,wrapping,htmlfrog', |
| + default='frog,dummy,wrapping', |
| help='Systems to generate (frog, native, dummy, ' |
| - 'htmlfrog)') |
| + 'htmlfrog, htmldartium)') |
| 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', |
| + 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__) |
| - output_dir = options.output_dir or os.path.join(current_dir, '..') |
| systems = options.systems.split(',') |
| + use_database_cache = options.use_database_cache |
| + generate_html_systems = ('htmlfrog' in systems) or ('htmldartium' in systems) |
| + output_dir = options.output_dir or ( |
| + os.path.join(current_dir, '../../html') if generate_html_systems else |
| + os.path.join(current_dir, '..')) |
| logging.config.fileConfig(os.path.join(current_dir, 'logging.conf')) |
| - GenerateDOM(systems, output_dir) |
| + num_html_systems = ('htmlfrog' in systems) + ('htmldartium' in systems) |
|
sra1
2012/02/16 04:43:28
Move validation as early as feasible.
Jacob
2012/02/17 00:44:23
Done.
|
| + if num_html_systems > 0 and num_html_systems < len(systems): |
| + print 'Cannot generate html and dom bindings at the same time' |
| + sys.exit(-1) |
| - # Copy Frog DOM to frog/dom_frog.dart. |
| - if 'frog' in systems: |
| - _logger.info('Copy dom_frog to frog/') |
| - subprocess.call(['cd .. ; ../tools/copy_dart.py frog dom_frog.dart'], |
| - shell=True); |
| + GenerateDOM(systems, generate_html_systems, output_dir, use_database_cache) |
| # Copy dummy DOM where dartc build expects it. |
| if 'dummy' in systems: |