| Index: Source/bindings/scripts/v8_attributes.py
 | 
| diff --git a/Source/bindings/scripts/v8_attributes.py b/Source/bindings/scripts/v8_attributes.py
 | 
| index e1c6489078fe98ad7a45cc33c0cbaceb9e01c335..308091519e64715019c1bee5a935c96694fa7657 100644
 | 
| --- a/Source/bindings/scripts/v8_attributes.py
 | 
| +++ b/Source/bindings/scripts/v8_attributes.py
 | 
| @@ -71,6 +71,11 @@ def attribute_context(interface, attribute):
 | 
|          (has_extended_attribute_value(interface, 'TypeChecking', 'Unrestricted') or
 | 
|           has_extended_attribute_value(attribute, 'TypeChecking', 'Unrestricted')) and
 | 
|           idl_type.name in ('Float', 'Double'))
 | 
| +    # [ImplementedInPrivateScript]
 | 
| +    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')
 | 
|  
 | 
|      if (base_idl_type == 'EventHandler' and
 | 
|          interface.name in ['Window', 'WorkerGlobalScope'] and
 | 
| @@ -88,6 +93,7 @@ def attribute_context(interface, attribute):
 | 
|          'activity_logging_world_list_for_setter': v8_utilities.activity_logging_world_list(attribute, 'Setter'),  # [ActivityLogging]
 | 
|          'activity_logging_include_old_value_for_setter': 'LogPreviousValue' in extended_attributes,  # [ActivityLogging]
 | 
|          'activity_logging_world_check': v8_utilities.activity_logging_world_check(attribute),  # [ActivityLogging]
 | 
| +        'argument_cpp_type': idl_type.cpp_type_args(used_as_argument=True),
 | 
|          'cached_attribute_validation_method': extended_attributes.get('CachedAttribute'),
 | 
|          'conditional_string': v8_utilities.conditional_string(attribute),
 | 
|          'constructor_type': idl_type.constructor_type_name
 | 
| @@ -108,6 +114,7 @@ def attribute_context(interface, attribute):
 | 
|          'is_getter_raises_exception':  # [RaisesException]
 | 
|              'RaisesException' in extended_attributes and
 | 
|              extended_attributes['RaisesException'] in (None, 'Getter'),
 | 
| +        'is_implemented_in_private_script': is_implemented_in_private_script,
 | 
|          'is_initialized_by_event_constructor':
 | 
|              'InitializedByEventConstructor' in extended_attributes,
 | 
|          'is_keep_alive_for_gc': is_keep_alive_for_gc(interface, attribute),
 | 
| @@ -125,6 +132,8 @@ def attribute_context(interface, attribute):
 | 
|          'measure_as': v8_utilities.measure_as(attribute),  # [MeasureAs]
 | 
|          'name': attribute.name,
 | 
|          'per_context_enabled_function': v8_utilities.per_context_enabled_function_name(attribute),  # [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(attribute),
 | 
|          'put_forwards': 'PutForwards' in extended_attributes,
 | 
|          'reflect_empty': extended_attributes.get('ReflectEmpty'),
 | 
| @@ -132,9 +141,9 @@ def attribute_context(interface, attribute):
 | 
|          'reflect_missing': extended_attributes.get('ReflectMissing'),
 | 
|          'reflect_only': extended_attributes['ReflectOnly'].split('|')
 | 
|              if 'ReflectOnly' in extended_attributes else None,
 | 
| +        'runtime_enabled_function': v8_utilities.runtime_enabled_function_name(attribute),  # [RuntimeEnabled]
 | 
|          'setter_callback': setter_callback_name(interface, attribute),
 | 
|          'v8_type': v8_types.v8_type(base_idl_type),
 | 
| -        'runtime_enabled_function': v8_utilities.runtime_enabled_function_name(attribute),  # [RuntimeEnabled]
 | 
|          'world_suffixes': ['', 'ForMainWorld']
 | 
|                            if 'PerWorldBindings' in extended_attributes
 | 
|                            else [''],  # [PerWorldBindings]
 | 
| @@ -169,7 +178,17 @@ def getter_context(interface, attribute, context):
 | 
|      # FIXME: check if compilers are smart enough to inline this, and if so,
 | 
|      # always use a local variable (for readability and CG simplicity).
 | 
|      release = False
 | 
| -    if ((idl_type.is_nullable and not context['is_nullable_simple']) or
 | 
| +    if 'ImplementedInPrivateScript' in extended_attributes:
 | 
| +        if (not idl_type.is_wrapper_type and
 | 
| +            not idl_type.is_basic_type):
 | 
| +            raise Exception('Private scripts supports only primitive types and DOM wrappers.')
 | 
| +
 | 
| +        context['cpp_value_original'] = cpp_value
 | 
| +        cpp_value = 'result'
 | 
| +        # EventHandler has special handling
 | 
| +        if base_idl_type != 'EventHandler':
 | 
| +            release = idl_type.release
 | 
| +    elif ((idl_type.is_nullable and not context['is_nullable_simple']) or
 | 
|          base_idl_type == 'EventHandler' or
 | 
|          'CachedAttribute' in extended_attributes or
 | 
|          'LogPreviousValue' in extended_attributes or
 | 
| @@ -179,8 +198,8 @@ def getter_context(interface, attribute, context):
 | 
|          context['cpp_value_original'] = cpp_value
 | 
|          cpp_value = 'cppValue'
 | 
|          # EventHandler has special handling
 | 
| -        if base_idl_type != 'EventHandler' and idl_type.is_interface_type:
 | 
| -            release = True
 | 
| +        if base_idl_type != 'EventHandler':
 | 
| +            release = idl_type.release
 | 
|  
 | 
|      def v8_set_return_value_statement(for_main_world=False):
 | 
|          if context['is_keep_alive_for_gc']:
 | 
| @@ -202,6 +221,10 @@ def getter_expression(interface, attribute, context):
 | 
|      this_getter_base_name = getter_base_name(interface, attribute, arguments)
 | 
|      getter_name = scoped_name(interface, attribute, this_getter_base_name)
 | 
|  
 | 
| +    if 'ImplementedInPrivateScript' in attribute.extended_attributes:
 | 
| +        arguments.append('toFrameIfNotDetached(info.GetIsolate()->GetCurrentContext())')
 | 
| +        arguments.append('impl')
 | 
| +        arguments.append('&result')
 | 
|      arguments.extend(v8_utilities.call_with_arguments(
 | 
|          attribute.extended_attributes.get('CallWith')))
 | 
|      # Members of IDL partial interface definitions are implemented in C++ as
 | 
| @@ -226,6 +249,10 @@ CONTENT_ATTRIBUTE_GETTER_NAMES = {
 | 
|  
 | 
|  def getter_base_name(interface, attribute, arguments):
 | 
|      extended_attributes = attribute.extended_attributes
 | 
| +
 | 
| +    if 'ImplementedInPrivateScript' in extended_attributes:
 | 
| +        return '%sAttributeGetterImplementedInPrivateScript' % uncapitalize(cpp_name(attribute))
 | 
| +
 | 
|      if 'Reflect' not in extended_attributes:
 | 
|          return uncapitalize(cpp_name(attribute))
 | 
|  
 | 
| @@ -308,6 +335,9 @@ def setter_context(interface, attribute, context):
 | 
|          'is_setter_call_with_execution_context': v8_utilities.has_extended_attribute_value(
 | 
|              attribute, 'SetterCallWith', 'ExecutionContext'),
 | 
|          'is_setter_raises_exception': is_setter_raises_exception,
 | 
| +        'private_script_cpp_value_to_v8_value': idl_type.cpp_value_to_v8_value(
 | 
| +            'cppValue', isolate='scriptState->isolate()',
 | 
| +            creation_context='scriptState->context()->Global()'),
 | 
|          'v8_value_to_local_cpp_value': idl_type.v8_value_to_local_cpp_value(
 | 
|              extended_attributes, 'v8Value', 'cppValue'),
 | 
|      })
 | 
| @@ -332,7 +362,11 @@ def setter_expression(interface, attribute, context):
 | 
|          not attribute.is_static):
 | 
|          arguments.append('*impl')
 | 
|      idl_type = attribute.idl_type
 | 
| -    if idl_type.base_type == 'EventHandler':
 | 
| +    if 'ImplementedInPrivateScript' in extended_attributes:
 | 
| +        arguments.append('toFrameIfNotDetached(info.GetIsolate()->GetCurrentContext())')
 | 
| +        arguments.append('impl')
 | 
| +        arguments.append('cppValue')
 | 
| +    elif idl_type.base_type == 'EventHandler':
 | 
|          getter_name = scoped_name(interface, attribute, cpp_name(attribute))
 | 
|          context['event_handler_getter_expression'] = '%s(%s)' % (
 | 
|              getter_name, ', '.join(arguments))
 | 
| @@ -361,6 +395,9 @@ CONTENT_ATTRIBUTE_SETTER_NAMES = {
 | 
|  
 | 
|  
 | 
|  def setter_base_name(interface, attribute, arguments):
 | 
| +    if 'ImplementedInPrivateScript' in attribute.extended_attributes:
 | 
| +        return '%sAttributeSetterImplementedInPrivateScript' % uncapitalize(cpp_name(attribute))
 | 
| +
 | 
|      if 'Reflect' not in attribute.extended_attributes:
 | 
|          return 'set%s' % capitalize(cpp_name(attribute))
 | 
|      arguments.append(scoped_content_attribute_name(interface, attribute))
 | 
| 
 |