Index: client/dom/scripts/dartgenerator.py |
diff --git a/client/dom/scripts/dartgenerator.py b/client/dom/scripts/dartgenerator.py |
index e267c905996abb0c91c02932c43c029da3c663ef..b4e80c2ff400b18e34870ba21fa227924474de2d 100755 |
--- a/client/dom/scripts/dartgenerator.py |
+++ b/client/dom/scripts/dartgenerator.py |
@@ -2704,22 +2704,76 @@ class NativeImplementationGenerator(WrappingInterfaceGenerator): |
self._cpp_definitions_emitter = emitter.Emitter() |
self._cpp_resolver_emitter = emitter.Emitter() |
- # Generate constructor. |
- # FIXME: add proper support for non-custom constructors. |
- if ('CustomConstructor' in self._interface.ext_attrs or |
- 'V8CustomConstructor' in self._interface.ext_attrs or |
- self._interface.id in ['FileReader', 'WebKitCSSMatrix', 'XSLTProcessor']): |
- self._cpp_resolver_emitter.Emit( |
- ' if (name == "$(INTERFACE_NAME)_constructor_Callback")\n' |
- ' return Dart$(INTERFACE_NAME)Internal::constructorCallback;\n', |
- INTERFACE_NAME=self._interface.id) |
+ self._GenerateConstructors() |
+ |
+ def _GenerateConstructors(self): |
+ # WebKit IDLs may define constructors with arguments. Currently this form is not supported |
+ # (see b/1721). There is custom implementation for some of them, the rest are just ignored |
+ # for now. |
+ SUPPORTED_CONSTRUCTORS_WITH_ARGS = [ 'WebKitCSSMatrix' ] |
+ UNSUPPORTED_CONSTRUCTORS_WITH_ARGS = [ |
+ 'EventSource', |
+ 'MediaStream', |
+ 'PeerConnection', |
+ 'ShadowRoot', |
+ 'SharedWorker', |
+ 'TextTrackCue', |
+ 'Worker' ] |
+ if not self._IsConstructable() or self._interface.id in UNSUPPORTED_CONSTRUCTORS_WITH_ARGS: |
+ return |
+ |
+ # TODO(antonm): currently we don't have information about number of arguments expected by |
+ # the constructor, so name only dispatch. |
+ self._cpp_resolver_emitter.Emit( |
+ ' if (name == "$(INTERFACE_NAME)_constructor_Callback")\n' |
+ ' return Dart$(INTERFACE_NAME)Internal::constructorCallback;\n', |
+ INTERFACE_NAME=self._interface.id) |
+ |
+ |
+ if self._interface.id in SUPPORTED_CONSTRUCTORS_WITH_ARGS or 'Constructor' not in self._interface.ext_attrs: |
+ # We have a custom implementation for it. |
self._cpp_declarations_emitter.Emit( |
'\n' |
'void constructorCallback(Dart_NativeArguments);\n') |
+ return |
+ |
+ raises_dom_exceptions = 'ConstructorRaisesException' in self._interface.ext_attrs |
+ raises_dart_exceptions = raises_dom_exceptions |
+ type_info = GetIDLTypeInfo(self._interface) |
+ arguments = [] |
+ parameter_definitions = '' |
+ if 'CallWith' in self._interface.ext_attrs: |
+ call_with = self._interface.ext_attrs['CallWith'] |
+ if call_with == 'ScriptExecutionContext': |
+ raises_dart_exceptions = True |
+ parameter_definitions = ( |
+ ' ScriptExecutionContext* context = DartUtilities::scriptExecutionContext();\n' |
+ ' if (!context) {\n' |
+ ' exception = Dart_NewString("Failed to create an object");\n' |
+ ' goto fail;\n' |
+ ' }\n') |
+ arguments = ['context'] |
+ else: |
+ raise Exception('Unsupported CallWith=%s attribute' % call_with) |
+ |
+ self._GenerateNativeCallback( |
+ callback_name='constructorCallback', |
+ idl_node=self._interface, |
+ parameter_definitions=parameter_definitions, |
+ needs_receiver=False, function_name='%s::create' % type_info.native_type(), |
+ arguments=arguments, |
+ idl_return_type=self._interface, |
+ raises_dart_exceptions=raises_dart_exceptions, |
+ raises_dom_exceptions=raises_dom_exceptions) |
+ |
def _ImplClassName(self, interface_name): |
return interface_name + 'Implementation' |
+ def _IsConstructable(self): |
+ # FIXME: support ConstructorTemplate. |
+ return set(['CustomConstructor', 'V8CustomConstructor', 'Constructor']) & set(self._interface.ext_attrs) |
+ |
def FinishInterface(self): |
base = self._BaseClassName(self._interface) |
self._dart_impl_emitter.Emit( |
@@ -2832,7 +2886,7 @@ class NativeImplementationGenerator(WrappingInterfaceGenerator): |
webcore_function_name += 'Animated' |
self._GenerateNativeCallback(cpp_callback_name, attr, '', |
- webcore_function_name, arguments, idl_return_type=attr.type, |
+ True, webcore_function_name, arguments, idl_return_type=attr.type, |
raises_dart_exceptions=attr.get_raises, |
raises_dom_exceptions=attr.get_raises) |
@@ -2861,7 +2915,7 @@ class NativeImplementationGenerator(WrappingInterfaceGenerator): |
self._GenerateParameterAdapter(parameter_definitions_emitter, attr, 0) |
parameter_definitions = parameter_definitions_emitter.Fragments() |
self._GenerateNativeCallback(cpp_callback_name, attr, parameter_definitions, |
- webcore_function_name, arguments, idl_return_type=None, |
+ True, webcore_function_name, arguments, idl_return_type=None, |
raises_dart_exceptions=True, |
raises_dom_exceptions=attr.set_raises) |
@@ -3026,19 +3080,19 @@ class NativeImplementationGenerator(WrappingInterfaceGenerator): |
arguments.extend('DartUtilities::processingUserGesture') |
parameter_definitions = parameter_definitions_emitter.Fragments() |
- self._GenerateNativeCallback(cpp_callback_name, operation, |
- parameter_definitions, webcore_function_name, arguments, |
- idl_return_type=operation.type, |
+ self._GenerateNativeCallback(cpp_callback_name, operation, parameter_definitions, |
+ True, webcore_function_name, arguments, idl_return_type=operation.type, |
raises_dart_exceptions=raises_dart_exceptions, |
raises_dom_exceptions=operation.raises) |
def _GenerateNativeCallback(self, callback_name, idl_node, |
- parameter_definitions, function_name, arguments, idl_return_type, |
+ parameter_definitions, needs_receiver, function_name, arguments, idl_return_type, |
raises_dart_exceptions, raises_dom_exceptions): |
- receiver = self._interface_type_info.receiver() |
if raises_dom_exceptions: |
arguments.append('ec') |
- callback = '%s%s(%s)' % (receiver, function_name, ', '.join(arguments)) |
+ prefix = '' |
+ if needs_receiver: prefix = self._interface_type_info.receiver() |
+ callback = '%s%s(%s)' % (prefix, function_name, ', '.join(arguments)) |
nested_templates = [] |
if idl_return_type and idl_return_type.id != 'void': |
@@ -3084,9 +3138,7 @@ class NativeImplementationGenerator(WrappingInterfaceGenerator): |
nested_templates.append( |
' {\n' |
- ' $WEBCORE_CLASS_NAME* receiver = DartDOMWrapper::receiver< $WEBCORE_CLASS_NAME >(args);\n' |
'$PARAMETER_DEFINITIONS' |
- '\n' |
'$BODY' |
' return;\n' |
' }\n') |
@@ -3113,11 +3165,15 @@ class NativeImplementationGenerator(WrappingInterfaceGenerator): |
'WEBCORE_CLASS_NAME': self._interface_type_info.native_type(), |
'PARAMETER_DEFINITIONS': parameter_definitions, |
} |
+ if needs_receiver: |
+ template_parameters['PARAMETER_DEFINITIONS'] = emitter.Format( |
+ ' $WEBCORE_CLASS_NAME* receiver = DartDOMWrapper::receiver< $WEBCORE_CLASS_NAME >(args);\n' |
+ ' $PARAMETER_DEFINITIONS\n', |
+ **template_parameters) |
+ |
for template in nested_templates: |
template_parameters['BODY'] = callback |
- callback_emitter = emitter.Emitter() |
- callback_emitter.Emit(template, **template_parameters) |
- callback = ''.join(callback_emitter.Fragments()) |
+ callback = emitter.Format(template, **template_parameters) |
self._cpp_definitions_emitter.Emit(callback) |