| Index: bindings/dart/scripts/dart_interface.py | 
| diff --git a/bindings/dart/scripts/dart_interface.py b/bindings/dart/scripts/dart_interface.py | 
| index 540c3acebc704585631e82432a44c221b015924a..efd70f03d70298073787fc07fa9d1d6952ac196b 100644 | 
| --- a/bindings/dart/scripts/dart_interface.py | 
| +++ b/bindings/dart/scripts/dart_interface.py | 
| @@ -395,6 +395,20 @@ def _suppress_extended_attributes(extended_attributes): | 
| return False | 
|  | 
|  | 
| +def add_native_entries(interface, constructors, is_custom): | 
| +    for constructor in constructors: | 
| +        types = None | 
| +        if not is_custom: | 
| +            types = [arg['preprocessed_type'] | 
| +                     for arg in constructor['arguments']] | 
| +        argument_names = [arg['name'] for arg in constructor['arguments']] | 
| +        native_entry = \ | 
| +            DartUtilities.generate_native_entry(interface.name, constructor, | 
| +                                                None, 'Constructor', None, | 
| +                                                argument_names, types) | 
| +        constructor.update({'native_entry': native_entry}) | 
| + | 
| + | 
| def generate_interface(interface): | 
| includes.clear() | 
| includes.update(INTERFACE_CPP_INCLUDES) | 
| @@ -540,6 +554,11 @@ def generate_interface(interface): | 
| # [NamedConstructor] | 
| named_constructor = generate_named_constructor(interface) | 
|  | 
| +    add_native_entries(interface, constructors, bool(custom_constructors)) | 
| +    add_native_entries(interface, custom_constructors, bool(custom_constructors)) | 
| +    if named_constructor: | 
| +        add_native_entries(interface, [named_constructor], bool(custom_constructors)) | 
| + | 
| if (constructors or custom_constructors or has_event_constructor or | 
| named_constructor): | 
| includes.add('core/frame/LocalDOMWindow.h') | 
| @@ -609,6 +628,8 @@ def generate_interface(interface): | 
| # For overloaded methods, only generate one accessor | 
| ('overload_index' not in method or method['overload_index'] == 1)) | 
|  | 
| +    generate_method_native_entries(interface, methods) | 
| + | 
| template_contents.update({ | 
| 'has_origin_safe_method_setter': any( | 
| method['is_check_security_for_frame'] and not method['is_read_only'] | 
| @@ -618,6 +639,10 @@ def generate_interface(interface): | 
| 'methods': methods, | 
| }) | 
|  | 
| +    native_entries = generate_native_entries(interface, constructors, | 
| +                                             custom_constructors, attributes, | 
| +                                             methods, named_constructor) | 
| + | 
| template_contents.update({ | 
| 'indexed_property_getter': indexed_property_getter(interface), | 
| 'indexed_property_setter': indexed_property_setter(interface), | 
| @@ -626,11 +651,29 @@ def generate_interface(interface): | 
| 'named_property_getter': named_property_getter(interface), | 
| 'named_property_setter': named_property_setter(interface), | 
| 'named_property_deleter': named_property_deleter(interface), | 
| +        'native_entries': native_entries, | 
| }) | 
|  | 
| return template_contents | 
|  | 
|  | 
| +def generate_native_entries(interface, constructors, custom_constructors, | 
| +                            attributes, methods, named_constructor): | 
| +    entries = [] | 
| +    for constructor in constructors: | 
| +        entries.append(constructor['native_entry']) | 
| +    for constructor in custom_constructors: | 
| +        entries.append(constructor['native_entry']) | 
| +    if named_constructor: | 
| +        entries.append(named_constructor['native_entry']) | 
| +    for method in methods: | 
| +        entries.extend(method['native_entries']) | 
| +    for attribute in attributes: | 
| +        entries.append(attribute['native_entry_getter']) | 
| +        entries.append(attribute['native_entry_setter']) | 
| +    return entries | 
| + | 
| + | 
| # [DeprecateAs], [Reflect], [RuntimeEnabled] | 
| def generate_constant(constant): | 
| # (Blink-only) string literals are unquoted in tokenizer, must be re-quoted | 
| @@ -655,6 +698,46 @@ def generate_constant(constant): | 
| # Overloads | 
| ################################################################################ | 
|  | 
| +def generate_method_native_entry(interface, method, count, optional_index): | 
| +    types = None | 
| +    if not method['is_custom']: | 
| +        types = [arg['preprocessed_type'] for arg in method['arguments'][0:count]] | 
| +    if method['is_call_with_script_arguments']: | 
| +        types.append("object") | 
| +    argument_names = [arg['name'] for arg in method['arguments'][0:count]] | 
| +    name = method['name'] | 
| +    native_entry = \ | 
| +        DartUtilities.generate_native_entry(interface.name, method, | 
| +                                            name, 'Method', | 
| +                                            optional_index, | 
| +                                            argument_names, types) | 
| +    return native_entry | 
| + | 
| + | 
| +def generate_method_native_entries(interface, methods): | 
| +    for method in methods: | 
| +        native_entries = [] | 
| +        required_arg_count = method['number_of_required_arguments'] | 
| +        arg_count = method['number_of_arguments'] | 
| +        if required_arg_count != arg_count: | 
| +            for x in range(required_arg_count, arg_count + 1): | 
| +                # This is really silly, but is here for now just to match up | 
| +                # the existing name generation in the old dart:html scripts | 
| +                index = arg_count - x + 1 | 
| +                native_entry = \ | 
| +                    generate_method_native_entry(interface, method, x, index) | 
| +                native_entries.append(native_entry) | 
| +        else: | 
| +            # Eventually, we should probably always generate an unindexed | 
| +            # native entry, to handle cases like | 
| +            # addEventListener in which we suppress the optionality, | 
| +            # and in general to make us more robust against optional changes | 
| +            native_entry = \ | 
| +                generate_method_native_entry(interface, method, arg_count, None) | 
| +            native_entries.append(native_entry) | 
| + | 
| +        method.update({'native_entries': native_entries}) | 
| + | 
| def generate_overloads(methods): | 
| generate_overloads_by_type(methods, is_static=False)  # Regular methods | 
| generate_overloads_by_type(methods, is_static=True) | 
| @@ -830,7 +913,8 @@ def generate_custom_constructor(interface, constructor): | 
| def custom_constructor_argument(argument, index): | 
| return { | 
| 'idl_type_object': argument.idl_type, | 
| -        'preprocessed_type': argument.idl_type.preprocessed_type, | 
| +        'name': argument.name, | 
| +        'preprocessed_type': str(argument.idl_type.preprocessed_type), | 
| } | 
|  | 
|  | 
| @@ -899,7 +983,7 @@ def constructor_argument(interface, argument, index): | 
| # FIXME: remove once [Default] removed and just use argument.default_value | 
| 'has_default': 'Default' in argument.extended_attributes or default_value, | 
| 'idl_type_object': idl_type, | 
| -        'preprocessed_type': idl_type.preprocessed_type, | 
| +        'preprocessed_type': str(idl_type.preprocessed_type), | 
| # Dictionary is special-cased, but arrays and sequences shouldn't be | 
| 'idl_type': not idl_type.array_or_sequence_type and idl_type.base_type, | 
| 'index': index, | 
|  |