| Index: third_party/WebKit/Source/bindings/scripts/v8_types.py | 
| diff --git a/third_party/WebKit/Source/bindings/scripts/v8_types.py b/third_party/WebKit/Source/bindings/scripts/v8_types.py | 
| index 1b50fee8e9186d4baacf5ef73debb492495f08b8..2c0b58d8e1802e6d678e7f39b1784ce247ade0e8 100644 | 
| --- a/third_party/WebKit/Source/bindings/scripts/v8_types.py | 
| +++ b/third_party/WebKit/Source/bindings/scripts/v8_types.py | 
| @@ -145,15 +145,6 @@ def cpp_type(idl_type, extended_attributes=None, raw_type=False, used_as_rvalue_ | 
| bool, True if the C++ type is used as an element of a container. | 
| Containers can be an array, a sequence or a dictionary. | 
| """ | 
| -    def string_mode(): | 
| -        if idl_type.is_nullable: | 
| -            return 'TreatNullAndUndefinedAsNullString' | 
| -        if extended_attributes.get('TreatNullAs') == 'EmptyString': | 
| -            return 'TreatNullAsEmptyString' | 
| -        if extended_attributes.get('TreatNullAs') == 'NullString': | 
| -            return 'TreatNullAsNullString' | 
| -        return '' | 
| - | 
| extended_attributes = extended_attributes or {} | 
| idl_type = idl_type.preprocessed_type | 
|  | 
| @@ -186,7 +177,7 @@ def cpp_type(idl_type, extended_attributes=None, raw_type=False, used_as_rvalue_ | 
| if idl_type.is_string_type: | 
| if not raw_type: | 
| return 'String' | 
| -        return 'V8StringResource<%s>' % string_mode() | 
| +        return 'V8StringResource<>' | 
|  | 
| if base_idl_type == 'ArrayBufferView' and 'FlexibleArrayBufferView' in extended_attributes: | 
| return 'FlexibleArrayBufferView' | 
| @@ -374,7 +365,7 @@ def includes_for_type(idl_type, extended_attributes=None): | 
| set(['bindings/%s/v8/V8%s.h' % (component_dir[base_idl_type], base_idl_type)]) | 
| ) | 
| if idl_type.is_basic_type: | 
| -        return set() | 
| +        return set(['bindings/core/v8/IDLTypes.h']) | 
| if base_idl_type.endswith('ConstructorConstructor'): | 
| # FIXME: rename to NamedConstructor | 
| # FIXME: replace with a [NamedConstructorAttribute] extended attribute | 
| @@ -393,7 +384,8 @@ def includes_for_type(idl_type, extended_attributes=None): | 
| if base_idl_type not in component_dir: | 
| return set() | 
| return set(['bindings/%s/v8/V8%s.h' % (component_dir[base_idl_type], | 
| -                                           base_idl_type)]) | 
| +                                           base_idl_type), | 
| +                'bindings/core/v8/IDLTypes.h']) | 
|  | 
| IdlType.includes_for_type = includes_for_type | 
|  | 
| @@ -484,32 +476,9 @@ def set_component_dirs(new_component_dirs): | 
| ################################################################################ | 
|  | 
| V8_VALUE_TO_CPP_VALUE = { | 
| -    # Basic | 
| -    'Date': 'toCoreDate({isolate}, {v8_value}, exceptionState)', | 
| -    'DOMString': '{v8_value}', | 
| -    'ByteString': 'toByteString({isolate}, {arguments})', | 
| -    'USVString': 'toUSVString({isolate}, {arguments})', | 
| -    'boolean': 'toBoolean({isolate}, {arguments})', | 
| -    'float': 'toRestrictedFloat({isolate}, {arguments})', | 
| -    'unrestricted float': 'toFloat({isolate}, {arguments})', | 
| -    'double': 'toRestrictedDouble({isolate}, {arguments})', | 
| -    'unrestricted double': 'toDouble({isolate}, {arguments})', | 
| -    'byte': 'toInt8({isolate}, {arguments})', | 
| -    'octet': 'toUInt8({isolate}, {arguments})', | 
| -    'short': 'toInt16({isolate}, {arguments})', | 
| -    'unsigned short': 'toUInt16({isolate}, {arguments})', | 
| -    'long': 'toInt32({isolate}, {arguments})', | 
| -    'unsigned long': 'toUInt32({isolate}, {arguments})', | 
| -    'long long': 'toInt64({isolate}, {arguments})', | 
| -    'unsigned long long': 'toUInt64({isolate}, {arguments})', | 
| # Interface types | 
| -    'Dictionary': 'Dictionary({isolate}, {v8_value}, exceptionState)', | 
| 'FlexibleArrayBufferView': 'toFlexibleArrayBufferView({isolate}, {v8_value}, {variable_name}, allocateFlexibleArrayBufferViewStorage({v8_value}))', | 
| 'NodeFilter': 'toNodeFilter({v8_value}, info.Holder(), ScriptState::current({isolate}))', | 
| -    'Promise': 'ScriptPromise::cast(ScriptState::current({isolate}), {v8_value})', | 
| -    'SerializedScriptValue': 'SerializedScriptValue::serialize({isolate}, {v8_value}, nullptr, nullptr, exceptionState)', | 
| -    'ScriptValue': 'ScriptValue(ScriptState::current({isolate}), {v8_value})', | 
| -    'Window': 'toDOMWindow({isolate}, {v8_value})', | 
| 'XPathNSResolver': 'toXPathNSResolver(ScriptState::current({isolate}), {v8_value})', | 
| } | 
|  | 
| @@ -518,6 +487,7 @@ def v8_conversion_needs_exception_state(idl_type): | 
| return (idl_type.is_numeric_type or | 
| idl_type.is_enum or | 
| idl_type.is_dictionary or | 
| +            idl_type.is_string_type or | 
| idl_type.name in ('Boolean', 'ByteString', 'Date', 'Dictionary', 'USVString', 'SerializedScriptValue')) | 
|  | 
| IdlType.v8_conversion_needs_exception_state = property(v8_conversion_needs_exception_state) | 
| @@ -545,18 +515,38 @@ def v8_conversion_is_trivial(idl_type): | 
| IdlType.v8_conversion_is_trivial = property(v8_conversion_is_trivial) | 
|  | 
|  | 
| +def idl_type_name(idl_type): | 
| +    idl_type = idl_type.preprocessed_type | 
| +    if idl_type.native_array_element_type: | 
| +        return 'idl::Sequence<%s>' % idl_type_name(idl_type.native_array_element_type) | 
| +    elif idl_type.is_union_type: | 
| +        return idl_type.as_union_type.name | 
| +    elif idl_type.is_basic_type: | 
| +        return 'idl::%s' % idl_type.name | 
| +    elif idl_type.implemented_as is not None: | 
| +        return idl_type.implemented_as | 
| +    return idl_type.name | 
| + | 
| + | 
| def v8_value_to_cpp_value(idl_type, extended_attributes, v8_value, variable_name, index, isolate): | 
| if idl_type.name == 'void': | 
| return '' | 
|  | 
| -    # Array or sequence types | 
| -    native_array_element_type = idl_type.native_array_element_type | 
| -    if native_array_element_type: | 
| -        return v8_value_to_cpp_value_array_or_sequence(native_array_element_type, v8_value, index, isolate) | 
| +    def string_mode(idl_type): | 
| +        if idl_type.is_nullable: | 
| +            return 'TreatNullAndUndefinedAsNullString' | 
| +        if extended_attributes.get('TreatNullAs') == 'EmptyString': | 
| +            return 'TreatNullAsEmptyString' | 
| +        if extended_attributes.get('TreatNullAs') == 'NullString': | 
| +            return 'TreatNullAsNullString' | 
| +        return 'DefaultMode' | 
|  | 
| # Simple types | 
| idl_type = idl_type.preprocessed_type | 
| -    base_idl_type = idl_type.as_union_type.name if idl_type.is_union_type else idl_type.base_type | 
| +    if idl_type.is_union_type: | 
| +        base_idl_type = idl_type.as_union_type.name | 
| +    else: | 
| +        base_idl_type = idl_type.base_type | 
|  | 
| if 'FlexibleArrayBufferView' in extended_attributes: | 
| if base_idl_type not in TYPED_ARRAY_TYPES.union(set(['ArrayBufferView'])): | 
| @@ -569,53 +559,36 @@ def v8_value_to_cpp_value(idl_type, extended_attributes, v8_value, variable_name | 
| configuration = 'EnforceRange' | 
| elif 'Clamp' in extended_attributes: | 
| configuration = 'Clamp' | 
| -        arguments = ', '.join([v8_value, configuration, 'exceptionState']) | 
| -    elif idl_type.v8_conversion_needs_exception_state: | 
| -        arguments = ', '.join([v8_value, 'exceptionState']) | 
| +        arguments = ', '.join([v8_value, 'exceptionState', configuration]) | 
| +    elif idl_type.native_array_element_type: | 
| +        # Index is None for setters, index (starting at 0) for method arguments, | 
| +        # and is used to provide a human-readable exception message | 
| +        if index is None: | 
| +            index = 0  # special case, meaning "setter" | 
| +        else: | 
| +            index += 1  # human-readable index | 
| +        arguments = ', '.join([v8_value, 'exceptionState', str(index)]) | 
| else: | 
| -        arguments = v8_value | 
| +        arguments = ', '.join([v8_value, 'exceptionState']) | 
| + | 
| if base_idl_type in V8_VALUE_TO_CPP_VALUE: | 
| cpp_expression_format = V8_VALUE_TO_CPP_VALUE[base_idl_type] | 
| -    elif idl_type.is_array_buffer_or_view: | 
| -        cpp_expression_format = ( | 
| -            '{v8_value}->Is{idl_type}() ? ' | 
| -            'V8{idl_type}::toImpl(v8::Local<v8::{idl_type}>::Cast({v8_value})) : 0') | 
| -    elif idl_type.is_union_type: | 
| -        nullable = 'UnionTypeConversionMode::Nullable' if idl_type.includes_nullable_type else 'UnionTypeConversionMode::NotNullable' | 
| -        cpp_expression_format = 'V8{idl_type}::toImpl({isolate}, {v8_value}, {variable_name}, %s, exceptionState)' % nullable | 
| -    elif idl_type.use_output_parameter_for_result: | 
| -        cpp_expression_format = 'V8{idl_type}::toImpl({isolate}, {v8_value}, {variable_name}, exceptionState)' | 
| -    elif idl_type.is_callback_function: | 
| -        cpp_expression_format = ( | 
| -            '{idl_type}::create(ScriptState::current({isolate}), {v8_value})') | 
| else: | 
| -        cpp_expression_format = ( | 
| -            'V8{idl_type}::toImplWithTypeCheck({isolate}, {v8_value})') | 
| - | 
| -    return cpp_expression_format.format(arguments=arguments, idl_type=base_idl_type, v8_value=v8_value, variable_name=variable_name, isolate=isolate) | 
| +        str_mode = string_mode(idl_type) | 
|  | 
| +        if idl_type.is_nullable: | 
| +            idl_type = idl_type.inner_type | 
| +        base_idl_type = idl_type_name(idl_type) | 
|  | 
| -def v8_value_to_cpp_value_array_or_sequence(native_array_element_type, v8_value, index, isolate='info.GetIsolate()'): | 
| -    # Index is None for setters, index (starting at 0) for method arguments, | 
| -    # and is used to provide a human-readable exception message | 
| -    if index is None: | 
| -        index = 0  # special case, meaning "setter" | 
| -    else: | 
| -        index += 1  # human-readable index | 
| -    if (native_array_element_type.is_interface_type and | 
| -        native_array_element_type.name != 'Dictionary'): | 
| -        this_cpp_type = None | 
| -        expression_format = 'toMemberNativeArray<{native_array_element_type}>({v8_value}, {index}, {isolate}, exceptionState)' | 
| -    else: | 
| -        this_cpp_type = native_array_element_type.cpp_type | 
| -        if native_array_element_type.is_dictionary or native_array_element_type.is_union_type: | 
| -            vector_type = 'HeapVector' | 
| +        if base_idl_type == 'idl::String': | 
| +            nvt_args = '<%s>' % str_mode | 
| else: | 
| -            vector_type = 'Vector' | 
| -        expression_format = 'toImplArray<%s<{cpp_type}>>({v8_value}, {index}, {isolate}, exceptionState)' % vector_type | 
| -    expression = expression_format.format(native_array_element_type=native_array_element_type.name, cpp_type=this_cpp_type, | 
| -                                          index=index, v8_value=v8_value, isolate=isolate) | 
| -    return expression | 
| +            nvt_args = '' | 
| + | 
| +        cpp_expression_format = ( | 
| +            'NativeValueTraits<{idl_type}>::nativeValue%s({isolate}, {arguments})' % nvt_args) | 
| + | 
| +    return cpp_expression_format.format(arguments=arguments, idl_type=base_idl_type, v8_value=v8_value, variable_name=variable_name, isolate=isolate) | 
|  | 
|  | 
| # FIXME: this function should be refactored, as this takes too many flags. | 
| @@ -638,24 +611,10 @@ def v8_value_to_local_cpp_value(idl_type, extended_attributes, v8_value, variabl | 
| # meaningful if 'check_expression' is not None. | 
| return_expression = bailout_return_value | 
|  | 
| -    if idl_type.is_string_type or idl_type.v8_conversion_needs_exception_state: | 
| +    if idl_type.v8_conversion_needs_exception_state: | 
| # Types for which conversion can fail and that need error handling. | 
| - | 
| check_expression = 'exceptionState.hadException()' | 
| - | 
| -        if idl_type.is_dictionary or idl_type.is_union_type: | 
| -            set_expression = cpp_value | 
| -        else: | 
| -            assign_expression = cpp_value | 
| -            # Note: 'not idl_type.v8_conversion_needs_exception_state' implies | 
| -            # 'idl_type.is_string_type', but there are types for which both are | 
| -            # true (ByteString and USVString), so using idl_type.is_string_type | 
| -            # as the condition here would be wrong. | 
| -            if not idl_type.v8_conversion_needs_exception_state: | 
| -                if use_exception_state: | 
| -                    check_expression = '!%s.prepare(exceptionState)' % variable_name | 
| -                else: | 
| -                    check_expression = '!%s.prepare()' % variable_name | 
| +        assign_expression = cpp_value | 
| elif not idl_type.v8_conversion_is_trivial and not idl_type.is_callback_function: | 
| return { | 
| 'error_message': 'no V8 -> C++ conversion for IDL type: %s' % idl_type.name | 
|  |