blob: 4fe8af30e66847ac5d739dabd3e6cfd2856e531a [file] [log] [blame]
#!/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())