| #!/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. | 
 |  | 
 | import database | 
 | import databasebuilder | 
 | import idlparser | 
 | import logging.config | 
 | import os.path | 
 | import sys | 
 |  | 
 | # TODO(antonm): most probably should go away or be autogenerated on IDLs roll. | 
 | DEFAULT_FEATURE_DEFINES = [ | 
 |     # Enabled Chrome WebKit build. | 
 |     'ENABLE_3D_PLUGIN', | 
 |     'ENABLE_3D_RENDERING', | 
 |     'ENABLE_ACCELERATED_2D_CANVAS', | 
 |     'ENABLE_BATTERY_STATUS', | 
 |     'ENABLE_BLOB', | 
 |     'ENABLE_BLOB_SLICE', | 
 |     'ENABLE_CALENDAR_PICKER', | 
 |     'ENABLE_CHANNEL_MESSAGING', | 
 |     'ENABLE_CSS_FILTERS', | 
 |     'ENABLE_CSS_IMAGE_SET', | 
 |     'ENABLE_CSS_SHADERS', | 
 |     'ENABLE_DART', | 
 |     'ENABLE_DATA_TRANSFER_ITEMS', | 
 |     'ENABLE_DETAILS', | 
 |     'ENABLE_DEVICE_ORIENTATION', | 
 |     'ENABLE_DIRECTORY_UPLOAD', | 
 |     'ENABLE_DOWNLOAD_ATTRIBUTE', | 
 |     'ENABLE_ENCRYPTED_MEDIA', | 
 |     'ENABLE_FILE_SYSTEM', | 
 |     'ENABLE_FILTERS', | 
 |     'ENABLE_FULLSCREEN_API', | 
 |     'ENABLE_GAMEPAD', | 
 |     'ENABLE_GEOLOCATION', | 
 |     'ENABLE_GESTURE_EVENTS', | 
 |     'ENABLE_INDEXED_DATABASE', | 
 |     'ENABLE_INPUT_SPEECH', | 
 |     'ENABLE_INPUT_TYPE_COLOR', | 
 |     'ENABLE_INPUT_TYPE_DATE', | 
 |     'ENABLE_JAVASCRIPT_DEBUGGER', | 
 |     'ENABLE_JAVASCRIPT_I18N_API', | 
 |     'ENABLE_LEGACY_NOTIFICATIONS', | 
 |     'ENABLE_LINK_PREFETCH', | 
 |     'ENABLE_MEDIA_SOURCE', | 
 |     'ENABLE_MEDIA_STATISTICS', | 
 |     'ENABLE_MEDIA_STREAM', | 
 |     'ENABLE_METER_TAG', | 
 |     'ENABLE_MHTML', | 
 |     'ENABLE_MUTATION_OBSERVERS', | 
 |     'ENABLE_NOTIFICATIONS', | 
 |     'ENABLE_OVERFLOW_SCROLLING', | 
 |     'ENABLE_PAGE_POPUP', | 
 |     'ENABLE_PAGE_VISIBILITY_API', | 
 |     'ENABLE_POINTER_LOCK', | 
 |     'ENABLE_PROGRESS_TAG', | 
 |     'ENABLE_QUOTA', | 
 |     'ENABLE_REGISTER_PROTOCOL_HANDLER', | 
 |     'ENABLE_REQUEST_ANIMATION_FRAME', | 
 |     'ENABLE_RUBY', | 
 |     'ENABLE_SANDBOX', | 
 |     'ENABLE_SCRIPTED_SPEECH', | 
 |     'ENABLE_SHADOW_DOM', | 
 |     'ENABLE_SHARED_WORKERS', | 
 |     'ENABLE_SMOOTH_SCROLLING', | 
 |     'ENABLE_SQL_DATABASE', | 
 |     'ENABLE_STYLE_SCOPED', | 
 |     'ENABLE_SVG', | 
 |     'ENABLE_SVG_FONTS', | 
 |     'ENABLE_TOUCH_EVENTS', | 
 |     'ENABLE_V8_SCRIPT_DEBUG_SERVER', | 
 |     'ENABLE_VIDEO', | 
 |     'ENABLE_VIDEO_TRACK', | 
 |     'ENABLE_VIEWPORT', | 
 |     'ENABLE_WEBGL', | 
 |     'ENABLE_WEB_AUDIO', | 
 |     'ENABLE_WEB_INTENTS', | 
 |     'ENABLE_WEB_SOCKETS', | 
 |     'ENABLE_WEB_TIMING', | 
 |     'ENABLE_WORKERS', | 
 |     'ENABLE_XHR_RESPONSE_BLOB', | 
 |     'ENABLE_XSLT', | 
 | ] | 
 |  | 
 | # TODO(antonm): Remove this filter. | 
 | UNSUPPORTED_FEATURES = [ 'ENABLE_WEB_INTENTS' ] | 
 |  | 
 | def build_database(idl_files, database_dir, feature_defines = None): | 
 |   """This code reconstructs the FremontCut IDL database from W3C, | 
 |   WebKit and Dart IDL files.""" | 
 |   current_dir = os.path.dirname(__file__) | 
 |   logging.config.fileConfig(os.path.join(current_dir, "logging.conf")) | 
 |  | 
 |   db = database.Database(database_dir) | 
 |  | 
 |   # Delete all existing IDLs in the DB. | 
 |   db.Delete() | 
 |  | 
 |   builder = databasebuilder.DatabaseBuilder(db) | 
 |  | 
 |   # TODO(vsm): Move this to a README. | 
 |   # This is the Dart SVN revision. | 
 |   webkit_revision = '1060' | 
 |  | 
 |   # TODO(vsm): Reconcile what is exposed here and inside WebKit code | 
 |   # generation.  We need to recheck this periodically for now. | 
 |   webkit_defines = [ 'LANGUAGE_DART', 'LANGUAGE_JAVASCRIPT' ] | 
 |   if feature_defines is None: | 
 |       feature_defines = DEFAULT_FEATURE_DEFINES | 
 |  | 
 |   webkit_options = databasebuilder.DatabaseBuilderOptions( | 
 |       idl_syntax=idlparser.WEBKIT_SYNTAX, | 
 | # TODO(vsm): What else should we define as on when processing IDL? | 
 |       idl_defines=[define for define in webkit_defines + feature_defines if define not in UNSUPPORTED_FEATURES], | 
 |       source='WebKit', | 
 |       source_attributes={'revision': webkit_revision}, | 
 |       type_rename_map={ | 
 |         'BarInfo': 'BarProp', | 
 |         'DedicatedWorkerContext': 'DedicatedWorkerGlobalScope', | 
 |         'DOMApplicationCache': 'ApplicationCache', | 
 |         'DOMCoreException': 'DOMException', | 
 |         'DOMFormData': 'FormData', | 
 |         'DOMSelection': 'Selection', | 
 |         'DOMWindow': 'Window', | 
 |         'SharedWorkerContext': 'SharedWorkerGlobalScope', | 
 |         'WorkerContext': 'WorkerGlobalScope', | 
 |       }) | 
 |  | 
 |   optional_argument_whitelist = [ | 
 |       ('CSSStyleDeclaration', 'setProperty', 'priority'), | 
 |       ('IDBDatabase', 'transaction', 'mode'), | 
 |       ] | 
 |  | 
 |   # Import WebKit IDLs. | 
 |   for file_name in idl_files: | 
 |     builder.import_idl_file(file_name, webkit_options) | 
 |  | 
 |   # Import Dart idl: | 
 |   dart_options = databasebuilder.DatabaseBuilderOptions( | 
 |     idl_syntax=idlparser.FREMONTCUT_SYNTAX, | 
 |     source='Dart', | 
 |     rename_operation_arguments_on_merge=True) | 
 |  | 
 |   builder.import_idl_file( | 
 |       os.path.join(current_dir, '..', 'elemental', 'elemental.idl'), | 
 |       dart_options) | 
 |  | 
 |   # Merging: | 
 |   builder.merge_imported_interfaces(optional_argument_whitelist) | 
 |  | 
 |   builder.fix_displacements('WebKit') | 
 |  | 
 |   # Cleanup: | 
 |   builder.normalize_annotations(['WebKit', 'Dart']) | 
 |  | 
 |   db.Save() | 
 |  | 
 | def main(): | 
 |   current_dir = os.path.dirname(__file__) | 
 |  | 
 |   webkit_dirs = [ | 
 |     'css', | 
 |     'dom', | 
 |     'fileapi', | 
 |     'html', | 
 |     'html/canvas', | 
 |     'inspector', | 
 |     'loader', | 
 |     'loader/appcache', | 
 |     'Modules/battery', | 
 |     'Modules/filesystem', | 
 |     'Modules/geolocation', | 
 |     'Modules/indexeddb', | 
 |     'Modules/mediastream', | 
 |     'Modules/speech', | 
 |     'Modules/webaudio', | 
 |     'Modules/webdatabase', | 
 |     'Modules/websockets', | 
 |     'notifications', | 
 |     'page', | 
 |     'plugins', | 
 |     'storage', | 
 |     'svg', | 
 |     'workers', | 
 |     'xml', | 
 |     ] | 
 |  | 
 |   ignored_idls = [ | 
 |     'AbstractView.idl', | 
 |     ] | 
 |  | 
 |   idl_files = [] | 
 |  | 
 |   webcore_dir = os.path.join(current_dir, '..',  | 
 |                              'third_party', 'WebCore') | 
 |   if not os.path.exists(webcore_dir): | 
 |     raise RuntimeError('directory not found: %s' % webcore_dir) | 
 |  | 
 |   def visitor(arg, dir_name, names): | 
 |     for name in names: | 
 |       file_name = os.path.join(dir_name, name) | 
 |       (interface, ext) = os.path.splitext(file_name) | 
 |       if ext == '.idl' and name not in ignored_idls: | 
 |         idl_files.append(file_name) | 
 |  | 
 |   for dir_name in webkit_dirs: | 
 |     dir_path = os.path.join(webcore_dir, dir_name) | 
 |     os.path.walk(dir_path, visitor, None) | 
 |  | 
 |   database_dir = os.path.join(current_dir, '..', 'database') | 
 |   return build_database(idl_files, database_dir) | 
 |  | 
 | if __name__ == '__main__': | 
 |   sys.exit(main()) |