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 method_context(interface, method, is_visible=True): arguments = method.arguments extended_attributes = method.extended_attributes idl_type = method.idl_type is_static = method.is_static name = method.name if is_visible: idl_type.add_includes_for_type(extended_attributes) this_cpp_value = cpp_value(interface, method, len(arguments)) is_implemented_in_private_script = 'ImplementedInPrivateScript' in extended_attributes if is_implemented_in_private_script: includes.add('bindings/core/v8/PrivateScriptRunner.h') includes.add('core/frame/LocalFrame.h') includes.add('platform/ScriptForbiddenScope.h') # [OnlyExposedToPrivateScript] is_only_exposed_to_private_script = 'OnlyExposedToPrivateScript' in extended_attributes is_call_with_script_arguments = has_extended_attribute_value(method, 'CallWith', 'ScriptArguments') if is_call_with_script_arguments: includes.update(['bindings/core/v8/ScriptCallStackFactory.h', 'core/inspector/ScriptArguments.h']) is_call_with_script_state = has_extended_attribute_value(method, 'CallWith', 'ScriptState') is_call_with_this_value = has_extended_attribute_value(method, 'CallWith', 'ThisValue') if is_call_with_script_state or is_call_with_this_value: includes.add('bindings/core/v8/ScriptState.h') is_check_security_for_node = 'CheckSecurity' in extended_attributes if is_check_security_for_node: includes.add('bindings/core/v8/BindingSecurity.h') is_custom_element_callbacks = 'CustomElementCallbacks' in extended_attributes if is_custom_element_callbacks: includes.add('core/dom/custom/CustomElementProcessingStack.h') is_do_not_check_security = 'DoNotCheckSecurity' in extended_attributes is_check_security_for_frame = ( has_extended_attribute_value(interface, 'CheckSecurity', 'Frame') and not is_do_not_check_security) is_check_security_for_window = ( has_extended_attribute_value(interface, 'CheckSecurity', 'Window') and not is_do_not_check_security) is_raises_exception = 'RaisesException' in extended_attributes is_custom_call_prologue = has_extended_attribute_value(method, 'Custom', 'CallPrologue') is_custom_call_epilogue = has_extended_attribute_value(method, 'Custom', 'CallEpilogue') is_post_message = 'PostMessage' in extended_attributes if is_post_message: includes.add('bindings/core/v8/SerializedScriptValueFactory.h') includes.add('core/dom/DOMArrayBuffer.h') includes.add('core/dom/MessagePort.h') if 'LenientThis' in extended_attributes: raise Exception('[LenientThis] is not supported for operations.') return { 'activity_logging_world_list': v8_utilities.activity_logging_world_list(method), # [ActivityLogging] 'arguments': [argument_context(interface, method, argument, index, is_visible=is_visible) for index, argument in enumerate(arguments)], 'argument_declarations_for_private_script': argument_declarations_for_private_script(interface, method), 'conditional_string': v8_utilities.conditional_string(method), 'cpp_type': (v8_types.cpp_template_type('Nullable', idl_type.cpp_type) if idl_type.is_explicit_nullable else idl_type.cpp_type), 'cpp_value': this_cpp_value, 'cpp_type_initializer': idl_type.cpp_type_initializer, 'custom_registration_extended_attributes': CUSTOM_REGISTRATION_EXTENDED_ATTRIBUTES.intersection( extended_attributes.iterkeys()), 'deprecate_as': v8_utilities.deprecate_as(method), # [DeprecateAs] 'exposed_test': v8_utilities.exposed(method, interface), # [Exposed] # TODO(yukishiino): Retire has_custom_registration flag. Should be # replaced with V8DOMConfiguration::PropertyLocationConfiguration. 'has_custom_registration': is_static or is_unforgeable(interface, method) or v8_utilities.has_extended_attribute( method, CUSTOM_REGISTRATION_EXTENDED_ATTRIBUTES), 'has_exception_state': is_raises_exception or is_check_security_for_frame or is_check_security_for_window or any(argument for argument in arguments if (argument.idl_type.name == 'SerializedScriptValue' or argument_conversion_needs_exception_state(method, argument))), 'idl_type': idl_type.base_type, 'is_call_with_execution_context': has_extended_attribute_value(method, 'CallWith', 'ExecutionContext'), 'is_call_with_script_arguments': is_call_with_script_arguments, 'is_call_with_script_state': is_call_with_script_state, 'is_call_with_this_value': is_call_with_this_value, 'is_check_security_for_frame': is_check_security_for_frame, 'is_check_security_for_node': is_check_security_for_node, 'is_check_security_for_window': is_check_security_for_window, 'is_custom': 'Custom' in extended_attributes and not (is_custom_call_prologue or is_custom_call_epilogue), 'is_custom_call_prologue': is_custom_call_prologue, 'is_custom_call_epilogue': is_custom_call_epilogue, 'is_custom_element_callbacks': is_custom_element_callbacks, 'is_do_not_check_security': is_do_not_check_security, 'is_do_not_check_signature': 'DoNotCheckSignature' in extended_attributes, 'is_explicit_nullable': idl_type.is_explicit_nullable, 'is_implemented_in_private_script': is_implemented_in_private_script, 'is_partial_interface_member': 'PartialInterfaceImplementedAs' in extended_attributes, 'is_per_world_bindings': 'PerWorldBindings' in extended_attributes, 'is_post_message': is_post_message, 'is_raises_exception': is_raises_exception, 'is_read_only': is_unforgeable(interface, method), 'is_static': is_static, 'is_variadic': arguments and arguments[-1].is_variadic, 'measure_as': v8_utilities.measure_as(method, interface), # [MeasureAs] 'name': name, 'number_of_arguments': len(arguments), 'number_of_required_arguments': len([ argument for argument in arguments if not (argument.is_optional or argument.is_variadic)]), 'number_of_required_or_variadic_arguments': len([ argument for argument in arguments if not argument.is_optional]), 'on_instance': v8_utilities.on_instance(interface, method), 'on_interface': v8_utilities.on_interface(interface, method), 'on_prototype': v8_utilities.on_prototype(interface, method), 'only_exposed_to_private_script': is_only_exposed_to_private_script, 'private_script_v8_value_to_local_cpp_value': idl_type.v8_value_to_local_cpp_value( extended_attributes, 'v8Value', 'cppValue', isolate='scriptState->isolate()', bailout_return_value='false'), 'property_attributes': property_attributes(interface, method), 'returns_promise': method.returns_promise, 'runtime_enabled_function': v8_utilities.runtime_enabled_function_name(method), # [RuntimeEnabled] 'should_be_exposed_to_script': not (is_implemented_in_private_script and is_only_exposed_to_private_script), 'use_output_parameter_for_result': idl_type.use_output_parameter_for_result, 'use_local_result': use_local_result(method), 'v8_set_return_value': v8_set_return_value(interface.name, method, this_cpp_value), 'v8_set_return_value_for_main_world': v8_set_return_value(interface.name, method, this_cpp_value, for_main_world=True), 'visible': is_visible, 'world_suffixes': ['', 'ForMainWorld'] if 'PerWorldBindings' in extended_attributes else [''], # [PerWorldBindings], }
def generate_method(interface, method): arguments = method.arguments extended_attributes = method.extended_attributes idl_type = method.idl_type is_static = method.is_static name = method.name this_cpp_value = cpp_value(interface, method, len(arguments)) this_custom_signature = custom_signature(method, arguments) def function_template(): if is_static: return 'functionTemplate' if 'Unforgeable' in extended_attributes: return 'instanceTemplate' return 'prototypeTemplate' def signature(): if this_custom_signature: return name + 'Signature' if is_static or 'DoNotCheckSignature' in extended_attributes: return 'v8::Local<v8::Signature>()' return 'defaultSignature' is_call_with_script_arguments = has_extended_attribute_value( method, 'CallWith', 'ScriptArguments') if is_call_with_script_arguments: includes.update([ 'bindings/v8/ScriptCallStackFactory.h', 'core/inspector/ScriptArguments.h' ]) is_call_with_script_state = has_extended_attribute_value( method, 'CallWith', 'ScriptState') if is_call_with_script_state: includes.add('bindings/v8/ScriptState.h') is_check_security_for_node = 'CheckSecurity' in extended_attributes if is_check_security_for_node: includes.add('bindings/v8/BindingSecurity.h') is_custom_element_callbacks = 'CustomElementCallbacks' in extended_attributes if is_custom_element_callbacks: includes.add('core/dom/custom/CustomElementCallbackDispatcher.h') contents = { 'activity_logging_world_list': v8_utilities.activity_logging_world_list(method), # [ActivityLogging] 'arguments': [ generate_argument(interface, method, argument, index) for index, argument in enumerate(arguments) ], 'conditional_string': v8_utilities.conditional_string(method), 'cpp_type': v8_types.cpp_type(idl_type), 'cpp_value': this_cpp_value, 'custom_signature': this_custom_signature, 'deprecate_as': v8_utilities.deprecate_as(method), # [DeprecateAs] 'do_not_check_signature': not (this_custom_signature or is_static or v8_utilities.has_extended_attribute(method, [ 'DoNotCheckSecurity', 'DoNotCheckSignature', 'NotEnumerable', 'ReadOnly', 'RuntimeEnabled', 'Unforgeable' ])), 'function_template': function_template(), 'idl_type': idl_type, 'is_call_with_execution_context': has_extended_attribute_value(method, 'CallWith', 'ExecutionContext'), 'is_call_with_script_arguments': is_call_with_script_arguments, 'is_call_with_script_state': is_call_with_script_state, 'is_check_security_for_frame': ('CheckSecurity' in interface.extended_attributes and 'DoNotCheckSecurity' not in extended_attributes), 'is_check_security_for_node': is_check_security_for_node, 'is_custom': 'Custom' in extended_attributes, 'is_custom_element_callbacks': is_custom_element_callbacks, 'is_do_not_check_security': 'DoNotCheckSecurity' in extended_attributes, 'is_per_world_bindings': 'PerWorldBindings' in extended_attributes, 'is_raises_exception': 'RaisesException' in extended_attributes, 'is_read_only': 'ReadOnly' in extended_attributes, 'is_static': is_static, 'is_strict_type_checking': 'StrictTypeChecking' in extended_attributes, 'is_variadic': arguments and arguments[-1].is_variadic, 'measure_as': v8_utilities.measure_as(method), # [MeasureAs] 'name': name, 'number_of_arguments': len(arguments), 'number_of_required_arguments': len([ argument for argument in arguments if not (argument.is_optional or argument.is_variadic) ]), 'number_of_required_or_variadic_arguments': len([argument for argument in arguments if not argument.is_optional]), 'per_context_enabled_function': v8_utilities.per_context_enabled_function_name( method), # [PerContextEnabled] 'property_attributes': property_attributes(method), 'runtime_enabled_function': v8_utilities.runtime_enabled_function_name(method), # [RuntimeEnabled] 'signature': signature(), 'v8_set_return_value': v8_set_return_value(method, this_cpp_value), 'world_suffixes': ['', 'ForMainWorld'] if 'PerWorldBindings' in extended_attributes else [''], # [PerWorldBindings] } return contents
def method_context(interface, method): arguments = method.arguments extended_attributes = method.extended_attributes idl_type = method.idl_type is_static = method.is_static name = method.name idl_type.add_includes_for_type() this_cpp_value = cpp_value(interface, method, len(arguments)) def function_template(): if is_static: return "functionTemplate" if "Unforgeable" in extended_attributes: return "instanceTemplate" return "prototypeTemplate" is_implemented_in_private_script = "ImplementedInPrivateScript" in extended_attributes if is_implemented_in_private_script: includes.add("bindings/core/v8/PrivateScriptRunner.h") includes.add("core/frame/LocalFrame.h") includes.add("platform/ScriptForbiddenScope.h") # [OnlyExposedToPrivateScript] is_only_exposed_to_private_script = "OnlyExposedToPrivateScript" in extended_attributes is_call_with_script_arguments = has_extended_attribute_value(method, "CallWith", "ScriptArguments") if is_call_with_script_arguments: includes.update(["bindings/core/v8/ScriptCallStackFactory.h", "core/inspector/ScriptArguments.h"]) is_call_with_script_state = has_extended_attribute_value(method, "CallWith", "ScriptState") if is_call_with_script_state: includes.add("bindings/core/v8/ScriptState.h") is_check_security_for_node = "CheckSecurity" in extended_attributes if is_check_security_for_node: includes.add("bindings/core/v8/BindingSecurity.h") is_custom_element_callbacks = "CustomElementCallbacks" in extended_attributes if is_custom_element_callbacks: includes.add("core/dom/custom/CustomElementProcessingStack.h") is_do_not_check_security = "DoNotCheckSecurity" in extended_attributes is_check_security_for_frame = ( has_extended_attribute_value(interface, "CheckSecurity", "Frame") and not is_do_not_check_security ) is_check_security_for_window = ( has_extended_attribute_value(interface, "CheckSecurity", "Window") and not is_do_not_check_security ) is_raises_exception = "RaisesException" in extended_attributes return { "activity_logging_world_list": v8_utilities.activity_logging_world_list(method), # [ActivityLogging] "arguments": [argument_context(interface, method, argument, index) for index, argument in enumerate(arguments)], "argument_declarations_for_private_script": argument_declarations_for_private_script(interface, method), "conditional_string": v8_utilities.conditional_string(method), "cpp_type": ( v8_types.cpp_template_type("Nullable", idl_type.cpp_type) if idl_type.is_explicit_nullable else idl_type.cpp_type ), "cpp_value": this_cpp_value, "cpp_type_initializer": idl_type.cpp_type_initializer, "custom_registration_extended_attributes": CUSTOM_REGISTRATION_EXTENDED_ATTRIBUTES.intersection( extended_attributes.iterkeys() ), "deprecate_as": v8_utilities.deprecate_as(method), # [DeprecateAs] "exposed_test": v8_utilities.exposed(method, interface), # [Exposed] "function_template": function_template(), "has_custom_registration": is_static or v8_utilities.has_extended_attribute(method, CUSTOM_REGISTRATION_EXTENDED_ATTRIBUTES), "has_exception_state": is_raises_exception or is_check_security_for_frame or is_check_security_for_window or any( argument for argument in arguments if ( argument.idl_type.name == "SerializedScriptValue" or argument_conversion_needs_exception_state(method, argument) ) ), "idl_type": idl_type.base_type, "is_call_with_execution_context": has_extended_attribute_value(method, "CallWith", "ExecutionContext"), "is_call_with_script_arguments": is_call_with_script_arguments, "is_call_with_script_state": is_call_with_script_state, "is_check_security_for_frame": is_check_security_for_frame, "is_check_security_for_node": is_check_security_for_node, "is_check_security_for_window": is_check_security_for_window, "is_custom": "Custom" in extended_attributes, "is_custom_element_callbacks": is_custom_element_callbacks, "is_do_not_check_security": is_do_not_check_security, "is_do_not_check_signature": "DoNotCheckSignature" in extended_attributes, "is_explicit_nullable": idl_type.is_explicit_nullable, "is_implemented_in_private_script": is_implemented_in_private_script, "is_partial_interface_member": "PartialInterfaceImplementedAs" in extended_attributes, "is_per_world_bindings": "PerWorldBindings" in extended_attributes, "is_raises_exception": is_raises_exception, "is_read_only": "Unforgeable" in extended_attributes, "is_static": is_static, "is_variadic": arguments and arguments[-1].is_variadic, "measure_as": v8_utilities.measure_as(method), # [MeasureAs] "name": name, "number_of_arguments": len(arguments), "number_of_required_arguments": len( [argument for argument in arguments if not (argument.is_optional or argument.is_variadic)] ), "number_of_required_or_variadic_arguments": len( [argument for argument in arguments if not argument.is_optional] ), "only_exposed_to_private_script": is_only_exposed_to_private_script, "per_context_enabled_function": v8_utilities.per_context_enabled_function_name(method), # [PerContextEnabled] "private_script_v8_value_to_local_cpp_value": idl_type.v8_value_to_local_cpp_value( extended_attributes, "v8Value", "cppValue", isolate="scriptState->isolate()", used_in_private_script=True ), "property_attributes": property_attributes(method), "runtime_enabled_function": v8_utilities.runtime_enabled_function_name(method), # [RuntimeEnabled] "should_be_exposed_to_script": not (is_implemented_in_private_script and is_only_exposed_to_private_script), "signature": "v8::Local<v8::Signature>()" if is_static or "DoNotCheckSignature" in extended_attributes else "defaultSignature", "union_arguments": idl_type.union_arguments, "use_local_result": use_local_result(method), "v8_set_return_value": v8_set_return_value(interface.name, method, this_cpp_value), "v8_set_return_value_for_main_world": v8_set_return_value( interface.name, method, this_cpp_value, for_main_world=True ), "world_suffixes": ["", "ForMainWorld"] if "PerWorldBindings" in extended_attributes else [""], # [PerWorldBindings], }
def method_context(interface, method): arguments = method.arguments extended_attributes = method.extended_attributes idl_type = method.idl_type is_static = method.is_static name = method.name idl_type.add_includes_for_type() this_cpp_value = cpp_value(interface, method, len(arguments)) def function_template(): if is_static: return 'functionTemplate' return 'prototypeTemplate' is_call_with_script_arguments = has_extended_attribute_value( method, 'CallWith', 'ScriptArguments') if is_call_with_script_arguments: includes.update([ 'bindings/core/v8/ScriptCallStackFactory.h', 'core/inspector/ScriptArguments.h' ]) is_call_with_script_state = has_extended_attribute_value( method, 'CallWith', 'ScriptState') if is_call_with_script_state: includes.add('bindings/core/v8/ScriptState.h') is_custom_element_callbacks = 'CustomElementCallbacks' in extended_attributes if is_custom_element_callbacks: includes.add('core/dom/custom/CustomElementProcessingStack.h') is_raises_exception = 'RaisesException' in extended_attributes arguments_need_try_catch = (any( argument_needs_try_catch(method, argument) for argument in arguments)) return { 'arguments': [ argument_context(interface, method, argument, index) for index, argument in enumerate(arguments) ], 'arguments_need_try_catch': arguments_need_try_catch, 'cpp_type': (v8_types.cpp_template_type('Nullable', idl_type.cpp_type) if idl_type.is_explicit_nullable else idl_type.cpp_type), 'cpp_value': this_cpp_value, 'cpp_type_initializer': idl_type.cpp_type_initializer, 'custom_registration_extended_attributes': CUSTOM_REGISTRATION_EXTENDED_ATTRIBUTES.intersection( extended_attributes.iterkeys()), 'exposed_test': v8_utilities.exposed(method, interface), # [Exposed] 'function_template': function_template(), 'has_custom_registration': is_static or v8_utilities.has_extended_attribute( method, CUSTOM_REGISTRATION_EXTENDED_ATTRIBUTES), 'has_exception_state': is_raises_exception or any(argument for argument in arguments if argument.idl_type.name == 'SerializedScriptValue' or argument.idl_type.may_raise_exception_on_conversion), 'idl_type': idl_type.base_type, 'is_call_with_execution_context': has_extended_attribute_value(method, 'CallWith', 'ExecutionContext'), 'is_call_with_script_arguments': is_call_with_script_arguments, 'is_call_with_script_state': is_call_with_script_state, 'is_custom': 'Custom' in extended_attributes, 'is_custom_element_callbacks': is_custom_element_callbacks, 'is_explicit_nullable': idl_type.is_explicit_nullable, 'is_partial_interface_member': 'PartialInterfaceImplementedAs' in extended_attributes, 'is_raises_exception': is_raises_exception, 'is_static': is_static, 'is_variadic': arguments and arguments[-1].is_variadic, 'name': name, 'number_of_arguments': len(arguments), 'number_of_required_arguments': len([ argument for argument in arguments if not (argument.is_optional or argument.is_variadic) ]), 'number_of_required_or_variadic_arguments': len([argument for argument in arguments if not argument.is_optional]), 'union_arguments': idl_type.union_arguments, 'use_local_result': use_local_result(method), }
def method_context(interface, method, is_visible=True): arguments = method.arguments extended_attributes = method.extended_attributes idl_type = method.idl_type is_static = method.is_static name = method.name idl_type.add_includes_for_type() this_cpp_value = cpp_value(interface, method, len(arguments)) def function_template(): if is_static: return 'functionTemplate' if 'Unforgeable' in extended_attributes: return 'instanceTemplate' return 'prototypeTemplate' is_implemented_in_private_script = 'ImplementedInPrivateScript' in extended_attributes if is_implemented_in_private_script: includes.add('bindings/core/v8/PrivateScriptRunner.h') includes.add('core/frame/LocalFrame.h') includes.add('platform/ScriptForbiddenScope.h') # [OnlyExposedToPrivateScript] is_only_exposed_to_private_script = 'OnlyExposedToPrivateScript' in extended_attributes is_call_with_script_arguments = has_extended_attribute_value( method, 'CallWith', 'ScriptArguments') if is_call_with_script_arguments: includes.update([ 'bindings/core/v8/ScriptCallStackFactory.h', 'core/inspector/ScriptArguments.h' ]) is_call_with_script_state = has_extended_attribute_value( method, 'CallWith', 'ScriptState') if is_call_with_script_state: includes.add('bindings/core/v8/ScriptState.h') is_check_security_for_node = 'CheckSecurity' in extended_attributes if is_check_security_for_node: includes.add('bindings/core/v8/BindingSecurity.h') is_custom_element_callbacks = 'CustomElementCallbacks' in extended_attributes if is_custom_element_callbacks: includes.add('core/dom/custom/CustomElementProcessingStack.h') is_do_not_check_security = 'DoNotCheckSecurity' in extended_attributes is_check_security_for_frame = (has_extended_attribute_value( interface, 'CheckSecurity', 'Frame') and not is_do_not_check_security) is_check_security_for_window = (has_extended_attribute_value( interface, 'CheckSecurity', 'Window') and not is_do_not_check_security) is_raises_exception = 'RaisesException' in extended_attributes return { 'activity_logging_world_list': v8_utilities.activity_logging_world_list(method), # [ActivityLogging] 'arguments': [ argument_context(interface, method, argument, index) for index, argument in enumerate(arguments) ], 'argument_declarations_for_private_script': argument_declarations_for_private_script(interface, method), 'conditional_string': v8_utilities.conditional_string(method), 'cpp_type': (v8_types.cpp_template_type('Nullable', idl_type.cpp_type) if idl_type.is_explicit_nullable else idl_type.cpp_type), 'cpp_value': this_cpp_value, 'cpp_type_initializer': idl_type.cpp_type_initializer, 'custom_registration_extended_attributes': CUSTOM_REGISTRATION_EXTENDED_ATTRIBUTES.intersection( extended_attributes.iterkeys()), 'deprecate_as': v8_utilities.deprecate_as(method), # [DeprecateAs] 'exposed_test': v8_utilities.exposed(method, interface), # [Exposed] 'function_template': function_template(), 'has_custom_registration': is_static or v8_utilities.has_extended_attribute( method, CUSTOM_REGISTRATION_EXTENDED_ATTRIBUTES), 'has_exception_state': is_raises_exception or is_check_security_for_frame or is_check_security_for_window or any(argument for argument in arguments if ( argument.idl_type.name == 'SerializedScriptValue' or argument_conversion_needs_exception_state(method, argument))), 'idl_type': idl_type.base_type, 'is_call_with_execution_context': has_extended_attribute_value(method, 'CallWith', 'ExecutionContext'), 'is_call_with_script_arguments': is_call_with_script_arguments, 'is_call_with_script_state': is_call_with_script_state, 'is_check_security_for_frame': is_check_security_for_frame, 'is_check_security_for_node': is_check_security_for_node, 'is_check_security_for_window': is_check_security_for_window, 'is_custom': 'Custom' in extended_attributes, 'is_custom_element_callbacks': is_custom_element_callbacks, 'is_do_not_check_security': is_do_not_check_security, 'is_do_not_check_signature': 'DoNotCheckSignature' in extended_attributes, 'is_explicit_nullable': idl_type.is_explicit_nullable, 'is_implemented_in_private_script': is_implemented_in_private_script, 'is_partial_interface_member': 'PartialInterfaceImplementedAs' in extended_attributes, 'is_per_world_bindings': 'PerWorldBindings' in extended_attributes, 'is_raises_exception': is_raises_exception, 'is_read_only': 'Unforgeable' in extended_attributes, 'is_static': is_static, 'is_variadic': arguments and arguments[-1].is_variadic, 'measure_as': v8_utilities.measure_as(method), # [MeasureAs] 'name': name, 'number_of_arguments': len(arguments), 'number_of_required_arguments': len([ argument for argument in arguments if not (argument.is_optional or argument.is_variadic) ]), 'number_of_required_or_variadic_arguments': len([argument for argument in arguments if not argument.is_optional]), 'only_exposed_to_private_script': is_only_exposed_to_private_script, 'per_context_enabled_function': v8_utilities.per_context_enabled_function_name( method), # [PerContextEnabled] 'private_script_v8_value_to_local_cpp_value': idl_type.v8_value_to_local_cpp_value(extended_attributes, 'v8Value', 'cppValue', isolate='scriptState->isolate()', used_in_private_script=True), 'property_attributes': property_attributes(method), 'runtime_enabled_function': v8_utilities.runtime_enabled_function_name(method), # [RuntimeEnabled] 'should_be_exposed_to_script': not (is_implemented_in_private_script and is_only_exposed_to_private_script), 'signature': 'v8::Local<v8::Signature>()' if is_static or 'DoNotCheckSignature' in extended_attributes else 'defaultSignature', 'use_output_parameter_for_result': idl_type.use_output_parameter_for_result, 'use_local_result': use_local_result(method), 'v8_set_return_value': v8_set_return_value(interface.name, method, this_cpp_value), 'v8_set_return_value_for_main_world': v8_set_return_value(interface.name, method, this_cpp_value, for_main_world=True), 'visible': is_visible, 'world_suffixes': ['', 'ForMainWorld'] if 'PerWorldBindings' in extended_attributes else [''], # [PerWorldBindings], }
def method_context(interface, method, is_visible=True): arguments = method.arguments extended_attributes = method.extended_attributes idl_type = method.idl_type is_static = method.is_static name = method.name if is_visible: idl_type.add_includes_for_type(extended_attributes) this_cpp_value = cpp_value(interface, method, len(arguments)) is_implemented_in_private_script = 'ImplementedInPrivateScript' in extended_attributes if is_implemented_in_private_script: includes.add('bindings/core/v8/PrivateScriptRunner.h') includes.add('core/frame/LocalFrame.h') includes.add('platform/ScriptForbiddenScope.h') # [OnlyExposedToPrivateScript] is_only_exposed_to_private_script = 'OnlyExposedToPrivateScript' in extended_attributes is_call_with_script_arguments = has_extended_attribute_value( method, 'CallWith', 'ScriptArguments') if is_call_with_script_arguments: includes.update([ 'bindings/core/v8/ScriptCallStack.h', 'core/inspector/ScriptArguments.h' ]) is_call_with_script_state = has_extended_attribute_value( method, 'CallWith', 'ScriptState') is_call_with_this_value = has_extended_attribute_value( method, 'CallWith', 'ThisValue') if is_call_with_script_state or is_call_with_this_value: includes.add('bindings/core/v8/ScriptState.h') # [CheckSecurity] is_do_not_check_security = 'DoNotCheckSecurity' in extended_attributes is_check_security_for_receiver = (has_extended_attribute_value( interface, 'CheckSecurity', 'Receiver') and not is_do_not_check_security) is_check_security_for_return_value = (has_extended_attribute_value( method, 'CheckSecurity', 'ReturnValue')) if is_check_security_for_receiver or is_check_security_for_return_value: includes.add('bindings/core/v8/BindingSecurity.h') is_ce_reactions = 'CEReactions' in extended_attributes if is_ce_reactions: includes.add('core/dom/custom/CEReactionsScope.h') is_custom_element_callbacks = 'CustomElementCallbacks' in extended_attributes if is_custom_element_callbacks: includes.add('core/dom/custom/V0CustomElementProcessingStack.h') is_raises_exception = 'RaisesException' in extended_attributes is_custom_call_prologue = has_extended_attribute_value( method, 'Custom', 'CallPrologue') is_custom_call_epilogue = has_extended_attribute_value( method, 'Custom', 'CallEpilogue') is_post_message = 'PostMessage' in extended_attributes if is_post_message: includes.add('bindings/core/v8/SerializedScriptValueFactory.h') includes.add('bindings/core/v8/Transferables.h') includes.add('core/dom/DOMArrayBufferBase.h') if 'LenientThis' in extended_attributes: raise Exception('[LenientThis] is not supported for operations.') argument_contexts = [ argument_context(interface, method, argument, index, is_visible=is_visible) for index, argument in enumerate(arguments) ] return { 'activity_logging_world_list': v8_utilities.activity_logging_world_list(method), # [ActivityLogging] 'arguments': argument_contexts, 'argument_declarations_for_private_script': argument_declarations_for_private_script(interface, method), 'cpp_type': (v8_types.cpp_template_type('Nullable', idl_type.cpp_type) if idl_type.is_explicit_nullable else idl_type.cpp_type), 'cpp_value': this_cpp_value, 'cpp_type_initializer': idl_type.cpp_type_initializer, 'custom_registration_extended_attributes': CUSTOM_REGISTRATION_EXTENDED_ATTRIBUTES.intersection( extended_attributes.iterkeys()), 'deprecate_as': v8_utilities.deprecate_as(method), # [DeprecateAs] 'do_not_test_new_object': 'DoNotTestNewObject' in extended_attributes, 'exposed_test': v8_utilities.exposed(method, interface), # [Exposed] # TODO(yukishiino): Retire has_custom_registration flag. Should be # replaced with V8DOMConfiguration::PropertyLocationConfiguration. 'has_custom_registration': v8_utilities.has_extended_attribute( method, CUSTOM_REGISTRATION_EXTENDED_ATTRIBUTES), 'has_exception_state': is_raises_exception or is_check_security_for_receiver or any(argument for argument in arguments if ( argument.idl_type.name == 'SerializedScriptValue' or argument_conversion_needs_exception_state(method, argument))), 'has_optional_argument_without_default_value': any(True for argument_context in argument_contexts if argument_context['is_optional_without_default_value']), 'idl_type': idl_type.base_type, 'is_call_with_execution_context': has_extended_attribute_value(method, 'CallWith', 'ExecutionContext'), 'is_call_with_script_arguments': is_call_with_script_arguments, 'is_call_with_script_state': is_call_with_script_state, 'is_call_with_this_value': is_call_with_this_value, 'is_ce_reactions': is_ce_reactions, 'is_check_security_for_receiver': is_check_security_for_receiver, 'is_check_security_for_return_value': is_check_security_for_return_value, 'is_custom': 'Custom' in extended_attributes and not (is_custom_call_prologue or is_custom_call_epilogue), 'is_custom_call_prologue': is_custom_call_prologue, 'is_custom_call_epilogue': is_custom_call_epilogue, 'is_custom_element_callbacks': is_custom_element_callbacks, 'is_do_not_check_security': is_do_not_check_security, 'is_explicit_nullable': idl_type.is_explicit_nullable, 'is_implemented_in_private_script': is_implemented_in_private_script, 'is_new_object': 'NewObject' in extended_attributes, 'is_partial_interface_member': 'PartialInterfaceImplementedAs' in extended_attributes, 'is_per_world_bindings': 'PerWorldBindings' in extended_attributes, 'is_post_message': is_post_message, 'is_raises_exception': is_raises_exception, 'is_static': is_static, 'is_unforgeable': is_unforgeable(interface, method), 'is_variadic': arguments and arguments[-1].is_variadic, 'measure_as': v8_utilities.measure_as(method, interface), # [MeasureAs] 'name': name, 'number_of_arguments': len(arguments), 'number_of_required_arguments': len([ argument for argument in arguments if not (argument.is_optional or argument.is_variadic) ]), 'number_of_required_or_variadic_arguments': len([argument for argument in arguments if not argument.is_optional]), 'on_instance': v8_utilities.on_instance(interface, method), 'on_interface': v8_utilities.on_interface(interface, method), 'on_prototype': v8_utilities.on_prototype(interface, method), 'only_exposed_to_private_script': is_only_exposed_to_private_script, 'origin_trial_enabled_function': v8_utilities.origin_trial_enabled_function_name( method), # [OriginTrialEnabled] 'origin_trial_feature_name': v8_utilities.origin_trial_feature_name(method), # [OriginTrialEnabled] 'private_script_v8_value_to_local_cpp_value': idl_type.v8_value_to_local_cpp_value(extended_attributes, 'v8Value', 'cppValue', isolate='scriptState->isolate()', bailout_return_value='false'), 'property_attributes': property_attributes(interface, method), 'returns_promise': method.returns_promise, 'runtime_enabled_function': v8_utilities.runtime_enabled_function_name(method), # [RuntimeEnabled] 'secure_context_test': v8_utilities.secure_context(method, interface), # [SecureContext] 'should_be_exposed_to_script': not (is_implemented_in_private_script and is_only_exposed_to_private_script), 'use_output_parameter_for_result': idl_type.use_output_parameter_for_result, 'use_local_result': use_local_result(method), 'v8_set_return_value': v8_set_return_value(interface.name, method, this_cpp_value), 'v8_set_return_value_for_main_world': v8_set_return_value(interface.name, method, this_cpp_value, for_main_world=True), 'visible': is_visible, 'world_suffixes': ['', 'ForMainWorld'] if 'PerWorldBindings' in extended_attributes else [''], # [PerWorldBindings], }
def generate_method(interface, method): arguments = method.arguments extended_attributes = method.extended_attributes idl_type = method.idl_type is_static = method.is_static name = method.name v8_types.add_includes_for_type(idl_type) this_cpp_value = cpp_value(interface, method, len(arguments)) def function_template(): if is_static: return 'functionTemplate' if 'Unforgeable' in extended_attributes: return 'instanceTemplate' return 'prototypeTemplate' is_call_with_script_arguments = has_extended_attribute_value(method, 'CallWith', 'ScriptArguments') if is_call_with_script_arguments: includes.update(['bindings/v8/ScriptCallStackFactory.h', 'core/inspector/ScriptArguments.h']) is_call_with_script_state = has_extended_attribute_value(method, 'CallWith', 'ScriptState') if is_call_with_script_state: includes.add('bindings/v8/ScriptState.h') is_check_security_for_node = 'CheckSecurity' in extended_attributes if is_check_security_for_node: includes.add('bindings/v8/BindingSecurity.h') is_custom_element_callbacks = 'CustomElementCallbacks' in extended_attributes if is_custom_element_callbacks: includes.add('core/dom/custom/CustomElementCallbackDispatcher.h') is_check_security_for_frame = ( 'CheckSecurity' in interface.extended_attributes and 'DoNotCheckSecurity' not in extended_attributes) is_raises_exception = 'RaisesException' in extended_attributes return { 'activity_logging_world_list': v8_utilities.activity_logging_world_list(method), # [ActivityLogging] 'arguments': [generate_argument(interface, method, argument, index) for index, argument in enumerate(arguments)], 'conditional_string': v8_utilities.conditional_string(method), 'cpp_type': v8_types.cpp_type(idl_type), 'cpp_value': this_cpp_value, 'deprecate_as': v8_utilities.deprecate_as(method), # [DeprecateAs] 'do_not_check_signature': not(is_static or v8_utilities.has_extended_attribute(method, ['DoNotCheckSecurity', 'DoNotCheckSignature', 'NotEnumerable', 'ReadOnly', 'RuntimeEnabled', 'Unforgeable'])), 'function_template': function_template(), 'idl_type': idl_type, 'has_exception_state': is_raises_exception or is_check_security_for_frame or any(argument for argument in arguments if argument.idl_type == 'SerializedScriptValue' or v8_types.is_integer_type(argument.idl_type)) or name in ['addEventListener', 'removeEventListener'], 'is_call_with_execution_context': has_extended_attribute_value(method, 'CallWith', 'ExecutionContext'), 'is_call_with_script_arguments': is_call_with_script_arguments, 'is_call_with_script_state': is_call_with_script_state, 'is_check_security_for_frame': is_check_security_for_frame, 'is_check_security_for_node': is_check_security_for_node, 'is_custom': 'Custom' in extended_attributes, 'is_custom_element_callbacks': is_custom_element_callbacks, 'is_do_not_check_security': 'DoNotCheckSecurity' in extended_attributes, 'is_do_not_check_signature': 'DoNotCheckSignature' in extended_attributes, 'is_per_world_bindings': 'PerWorldBindings' in extended_attributes, 'is_raises_exception': is_raises_exception, 'is_read_only': 'ReadOnly' in extended_attributes, 'is_static': is_static, 'is_strict_type_checking': 'StrictTypeChecking' in extended_attributes or 'StrictTypeChecking' in interface.extended_attributes, 'is_variadic': arguments and arguments[-1].is_variadic, 'measure_as': v8_utilities.measure_as(method), # [MeasureAs] 'name': name, 'number_of_arguments': len(arguments), 'number_of_required_arguments': len([ argument for argument in arguments if not (argument.is_optional or argument.is_variadic)]), 'number_of_required_or_variadic_arguments': len([ argument for argument in arguments if not argument.is_optional]), 'per_context_enabled_function': v8_utilities.per_context_enabled_function_name(method), # [PerContextEnabled] 'property_attributes': property_attributes(method), 'runtime_enabled_function': v8_utilities.runtime_enabled_function_name(method), # [RuntimeEnabled] 'signature': 'v8::Local<v8::Signature>()' if is_static or 'DoNotCheckSignature' in extended_attributes else 'defaultSignature', 'union_arguments': union_arguments(idl_type), 'v8_set_return_value_for_main_world': v8_set_return_value(interface.name, method, this_cpp_value, for_main_world=True), 'v8_set_return_value': v8_set_return_value(interface.name, method, this_cpp_value), 'world_suffixes': ['', 'ForMainWorld'] if 'PerWorldBindings' in extended_attributes else [''], # [PerWorldBindings] }
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 method_context(interface, method): arguments = method.arguments extended_attributes = method.extended_attributes idl_type = method.idl_type is_static = method.is_static name = method.name idl_type.add_includes_for_type() this_cpp_value = cpp_value(interface, method, len(arguments)) def function_template(): if is_static: return 'functionTemplate' return 'prototypeTemplate' is_call_with_script_arguments = has_extended_attribute_value(method, 'CallWith', 'ScriptArguments') if is_call_with_script_arguments: includes.update(['bindings/core/v8/ScriptCallStackFactory.h', 'core/inspector/ScriptArguments.h']) is_call_with_script_state = has_extended_attribute_value(method, 'CallWith', 'ScriptState') if is_call_with_script_state: includes.add('bindings/core/v8/ScriptState.h') is_raises_exception = 'RaisesException' in extended_attributes arguments_need_try_catch = ( any(argument_needs_try_catch(method, argument) for argument in arguments)) return { 'arguments': [argument_context(interface, method, argument, index) for index, argument in enumerate(arguments)], 'arguments_need_try_catch': arguments_need_try_catch, 'cpp_type': (v8_types.cpp_template_type('Nullable', idl_type.cpp_type) if idl_type.is_explicit_nullable else idl_type.cpp_type), 'cpp_value': this_cpp_value, 'cpp_type_initializer': idl_type.cpp_type_initializer, 'custom_registration_extended_attributes': CUSTOM_REGISTRATION_EXTENDED_ATTRIBUTES.intersection( extended_attributes.iterkeys()), 'exposed_test': v8_utilities.exposed(method, interface), # [Exposed] 'function_template': function_template(), 'has_custom_registration': is_static or v8_utilities.has_extended_attribute( method, CUSTOM_REGISTRATION_EXTENDED_ATTRIBUTES), 'has_exception_state': is_raises_exception or any(argument for argument in arguments if argument.idl_type.name == 'SerializedScriptValue' or argument.idl_type.may_raise_exception_on_conversion), 'idl_type': idl_type.base_type, 'is_call_with_execution_context': has_extended_attribute_value(method, 'CallWith', 'ExecutionContext'), 'is_call_with_script_arguments': is_call_with_script_arguments, 'is_call_with_script_state': is_call_with_script_state, 'is_custom': 'Custom' in extended_attributes, 'is_explicit_nullable': idl_type.is_explicit_nullable, 'is_partial_interface_member': 'PartialInterfaceImplementedAs' in extended_attributes, 'is_raises_exception': is_raises_exception, 'is_static': is_static, 'is_variadic': arguments and arguments[-1].is_variadic, 'name': name, 'number_of_arguments': len(arguments), 'number_of_required_arguments': len([ argument for argument in arguments if not (argument.is_optional or argument.is_variadic)]), 'number_of_required_or_variadic_arguments': len([ argument for argument in arguments if not argument.is_optional]), 'union_arguments': idl_type.union_arguments, 'use_local_result': use_local_result(method), }
def method_context(interface, method): arguments = method.arguments extended_attributes = method.extended_attributes idl_type = method.idl_type is_static = method.is_static name = method.name return_promise = idl_type.name == 'Promise' idl_type.add_includes_for_type() this_cpp_value = cpp_value(interface, method, len(arguments)) def function_template(): if is_static: return 'functionTemplate' if 'Unforgeable' in extended_attributes: return 'instanceTemplate' return 'prototypeTemplate' is_implemented_in_private_script = 'ImplementedInPrivateScript' in extended_attributes if is_implemented_in_private_script: includes.add('bindings/core/v8/PrivateScriptRunner.h') includes.add('core/frame/LocalFrame.h') includes.add('platform/ScriptForbiddenScope.h') # [OnlyExposedToPrivateScript] is_only_exposed_to_private_script = 'OnlyExposedToPrivateScript' in extended_attributes is_call_with_script_arguments = has_extended_attribute_value(method, 'CallWith', 'ScriptArguments') if is_call_with_script_arguments: includes.update(['bindings/core/v8/ScriptCallStackFactory.h', 'core/inspector/ScriptArguments.h']) is_call_with_script_state = has_extended_attribute_value(method, 'CallWith', 'ScriptState') if is_call_with_script_state: includes.add('bindings/core/v8/ScriptState.h') is_check_security_for_node = 'CheckSecurity' in extended_attributes if is_check_security_for_node: includes.add('bindings/core/v8/BindingSecurity.h') is_custom_element_callbacks = 'CustomElementCallbacks' in extended_attributes if is_custom_element_callbacks: includes.add('core/dom/custom/CustomElementCallbackDispatcher.h') is_check_security_for_frame = ( 'CheckSecurity' in interface.extended_attributes and 'DoNotCheckSecurity' not in extended_attributes) is_raises_exception = 'RaisesException' in extended_attributes arguments_need_try_catch = ( any(argument_needs_try_catch(argument, return_promise) for argument in arguments)) return { 'activity_logging_world_list': v8_utilities.activity_logging_world_list(method), # [ActivityLogging] 'arguments': [argument_context(interface, method, argument, index) for index, argument in enumerate(arguments)], 'argument_declarations_for_private_script': argument_declarations_for_private_script(interface, method), 'arguments_need_try_catch': arguments_need_try_catch, 'conditional_string': v8_utilities.conditional_string(method), 'cpp_type': (v8_types.cpp_template_type('Nullable', idl_type.cpp_type) if idl_type.is_explicit_nullable else idl_type.cpp_type), 'cpp_value': this_cpp_value, 'cpp_type_initializer': idl_type.cpp_type_initializer, 'custom_registration_extended_attributes': CUSTOM_REGISTRATION_EXTENDED_ATTRIBUTES.intersection( extended_attributes.iterkeys()), 'deprecate_as': v8_utilities.deprecate_as(method), # [DeprecateAs] 'exposed_test': v8_utilities.exposed(method, interface), # [Exposed] 'function_template': function_template(), 'has_custom_registration': is_static or v8_utilities.has_extended_attribute( method, CUSTOM_REGISTRATION_EXTENDED_ATTRIBUTES), 'has_exception_state': is_raises_exception or is_check_security_for_frame or interface.name == 'EventTarget' or # FIXME: merge with is_check_security_for_frame http://crbug.com/383699 any(argument for argument in arguments if argument.idl_type.name == 'SerializedScriptValue' or argument.idl_type.may_raise_exception_on_conversion), 'idl_type': idl_type.base_type, 'is_call_with_execution_context': has_extended_attribute_value(method, 'CallWith', 'ExecutionContext'), 'is_call_with_script_arguments': is_call_with_script_arguments, 'is_call_with_script_state': is_call_with_script_state, 'is_check_security_for_frame': is_check_security_for_frame, 'is_check_security_for_node': is_check_security_for_node, 'is_custom': 'Custom' in extended_attributes, 'is_custom_element_callbacks': is_custom_element_callbacks, 'is_do_not_check_security': 'DoNotCheckSecurity' in extended_attributes, 'is_do_not_check_signature': 'DoNotCheckSignature' in extended_attributes, 'is_explicit_nullable': idl_type.is_explicit_nullable, 'is_implemented_in_private_script': is_implemented_in_private_script, 'is_partial_interface_member': 'PartialInterfaceImplementedAs' in extended_attributes, 'is_per_world_bindings': 'PerWorldBindings' in extended_attributes, 'is_raises_exception': is_raises_exception, 'is_read_only': 'Unforgeable' in extended_attributes, 'is_static': is_static, 'is_variadic': arguments and arguments[-1].is_variadic, 'measure_as': v8_utilities.measure_as(method), # [MeasureAs] 'name': name, 'number_of_arguments': len(arguments), 'number_of_required_arguments': len([ argument for argument in arguments if not (argument.is_optional or argument.is_variadic)]), 'number_of_required_or_variadic_arguments': len([ argument for argument in arguments if not argument.is_optional]), 'only_exposed_to_private_script': is_only_exposed_to_private_script, 'per_context_enabled_function': v8_utilities.per_context_enabled_function_name(method), # [PerContextEnabled] 'private_script_v8_value_to_local_cpp_value': idl_type.v8_value_to_local_cpp_value( extended_attributes, 'v8Value', 'cppValue', isolate='scriptState->isolate()', used_in_private_script=True), 'property_attributes': property_attributes(method), 'runtime_enabled_function': v8_utilities.runtime_enabled_function_name(method), # [RuntimeEnabled] 'should_be_exposed_to_script': not (is_implemented_in_private_script and is_only_exposed_to_private_script), 'signature': 'v8::Local<v8::Signature>()' if is_static or 'DoNotCheckSignature' in extended_attributes else 'defaultSignature', 'union_arguments': idl_type.union_arguments, 'use_local_result': use_local_result(method), 'v8_set_return_value': v8_set_return_value(interface.name, method, this_cpp_value), 'v8_set_return_value_for_main_world': v8_set_return_value(interface.name, method, this_cpp_value, for_main_world=True), 'world_suffixes': ['', 'ForMainWorld'] if 'PerWorldBindings' in extended_attributes else [''], # [PerWorldBindings], }
def method_context(interface, method, is_visible=True): arguments = method.arguments extended_attributes = method.extended_attributes idl_type = method.idl_type is_static = method.is_static name = method.name if is_visible: idl_type.add_includes_for_type(extended_attributes) this_cpp_value = cpp_value(interface, method, len(arguments)) is_implemented_in_private_script = "ImplementedInPrivateScript" in extended_attributes if is_implemented_in_private_script: includes.add("bindings/core/v8/PrivateScriptRunner.h") includes.add("core/frame/LocalFrame.h") includes.add("platform/ScriptForbiddenScope.h") # [OnlyExposedToPrivateScript] is_only_exposed_to_private_script = "OnlyExposedToPrivateScript" in extended_attributes is_call_with_script_arguments = has_extended_attribute_value(method, "CallWith", "ScriptArguments") if is_call_with_script_arguments: includes.update(["bindings/core/v8/ScriptCallStack.h", "core/inspector/ScriptArguments.h"]) is_call_with_script_state = has_extended_attribute_value(method, "CallWith", "ScriptState") is_call_with_this_value = has_extended_attribute_value(method, "CallWith", "ThisValue") if is_call_with_script_state or is_call_with_this_value: includes.add("bindings/core/v8/ScriptState.h") # [CheckSecurity] is_do_not_check_security = "DoNotCheckSecurity" in extended_attributes is_check_security_for_receiver = ( has_extended_attribute_value(interface, "CheckSecurity", "Receiver") and not is_do_not_check_security ) is_check_security_for_return_value = has_extended_attribute_value(method, "CheckSecurity", "ReturnValue") if is_check_security_for_receiver or is_check_security_for_return_value: includes.add("bindings/core/v8/BindingSecurity.h") is_ce_reactions = "CEReactions" in extended_attributes if is_ce_reactions: includes.add("core/dom/custom/CEReactionsScope.h") is_custom_element_callbacks = "CustomElementCallbacks" in extended_attributes if is_custom_element_callbacks: includes.add("core/dom/custom/V0CustomElementProcessingStack.h") is_raises_exception = "RaisesException" in extended_attributes is_custom_call_prologue = has_extended_attribute_value(method, "Custom", "CallPrologue") is_custom_call_epilogue = has_extended_attribute_value(method, "Custom", "CallEpilogue") is_post_message = "PostMessage" in extended_attributes if is_post_message: includes.add("bindings/core/v8/SerializedScriptValueFactory.h") includes.add("bindings/core/v8/Transferables.h") if "LenientThis" in extended_attributes: raise Exception("[LenientThis] is not supported for operations.") argument_contexts = [ argument_context(interface, method, argument, index, is_visible=is_visible) for index, argument in enumerate(arguments) ] return { "activity_logging_world_list": v8_utilities.activity_logging_world_list(method), # [ActivityLogging] "arguments": argument_contexts, "argument_declarations_for_private_script": argument_declarations_for_private_script(interface, method), "cpp_type": ( v8_types.cpp_template_type("Nullable", idl_type.cpp_type) if idl_type.is_explicit_nullable else idl_type.cpp_type ), "cpp_value": this_cpp_value, "cpp_type_initializer": idl_type.cpp_type_initializer, "custom_registration_extended_attributes": CUSTOM_REGISTRATION_EXTENDED_ATTRIBUTES.intersection( extended_attributes.iterkeys() ), "deprecate_as": v8_utilities.deprecate_as(method), # [DeprecateAs] "do_not_test_new_object": "DoNotTestNewObject" in extended_attributes, "exposed_test": v8_utilities.exposed(method, interface), # [Exposed] # TODO(yukishiino): Retire has_custom_registration flag. Should be # replaced with V8DOMConfiguration::PropertyLocationConfiguration. "has_custom_registration": v8_utilities.has_extended_attribute(method, CUSTOM_REGISTRATION_EXTENDED_ATTRIBUTES), "has_exception_state": is_raises_exception or is_check_security_for_receiver or any( argument for argument in arguments if ( argument.idl_type.name == "SerializedScriptValue" or argument_conversion_needs_exception_state(method, argument) ) ), "has_optional_argument_without_default_value": any( True for argument_context in argument_contexts if argument_context["is_optional_without_default_value"] ), "idl_type": idl_type.base_type, "is_call_with_execution_context": has_extended_attribute_value(method, "CallWith", "ExecutionContext"), "is_call_with_script_arguments": is_call_with_script_arguments, "is_call_with_script_state": is_call_with_script_state, "is_call_with_this_value": is_call_with_this_value, "is_ce_reactions": is_ce_reactions, "is_check_security_for_receiver": is_check_security_for_receiver, "is_check_security_for_return_value": is_check_security_for_return_value, "is_custom": "Custom" in extended_attributes and not (is_custom_call_prologue or is_custom_call_epilogue), "is_custom_call_prologue": is_custom_call_prologue, "is_custom_call_epilogue": is_custom_call_epilogue, "is_custom_element_callbacks": is_custom_element_callbacks, "is_do_not_check_security": is_do_not_check_security, "is_explicit_nullable": idl_type.is_explicit_nullable, "is_implemented_in_private_script": is_implemented_in_private_script, "is_new_object": "NewObject" in extended_attributes, "is_partial_interface_member": "PartialInterfaceImplementedAs" in extended_attributes, "is_per_world_bindings": "PerWorldBindings" in extended_attributes, "is_post_message": is_post_message, "is_raises_exception": is_raises_exception, "is_static": is_static, "is_unforgeable": is_unforgeable(interface, method), "is_variadic": arguments and arguments[-1].is_variadic, "measure_as": v8_utilities.measure_as(method, interface), # [MeasureAs] "name": name, "number_of_arguments": len(arguments), "number_of_required_arguments": len( [argument for argument in arguments if not (argument.is_optional or argument.is_variadic)] ), "number_of_required_or_variadic_arguments": len( [argument for argument in arguments if not argument.is_optional] ), "on_instance": v8_utilities.on_instance(interface, method), "on_interface": v8_utilities.on_interface(interface, method), "on_prototype": v8_utilities.on_prototype(interface, method), "only_exposed_to_private_script": is_only_exposed_to_private_script, "origin_trial_enabled_function": v8_utilities.origin_trial_enabled_function_name( method ), # [OriginTrialEnabled] "origin_trial_feature_name": v8_utilities.origin_trial_feature_name(method), # [OriginTrialEnabled] "private_script_v8_value_to_local_cpp_value": idl_type.v8_value_to_local_cpp_value( extended_attributes, "v8Value", "cppValue", isolate="scriptState->isolate()", bailout_return_value="false" ), "property_attributes": property_attributes(interface, method), "returns_promise": method.returns_promise, "runtime_enabled_function": v8_utilities.runtime_enabled_function_name(method), # [RuntimeEnabled] "should_be_exposed_to_script": not (is_implemented_in_private_script and is_only_exposed_to_private_script), "use_output_parameter_for_result": idl_type.use_output_parameter_for_result, "use_local_result": use_local_result(method), "v8_set_return_value": v8_set_return_value(interface.name, method, this_cpp_value), "v8_set_return_value_for_main_world": v8_set_return_value( interface.name, method, this_cpp_value, for_main_world=True ), "visible": is_visible, "world_suffixes": ["", "ForMainWorld"] if "PerWorldBindings" in extended_attributes else [""], # [PerWorldBindings], }
def method_context(interface, method): arguments = method.arguments extended_attributes = method.extended_attributes idl_type = method.idl_type is_static = method.is_static name = method.name idl_type.add_includes_for_type() this_cpp_value = cpp_value(interface, method, len(arguments)) def function_template(): if is_static: return "functionTemplate" return "prototypeTemplate" is_call_with_script_arguments = has_extended_attribute_value(method, "CallWith", "ScriptArguments") if is_call_with_script_arguments: includes.update(["bindings/core/v8/ScriptCallStackFactory.h", "core/inspector/ScriptArguments.h"]) is_call_with_script_state = has_extended_attribute_value(method, "CallWith", "ScriptState") if is_call_with_script_state: includes.add("bindings/core/v8/ScriptState.h") is_custom_element_callbacks = "CustomElementCallbacks" in extended_attributes if is_custom_element_callbacks: includes.add("sky/engine/core/dom/custom/custom_element_callback_scope.h") is_raises_exception = "RaisesException" in extended_attributes arguments_need_try_catch = any(argument_needs_try_catch(method, argument) for argument in arguments) return { "arguments": [argument_context(interface, method, argument, index) for index, argument in enumerate(arguments)], "arguments_need_try_catch": arguments_need_try_catch, "cpp_type": ( v8_types.cpp_template_type("Nullable", idl_type.cpp_type) if idl_type.is_explicit_nullable else idl_type.cpp_type ), "cpp_value": this_cpp_value, "cpp_type_initializer": idl_type.cpp_type_initializer, "custom_registration_extended_attributes": CUSTOM_REGISTRATION_EXTENDED_ATTRIBUTES.intersection( extended_attributes.iterkeys() ), "exposed_test": v8_utilities.exposed(method, interface), # [Exposed] "function_template": function_template(), "has_custom_registration": is_static or v8_utilities.has_extended_attribute(method, CUSTOM_REGISTRATION_EXTENDED_ATTRIBUTES), "has_exception_state": is_raises_exception or any( argument for argument in arguments if argument.idl_type.name == "SerializedScriptValue" or argument.idl_type.may_raise_exception_on_conversion ), "idl_type": idl_type.base_type, "is_call_with_execution_context": has_extended_attribute_value(method, "CallWith", "ExecutionContext"), "is_call_with_script_arguments": is_call_with_script_arguments, "is_call_with_script_state": is_call_with_script_state, "is_custom": "Custom" in extended_attributes, "is_custom_element_callbacks": is_custom_element_callbacks, "is_explicit_nullable": idl_type.is_explicit_nullable, "is_partial_interface_member": "PartialInterfaceImplementedAs" in extended_attributes, "is_raises_exception": is_raises_exception, "is_static": is_static, "is_variadic": arguments and arguments[-1].is_variadic, "name": name, "number_of_arguments": len(arguments), "number_of_required_arguments": len( [argument for argument in arguments if not (argument.is_optional or argument.is_variadic)] ), "number_of_required_or_variadic_arguments": len( [argument for argument in arguments if not argument.is_optional] ), "union_arguments": idl_type.union_arguments, "use_local_result": use_local_result(method), }
def generate_method(interface, method): arguments = method.arguments extended_attributes = method.extended_attributes idl_type = method.idl_type is_static = method.is_static name = method.name this_cpp_value = cpp_value(interface, method, len(arguments)) this_custom_signature = custom_signature(method, arguments) def function_template(): # FIXME: Rename as follows (also in v8/V8DOMConfiguration): # desc => functionTemplate # instance => instanceTemplate # proto => prototypeTemplate if is_static: return 'desc' if 'Unforgeable' in extended_attributes: return 'instance' return 'proto' def signature(): if this_custom_signature: return name + 'Signature' if is_static or 'DoNotCheckSignature' in extended_attributes: return 'v8::Local<v8::Signature>()' return 'defaultSignature' is_call_with_script_arguments = has_extended_attribute_value(method, 'CallWith', 'ScriptArguments') if is_call_with_script_arguments: includes.update(['bindings/v8/ScriptCallStackFactory.h', 'core/inspector/ScriptArguments.h']) is_call_with_script_state = has_extended_attribute_value(method, 'CallWith', 'ScriptState') if is_call_with_script_state: includes.add('bindings/v8/ScriptState.h') is_check_security_for_node = 'CheckSecurityForNode' in extended_attributes if is_check_security_for_node: includes.add('bindings/v8/BindingSecurity.h') is_custom_element_callbacks = 'CustomElementCallbacks' in extended_attributes if is_custom_element_callbacks: includes.add('core/dom/custom/CustomElementCallbackDispatcher.h') is_raises_exception = 'RaisesException' in extended_attributes if is_raises_exception: includes.update(['bindings/v8/ExceptionMessages.h', 'bindings/v8/ExceptionState.h']) contents = { 'activity_logging_world_list': v8_utilities.activity_logging_world_list(method), # [ActivityLogging] 'arguments': [generate_argument(interface, method, argument, index) for index, argument in enumerate(arguments)], 'conditional_string': v8_utilities.conditional_string(method), 'cpp_type': v8_types.cpp_type(idl_type), 'cpp_value': this_cpp_value, 'custom_signature': this_custom_signature, 'deprecate_as': v8_utilities.deprecate_as(method), # [DeprecateAs] 'do_not_check_signature': not(this_custom_signature or is_static or v8_utilities.has_extended_attribute(method, ['DoNotCheckSignature', 'NotEnumerable', 'ReadOnly', 'RuntimeEnabled', 'Unforgeable'])), 'function_template': function_template(), 'idl_type': idl_type, 'is_call_with_execution_context': has_extended_attribute_value(method, 'CallWith', 'ExecutionContext'), 'is_call_with_script_arguments': is_call_with_script_arguments, 'is_call_with_script_state': is_call_with_script_state, 'is_check_security_for_node': is_check_security_for_node, 'is_custom': 'Custom' in extended_attributes, 'is_custom_element_callbacks': is_custom_element_callbacks, 'is_per_world_bindings': 'PerWorldBindings' in extended_attributes, 'is_raises_exception': is_raises_exception, 'is_static': is_static, 'measure_as': v8_utilities.measure_as(method), # [MeasureAs] 'name': name, 'number_of_arguments': len(arguments), 'number_of_required_arguments': len([ argument for argument in arguments if not (argument.is_optional or argument.is_variadic)]), 'number_of_required_or_variadic_arguments': len([ argument for argument in arguments if not argument.is_optional]), 'per_context_enabled_function_name': v8_utilities.per_context_enabled_function_name(method), # [PerContextEnabled] 'property_attributes': property_attributes(method), 'runtime_enabled_function_name': v8_utilities.runtime_enabled_function_name(method), # [RuntimeEnabled] 'signature': signature(), 'v8_set_return_value': v8_set_return_value(method, this_cpp_value), 'world_suffixes': ['', 'ForMainWorld'] if 'PerWorldBindings' in extended_attributes else [''], # [PerWorldBindings] } return contents
def generate_method(interface, method): arguments = method.arguments extended_attributes = method.extended_attributes idl_type = method.idl_type is_static = method.is_static name = method.name idl_type.add_includes_for_type() this_cpp_value = cpp_value(interface, method, len(arguments)) def function_template(): if is_static: return 'functionTemplate' if 'Unforgeable' in extended_attributes: return 'instanceTemplate' return 'prototypeTemplate' is_call_with_script_arguments = has_extended_attribute_value( method, 'CallWith', 'ScriptArguments') if is_call_with_script_arguments: includes.update([ 'bindings/v8/ScriptCallStackFactory.h', 'core/inspector/ScriptArguments.h' ]) is_call_with_script_state = has_extended_attribute_value( method, 'CallWith', 'ScriptState') if is_call_with_script_state: includes.add('bindings/v8/ScriptState.h') is_check_security_for_node = 'CheckSecurity' in extended_attributes if is_check_security_for_node: includes.add('bindings/v8/BindingSecurity.h') is_custom_element_callbacks = 'CustomElementCallbacks' in extended_attributes if is_custom_element_callbacks: includes.add('core/dom/custom/CustomElementCallbackDispatcher.h') has_event_listener_argument = any( argument for argument in arguments if argument.idl_type.name == 'EventListener') is_check_security_for_frame = ( 'CheckSecurity' in interface.extended_attributes and 'DoNotCheckSecurity' not in extended_attributes) is_raises_exception = 'RaisesException' in extended_attributes arguments_need_try_catch = any( argument_needs_try_catch(argument) for argument in arguments) return { 'activity_logging_world_list': v8_utilities.activity_logging_world_list(method), # [ActivityLogging] 'arguments': [ generate_argument(interface, method, argument, index) for index, argument in enumerate(arguments) ], 'arguments_need_try_catch': arguments_need_try_catch, 'conditional_string': v8_utilities.conditional_string(method), 'cpp_type': idl_type.cpp_type, 'cpp_value': this_cpp_value, 'custom_registration_extended_attributes': CUSTOM_REGISTRATION_EXTENDED_ATTRIBUTES.intersection( extended_attributes.iterkeys()), 'deprecate_as': v8_utilities.deprecate_as(method), # [DeprecateAs] 'function_template': function_template(), 'has_custom_registration': is_static or v8_utilities.has_extended_attribute( method, CUSTOM_REGISTRATION_EXTENDED_ATTRIBUTES), 'has_event_listener_argument': has_event_listener_argument, 'has_exception_state': has_event_listener_argument or is_raises_exception or is_check_security_for_frame or any(argument for argument in arguments if argument.idl_type.name in ('ByteString', 'ScalarValueString', 'SerializedScriptValue') or argument.idl_type.is_integer_type), 'idl_type': idl_type.base_type, 'is_call_with_execution_context': has_extended_attribute_value(method, 'CallWith', 'ExecutionContext'), 'is_call_with_script_arguments': is_call_with_script_arguments, 'is_call_with_script_state': is_call_with_script_state, 'is_check_security_for_frame': is_check_security_for_frame, 'is_check_security_for_node': is_check_security_for_node, 'is_custom': 'Custom' in extended_attributes, 'is_custom_element_callbacks': is_custom_element_callbacks, 'is_do_not_check_security': 'DoNotCheckSecurity' in extended_attributes, 'is_do_not_check_signature': 'DoNotCheckSignature' in extended_attributes, 'is_partial_interface_member': 'PartialInterfaceImplementedAs' in extended_attributes, 'is_per_world_bindings': 'PerWorldBindings' in extended_attributes, 'is_raises_exception': is_raises_exception, 'is_read_only': 'ReadOnly' in extended_attributes, 'is_static': is_static, 'is_variadic': arguments and arguments[-1].is_variadic, 'measure_as': v8_utilities.measure_as(method), # [MeasureAs] 'name': name, 'number_of_arguments': len(arguments), 'number_of_required_arguments': len([ argument for argument in arguments if not (argument.is_optional or argument.is_variadic) ]), 'number_of_required_or_variadic_arguments': len([argument for argument in arguments if not argument.is_optional]), 'per_context_enabled_function': v8_utilities.per_context_enabled_function_name( method), # [PerContextEnabled] 'property_attributes': property_attributes(method), 'runtime_enabled_function': v8_utilities.runtime_enabled_function_name(method), # [RuntimeEnabled] 'signature': 'v8::Local<v8::Signature>()' if is_static or 'DoNotCheckSignature' in extended_attributes else 'defaultSignature', 'union_arguments': idl_type.union_arguments, 'v8_set_return_value_for_main_world': v8_set_return_value(interface.name, method, this_cpp_value, for_main_world=True), 'v8_set_return_value': v8_set_return_value(interface.name, method, this_cpp_value), 'world_suffixes': ['', 'ForMainWorld'] if 'PerWorldBindings' in extended_attributes else [''], # [PerWorldBindings] }