| 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 generates Dart APIs from the IDL database.""" | 6 """This module generates Dart APIs from the IDL database.""" |
| 7 | 7 |
| 8 import emitter | 8 import emitter |
| 9 import idlnode | 9 import idlnode |
| 10 import logging | 10 import logging |
| (...skipping 1751 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1762 ' bool isEmpty() {\n' | 1762 ' bool isEmpty() {\n' |
| 1763 ' return length == 0;\n' | 1763 ' return length == 0;\n' |
| 1764 ' }\n' | 1764 ' }\n' |
| 1765 '\n' | 1765 '\n' |
| 1766 ' Iterator<$TYPE> iterator() {\n' | 1766 ' Iterator<$TYPE> iterator() {\n' |
| 1767 ' return new _FixedSizeListIterator<$TYPE>(this);\n' | 1767 ' return new _FixedSizeListIterator<$TYPE>(this);\n' |
| 1768 ' }\n', | 1768 ' }\n', |
| 1769 TYPE=element_type) | 1769 TYPE=element_type) |
| 1770 | 1770 |
| 1771 def _HasNativeIndexGetter(self, interface): | 1771 def _HasNativeIndexGetter(self, interface): |
| 1772 return ('HasIndexGetter' in interface.ext_attrs or | 1772 return ('IndexedGetter' in interface.ext_attrs or |
| 1773 'HasNumericIndexGetter' in interface.ext_attrs) | 1773 'NumericIndexedGetter' in interface.ext_attrs) |
| 1774 | 1774 |
| 1775 def _EmitNativeIndexGetter(self, interface, element_type): | 1775 def _EmitNativeIndexGetter(self, interface, element_type): |
| 1776 method_name = '_index' | 1776 method_name = '_index' |
| 1777 self._members_emitter.Emit( | 1777 self._members_emitter.Emit( |
| 1778 '\n' | 1778 '\n' |
| 1779 ' $TYPE operator[](int index) { return $METHOD(this, index); }\n' | 1779 ' $TYPE operator[](int index) { return $METHOD(this, index); }\n' |
| 1780 ' static $TYPE $METHOD(var _this, int index) native;\n', | 1780 ' static $TYPE $METHOD(var _this, int index) native;\n', |
| 1781 TYPE=element_type, METHOD=method_name) | 1781 TYPE=element_type, METHOD=method_name) |
| 1782 | 1782 |
| 1783 def _HasNativeIndexSetter(self, interface): | 1783 def _HasNativeIndexSetter(self, interface): |
| 1784 return 'HasCustomIndexSetter' in interface.ext_attrs | 1784 return 'CustomIndexedSetter' in interface.ext_attrs |
| 1785 | 1785 |
| 1786 def _EmitNativeIndexSetter(self, interface, element_type): | 1786 def _EmitNativeIndexSetter(self, interface, element_type): |
| 1787 method_name = '_set_index' | 1787 method_name = '_set_index' |
| 1788 self._members_emitter.Emit( | 1788 self._members_emitter.Emit( |
| 1789 '\n' | 1789 '\n' |
| 1790 ' void operator[]=(int index, $TYPE value) {\n' | 1790 ' void operator[]=(int index, $TYPE value) {\n' |
| 1791 ' return $METHOD(this, index, value);\n' | 1791 ' return $METHOD(this, index, value);\n' |
| 1792 ' }\n' | 1792 ' }\n' |
| 1793 ' static $METHOD(_this, index, value) native;\n', | 1793 ' static $METHOD(_this, index, value) native;\n', |
| 1794 TYPE=element_type, METHOD=method_name) | 1794 TYPE=element_type, METHOD=method_name) |
| (...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2186 # | 2186 # |
| 2187 # and | 2187 # and |
| 2188 # | 2188 # |
| 2189 # class YImpl extends ListBase<T> { copies of transitive XImpl methods; } | 2189 # class YImpl extends ListBase<T> { copies of transitive XImpl methods; } |
| 2190 # | 2190 # |
| 2191 self._members_emitter.Emit( | 2191 self._members_emitter.Emit( |
| 2192 '\n' | 2192 '\n' |
| 2193 ' $TYPE operator[](int index) native "return this[index];";\n', | 2193 ' $TYPE operator[](int index) native "return this[index];";\n', |
| 2194 TYPE=self._NarrowOutputType(element_type)) | 2194 TYPE=self._NarrowOutputType(element_type)) |
| 2195 | 2195 |
| 2196 if 'HasCustomIndexSetter' in self._interface.ext_attrs: | 2196 if 'CustomIndexedSetter' in self._interface.ext_attrs: |
| 2197 self._members_emitter.Emit( | 2197 self._members_emitter.Emit( |
| 2198 '\n' | 2198 '\n' |
| 2199 ' void operator[]=(int index, $TYPE value) native "this[index] = valu
e";\n', | 2199 ' void operator[]=(int index, $TYPE value) native "this[index] = valu
e";\n', |
| 2200 TYPE=self._NarrowInputType(element_type)) | 2200 TYPE=self._NarrowInputType(element_type)) |
| 2201 else: | 2201 else: |
| 2202 self._members_emitter.Emit( | 2202 self._members_emitter.Emit( |
| 2203 '\n' | 2203 '\n' |
| 2204 ' void operator[]=(int index, $TYPE value) {\n' | 2204 ' void operator[]=(int index, $TYPE value) {\n' |
| 2205 ' throw new UnsupportedOperationException("Cannot assign element of
immutable List.");\n' | 2205 ' throw new UnsupportedOperationException("Cannot assign element of
immutable List.");\n' |
| 2206 ' }\n', | 2206 ' }\n', |
| (...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2738 RESOLVER=self._cpp_resolver_emitter.Fragments()) | 2738 RESOLVER=self._cpp_resolver_emitter.Fragments()) |
| 2739 | 2739 |
| 2740 def _GenerateCppHeader(self): | 2740 def _GenerateCppHeader(self): |
| 2741 webcore_include = self._interface_type_info.webcore_include() | 2741 webcore_include = self._interface_type_info.webcore_include() |
| 2742 if webcore_include: | 2742 if webcore_include: |
| 2743 webcore_include = '#include "%s.h"\n' % webcore_include | 2743 webcore_include = '#include "%s.h"\n' % webcore_include |
| 2744 else: | 2744 else: |
| 2745 webcore_include = '' | 2745 webcore_include = '' |
| 2746 | 2746 |
| 2747 if ('CustomToJS' in self._interface.ext_attrs or | 2747 if ('CustomToJS' in self._interface.ext_attrs or |
| 2748 'CustomToJSObject' in self._interface.ext_attrs or |
| 2748 'PureInterface' in self._interface.ext_attrs or | 2749 'PureInterface' in self._interface.ext_attrs or |
| 2750 'CPPPureInterface' in self._interface.ext_attrs or |
| 2749 self._interface_type_info.custom_to_dart()): | 2751 self._interface_type_info.custom_to_dart()): |
| 2750 to_dart_value_template = ( | 2752 to_dart_value_template = ( |
| 2751 'Dart_Handle toDartValue($(WEBCORE_CLASS_NAME)* value);\n') | 2753 'Dart_Handle toDartValue($(WEBCORE_CLASS_NAME)* value);\n') |
| 2752 else: | 2754 else: |
| 2753 to_dart_value_template = ( | 2755 to_dart_value_template = ( |
| 2754 'inline Dart_Handle toDartValue($(WEBCORE_CLASS_NAME)* value)\n' | 2756 'inline Dart_Handle toDartValue($(WEBCORE_CLASS_NAME)* value)\n' |
| 2755 '{\n' | 2757 '{\n' |
| 2756 ' return DartDOMWrapper::toDart<Dart$(INTERFACE)>(value);\n' | 2758 ' return DartDOMWrapper::toDart<Dart$(INTERFACE)>(value);\n' |
| 2757 '}\n') | 2759 '}\n') |
| 2758 to_dart_value_emitter = emitter.Emitter() | 2760 to_dart_value_emitter = emitter.Emitter() |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2857 arguments.append(attr.id) | 2859 arguments.append(attr.id) |
| 2858 parameter_definitions_emitter = emitter.Emitter() | 2860 parameter_definitions_emitter = emitter.Emitter() |
| 2859 self._GenerateParameterAdapter(parameter_definitions_emitter, attr, 0) | 2861 self._GenerateParameterAdapter(parameter_definitions_emitter, attr, 0) |
| 2860 parameter_definitions = parameter_definitions_emitter.Fragments() | 2862 parameter_definitions = parameter_definitions_emitter.Fragments() |
| 2861 self._GenerateNativeCallback(cpp_callback_name, attr, parameter_definitions, | 2863 self._GenerateNativeCallback(cpp_callback_name, attr, parameter_definitions, |
| 2862 webcore_function_name, arguments, idl_return_type=None, | 2864 webcore_function_name, arguments, idl_return_type=None, |
| 2863 raises_dart_exceptions=True, | 2865 raises_dart_exceptions=True, |
| 2864 raises_dom_exceptions=attr.set_raises) | 2866 raises_dom_exceptions=attr.set_raises) |
| 2865 | 2867 |
| 2866 def _HasNativeIndexGetter(self, interface): | 2868 def _HasNativeIndexGetter(self, interface): |
| 2867 return ('HasCustomIndexGetter' in interface.ext_attrs or | 2869 return ('CustomIndexedGetter' in interface.ext_attrs or |
| 2868 'HasNumericIndexGetter' in interface.ext_attrs) | 2870 'NumericIndexedGetter' in interface.ext_attrs) |
| 2869 | 2871 |
| 2870 def _EmitNativeIndexGetter(self, interface, element_type): | 2872 def _EmitNativeIndexGetter(self, interface, element_type): |
| 2871 dart_declaration = '%s operator[](int index)' % element_type | 2873 dart_declaration = '%s operator[](int index)' % element_type |
| 2872 self._GenerateNativeBinding('numericIndexGetter', 2, dart_declaration, | 2874 self._GenerateNativeBinding('numericIndexGetter', 2, dart_declaration, |
| 2873 'Callback', True) | 2875 'Callback', True) |
| 2874 | 2876 |
| 2875 def _EmitNativeIndexSetter(self, interface, element_type): | 2877 def _EmitNativeIndexSetter(self, interface, element_type): |
| 2876 dart_declaration = 'void operator[]=(int index, %s value)' % element_type | 2878 dart_declaration = 'void operator[]=(int index, %s value)' % element_type |
| 2877 self._GenerateNativeBinding('numericIndexSetter', 3, dart_declaration, | 2879 self._GenerateNativeBinding('numericIndexSetter', 3, dart_declaration, |
| 2878 'Callback', True) | 2880 'Callback', True) |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2957 argument_list) | 2959 argument_list) |
| 2958 is_custom = 'Custom' in operation.ext_attrs | 2960 is_custom = 'Custom' in operation.ext_attrs |
| 2959 cpp_callback_name = self._GenerateNativeBinding( | 2961 cpp_callback_name = self._GenerateNativeBinding( |
| 2960 native_name, 1 + len(operation.arguments), dart_declaration, 'Callback', | 2962 native_name, 1 + len(operation.arguments), dart_declaration, 'Callback', |
| 2961 is_custom) | 2963 is_custom) |
| 2962 if is_custom: | 2964 if is_custom: |
| 2963 return | 2965 return |
| 2964 | 2966 |
| 2965 # Generate callback. | 2967 # Generate callback. |
| 2966 webcore_function_name = operation.id | 2968 webcore_function_name = operation.id |
| 2967 if 'ImplementationFunction' in operation.ext_attrs: | 2969 if 'ImplementedAs' in operation.ext_attrs: |
| 2968 webcore_function_name = operation.ext_attrs['ImplementationFunction'] | 2970 webcore_function_name = operation.ext_attrs['ImplementedAs'] |
| 2969 | 2971 |
| 2970 parameter_definitions_emitter = emitter.Emitter() | 2972 parameter_definitions_emitter = emitter.Emitter() |
| 2971 raises_dart_exceptions = len(operation.arguments) > 0 or operation.raises | 2973 raises_dart_exceptions = len(operation.arguments) > 0 or operation.raises |
| 2972 arguments = [] | 2974 arguments = [] |
| 2973 | 2975 |
| 2974 # Process 'CallWith' argument. | 2976 # Process 'CallWith' argument. |
| 2975 if ('CallWith' in operation.ext_attrs and | 2977 if 'CallWith' in operation.ext_attrs: |
| 2976 operation.ext_attrs['CallWith'] == 'ScriptExecutionContext'): | 2978 call_with = operation.ext_attrs['CallWith'] |
| 2977 parameter_definitions_emitter.Emit( | 2979 if call_with == 'ScriptExecutionContext': |
| 2978 ' ScriptExecutionContext* context = DartUtilities::scriptExecut
ionContext();\n' | 2980 parameter_definitions_emitter.Emit( |
| 2979 ' if (!context)\n' | 2981 ' ScriptExecutionContext* context = DartUtilities::scriptExec
utionContext();\n' |
| 2980 ' return;\n') | 2982 ' if (!context)\n' |
| 2981 arguments.append('context') | 2983 ' return;\n') |
| 2984 arguments.append('context') |
| 2985 elif call_with == 'ScriptArguments|CallStack': |
| 2986 raises_dart_exceptions = True |
| 2987 self._cpp_impl_includes['ScriptArguments'] = 1 |
| 2988 self._cpp_impl_includes['ScriptCallStack'] = 1 |
| 2989 self._cpp_impl_includes['V8Proxy'] = 1 |
| 2990 self._cpp_impl_includes['v8'] = 1 |
| 2991 parameter_definitions_emitter.Emit( |
| 2992 ' v8::HandleScope handleScope;\n' |
| 2993 ' v8::Context::Scope scope(V8Proxy::mainWorldContext(DartUtil
ities::domWindowForCurrentIsolate()->frame()));\n' |
| 2994 ' Dart_Handle customArgument = Dart_GetNativeArgument(args, $
INDEX);\n' |
| 2995 ' RefPtr<ScriptArguments> scriptArguments(DartUtilities::crea
teScriptArguments(customArgument, exception));\n' |
| 2996 ' if (!scriptArguments)\n' |
| 2997 ' goto fail;\n' |
| 2998 ' RefPtr<ScriptCallStack> scriptCallStack(DartUtilities::crea
teScriptCallStack());\n' |
| 2999 ' if (!scriptCallStack->size())\n' |
| 3000 ' return;\n', |
| 3001 INDEX=len(operation.arguments)) |
| 3002 arguments.extend(['scriptArguments', 'scriptCallStack']) |
| 2982 | 3003 |
| 2983 # Process Dart arguments. | 3004 # Process Dart arguments. |
| 2984 for (i, argument) in enumerate(operation.arguments): | 3005 for (i, argument) in enumerate(operation.arguments): |
| 2985 if i == len(operation.arguments) - 1 and 'CustomArgumentHandling' in opera
tion.ext_attrs: | 3006 if i == len(operation.arguments) - 1 and self._interface.id == 'Console' a
nd argument.id == 'arg': |
| 2986 # FIXME: we are skipping last argument here because it was added in | 3007 # FIXME: we are skipping last argument here because it was added in |
| 2987 # supplemental dart.idl. Cleanup dart.idl and remove this check. | 3008 # supplemental dart.idl. Cleanup dart.idl and remove this check. |
| 2988 break | 3009 break |
| 2989 self._GenerateParameterAdapter(parameter_definitions_emitter, argument, i) | 3010 self._GenerateParameterAdapter(parameter_definitions_emitter, argument, i) |
| 2990 arguments.append(argument.id) | 3011 arguments.append(argument.id) |
| 2991 | 3012 |
| 2992 if operation.id in ['addEventListener', 'removeEventListener']: | 3013 if operation.id in ['addEventListener', 'removeEventListener']: |
| 2993 # addEventListener's and removeEventListener's last argument is marked | 3014 # addEventListener's and removeEventListener's last argument is marked |
| 2994 # as optional in idl, but is not optional in webcore implementation. | 3015 # as optional in idl, but is not optional in webcore implementation. |
| 2995 if len(operation.arguments) == 2: | 3016 if len(operation.arguments) == 2: |
| 2996 arguments.append('false') | 3017 arguments.append('false') |
| 2997 | 3018 |
| 2998 if self._interface.id == 'CSSStyleDeclaration' and operation.id == 'setPrope
rty': | 3019 if self._interface.id == 'CSSStyleDeclaration' and operation.id == 'setPrope
rty': |
| 2999 # CSSStyleDeclaration.setProperty priority parameter is optional in Dart | 3020 # CSSStyleDeclaration.setProperty priority parameter is optional in Dart |
| 3000 # idl, but is not optional in webcore implementation. | 3021 # idl, but is not optional in webcore implementation. |
| 3001 if len(operation.arguments) == 2: | 3022 if len(operation.arguments) == 2: |
| 3002 arguments.append('String()') | 3023 arguments.append('String()') |
| 3003 | 3024 |
| 3004 # Process auxiliary arguments. | |
| 3005 if 'CustomArgumentHandling' in operation.ext_attrs: | |
| 3006 raises_dart_exceptions = True | |
| 3007 self._cpp_impl_includes['ScriptArguments'] = 1 | |
| 3008 self._cpp_impl_includes['ScriptCallStack'] = 1 | |
| 3009 self._cpp_impl_includes['V8Proxy'] = 1 | |
| 3010 self._cpp_impl_includes['v8'] = 1 | |
| 3011 parameter_definitions_emitter.Emit( | |
| 3012 ' v8::HandleScope handleScope;\n' | |
| 3013 ' v8::Context::Scope scope(V8Proxy::mainWorldContext(DartUtilit
ies::domWindowForCurrentIsolate()->frame()));\n' | |
| 3014 ' Dart_Handle customArgument = Dart_GetNativeArgument(args, $IN
DEX);\n' | |
| 3015 ' RefPtr<ScriptArguments> scriptArguments(DartUtilities::create
ScriptArguments(customArgument, exception));\n' | |
| 3016 ' if (!scriptArguments)\n' | |
| 3017 ' goto fail;\n' | |
| 3018 ' RefPtr<ScriptCallStack> scriptCallStack(DartUtilities::create
ScriptCallStack());\n' | |
| 3019 ' if (!scriptCallStack->size())\n' | |
| 3020 ' return;\n', | |
| 3021 INDEX=len(operation.arguments)) | |
| 3022 arguments.extend(['scriptArguments', 'scriptCallStack']) | |
| 3023 | |
| 3024 if 'NeedsUserGestureCheck' in operation.ext_attrs: | 3025 if 'NeedsUserGestureCheck' in operation.ext_attrs: |
| 3025 arguments.extend('DartUtilities::processingUserGesture') | 3026 arguments.extend('DartUtilities::processingUserGesture') |
| 3026 | 3027 |
| 3027 parameter_definitions = parameter_definitions_emitter.Fragments() | 3028 parameter_definitions = parameter_definitions_emitter.Fragments() |
| 3028 self._GenerateNativeCallback(cpp_callback_name, operation, | 3029 self._GenerateNativeCallback(cpp_callback_name, operation, |
| 3029 parameter_definitions, webcore_function_name, arguments, | 3030 parameter_definitions, webcore_function_name, arguments, |
| 3030 idl_return_type=operation.type, | 3031 idl_return_type=operation.type, |
| 3031 raises_dart_exceptions=raises_dart_exceptions, | 3032 raises_dart_exceptions=raises_dart_exceptions, |
| 3032 raises_dom_exceptions=operation.raises) | 3033 raises_dom_exceptions=operation.raises) |
| 3033 | 3034 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 3056 elif return_type_info.idl_type() in svg_primitive_types: | 3057 elif return_type_info.idl_type() in svg_primitive_types: |
| 3057 conversion_cast = '%s::create($BODY)' | 3058 conversion_cast = '%s::create($BODY)' |
| 3058 else: | 3059 else: |
| 3059 conversion_cast = 'static_cast<%s*>($BODY)' | 3060 conversion_cast = 'static_cast<%s*>($BODY)' |
| 3060 conversion_cast = conversion_cast % return_type_info.native_type() | 3061 conversion_cast = conversion_cast % return_type_info.native_type() |
| 3061 nested_templates.append(conversion_cast) | 3062 nested_templates.append(conversion_cast) |
| 3062 | 3063 |
| 3063 if return_type_info.conversion_include(): | 3064 if return_type_info.conversion_include(): |
| 3064 self._cpp_impl_includes[return_type_info.conversion_include()] = 1 | 3065 self._cpp_impl_includes[return_type_info.conversion_include()] = 1 |
| 3065 if (return_type_info.idl_type() in ['DOMString', 'AtomicString'] and | 3066 if (return_type_info.idl_type() in ['DOMString', 'AtomicString'] and |
| 3066 'ConvertNullStringTo' in idl_node.ext_attrs): | 3067 'TreatReturnedNullStringAs' in idl_node.ext_attrs): |
| 3067 nested_templates.append('$BODY, ConvertDefaultToNull') | 3068 nested_templates.append('$BODY, ConvertDefaultToNull') |
| 3068 nested_templates.append( | 3069 nested_templates.append( |
| 3069 ' Dart_Handle returnValue = toDartValue($BODY);\n' | 3070 ' Dart_Handle returnValue = toDartValue($BODY);\n' |
| 3070 ' if (returnValue)\n' | 3071 ' if (returnValue)\n' |
| 3071 ' Dart_SetReturnValue(args, returnValue);\n') | 3072 ' Dart_SetReturnValue(args, returnValue);\n') |
| 3072 else: | 3073 else: |
| 3073 nested_templates.append(' $BODY;\n') | 3074 nested_templates.append(' $BODY;\n') |
| 3074 | 3075 |
| 3075 if raises_dom_exceptions: | 3076 if raises_dom_exceptions: |
| 3076 nested_templates.append( | 3077 nested_templates.append( |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3165 namespace = 'HTMLNames' | 3166 namespace = 'HTMLNames' |
| 3166 svg_exceptions = ['class', 'id', 'onabort', 'onclick', 'onerror', 'onload', | 3167 svg_exceptions = ['class', 'id', 'onabort', 'onclick', 'onerror', 'onload', |
| 3167 'onmousedown', 'onmousemove', 'onmouseout', 'onmouseover', | 3168 'onmousedown', 'onmousemove', 'onmouseout', 'onmouseover', |
| 3168 'onmouseup', 'onresize', 'onscroll', 'onunload'] | 3169 'onmouseup', 'onresize', 'onscroll', 'onunload'] |
| 3169 if self._interface.id.startswith('SVG') and not attr.id in svg_exceptions: | 3170 if self._interface.id.startswith('SVG') and not attr.id in svg_exceptions: |
| 3170 namespace = 'SVGNames' | 3171 namespace = 'SVGNames' |
| 3171 self._cpp_impl_includes[namespace] = 1 | 3172 self._cpp_impl_includes[namespace] = 1 |
| 3172 | 3173 |
| 3173 attribute_name = attr.ext_attrs['Reflect'] or attr.id.lower() | 3174 attribute_name = attr.ext_attrs['Reflect'] or attr.id.lower() |
| 3174 return 'WebCore::%s::%sAttr' % (namespace, attribute_name) | 3175 return 'WebCore::%s::%sAttr' % (namespace, attribute_name) |
| OLD | NEW |