Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 3 # for details. All rights reserved. Use of this source code is governed by a | 3 # for details. All rights reserved. Use of this source code is governed by a |
| 4 # BSD-style license that can be found in the LICENSE file. | 4 # BSD-style license that can be found in the LICENSE file. |
| 5 | 5 |
| 6 """This module provides shared functionality for the systems to generate | 6 """This module provides shared functionality for the systems to generate |
| 7 native binding from the IDL database.""" | 7 native binding from the IDL database.""" |
| 8 | 8 |
| 9 import emitter | 9 import emitter |
| 10 import os | 10 import os |
| 11 from generator import * | 11 from generator import * |
| 12 from htmldartgenerator import * | 12 from htmldartgenerator import * |
| 13 from idlnode import IDLArgument | 13 from idlnode import IDLArgument |
| 14 from systemhtml import js_support_checks, GetCallbackInfo, HTML_LIBRARY_NAMES | 14 from systemhtml import js_support_checks, GetCallbackInfo, HTML_LIBRARY_NAMES |
| 15 | 15 |
| 16 _cpp_type_map = { | |
| 17 ('DataTransferItem', 'webkitGetAsEntry'): 'DataTransferItemFileSystem', | |
| 18 ('DOMWindow', 'indexedDB'): 'DOMWindowIndexedDatabase', | |
|
Anton Muhin
2013/05/17 09:55:05
is this temporary? if yes, please, add a TODO
| |
| 19 ('DOMWindow', 'speechSynthesis'): 'DOMWindowSpeechSynthesis', | |
| 20 ('DOMWindow', 'webkitNotifications'): 'DOMWindowNotifications', | |
| 21 ('DOMWindow', 'storage'): 'DOMWindowQuota', | |
| 22 ('DOMWindow', 'webkitStorageInfo'): 'DOMWindowQuota', | |
| 23 ('DOMWindow', 'openDatabase'): 'DOMWindowWebDatabase', | |
| 24 ('DOMWindow', 'webkitRequestFileSystem'): 'DOMWindowFileSystem', | |
| 25 ('DOMWindow', 'webkitResolveLocalFileSystemURL'): 'DOMWindowFileSystem', | |
| 26 ('HTMLInputElement', 'webkitEntries'): 'HTMLInputElementFileSystem', | |
| 27 ('Navigator', 'doNotTrack'): 'NavigatorDoNotTrack', | |
| 28 ('Navigator', 'geolocation'): 'NavigatorGeolocation', | |
| 29 ('Navigator', 'webkitPersistentStorage'): 'NavigatorStorageQuota', | |
| 30 ('Navigator', 'webkitTemporaryStorage'): 'NavigatorStorageQuota', | |
| 31 ('Navigator', 'registerProtocolHandler'): 'NavigatorContentUtils', | |
| 32 ('Navigator', 'unregisterProtocolHandler'): 'NavigatorContentUtils', | |
| 33 ('Navigator', 'webkitGetUserMedia'): 'NavigatorMediaStream', | |
| 34 ('Navigator', 'webkitGetGamepads'): 'NavigatorGamepad', | |
| 35 } | |
| 36 | |
| 37 _cpp_partial_map = {} | |
| 38 | |
| 39 def _GetCPPPartialNames(interface_name): | |
| 40 if not _cpp_partial_map: | |
| 41 for (type, member) in _cpp_type_map.keys(): | |
|
Anton Muhin
2013/05/17 09:55:05
nit: please, no () around type, member
| |
| 42 if type not in _cpp_partial_map: | |
| 43 _cpp_partial_map[type] = set([]) | |
| 44 _cpp_partial_map[type].add(_cpp_type_map[(type, member)]) | |
|
Anton Muhin
2013/05/17 09:55:05
_cpp_partial_map.setdefault(type, set()).add(....)
| |
| 45 | |
| 46 if interface_name in _cpp_partial_map: | |
|
Anton Muhin
2013/05/17 09:55:05
return _cpp_partial_map.get(interface_name, set())
| |
| 47 return _cpp_partial_map[interface_name] | |
| 48 else: | |
| 49 return set([]) | |
| 50 | |
| 51 def _GetCPPTypeName(interface_name, callback_name): | |
| 52 # TODO(vsm): We need to track the original IDL file name in order to recover | |
| 53 # the proper CPP name. | |
| 54 | |
| 55 cpp_tuple = (interface_name, callback_name) | |
|
Anton Muhin
2013/05/17 09:55:05
return _cpp_type_name.get((interface_name, callbac
| |
| 56 if cpp_tuple in _cpp_type_map: | |
| 57 cpp_type_name = _cpp_type_map[cpp_tuple] | |
| 58 else: | |
| 59 cpp_type_name = interface_name | |
| 60 return cpp_type_name | |
| 61 | |
| 16 class DartiumBackend(HtmlDartGenerator): | 62 class DartiumBackend(HtmlDartGenerator): |
| 17 """Generates Dart implementation for one DOM IDL interface.""" | 63 """Generates Dart implementation for one DOM IDL interface.""" |
| 18 | 64 |
| 19 def __init__(self, interface, cpp_library_emitter, options): | 65 def __init__(self, interface, cpp_library_emitter, options): |
| 20 super(DartiumBackend, self).__init__(interface, options) | 66 super(DartiumBackend, self).__init__(interface, options) |
| 21 | 67 |
| 22 self._interface = interface | 68 self._interface = interface |
| 23 self._cpp_library_emitter = cpp_library_emitter | 69 self._cpp_library_emitter = cpp_library_emitter |
| 24 self._database = options.database | 70 self._database = options.database |
| 25 self._template_loader = options.templates | 71 self._template_loader = options.templates |
| 26 self._type_registry = options.type_registry | 72 self._type_registry = options.type_registry |
| 27 self._interface_type_info = self._type_registry.TypeInfo(self._interface.id) | 73 self._interface_type_info = self._type_registry.TypeInfo(self._interface.id) |
| 28 self._metadata = options.metadata | 74 self._metadata = options.metadata |
| 29 | 75 |
| 30 def ImplementsMergedMembers(self): | 76 def ImplementsMergedMembers(self): |
| 31 # We could not add merged functions to implementation class because | 77 # We could not add merged functions to implementation class because |
| 32 # underlying c++ object doesn't implement them. Merged functions are | 78 # underlying c++ object doesn't implement them. Merged functions are |
| 33 # generated on merged interface implementation instead. | 79 # generated on merged interface implementation instead. |
| 34 return False | 80 return False |
| 35 | 81 |
| 36 def CustomJSMembers(self): | 82 def CustomJSMembers(self): |
| 37 return {} | 83 return {} |
| 38 | 84 |
| 39 def GenerateCallback(self, info): | 85 def GenerateCallback(self, info): |
| 40 if IsPureInterface(self._interface.id) or IsCustomType(self._interface.id): | 86 if IsPureInterface(self._interface.id) or IsCustomType(self._interface.id): |
| 41 return | 87 return |
| 42 | 88 |
| 43 cpp_impl_includes = set() | 89 cpp_impl_includes = set(['"' + partial + '.h"' |
| 90 for partial in _GetCPPPartialNames(self._interface. id)]) | |
| 44 cpp_header_handlers_emitter = emitter.Emitter() | 91 cpp_header_handlers_emitter = emitter.Emitter() |
| 45 cpp_impl_handlers_emitter = emitter.Emitter() | 92 cpp_impl_handlers_emitter = emitter.Emitter() |
| 46 class_name = 'Dart%s' % self._interface.id | 93 class_name = 'Dart%s' % self._interface.id |
| 47 for operation in self._interface.operations: | 94 for operation in self._interface.operations: |
| 48 parameters = [] | 95 parameters = [] |
| 49 arguments = [] | 96 arguments = [] |
| 50 conversion_includes = [] | 97 conversion_includes = [] |
| 51 for argument in operation.arguments: | 98 for argument in operation.arguments: |
| 52 argument_type_info = self._TypeInfo(argument.type.id) | 99 argument_type_info = self._TypeInfo(argument.type.id) |
| 53 parameters.append('%s %s' % (argument_type_info.parameter_type(), | 100 parameters.append('%s %s' % (argument_type_info.parameter_type(), |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 122 self._interface.id, | 169 self._interface.id, |
| 123 self._renamer.GetLibraryName(self._interface)) | 170 self._renamer.GetLibraryName(self._interface)) |
| 124 self._cpp_impl_emitter = self._cpp_library_emitter.CreateSourceEmitter(sel f._interface.id) | 171 self._cpp_impl_emitter = self._cpp_library_emitter.CreateSourceEmitter(sel f._interface.id) |
| 125 else: | 172 else: |
| 126 self._cpp_header_emitter = emitter.Emitter() | 173 self._cpp_header_emitter = emitter.Emitter() |
| 127 self._cpp_impl_emitter = emitter.Emitter() | 174 self._cpp_impl_emitter = emitter.Emitter() |
| 128 | 175 |
| 129 self._interface_type_info = self._TypeInfo(self._interface.id) | 176 self._interface_type_info = self._TypeInfo(self._interface.id) |
| 130 self._members_emitter = members_emitter | 177 self._members_emitter = members_emitter |
| 131 self._cpp_declarations_emitter = emitter.Emitter() | 178 self._cpp_declarations_emitter = emitter.Emitter() |
| 132 self._cpp_impl_includes = set() | 179 self._cpp_impl_includes = set(['"' + partial + '.h"' |
| 180 for partial in _GetCPPPartialNames(self._inte rface.id)]) | |
| 133 self._cpp_definitions_emitter = emitter.Emitter() | 181 self._cpp_definitions_emitter = emitter.Emitter() |
| 134 self._cpp_resolver_emitter = emitter.Emitter() | 182 self._cpp_resolver_emitter = emitter.Emitter() |
| 135 | 183 |
| 136 # We need to revisit our treatment of typed arrays, right now | 184 # We need to revisit our treatment of typed arrays, right now |
| 137 # it is full of hacks. | 185 # it is full of hacks. |
| 138 if self._interface.ext_attrs.get('ConstructorTemplate') == 'TypedArray': | 186 if self._interface.ext_attrs.get('ConstructorTemplate') == 'TypedArray': |
| 139 self._cpp_resolver_emitter.Emit( | 187 self._cpp_resolver_emitter.Emit( |
| 140 ' if (name == "$(INTERFACE_NAME)_constructor_Callback")\n' | 188 ' if (name == "$(INTERFACE_NAME)_constructor_Callback")\n' |
| 141 ' return Dart$(INTERFACE_NAME)Internal::constructorCallback;\n' , | 189 ' return Dart$(INTERFACE_NAME)Internal::constructorCallback;\n' , |
| 142 INTERFACE_NAME=self._interface.id) | 190 INTERFACE_NAME=self._interface.id) |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 350 webcore_function_name = 'getNonEmptyURLAttribute' | 398 webcore_function_name = 'getNonEmptyURLAttribute' |
| 351 else: | 399 else: |
| 352 webcore_function_name = 'getURLAttribute' | 400 webcore_function_name = 'getURLAttribute' |
| 353 elif 'ImplementedAs' in attr.ext_attrs: | 401 elif 'ImplementedAs' in attr.ext_attrs: |
| 354 webcore_function_name = attr.ext_attrs['ImplementedAs'] | 402 webcore_function_name = attr.ext_attrs['ImplementedAs'] |
| 355 else: | 403 else: |
| 356 if attr.id == 'operator': | 404 if attr.id == 'operator': |
| 357 webcore_function_name = '_operator' | 405 webcore_function_name = '_operator' |
| 358 elif attr.id == 'target' and attr.type.id == 'SVGAnimatedString': | 406 elif attr.id == 'target' and attr.type.id == 'SVGAnimatedString': |
| 359 webcore_function_name = 'svgTarget' | 407 webcore_function_name = 'svgTarget' |
| 408 elif attr.id == 'CSS': | |
|
Anton Muhin
2013/05/17 09:55:05
this is a rename, correct? There is this implemen
| |
| 409 webcore_function_name = 'css' | |
| 360 else: | 410 else: |
| 361 webcore_function_name = self._ToWebKitName(attr.id) | 411 webcore_function_name = self._ToWebKitName(attr.id) |
| 362 if attr.type.id.startswith('SVGAnimated'): | 412 if attr.type.id.startswith('SVGAnimated'): |
| 363 webcore_function_name += 'Animated' | 413 webcore_function_name += 'Animated' |
| 364 | 414 |
| 365 function_expression = self._GenerateWebCoreFunctionExpression(webcore_functi on_name, attr) | 415 function_expression = self._GenerateWebCoreFunctionExpression(webcore_functi on_name, attr) |
| 366 self._GenerateNativeCallback( | 416 self._GenerateNativeCallback( |
| 367 cpp_callback_name, | 417 cpp_callback_name, |
| 368 True, | 418 True, |
| 369 function_expression, | 419 function_expression, |
| (...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 789 if raises_dom_exception: | 839 if raises_dom_exception: |
| 790 cpp_arguments.append('ec') | 840 cpp_arguments.append('ec') |
| 791 invocation_emitter = body_emitter.Emit( | 841 invocation_emitter = body_emitter.Emit( |
| 792 ' ExceptionCode ec = 0;\n' | 842 ' ExceptionCode ec = 0;\n' |
| 793 '$!INVOCATION' | 843 '$!INVOCATION' |
| 794 ' if (UNLIKELY(ec)) {\n' | 844 ' if (UNLIKELY(ec)) {\n' |
| 795 ' exception = DartDOMWrapper::exceptionCodeToDartException(ec );\n' | 845 ' exception = DartDOMWrapper::exceptionCodeToDartException(ec );\n' |
| 796 ' goto fail;\n' | 846 ' goto fail;\n' |
| 797 ' }\n') | 847 ' }\n') |
| 798 | 848 |
| 849 | |
| 850 if needs_receiver: | |
| 851 interface_name = self._interface_type_info.native_type() | |
| 852 cpp_type_name = _GetCPPTypeName(interface_name, | |
|
Anton Muhin
2013/05/17 09:55:05
nit: single line
| |
| 853 node.id) | |
| 854 if interface_name != cpp_type_name: | |
| 855 if interface_name == 'DOMWindow' or interface_name == 'Navigator': | |
| 856 cpp_arguments.insert(0, 'receiver') | |
|
Anton Muhin
2013/05/17 09:55:05
just curious: does the position (1st/last) indeed
| |
| 857 else: | |
| 858 cpp_arguments.append('receiver') | |
| 859 | |
| 799 function_call = '%s(%s)' % (function_expression, ', '.join(cpp_arguments)) | 860 function_call = '%s(%s)' % (function_expression, ', '.join(cpp_arguments)) |
| 800 if return_type == 'void': | 861 if return_type == 'void': |
| 801 invocation_emitter.Emit( | 862 invocation_emitter.Emit( |
| 802 ' $FUNCTION_CALL;\n', | 863 ' $FUNCTION_CALL;\n', |
| 803 FUNCTION_CALL=function_call) | 864 FUNCTION_CALL=function_call) |
| 804 else: | 865 else: |
| 805 return_type_info = self._TypeInfo(return_type) | 866 return_type_info = self._TypeInfo(return_type) |
| 806 self._cpp_impl_includes |= set(return_type_info.conversion_includes()) | 867 self._cpp_impl_includes |= set(return_type_info.conversion_includes()) |
| 807 | 868 |
| 808 if return_type_is_nullable: | 869 if return_type_is_nullable: |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 836 native_binding = '%s_%s_%s' % (self._interface.id, idl_name, native_suffix) | 897 native_binding = '%s_%s_%s' % (self._interface.id, idl_name, native_suffix) |
| 837 self._members_emitter.Emit( | 898 self._members_emitter.Emit( |
| 838 '\n' | 899 '\n' |
| 839 ' $METADATA$DART_DECLARATION native "$NATIVE_BINDING";\n', | 900 ' $METADATA$DART_DECLARATION native "$NATIVE_BINDING";\n', |
| 840 DOMINTERFACE=self._interface.id, | 901 DOMINTERFACE=self._interface.id, |
| 841 METADATA=metadata, | 902 METADATA=metadata, |
| 842 DART_DECLARATION=dart_declaration, | 903 DART_DECLARATION=dart_declaration, |
| 843 NATIVE_BINDING=native_binding) | 904 NATIVE_BINDING=native_binding) |
| 844 | 905 |
| 845 cpp_callback_name = '%s%s' % (idl_name, native_suffix) | 906 cpp_callback_name = '%s%s' % (idl_name, native_suffix) |
| 907 | |
| 846 self._cpp_resolver_emitter.Emit( | 908 self._cpp_resolver_emitter.Emit( |
| 847 ' if (argumentCount == $ARGC && name == "$NATIVE_BINDING")\n' | 909 ' if (argumentCount == $ARGC && name == "$NATIVE_BINDING")\n' |
| 848 ' return Dart$(INTERFACE_NAME)Internal::$CPP_CALLBACK_NAME;\n', | 910 ' return Dart$(INTERFACE_NAME)Internal::$CPP_CALLBACK_NAME;\n', |
| 849 ARGC=argument_count, | 911 ARGC=argument_count, |
| 850 NATIVE_BINDING=native_binding, | 912 NATIVE_BINDING=native_binding, |
| 851 INTERFACE_NAME=self._interface.id, | 913 INTERFACE_NAME=self._interface.id, |
| 852 CPP_CALLBACK_NAME=cpp_callback_name) | 914 CPP_CALLBACK_NAME=cpp_callback_name) |
| 853 | 915 |
| 854 if is_custom: | 916 if is_custom: |
| 855 self._cpp_declarations_emitter.Emit( | 917 self._cpp_declarations_emitter.Emit( |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 869 self._cpp_impl_includes.add('"%s.h"' % namespace) | 931 self._cpp_impl_includes.add('"%s.h"' % namespace) |
| 870 | 932 |
| 871 attribute_name = attr.ext_attrs['Reflect'] or attr.id.lower() | 933 attribute_name = attr.ext_attrs['Reflect'] or attr.id.lower() |
| 872 return 'WebCore::%s::%sAttr' % (namespace, attribute_name) | 934 return 'WebCore::%s::%sAttr' % (namespace, attribute_name) |
| 873 | 935 |
| 874 def _GenerateWebCoreFunctionExpression(self, function_name, idl_node): | 936 def _GenerateWebCoreFunctionExpression(self, function_name, idl_node): |
| 875 if 'ImplementedBy' in idl_node.ext_attrs: | 937 if 'ImplementedBy' in idl_node.ext_attrs: |
| 876 return '%s::%s' % (idl_node.ext_attrs['ImplementedBy'], function_name) | 938 return '%s::%s' % (idl_node.ext_attrs['ImplementedBy'], function_name) |
| 877 if idl_node.is_static: | 939 if idl_node.is_static: |
| 878 return '%s::%s' % (self._interface_type_info.idl_type(), function_name) | 940 return '%s::%s' % (self._interface_type_info.idl_type(), function_name) |
| 879 return '%s%s' % (self._interface_type_info.receiver(), function_name) | 941 interface_name = self._interface_type_info.idl_type() |
| 942 cpp_type_name = _GetCPPTypeName(interface_name, function_name) | |
|
Anton Muhin
2013/05/17 09:55:05
overall it looks like _GetCPPTypeName should retur
| |
| 943 if cpp_type_name == interface_name: | |
| 944 return '%s%s' % (self._interface_type_info.receiver(), function_name) | |
| 945 else: | |
| 946 return '%s::%s' % (cpp_type_name, function_name) | |
| 880 | 947 |
| 881 def _IsArgumentOptionalInWebCore(self, operation, argument): | 948 def _IsArgumentOptionalInWebCore(self, operation, argument): |
| 882 if not IsOptional(argument): | 949 if not IsOptional(argument): |
| 883 return False | 950 return False |
| 884 if 'Callback' in argument.ext_attrs: | 951 if 'Callback' in argument.ext_attrs: |
| 885 return False | 952 return False |
| 886 if operation.id in ['addEventListener', 'removeEventListener'] and argument. id == 'useCapture': | 953 if operation.id in ['addEventListener', 'removeEventListener'] and argument. id == 'useCapture': |
| 887 return False | 954 return False |
| 888 if 'ForceOptional' in argument.ext_attrs: | 955 if 'ForceOptional' in argument.ext_attrs: |
| 889 return False | 956 return False |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 952 ' if (Dart_NativeFunction func = $CLASS_NAME::resolver(name, argu mentCount))\n' | 1019 ' if (Dart_NativeFunction func = $CLASS_NAME::resolver(name, argu mentCount))\n' |
| 953 ' return func;\n', | 1020 ' return func;\n', |
| 954 CLASS_NAME=os.path.splitext(os.path.basename(path))[0]) | 1021 CLASS_NAME=os.path.splitext(os.path.basename(path))[0]) |
| 955 | 1022 |
| 956 def _IsOptionalStringArgumentInInitEventMethod(interface, operation, argument): | 1023 def _IsOptionalStringArgumentInInitEventMethod(interface, operation, argument): |
| 957 return ( | 1024 return ( |
| 958 interface.id.endswith('Event') and | 1025 interface.id.endswith('Event') and |
| 959 operation.id.startswith('init') and | 1026 operation.id.startswith('init') and |
| 960 argument.ext_attrs.get('Default') == 'Undefined' and | 1027 argument.ext_attrs.get('Default') == 'Undefined' and |
| 961 argument.type.id == 'DOMString') | 1028 argument.type.id == 'DOMString') |
| OLD | NEW |