| Index: Source/bindings/scripts/v8_utilities.py | 
| diff --git a/Source/bindings/scripts/v8_utilities.py b/Source/bindings/scripts/v8_utilities.py | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..f00a798ee6130d9acfbe6c289d8033bcfe669d1a | 
| --- /dev/null | 
| +++ b/Source/bindings/scripts/v8_utilities.py | 
| @@ -0,0 +1,243 @@ | 
| +# Copyright (C) 2013 Google Inc. All rights reserved. | 
| +# | 
| +# Redistribution and use in source and binary forms, with or without | 
| +# modification, are permitted provided that the following conditions are | 
| +# met: | 
| +# | 
| +#     * Redistributions of source code must retain the above copyright | 
| +# notice, this list of conditions and the following disclaimer. | 
| +#     * Redistributions in binary form must reproduce the above | 
| +# copyright notice, this list of conditions and the following disclaimer | 
| +# in the documentation and/or other materials provided with the | 
| +# distribution. | 
| +#     * Neither the name of Google Inc. nor the names of its | 
| +# contributors may be used to endorse or promote products derived from | 
| +# this software without specific prior written permission. | 
| +# | 
| +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
| +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
| +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
| +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 
| +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
| +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
| +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
| +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
| +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
| +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
| +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
| + | 
| + | 
| +import re | 
| + | 
| +ACRONYMS = ['CSS', 'HTML', 'IME', 'JS', 'SVG', 'URL', 'XML', 'XSLT'] | 
| + | 
| + | 
| +def generate_conditional_string(definition_or_member): | 
| +    if 'Conditional' not in definition_or_member.extended_attributes: | 
| +        return '' | 
| +    conditional = definition_or_member.extended_attributes['Conditional'] | 
| +    for operator in ['&', '|']: | 
| +        if operator in conditional: | 
| +            conditions = sorted(conditional.split(operator)) | 
| +            operator_separator = ' {0}{0} '.format(operator) | 
| +            return operator_separator.join(['ENABLE(%s)' % expression for expression in conditions]) | 
| +    return 'ENABLE(%s)' % conditional | 
| + | 
| + | 
| +def implemented_as_cpp_name(definition_or_member): | 
| +    """Return ImplementedAs name, falling back on name attribute. | 
| + | 
| +    For interfaces (definitions), this is used as the class name. | 
| +    For attributes and operations (members), this is used as the method name. | 
| +    For attributes, this is also used in the getter and setter. | 
| +    """ | 
| +    return definition_or_member.extended_attributes.get('ImplementedAs', definition_or_member.name) | 
| + | 
| + | 
| +def runtime_enable_function_name(definition_or_member): | 
| +    """Return the name of the RuntimeEnabledFeatures function. | 
| + | 
| +    The returned function checks if a method/attribute is enabled. | 
| +    If a parameter is given (e.g. 'EnabledAtRuntime=FeatureName'), return: | 
| +        RuntimeEnabledFeatures::{featureName}Enabled | 
| +    Otherwise return: | 
| +        RuntimeEnabledFeatures::{methodName}Enabled | 
| +    """ | 
| +    name = definition_or_member.extended_attributes.get('EnabledAtRuntime') or definition_or_member.name | 
| +    return 'RuntimeEnabledFeatures::%sEnabled' % uncapitalize(name) | 
| + | 
| + | 
| +def uncapitalize(name): | 
| +    """Uncapitalize first letter or initial acronym (* with some exceptions). | 
| + | 
| +    E.g., 'SetURL' becomes 'setURL', but 'URLFoo' becomes 'urlFoo'. | 
| +    Used in method names; exceptions differ from capitalize(). | 
| +    """ | 
| +    for acronym in ACRONYMS: | 
| +        if name.startswith(acronym): | 
| +            name.replace(acronym, acronym.lower()) | 
| +            break | 
| +    else: | 
| +        name = name[0].lower() + name[1:] | 
| + | 
| +    # For HTML5 FileSystem API Flags attributes. | 
| +    # (create is widely used to instantiate an object and must be avoided.) | 
| +    if name == 'create': | 
| +        return 'isCreate' | 
| +    if name == 'exclusive': | 
| +        return 'isExclusive' | 
| +    return name | 
| + | 
| + | 
| +################################################################################ | 
| +# WIP | 
| +################################################################################ | 
| + | 
| +ACTIVITY_LOGGING_INCLUDES = [ | 
| +    'bindings/v8/V8Binding.h', | 
| +    'bindings/v8/V8DOMActivityLogger.h', | 
| +    'wtf/Vector.h', | 
| +] | 
| + | 
| + | 
| +def capitalize(name): | 
| +    """Capitalize first letter or initial acronym (* with some exceptions). | 
| + | 
| +    Used in setter names. | 
| +    """ | 
| +    name = name[0].upper() + name[1:] | 
| +    # xmlEncoding becomes XMLEncoding, but xmlllang becomes Xmllang. | 
| +    if name.startswith('CssText') or re.match('Xml[a-z]', name): | 
| +        return name | 
| +    for acronym in ACRONYMS: | 
| +        if name.startswith(acronym.capitalize()): | 
| +            name.replace(acronym.capitalize(), acronym) | 
| +            break | 
| +    return name | 
| + | 
| + | 
| +def strip_suffix(text, suffix): | 
| +    if suffix and text.endswith(suffix): | 
| +        return text[:-len(suffix)] | 
| +    return text | 
| + | 
| + | 
| +def extended_attribute_contains(values_str, keyword): | 
| +    return values_str and keyword in re.split('[|&]', values_str) | 
| + | 
| + | 
| +def get_raises_exception(function): | 
| +    return 'RaisesException' in function.extended_attributes | 
| + | 
| + | 
| +def get_function_mandatory_parameters(function, count_variadic=False): | 
| +    allow_non_optional = True | 
| +    for parameter in function.arguments: | 
| +        if parameter.is_optional or parameter.is_variadic: | 
| +            allow_non_optional = False | 
| +        else: | 
| +            if not allow_non_optional: | 
| +                raise Exception() | 
| +    mandatory_parameters = 0 | 
| +    for parameter in function.arguments: | 
| +        if parameter.is_optional: | 
| +            break | 
| +        if parameter.is_variadic and not count_variadic: | 
| +            break | 
| +        mandatory_parameters += 1 | 
| +#     print '[]', function.name, mandatory_parameters | 
| +    return mandatory_parameters | 
| + | 
| + | 
| +def get_feature_observation_parameter(interface_or_attribute_or_function): | 
| +    includes = [] | 
| +    measure_as = 'MeasureAs' in interface_or_attribute_or_function.extended_attributes | 
| +    if measure_as: | 
| +        includes.append('core/page/UseCounter.h') | 
| +    parameter = { | 
| +        'measure_as': interface_or_attribute_or_function.extended_attributes.get('MeasureAs'), | 
| +    } | 
| +    return parameter, includes | 
| + | 
| + | 
| +def get_deprecation_notification_parameter(interface_or_attribute_or_function): | 
| +    includes = [] | 
| +#     print '[[]]', interface_or_attribute_or_function.extended_attributes | 
| +    deprecate_as = 'DeprecateAs' in interface_or_attribute_or_function.extended_attributes | 
| +    if deprecate_as: | 
| +        includes.append('core/page/PageConsole.h') | 
| +        includes.append('core/page/UseCounter.h') | 
| +    parameter = { | 
| +        'deprecate_as': interface_or_attribute_or_function.extended_attributes.get('DeprecateAs'), | 
| +    } | 
| +    return parameter, includes | 
| + | 
| + | 
| +def has_activity_logging(for_main_world_suffix, extended_attributes, access): | 
| +    if access not in ['Method', 'Setter', 'Getter']: | 
| +        raise Exception('Unrecognized activity logging access type') | 
| +    if 'ActivityLog' not in extended_attributes: | 
| +        return False | 
| +    activity_log = extended_attributes['ActivityLog'] | 
| +    log_only_isolated_worlds = activity_log.endswith('ForIsolatedWorlds') | 
| +    if log_only_isolated_worlds and for_main_world_suffix == 'ForMainWorld': | 
| +        return False | 
| +    return ( | 
| +        activity_log.startswith('Access') or | 
| +        (access in ['Getter', 'Setter'] and activity_log.startswith(access))) | 
| + | 
| + | 
| +def get_custom_element_invocation_scope_parameter(interface_or_attribute_or_function): | 
| +#     print '[[]]', interface_or_attribute_or_function.extended_attributes | 
| +    includes = [] | 
| +    custom_element_invocation_scope = 'DeliverCustomElementCallbacks' in interface_or_attribute_or_function.extended_attributes or 'Reflect' in interface_or_attribute_or_function.extended_attributes | 
| +    if custom_element_invocation_scope: | 
| +        includes.append('core/dom/CustomElementCallbackDispatcher.h') | 
| +    parameter = { | 
| +        'custom_element_invocation_scope': custom_element_invocation_scope, | 
| +    } | 
| +    return parameter, includes | 
| + | 
| + | 
| +def get_call_with_parameter(call_with, return_void=False, function=None): | 
| +    """ | 
| +    @return arguments, template_parameter, includes | 
| +    """ | 
| +    if not call_with: | 
| +        return [], {}, [] | 
| + | 
| +    if return_void: | 
| +        script_state_return_value = '' | 
| +    else: | 
| +        script_state_return_value = ' v8Undefined()' | 
| + | 
| +    script_state = extended_attribute_contains(call_with, 'ScriptState') | 
| +    script_execution_context = extended_attribute_contains(call_with, 'ScriptExecutionContext') | 
| +    script_arguments = extended_attribute_contains(call_with, 'ScriptArguments') | 
| +    active_window = extended_attribute_contains(call_with, 'ActiveWindow') | 
| +    first_window = extended_attribute_contains(call_with, 'FirstWindow') | 
| + | 
| +    call_with_arguments = [] | 
| +    if script_state: | 
| +        call_with_arguments.append('&state') | 
| +    if script_execution_context: | 
| +        call_with_arguments.append('scriptContext') | 
| +    if function and script_arguments: | 
| +        call_with_arguments.append('scriptArguments.release()') | 
| +        includes = ['bindings/v8/ScriptCallStackFactory.h', | 
| +                    'core/inspector/ScriptArguments.h'] | 
| +    else: | 
| +        includes = [] | 
| +    if active_window: | 
| +        call_with_arguments.append('activeDOMWindow()') | 
| +    if first_window: | 
| +        call_with_arguments.append('firstDOMWindow()') | 
| + | 
| +    template_parameter = { | 
| +        'script_state_return_value': script_state_return_value, | 
| +        'script_state': script_state, | 
| +        'script_execution_context': script_execution_context, | 
| +        'function': function, | 
| +        'number_of_function_parameters': len(function.arguments) if function else 0, | 
| +    } | 
| +    return call_with_arguments, template_parameter, includes | 
|  |