def generate_attribute(interface, attribute): idl_type = attribute.idl_type extended_attributes = attribute.extended_attributes has_custom_getter = ('Custom' in extended_attributes and extended_attributes['Custom'] in [None, 'Getter']) has_custom_setter = (not attribute.is_read_only and 'Custom' in extended_attributes and extended_attributes['Custom'] in [None, 'Setter']) contents = { 'access_control_list': access_control_list(attribute), 'activity_logging_world_list_for_getter': v8_utilities.activity_logging_world_list(attribute, 'Getter'), # [ActivityLogging] 'activity_logging_world_list_for_setter': v8_utilities.activity_logging_world_list(attribute, 'Setter'), # [ActivityLogging] 'cached_attribute_validation_method': extended_attributes.get('CachedAttribute'), 'conditional_string': v8_utilities.conditional_string(attribute), 'cpp_type': v8_types.cpp_type(idl_type), 'getter_callback_name': getter_callback_name(interface, attribute), 'getter_callback_name_for_main_world': getter_callback_name_for_main_world(interface, attribute), 'has_custom_getter': has_custom_getter, 'has_custom_setter': has_custom_setter, 'idl_type': idl_type, 'is_call_with_execution_context': v8_utilities.has_extended_attribute_value(attribute, 'CallWith', 'ExecutionContext'), 'is_constructor': is_constructor_attribute(attribute), 'is_getter_raises_exception': has_extended_attribute(attribute, ('GetterRaisesException', 'RaisesException')), 'is_keep_alive_for_gc': is_keep_alive_for_gc(attribute), 'is_nullable': attribute.is_nullable, 'is_read_only': attribute.is_read_only, 'is_replaceable': 'Replaceable' in attribute.extended_attributes, 'is_setter_raises_exception': has_extended_attribute(attribute, ('RaisesException', 'SetterRaisesException')), 'is_static': attribute.is_static, 'name': attribute.name, 'per_context_enabled_function_name': v8_utilities.per_context_enabled_function_name(attribute), # [PerContextEnabled] 'property_attributes': property_attributes(attribute), 'setter_callback_name': setter_callback_name(interface, attribute), 'setter_callback_name_for_main_world': setter_callback_name_for_main_world(interface, attribute), 'v8_type': v8_types.v8_type(idl_type), 'runtime_enabled_function_name': v8_utilities.runtime_enabled_function_name(attribute), # [RuntimeEnabled] 'world_suffixes': ['', 'ForMainWorld'] if 'PerWorldBindings' in extended_attributes else [''], # [PerWorldBindings] 'wrapper_type_info': wrapper_type_info(attribute), } if is_constructor_attribute(attribute): includes.update(v8_types.includes_for_type(idl_type)) return contents if not has_custom_getter: generate_getter(interface, attribute, contents) if not attribute.is_read_only and not has_custom_setter: generate_setter(interface, attribute, contents) return contents
def generate_attribute_and_includes(attribute): idl_type = attribute.data_type # FIXME: need to check should_keep_attribute_alive, but for now sufficient # to check if primitive. should_keep_attribute_alive = not v8_types.primitive_type(idl_type) if should_keep_attribute_alive: return_v8_value_statement = None # unused includes = v8_types.includes_for_type(idl_type) includes.add('bindings/v8/V8HiddenPropertyName.h') else: cpp_value = 'imp->%s()' % uncapitalize(attribute.name) return_v8_value_statement = v8_types.v8_set_return_value(idl_type, cpp_value, callback_info='info') includes = [] contents = { 'name': attribute.name, 'conditional_string': generate_conditional_string(attribute), 'cpp_method_name': cpp_method_name(attribute), 'cpp_type': v8_types.cpp_type(idl_type, pointer_type='RefPtr'), 'should_keep_attribute_alive': should_keep_attribute_alive, 'return_v8_value_statement': return_v8_value_statement, 'v8_type': v8_types.v8_type(idl_type), } return contents, includes
def generate_interface(interface): includes.clear() includes.update(INTERFACE_CPP_INCLUDES) header_includes = INTERFACE_H_INCLUDES parent_interface = interface.parent if parent_interface: header_includes.update(v8_types.includes_for_type(parent_interface)) extended_attributes = interface.extended_attributes # [CheckSecurity] is_check_security = 'CheckSecurity' in extended_attributes if is_check_security: includes.update(['bindings/v8/BindingSecurity.h', 'bindings/v8/ExceptionState.h']) # [GenerateVisitDOMWrapper] generate_visit_dom_wrapper_function = extended_attributes.get('GenerateVisitDOMWrapper') if generate_visit_dom_wrapper_function: includes.update(['bindings/v8/V8GCController.h', 'core/dom/Element.h']) # [MeasureAs] is_measure_as = 'MeasureAs' in extended_attributes if is_measure_as: includes.add('core/frame/UseCounter.h') # [RaisesException=Constructor] is_constructor_raises_exception = extended_attributes.get('RaisesException') == 'Constructor' if is_constructor_raises_exception: includes.add('bindings/v8/ExceptionState.h') # [SpecialWrapFor] if 'SpecialWrapFor' in extended_attributes: special_wrap_for = extended_attributes['SpecialWrapFor'].split('|') else: special_wrap_for = [] for special_wrap_interface in special_wrap_for: v8_types.add_includes_for_type(special_wrap_interface) # Constructors # [Constructor] has_constructor = 'Constructor' in extended_attributes if has_constructor: includes.add('bindings/v8/V8ObjectConstructor.h') # [EventConstructor] has_event_constructor = 'EventConstructor' in extended_attributes has_any_type_attributes = any(attribute for attribute in interface.attributes if attribute.idl_type == 'any') if has_event_constructor: includes.update(['bindings/v8/Dictionary.h', 'bindings/v8/V8ObjectConstructor.h']) if has_any_type_attributes: includes.add('bindings/v8/SerializedScriptValue.h') template_contents = { 'conditional_string': conditional_string(interface), # [Conditional] 'constructor_arguments': constructor_arguments(interface), 'cpp_class': cpp_name(interface), 'generate_visit_dom_wrapper_function': generate_visit_dom_wrapper_function, 'has_constructor': has_constructor, 'has_custom_legacy_call_as_function': has_extended_attribute_value(interface, 'Custom', 'LegacyCallAsFunction'), # [Custom=LegacyCallAsFunction] 'has_custom_to_v8': has_extended_attribute_value(interface, 'Custom', 'ToV8'), # [Custom=ToV8] 'has_custom_wrap': has_extended_attribute_value(interface, 'Custom', 'Wrap'), # [Custom=Wrap] 'has_event_constructor': has_event_constructor, 'has_any_type_attributes': has_any_type_attributes, 'has_visit_dom_wrapper': ( # [Custom=Wrap], [GenerateVisitDOMWrapper] has_extended_attribute_value(interface, 'Custom', 'VisitDOMWrapper') or 'GenerateVisitDOMWrapper' in extended_attributes), 'header_includes': header_includes, 'interface_name': interface.name, 'is_active_dom_object': 'ActiveDOMObject' in extended_attributes, # [ActiveDOMObject] 'is_check_security': is_check_security, 'is_constructor_call_with_document': has_extended_attribute_value( interface, 'ConstructorCallWith', 'Document'), # [ConstructorCallWith=Document] 'is_constructor_call_with_execution_context': has_extended_attribute_value( interface, 'ConstructorCallWith', 'ExecutionContext'), # [ConstructorCallWith=ExeuctionContext] 'is_constructor_raises_exception': is_constructor_raises_exception, 'is_dependent_lifetime': 'DependentLifetime' in extended_attributes, # [DependentLifetime] 'length': 1 if has_event_constructor else 0, # FIXME: more complex in general, see discussion of length in http://heycam.github.io/webidl/#es-interface-call 'measure_as': v8_utilities.measure_as(interface), # [MeasureAs] 'parent_interface': parent_interface, 'runtime_enabled_function': runtime_enabled_function_name(interface), # [RuntimeEnabled] 'special_wrap_for': special_wrap_for, 'v8_class': v8_utilities.v8_class_name(interface), } template_contents.update({ 'constants': [generate_constant(constant) for constant in interface.constants], 'do_not_check_constants': 'DoNotCheckConstants' in extended_attributes, }) attributes = [v8_attributes.generate_attribute(interface, attribute) for attribute in interface.attributes] template_contents.update({ 'attributes': attributes, 'has_accessors': any(attribute['is_expose_js_accessors'] for attribute in attributes), 'has_constructor_attributes': any(attribute['constructor_type'] for attribute in attributes), 'has_per_context_enabled_attributes': any(attribute['per_context_enabled_function'] for attribute in attributes), 'has_replaceable_attributes': any(attribute['is_replaceable'] for attribute in attributes), }) methods = [v8_methods.generate_method(interface, method) for method in interface.operations] generate_overloads(methods) for method in methods: method['do_generate_method_configuration'] = ( method['do_not_check_signature'] and not method['per_context_enabled_function'] and # For overloaded methods, only generate one accessor ('overload_index' not in method or method['overload_index'] == 1)) template_contents.update({ 'has_origin_safe_method_setter': any( method['is_check_security_for_frame'] and not method['is_read_only'] for method in methods), 'has_method_configuration': any(method['do_generate_method_configuration'] for method in methods), 'has_per_context_enabled_methods': any(method['per_context_enabled_function'] for method in methods), 'methods': methods, }) return template_contents
def generate_attribute(interface, attribute): idl_type = attribute.idl_type extended_attributes = attribute.extended_attributes has_custom_getter = has_extended_attribute(attribute, ('Custom', 'CustomGetter')) has_custom_setter = not attribute.is_read_only and has_extended_attribute( attribute, ('Custom', 'CustomSetter')) contents = { 'access_control_list': access_control_list(attribute), 'activity_logging_world_list_for_getter': v8_utilities.activity_logging_world_list( attribute, 'Getter'), # [ActivityLogging] 'activity_logging_world_list_for_setter': v8_utilities.activity_logging_world_list( attribute, 'Setter'), # [ActivityLogging] 'cached_attribute_validation_method': extended_attributes.get('CachedAttribute'), 'conditional_string': v8_utilities.generate_conditional_string(attribute), 'cpp_type': v8_types.cpp_type(idl_type), 'getter_callback_name': getter_callback_name(interface, attribute), 'getter_callback_name_for_main_world': getter_callback_name_for_main_world(interface, attribute), 'has_custom_getter': has_custom_getter, 'has_custom_setter': has_custom_setter, 'idl_type': idl_type, 'is_constructor': is_constructor_attribute(attribute), 'is_getter_raises_exception': has_extended_attribute(attribute, ('GetterRaisesException', 'RaisesException')), 'is_keep_alive_for_gc': is_keep_alive_for_gc(attribute), 'is_nullable': attribute.is_nullable, 'is_read_only': attribute.is_read_only, 'is_replaceable': 'Replaceable' in attribute.extended_attributes, 'is_setter_raises_exception': has_extended_attribute(attribute, ('RaisesException', 'SetterRaisesException')), 'is_static': attribute.is_static, 'name': attribute.name, 'per_context_enabled_function_name': v8_utilities.per_context_enabled_function_name( attribute), # [PerContextEnabled] 'property_attributes': property_attributes(attribute), 'setter_callback_name': setter_callback_name(interface, attribute), 'setter_callback_name_for_main_world': setter_callback_name_for_main_world(interface, attribute), 'v8_type': v8_types.v8_type(idl_type), 'runtime_enabled_function_name': v8_utilities.runtime_enabled_function_name( attribute), # [RuntimeEnabled] 'world_suffixes': ['', 'ForMainWorld'] if 'PerWorldBindings' in extended_attributes else [''], # [PerWorldBindings] 'wrapper_type_info': wrapper_type_info(attribute), } if is_constructor_attribute(attribute): includes.update(v8_types.includes_for_type(idl_type)) return contents if not has_custom_getter: generate_getter(interface, attribute, contents) if not attribute.is_read_only and not has_custom_setter: generate_setter(interface, attribute, contents) return contents
def generate_interface(interface): includes.clear() includes.update(INTERFACE_CPP_INCLUDES) header_includes = INTERFACE_H_INCLUDES parent_interface = interface.parent if parent_interface: header_includes.update(v8_types.includes_for_type(parent_interface)) extended_attributes = interface.extended_attributes # [CheckSecurity] is_check_security = 'CheckSecurity' in extended_attributes if is_check_security: includes.add('bindings/v8/BindingSecurity.h') # [GenerateVisitDOMWrapper] generate_visit_dom_wrapper_function = extended_attributes.get( 'GenerateVisitDOMWrapper') if generate_visit_dom_wrapper_function: includes.update(['bindings/v8/V8GCController.h', 'core/dom/Element.h']) # [MeasureAs] is_measure_as = 'MeasureAs' in extended_attributes if is_measure_as: includes.add('core/frame/UseCounter.h') # [SpecialWrapFor] if 'SpecialWrapFor' in extended_attributes: special_wrap_for = extended_attributes['SpecialWrapFor'].split('|') else: special_wrap_for = [] for special_wrap_interface in special_wrap_for: v8_types.add_includes_for_type(special_wrap_interface) # Constructors constructors = [ generate_constructor(interface, constructor) for constructor in interface.constructors # FIXME: shouldn't put named constructors with constructors # (currently needed for Perl compatibility) # Handle named constructors separately if constructor.name == 'Constructor' ] generate_constructor_overloads(constructors) # [CustomConstructor] has_custom_constructor = 'CustomConstructor' in extended_attributes # [EventConstructor] has_event_constructor = 'EventConstructor' in extended_attributes any_type_attributes = [ attribute for attribute in interface.attributes if attribute.idl_type == 'any' ] if has_event_constructor: includes.add('bindings/v8/Dictionary.h') if any_type_attributes: includes.add('bindings/v8/SerializedScriptValue.h') # [NamedConstructor] if 'NamedConstructor' in extended_attributes: # FIXME: parser should return named constructor separately; # included in constructors (and only name stored in extended attribute) # for Perl compatibility named_constructor = {'name': extended_attributes['NamedConstructor']} else: named_constructor = None if (constructors or has_custom_constructor or has_event_constructor or named_constructor): includes.add('bindings/v8/V8ObjectConstructor.h') template_contents = { 'any_type_attributes': any_type_attributes, 'conditional_string': conditional_string(interface), # [Conditional] 'constructors': constructors, 'cpp_class': cpp_name(interface), 'generate_visit_dom_wrapper_function': generate_visit_dom_wrapper_function, 'has_custom_constructor': has_custom_constructor, 'has_custom_legacy_call_as_function': has_extended_attribute_value( interface, 'Custom', 'LegacyCallAsFunction'), # [Custom=LegacyCallAsFunction] 'has_custom_to_v8': has_extended_attribute_value(interface, 'Custom', 'ToV8'), # [Custom=ToV8] 'has_custom_wrap': has_extended_attribute_value(interface, 'Custom', 'Wrap'), # [Custom=Wrap] 'has_event_constructor': has_event_constructor, 'has_visit_dom_wrapper': ( # [Custom=Wrap], [GenerateVisitDOMWrapper] has_extended_attribute_value(interface, 'Custom', 'VisitDOMWrapper') or 'GenerateVisitDOMWrapper' in extended_attributes), 'header_includes': header_includes, 'interface_length': interface_length(interface, constructors), 'interface_name': interface.name, 'is_active_dom_object': 'ActiveDOMObject' in extended_attributes, # [ActiveDOMObject] 'is_check_security': is_check_security, 'is_constructor_call_with_document': has_extended_attribute_value( interface, 'ConstructorCallWith', 'Document'), # [ConstructorCallWith=Document] 'is_constructor_call_with_execution_context': has_extended_attribute_value( interface, 'ConstructorCallWith', 'ExecutionContext'), # [ConstructorCallWith=ExeuctionContext] 'is_constructor_raises_exception': extended_attributes.get('RaisesException') == 'Constructor', # [RaisesException=Constructor] 'is_dependent_lifetime': 'DependentLifetime' in extended_attributes, # [DependentLifetime] 'is_event_target': inherits_interface(interface, 'EventTarget'), 'is_node': inherits_interface(interface, 'Node'), 'measure_as': v8_utilities.measure_as(interface), # [MeasureAs] 'named_constructor': named_constructor, 'parent_interface': parent_interface, 'runtime_enabled_function': runtime_enabled_function_name(interface), # [RuntimeEnabled] 'special_wrap_for': special_wrap_for, 'v8_class': v8_utilities.v8_class_name(interface), } template_contents.update({ 'constants': [generate_constant(constant) for constant in interface.constants], 'do_not_check_constants': 'DoNotCheckConstants' in extended_attributes, }) attributes = [ v8_attributes.generate_attribute(interface, attribute) for attribute in interface.attributes ] template_contents.update({ 'attributes': attributes, 'has_accessors': any(attribute['is_expose_js_accessors'] for attribute in attributes), 'has_constructor_attributes': any(attribute['constructor_type'] for attribute in attributes), 'has_per_context_enabled_attributes': any(attribute['per_context_enabled_function'] for attribute in attributes), 'has_replaceable_attributes': any(attribute['is_replaceable'] for attribute in attributes), }) methods = [ v8_methods.generate_method(interface, method) for method in interface.operations ] generate_overloads(methods) for method in methods: method['do_generate_method_configuration'] = ( method['do_not_check_signature'] and not method['per_context_enabled_function'] and # For overloaded methods, only generate one accessor ('overload_index' not in method or method['overload_index'] == 1)) template_contents.update({ 'has_origin_safe_method_setter': any(method['is_check_security_for_frame'] and not method['is_read_only'] for method in methods), 'has_method_configuration': any(method['do_generate_method_configuration'] for method in methods), 'has_per_context_enabled_methods': any(method['per_context_enabled_function'] for method in methods), 'methods': methods, }) return template_contents
def includes_for_operation(operation): includes = includes_for_type(operation.data_type) for argument in operation.arguments: includes.update(includes_for_type(argument.data_type)) return includes
def generate_interface(interface): includes.clear() includes.update(INTERFACE_CPP_INCLUDES) header_includes = INTERFACE_H_INCLUDES parent_interface = interface.parent if parent_interface: header_includes.update(v8_types.includes_for_type(parent_interface)) extended_attributes = interface.extended_attributes is_audio_buffer = inherits_interface(interface.name, 'AudioBuffer') if is_audio_buffer: includes.add('modules/webaudio/AudioBuffer.h') is_document = inherits_interface(interface.name, 'Document') if is_document: includes.update(['bindings/v8/ScriptController.h', 'bindings/v8/V8WindowShell.h', 'core/frame/Frame.h']) # [CheckSecurity] is_check_security = 'CheckSecurity' in extended_attributes if is_check_security: includes.add('bindings/v8/BindingSecurity.h') # [SetWrapperReferenceFrom] reachable_node_function = extended_attributes.get('SetWrapperReferenceFrom') if reachable_node_function: includes.update(['bindings/v8/V8GCController.h', 'core/dom/Element.h']) # [MeasureAs] is_measure_as = 'MeasureAs' in extended_attributes if is_measure_as: includes.add('core/frame/UseCounter.h') # [SetWrapperReferenceTo] set_wrapper_reference_to_list = [{ 'name': argument.name, 'idl_type': argument.idl_type, 'v8_type': v8_types.v8_type(argument.idl_type), } for argument in extended_attributes.get('SetWrapperReferenceTo', [])] for set_wrapper_reference_to in set_wrapper_reference_to_list: v8_types.add_includes_for_type(set_wrapper_reference_to['idl_type']) # [SpecialWrapFor] if 'SpecialWrapFor' in extended_attributes: special_wrap_for = extended_attributes['SpecialWrapFor'].split('|') else: special_wrap_for = [] for special_wrap_interface in special_wrap_for: v8_types.add_includes_for_type(special_wrap_interface) template_contents = { 'conditional_string': conditional_string(interface), # [Conditional] 'cpp_class': cpp_name(interface), 'has_custom_legacy_call_as_function': has_extended_attribute_value(interface, 'Custom', 'LegacyCallAsFunction'), # [Custom=LegacyCallAsFunction] 'has_custom_to_v8': has_extended_attribute_value(interface, 'Custom', 'ToV8'), # [Custom=ToV8] 'has_custom_wrap': has_extended_attribute_value(interface, 'Custom', 'Wrap'), # [Custom=Wrap] 'has_visit_dom_wrapper': ( # [Custom=Wrap], [SetWrapperReferenceFrom] has_extended_attribute_value(interface, 'Custom', 'VisitDOMWrapper') or reachable_node_function or set_wrapper_reference_to_list), 'header_includes': header_includes, 'interface_name': interface.name, 'is_active_dom_object': 'ActiveDOMObject' in extended_attributes, # [ActiveDOMObject] 'is_audio_buffer': is_audio_buffer, 'is_check_security': is_check_security, 'is_dependent_lifetime': 'DependentLifetime' in extended_attributes, # [DependentLifetime] 'is_document': is_document, 'is_event_target': inherits_interface(interface.name, 'EventTarget'), 'is_exception': interface.is_exception, 'is_node': inherits_interface(interface.name, 'Node'), 'measure_as': v8_utilities.measure_as(interface), # [MeasureAs] 'parent_interface': parent_interface, 'reachable_node_function': reachable_node_function, 'runtime_enabled_function': runtime_enabled_function_name(interface), # [RuntimeEnabled] 'set_wrapper_reference_to_list': set_wrapper_reference_to_list, 'special_wrap_for': special_wrap_for, 'v8_class': v8_utilities.v8_class_name(interface), } # Constructors constructors = [generate_constructor(interface, constructor) for constructor in interface.constructors # FIXME: shouldn't put named constructors with constructors # (currently needed for Perl compatibility) # Handle named constructors separately if constructor.name == 'Constructor'] generate_constructor_overloads(constructors) # [CustomConstructor] custom_constructors = [{ # Only needed for computing interface length 'number_of_required_arguments': number_of_required_arguments(constructor), } for constructor in interface.custom_constructors] # [EventConstructor] has_event_constructor = 'EventConstructor' in extended_attributes any_type_attributes = [attribute for attribute in interface.attributes if attribute.idl_type == 'any'] if has_event_constructor: includes.add('bindings/v8/Dictionary.h') if any_type_attributes: includes.add('bindings/v8/SerializedScriptValue.h') # [NamedConstructor] named_constructor = generate_named_constructor(interface) if (constructors or custom_constructors or has_event_constructor or named_constructor): includes.add('bindings/v8/V8ObjectConstructor.h') template_contents.update({ 'any_type_attributes': any_type_attributes, 'constructors': constructors, 'has_custom_constructor': bool(custom_constructors), 'has_event_constructor': has_event_constructor, 'interface_length': interface_length(interface, constructors + custom_constructors), 'is_constructor_call_with_document': has_extended_attribute_value( interface, 'ConstructorCallWith', 'Document'), # [ConstructorCallWith=Document] 'is_constructor_call_with_execution_context': has_extended_attribute_value( interface, 'ConstructorCallWith', 'ExecutionContext'), # [ConstructorCallWith=ExeuctionContext] 'is_constructor_raises_exception': extended_attributes.get('RaisesException') == 'Constructor', # [RaisesException=Constructor] 'named_constructor': named_constructor, }) # Constants template_contents.update({ 'constants': [generate_constant(constant) for constant in interface.constants], 'do_not_check_constants': 'DoNotCheckConstants' in extended_attributes, }) # Attributes attributes = [v8_attributes.generate_attribute(interface, attribute) for attribute in interface.attributes] template_contents.update({ 'attributes': attributes, 'has_accessors': any(attribute['is_expose_js_accessors'] for attribute in attributes), 'has_constructor_attributes': any(attribute['constructor_type'] for attribute in attributes), 'has_per_context_enabled_attributes': any(attribute['per_context_enabled_function'] for attribute in attributes), 'has_replaceable_attributes': any(attribute['is_replaceable'] for attribute in attributes), }) # Methods methods = [v8_methods.generate_method(interface, method) for method in interface.operations] generate_overloads(methods) for method in methods: method['do_generate_method_configuration'] = ( method['do_not_check_signature'] and not method['per_context_enabled_function'] and # For overloaded methods, only generate one accessor ('overload_index' not in method or method['overload_index'] == 1)) template_contents.update({ 'has_origin_safe_method_setter': any( method['is_check_security_for_frame'] and not method['is_read_only'] for method in methods), 'has_method_configuration': any(method['do_generate_method_configuration'] for method in methods), 'has_per_context_enabled_methods': any(method['per_context_enabled_function'] for method in methods), 'methods': methods, }) return template_contents
def generate_interface(interface): includes.clear() includes.update(INTERFACE_CPP_INCLUDES) header_includes = INTERFACE_H_INCLUDES parent_interface = interface.parent if parent_interface: header_includes.update(v8_types.includes_for_type(parent_interface)) extended_attributes = interface.extended_attributes is_audio_buffer = inherits_interface(interface.name, 'AudioBuffer') if is_audio_buffer: includes.add('modules/webaudio/AudioBuffer.h') is_document = inherits_interface(interface.name, 'Document') if is_document: includes.update(['bindings/v8/ScriptController.h', 'bindings/v8/V8WindowShell.h', 'core/frame/Frame.h']) # [CheckSecurity] is_check_security = 'CheckSecurity' in extended_attributes if is_check_security: includes.add('bindings/v8/BindingSecurity.h') # [MeasureAs] is_measure_as = 'MeasureAs' in extended_attributes if is_measure_as: includes.add('core/frame/UseCounter.h') # [SetWrapperReferenceFrom] reachable_node_function = extended_attributes.get('SetWrapperReferenceFrom') if reachable_node_function: includes.update(['bindings/v8/V8GCController.h', 'core/dom/Element.h']) # [SetWrapperReferenceTo] set_wrapper_reference_to_list = [{ 'name': argument.name, 'idl_type': argument.idl_type, 'v8_type': v8_types.v8_type(argument.idl_type), } for argument in extended_attributes.get('SetWrapperReferenceTo', [])] for set_wrapper_reference_to in set_wrapper_reference_to_list: v8_types.add_includes_for_type(set_wrapper_reference_to['idl_type']) # [SpecialWrapFor] if 'SpecialWrapFor' in extended_attributes: special_wrap_for = extended_attributes['SpecialWrapFor'].split('|') else: special_wrap_for = [] for special_wrap_interface in special_wrap_for: v8_types.add_includes_for_type(special_wrap_interface) # [WillBeGarbageCollected] is_will_be_garbage_collected = 'WillBeGarbageCollected' in extended_attributes template_contents = { 'conditional_string': conditional_string(interface), # [Conditional] 'cpp_class': cpp_name(interface), 'has_custom_legacy_call_as_function': has_extended_attribute_value(interface, 'Custom', 'LegacyCallAsFunction'), # [Custom=LegacyCallAsFunction] 'has_custom_to_v8': has_extended_attribute_value(interface, 'Custom', 'ToV8'), # [Custom=ToV8] 'has_custom_wrap': has_extended_attribute_value(interface, 'Custom', 'Wrap'), # [Custom=Wrap] 'has_visit_dom_wrapper': ( # [Custom=Wrap], [SetWrapperReferenceFrom] has_extended_attribute_value(interface, 'Custom', 'VisitDOMWrapper') or reachable_node_function or set_wrapper_reference_to_list), 'header_includes': header_includes, 'interface_name': interface.name, 'is_active_dom_object': 'ActiveDOMObject' in extended_attributes, # [ActiveDOMObject] 'is_audio_buffer': is_audio_buffer, 'is_check_security': is_check_security, 'is_dependent_lifetime': 'DependentLifetime' in extended_attributes, # [DependentLifetime] 'is_document': is_document, 'is_event_target': inherits_interface(interface.name, 'EventTarget'), 'is_exception': interface.is_exception, 'is_will_be_garbage_collected': is_will_be_garbage_collected, 'is_node': inherits_interface(interface.name, 'Node'), 'measure_as': v8_utilities.measure_as(interface), # [MeasureAs] 'parent_interface': parent_interface, 'pass_ref_ptr': 'PassRefPtrWillBeRawPtr' if is_will_be_garbage_collected else 'PassRefPtr', 'reachable_node_function': reachable_node_function, 'ref_ptr': 'RefPtrWillBeRawPtr' if is_will_be_garbage_collected else 'RefPtr', 'runtime_enabled_function': runtime_enabled_function_name(interface), # [RuntimeEnabled] 'set_wrapper_reference_to_list': set_wrapper_reference_to_list, 'special_wrap_for': special_wrap_for, 'v8_class': v8_utilities.v8_class_name(interface), } # Constructors constructors = [generate_constructor(interface, constructor) for constructor in interface.constructors # FIXME: shouldn't put named constructors with constructors # (currently needed for Perl compatibility) # Handle named constructors separately if constructor.name == 'Constructor'] generate_constructor_overloads(constructors) # [CustomConstructor] custom_constructors = [{ # Only needed for computing interface length 'number_of_required_arguments': number_of_required_arguments(constructor), } for constructor in interface.custom_constructors] # [EventConstructor] has_event_constructor = 'EventConstructor' in extended_attributes any_type_attributes = [attribute for attribute in interface.attributes if attribute.idl_type == 'any'] if has_event_constructor: includes.add('bindings/v8/Dictionary.h') if any_type_attributes: includes.add('bindings/v8/SerializedScriptValue.h') # [NamedConstructor] named_constructor = generate_named_constructor(interface) if (constructors or custom_constructors or has_event_constructor or named_constructor): includes.add('bindings/v8/V8ObjectConstructor.h') template_contents.update({ 'any_type_attributes': any_type_attributes, 'constructors': constructors, 'has_custom_constructor': bool(custom_constructors), 'has_event_constructor': has_event_constructor, 'interface_length': interface_length(interface, constructors + custom_constructors), 'is_constructor_call_with_document': has_extended_attribute_value( interface, 'ConstructorCallWith', 'Document'), # [ConstructorCallWith=Document] 'is_constructor_call_with_execution_context': has_extended_attribute_value( interface, 'ConstructorCallWith', 'ExecutionContext'), # [ConstructorCallWith=ExeuctionContext] 'is_constructor_raises_exception': extended_attributes.get('RaisesException') == 'Constructor', # [RaisesException=Constructor] 'named_constructor': named_constructor, }) # Constants template_contents.update({ 'constants': [generate_constant(constant) for constant in interface.constants], 'do_not_check_constants': 'DoNotCheckConstants' in extended_attributes, }) # Attributes attributes = [v8_attributes.generate_attribute(interface, attribute) for attribute in interface.attributes] template_contents.update({ 'attributes': attributes, 'has_accessors': any(attribute['is_expose_js_accessors'] for attribute in attributes), 'has_attribute_configuration': any( not (attribute['is_expose_js_accessors'] or attribute['is_static'] or attribute['runtime_enabled_function'] or attribute['per_context_enabled_function']) for attribute in attributes), 'has_constructor_attributes': any(attribute['constructor_type'] for attribute in attributes), 'has_per_context_enabled_attributes': any(attribute['per_context_enabled_function'] for attribute in attributes), 'has_replaceable_attributes': any(attribute['is_replaceable'] for attribute in attributes), }) # Methods methods = [v8_methods.generate_method(interface, method) for method in interface.operations if method.name] # Skip anonymous special operations (methods) generate_overloads(methods) for method in methods: method['do_generate_method_configuration'] = ( method['do_not_check_signature'] and not method['per_context_enabled_function'] and # For overloaded methods, only generate one accessor ('overload_index' not in method or method['overload_index'] == 1)) template_contents.update({ 'has_origin_safe_method_setter': any( method['is_check_security_for_frame'] and not method['is_read_only'] for method in methods), 'has_method_configuration': any(method['do_generate_method_configuration'] for method in methods), 'has_per_context_enabled_methods': any(method['per_context_enabled_function'] for method in methods), 'methods': methods, }) template_contents.update({ 'indexed_property_getter': indexed_property_getter(interface), 'indexed_property_setter': indexed_property_setter(interface), 'indexed_property_deleter': indexed_property_deleter(interface), 'is_override_builtins': 'OverrideBuiltins' in extended_attributes, 'named_property_getter': named_property_getter(interface), 'named_property_setter': named_property_setter(interface), 'named_property_deleter': named_property_deleter(interface), }) return template_contents