| Index: Source/bindings/templates/methods.cpp | 
| diff --git a/Source/bindings/templates/methods.cpp b/Source/bindings/templates/methods.cpp | 
| index e33041bb0a4df4aa0bb441c9ceda7aa41767648e..85bb19408844248a99a4a1b59a5838013e6c0ebd 100644 | 
| --- a/Source/bindings/templates/methods.cpp | 
| +++ b/Source/bindings/templates/methods.cpp | 
| @@ -61,19 +61,23 @@ static void {{method.name}}{{method.overload_index}}Method{{world_suffix}}(const | 
| {######################################} | 
| {% macro generate_arguments(method, world_suffix) %} | 
| {% for argument in method.arguments %} | 
| -{{generate_argument_var_declaration(argument)}}; | 
| -{% endfor %} | 
| +{{generate_argument_var_declaration(argument)}} | 
| +{%- endfor %} | 
| { | 
| {% if method.arguments_need_try_catch %} | 
| v8::TryCatch block; | 
| V8RethrowTryCatchScope rethrow(block); | 
| {% endif %} | 
| {% for argument in method.arguments %} | 
| -    {% if argument.default_value %} | 
| +    {% if argument.is_optional %} | 
| if (!info[{{argument.index}}]->IsUndefined()) { | 
| {{generate_argument(method, argument, world_suffix) | indent(8)}} | 
| } else { | 
| +        {% if argument.default_value %} | 
| {{argument.name}} = {{argument.default_value}}; | 
| +        {% else %} | 
| +        {{argument.name}}Missing = true; | 
| +        {% endif %} | 
| } | 
| {% else %} | 
| {{generate_argument(method, argument, world_suffix) | indent}} | 
| @@ -88,39 +92,24 @@ static void {{method.name}}{{method.overload_index}}Method{{world_suffix}}(const | 
| {% if argument.is_callback_interface %} | 
| {# FIXME: remove EventListener special case #} | 
| {% if argument.idl_type == 'EventListener' %} | 
| -RefPtr<{{argument.idl_type}}> {{argument.name}} | 
| -{%- else %} | 
| -OwnPtr<{{argument.idl_type}}> {{argument.name}} | 
| -{%- endif %}{# argument.idl_type == 'EventListener' #} | 
| +RefPtr<{{argument.idl_type}}> {{argument.name}}; | 
| +{% else %} | 
| +OwnPtr<{{argument.idl_type}}> {{argument.name}}; | 
| +{% endif %}{# argument.idl_type == 'EventListener' #} | 
| {%- elif argument.is_clamp %}{# argument.is_callback_interface #} | 
| {# NaN is treated as 0: http://www.w3.org/TR/WebIDL/#es-type-mapping #} | 
| -{{argument.cpp_type}} {{argument.name}} = 0 | 
| -{%- else %} | 
| -{{argument.cpp_type}} {{argument.name}} | 
| -{%- endif %} | 
| -{% endmacro %} | 
| +{{argument.cpp_type}} {{argument.name}} = 0; | 
| +{% else %} | 
| +{{argument.cpp_type}} {{argument.name}}{% if argument.is_explicit_optional %}{{argument.cpp_type_initializer}}{% endif %}; | 
| +{% endif %} | 
| +{% if argument.is_explicit_optional %} | 
| +bool {{argument.name}}Missing = false; | 
| +{% endif %} | 
| +{%- endmacro %} | 
|  | 
|  | 
| {######################################} | 
| {% macro generate_argument(method, argument, world_suffix) %} | 
| -{% if argument.is_optional and not argument.has_default and | 
| -      argument.idl_type != 'Dictionary' and | 
| -      not argument.is_callback_interface %} | 
| -{# Optional arguments without a default value generate an early call with | 
| -   fewer arguments if they are omitted. | 
| -   Optional Dictionary arguments default to empty dictionary. #} | 
| -if (UNLIKELY(info.Length() <= {{argument.index}})) { | 
| -    {% if world_suffix %} | 
| -    {{cpp_method_call(method, argument.v8_set_return_value_for_main_world, argument.cpp_value) | indent}} | 
| -    {% else %} | 
| -    {{cpp_method_call(method, argument.v8_set_return_value, argument.cpp_value) | indent}} | 
| -    {% endif %} | 
| -    {% if argument.has_event_listener_argument %} | 
| -    {{hidden_dependency_action(method.name) | indent}} | 
| -    {% endif %} | 
| -    return; | 
| -} | 
| -{% endif %} | 
| {% if argument.has_type_checking_interface and not argument.is_variadic_wrapper_type %} | 
| {# Type checking for wrapper interface types (if interface not implemented, | 
| throw a TypeError), per http://www.w3.org/TR/WebIDL/#es-interface | 
|  |