| Index: Source/bindings/scripts/unstable/v8_attributes.py
|
| diff --git a/Source/bindings/scripts/unstable/v8_attributes.py b/Source/bindings/scripts/unstable/v8_attributes.py
|
| index cd130e2fcb4591f3bb91c6e8cdd0326f2730056f..8b364789787d61418b1747ba71c7bbef4c18b0d5 100644
|
| --- a/Source/bindings/scripts/unstable/v8_attributes.py
|
| +++ b/Source/bindings/scripts/unstable/v8_attributes.py
|
| @@ -85,7 +85,8 @@ def generate_attribute_and_includes(interface, attribute):
|
| contents['is_custom_getter'] = True
|
| return contents, set()
|
|
|
| - cpp_value = getter_expression(interface, attribute, contents)
|
| + includes = set()
|
| + cpp_value = getter_expression(interface, attribute, contents, includes)
|
| # [GetterRaisesException], [RaisesException]
|
| is_getter_raises_exception = has_extended_attribute(attribute, ('GetterRaisesException', 'RaisesException'))
|
| # Normally we can inline the function call into the return statement to
|
| @@ -104,10 +105,11 @@ def generate_attribute_and_includes(interface, attribute):
|
|
|
| if this_is_keep_alive_for_gc:
|
| return_v8_value_statement = 'v8SetReturnValue(info, wrapper);'
|
| - includes = v8_types.includes_for_type(idl_type)
|
| + type_includes = v8_types.includes_for_type(idl_type)
|
| includes.add('bindings/v8/V8HiddenPropertyName.h')
|
| else:
|
| - return_v8_value_statement, includes = v8_types.v8_set_return_value(idl_type, cpp_value, callback_info='info', isolate='info.GetIsolate()', extended_attributes=extended_attributes, script_wrappable='imp')
|
| + return_v8_value_statement, type_includes = v8_types.v8_set_return_value(idl_type, cpp_value, callback_info='info', isolate='info.GetIsolate()', extended_attributes=extended_attributes, script_wrappable='imp')
|
| + includes.update(type_includes)
|
| contents['return_v8_value_statement'] = return_v8_value_statement
|
|
|
| if (idl_type == 'EventHandler' and
|
| @@ -136,23 +138,51 @@ def generate_attribute_and_includes(interface, attribute):
|
| return contents, includes
|
|
|
|
|
| -def getter_expression(interface, attribute, contents):
|
| - this_getter_name = getter_name(interface, attribute)
|
| - arguments = v8_utilities.call_with_arguments(attribute, contents)
|
| +def getter_expression(interface, attribute, contents, includes):
|
| + arguments = []
|
| + if 'Reflect' in attribute.extended_attributes:
|
| + getter_base_name = content_attribute_getter_base_name(attribute, includes, arguments)
|
| + else:
|
| + getter_base_name = uncapitalize(cpp_name(attribute))
|
| +
|
| + if attribute.is_static:
|
| + getter_name = '%s::%s' % (interface.name, getter_base_name)
|
| + else:
|
| + getter_name = 'imp->%s' % getter_base_name
|
| +
|
| + arguments.extend(v8_utilities.call_with_arguments(attribute, contents))
|
| if attribute.is_nullable:
|
| arguments.append('isNull')
|
| if has_extended_attribute(attribute, ('GetterRaisesException', 'RaisesException')):
|
| arguments.append('es')
|
| if attribute.data_type == 'EventHandler':
|
| arguments.append('isolatedWorldForIsolate(info.GetIsolate())')
|
| - return '%s(%s)' % (this_getter_name, ', '.join(arguments))
|
| + return '%s(%s)' % (getter_name, ', '.join(arguments))
|
|
|
|
|
| -def getter_name(interface, attribute):
|
| - getter_method_name = uncapitalize(cpp_name(attribute))
|
| - if attribute.is_static:
|
| - return '%s::%s' % (interface.name, getter_method_name)
|
| - return 'imp->%s' % getter_method_name
|
| +CONTENT_ATTRIBUTE_GETTER_NAMES = {
|
| + 'boolean': 'fastHasAttribute',
|
| + 'long': 'getIntegralAttribute',
|
| + 'unsigned long': 'getUnsignedIntegralAttribute',
|
| +}
|
| +
|
| +
|
| +def content_attribute_getter_base_name(attribute, includes, arguments):
|
| + content_attribute_name = attribute.extended_attributes['Reflect'] or attribute.name.lower()
|
| + namespace = 'HTMLNames' # FIXME: can be SVG too
|
| + includes.add('%s.h' % namespace)
|
| +
|
| + if content_attribute_name in ['class', 'id', 'name']:
|
| + # Special-case for performance optimization.
|
| + return 'get%sAttribute' % content_attribute_name.capitalize()
|
| +
|
| + scoped_name = '%s::%sAttr' % (namespace, content_attribute_name)
|
| + arguments.append(scoped_name)
|
| +
|
| + idl_type = attribute.data_type
|
| + if idl_type in CONTENT_ATTRIBUTE_GETTER_NAMES:
|
| + return CONTENT_ATTRIBUTE_GETTER_NAMES[idl_type]
|
| + return 'fastGetAttribute'
|
|
|
|
|
| def is_keep_alive_for_gc(attribute):
|
|
|