18abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# Copyright (C) 2013 Google Inc. All rights reserved.
28abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#
38abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# Redistribution and use in source and binary forms, with or without
48abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# modification, are permitted provided that the following conditions are
58abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# met:
68abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#
78abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#     * Redistributions of source code must retain the above copyright
88abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# notice, this list of conditions and the following disclaimer.
98abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#     * Redistributions in binary form must reproduce the above
108abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# copyright notice, this list of conditions and the following disclaimer
118abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# in the documentation and/or other materials provided with the
128abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# distribution.
138abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#     * Neither the name of Google Inc. nor the names of its
148abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# contributors may be used to endorse or promote products derived from
158abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# this software without specific prior written permission.
168abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#
178abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
188abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
198abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
208abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
218abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
228abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
238abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
248abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
258abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
268abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
278abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
288abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
299bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)"""Functions shared by various parts of the code generator.
309bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
31e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)Extends IdlTypeBase type with |enum_validation_expression| property.
32d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
33d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)Design doc: http://www.chromium.org/developers/design-documents/idl-compiler
349bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)"""
359bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)import re
37f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
38e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)from idl_types import IdlTypeBase
39d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)import idl_types
40f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)from v8_globals import includes
418abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)import v8_types
428abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)ACRONYMS = [
445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    'CSSOM',  # must come *before* CSS to match full acronym
455d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    'CSS',
465d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    'HTML',
475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    'IME',
485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    'JS',
495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    'SVG',
505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    'URL',
515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    'WOFF',
525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    'XML',
535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    'XSLT',
545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)]
558abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
568abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
5709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)################################################################################
5809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)# Extended attribute parsing
5909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)################################################################################
6009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccidef extended_attribute_value_contains(extended_attribute_value, key):
627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return (extended_attribute_value == key or
637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            (isinstance(extended_attribute_value, list) and
647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci             key in extended_attribute_value))
6551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
6651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
671e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)def has_extended_attribute(definition_or_member, extended_attribute_list):
681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return any(extended_attribute in definition_or_member.extended_attributes
691e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)               for extended_attribute in extended_attribute_list)
708abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
71bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
7251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)def has_extended_attribute_value(definition_or_member, name, value):
7351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    extended_attributes = definition_or_member.extended_attributes
7451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return (name in extended_attributes and
7551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            extended_attribute_value_contains(extended_attributes[name], value))
76bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
77bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccidef extended_attribute_value_as_list(definition_or_member, name):
79e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    extended_attributes = definition_or_member.extended_attributes
80e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if name not in extended_attributes:
817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return None
827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    value = extended_attributes[name]
837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if isinstance(value, list):
847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return value
857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return [value]
86e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
87e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
8809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)################################################################################
8951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)# String handling
9009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)################################################################################
9109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
92bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)def capitalize(name):
93bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    """Capitalize first letter or initial acronym (used in setter names)."""
94bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    for acronym in ACRONYMS:
95bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        if name.startswith(acronym.lower()):
96bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            return name.replace(acronym.lower(), acronym)
97bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return name[0].upper() + name[1:]
988abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
998abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
100f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)def strip_suffix(string, suffix):
101f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if not suffix or not string.endswith(suffix):
102f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return string
103f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return string[:-len(suffix)]
104f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
105f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
1061e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)def uncapitalize(name):
10751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    """Uncapitalizes first letter or initial acronym (used in method names).
1081e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
1091e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    E.g., 'SetURL' becomes 'setURL', but 'URLFoo' becomes 'urlFoo'.
1101e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    """
1111e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    for acronym in ACRONYMS:
1121e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if name.startswith(acronym):
11309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return name.replace(acronym, acronym.lower())
1141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return name[0].lower() + name[1:]
1151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
1161e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
11709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)################################################################################
11851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)# C++
11909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)################################################################################
12009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
121f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)def enum_validation_expression(idl_type):
122d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    # FIXME: Add IdlEnumType, move property to derived type, and remove this check
123d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if not idl_type.is_enum:
124f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        return None
125f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return ' || '.join(['string == "%s"' % enum_value
126d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                        for enum_value in idl_type.enum_values])
127e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)IdlTypeBase.enum_validation_expression = property(enum_validation_expression)
128f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
129f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
13051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)def scoped_name(interface, definition, base_name):
131e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if 'ImplementedInPrivateScript' in definition.extended_attributes:
132e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return '%s::PrivateScript::%s' % (v8_class_name(interface), base_name)
133a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    # partial interfaces are implemented as separate classes, with their members
134a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    # implemented as static member functions
135a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    partial_interface_implemented_as = definition.extended_attributes.get('PartialInterfaceImplementedAs')
136a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if partial_interface_implemented_as:
137a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return '%s::%s' % (partial_interface_implemented_as, base_name)
1386f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (definition.is_static or
1396f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        definition.name in ('Constructor', 'NamedConstructor')):
14009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return '%s::%s' % (cpp_name(interface), base_name)
14143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    return 'impl->%s' % base_name
14251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
14351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
14451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)def v8_class_name(interface):
14551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return v8_types.v8_type(interface.name)
14651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
14751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
14809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)################################################################################
14909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)# Specific extended attributes
15009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)################################################################################
15109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)# [ActivityLogging]
153f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liudef activity_logging_world_list(member, access_type=''):
154bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    """Returns a set of world suffixes for which a definition member has activity logging, for specified access type.
1558abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
1561e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    access_type can be 'Getter' or 'Setter' if only checking getting or setting.
1571e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    """
158f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    extended_attributes = member.extended_attributes
159f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if 'LogActivity' not in extended_attributes:
160bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return set()
161f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    log_activity = extended_attributes['LogActivity']
162f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if log_activity and not log_activity.startswith(access_type):
163bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return set()
164f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
165197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    includes.add('bindings/core/v8/V8DOMActivityLogger.h')
166f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if 'LogAllWorlds' in extended_attributes:
167f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return set(['', 'ForMainWorld'])
168f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return set([''])  # At minimum, include isolated worlds.
1691e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
1701e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
1715d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)# [ActivityLogging]
1725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)def activity_logging_world_check(member):
1735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    """Returns if an isolated world check is required when generating activity
1745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    logging code.
1755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    The check is required when there is no per-world binding code and logging is
1775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    required only for isolated world.
1785d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    """
1795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    extended_attributes = member.extended_attributes
1805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if 'LogActivity' not in extended_attributes:
1815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return False
1825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if ('PerWorldBindings' not in extended_attributes and
1835d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        'LogAllWorlds' not in extended_attributes):
1845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return True
1855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return False
1865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1881e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)# [CallWith]
1891e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)CALL_WITH_ARGUMENTS = {
190d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    'ScriptState': 'scriptState',
1915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    'ExecutionContext': 'executionContext',
1921e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'ScriptArguments': 'scriptArguments.release()',
193d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    'ActiveWindow': 'callingDOMWindow(info.GetIsolate())',
194d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    'FirstWindow': 'enteredDOMWindow(info.GetIsolate())',
1955d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    'Document': 'document',
1961e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
1971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)# List because key order matters, as we want arguments in deterministic order
1981e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)CALL_WITH_VALUES = [
1991e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'ScriptState',
2001e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'ExecutionContext',
2011e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'ScriptArguments',
2021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'ActiveWindow',
2031e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'FirstWindow',
2045d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    'Document',
2051e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)]
2061e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
2071e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
2085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)def call_with_arguments(call_with_values):
209bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if not call_with_values:
2101e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return []
2111e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return [CALL_WITH_ARGUMENTS[value]
2121e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            for value in CALL_WITH_VALUES
213bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            if extended_attribute_value_contains(call_with_values, value)]
2141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
2151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
2161e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)# [Conditional]
217e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)DELIMITER_TO_OPERATOR = {
218e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    '|': '||',
219e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ',': '&&',
220e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
221e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
222e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
22351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)def conditional_string(definition_or_member):
22451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    extended_attributes = definition_or_member.extended_attributes
22551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if 'Conditional' not in extended_attributes:
2261e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return None
2277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return 'ENABLE(%s)' % extended_attributes['Conditional']
2288abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
2298abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
2301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)# [DeprecateAs]
23151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)def deprecate_as(member):
23251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    extended_attributes = member.extended_attributes
23351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if 'DeprecateAs' not in extended_attributes:
23451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return None
23551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    includes.add('core/frame/UseCounter.h')
23651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return extended_attributes['DeprecateAs']
23751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
23851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
239e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)# [Exposed]
240e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)EXPOSED_EXECUTION_CONTEXT_METHOD = {
241e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    'DedicatedWorker': 'isDedicatedWorkerGlobalScope',
242e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    'ServiceWorker': 'isServiceWorkerGlobalScope',
243e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    'SharedWorker': 'isSharedWorkerGlobalScope',
244e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    'Window': 'isDocument',
245e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    'Worker': 'isWorkerGlobalScope',
246e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
247e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
248e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
249e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)def exposed(definition_or_member, interface):
2507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    exposure_set = extended_attribute_value_as_list(definition_or_member, 'Exposed')
251e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if not exposure_set:
252e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return None
253e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
254e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    interface_exposure_set = expanded_exposure_set_for_interface(interface)
255e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
256e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    # Methods must not be exposed to a broader scope than their interface.
257e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if not set(exposure_set).issubset(interface_exposure_set):
258e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        raise ValueError('Interface members\' exposure sets must be a subset of the interface\'s.')
259e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
260e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    exposure_checks = []
261e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    for environment in exposure_set:
262e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        # Methods must be exposed on one of the scopes known to Blink.
263e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if environment not in EXPOSED_EXECUTION_CONTEXT_METHOD:
264e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            raise ValueError('Values for the [Exposed] annotation must reflect to a valid exposure scope.')
265e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
266e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exposure_checks.append('context->%s()' % EXPOSED_EXECUTION_CONTEXT_METHOD[environment])
267e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
268e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return ' || '.join(exposure_checks)
269e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
270e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
271e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)def expanded_exposure_set_for_interface(interface):
2727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    exposure_set = extended_attribute_value_as_list(interface, 'Exposed')
273e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
274e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    # "Worker" is an aggregation for the different kinds of workers.
275e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if 'Worker' in exposure_set:
276e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exposure_set.extend(('DedicatedWorker', 'SharedWorker', 'ServiceWorker'))
277e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
278e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return sorted(set(exposure_set))
279e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
280e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
2816f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch# [GarbageCollected], [WillBeGarbageCollected]
2826f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochdef gc_type(definition):
2836f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    extended_attributes = definition.extended_attributes
2846f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if 'GarbageCollected' in extended_attributes:
2856f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return 'GarbageCollectedObject'
2866f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    elif 'WillBeGarbageCollected' in extended_attributes:
2876f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return 'WillBeGarbageCollectedObject'
2886f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    return 'RefCountedObject'
2896f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
2906f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
29151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)# [ImplementedAs]
29251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)def cpp_name(definition_or_member):
29351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    extended_attributes = definition_or_member.extended_attributes
29451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if 'ImplementedAs' not in extended_attributes:
29551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return definition_or_member.name
29651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return extended_attributes['ImplementedAs']
29751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
29851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
29951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)# [MeasureAs]
30051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)def measure_as(definition_or_member):
30151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    extended_attributes = definition_or_member.extended_attributes
30251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if 'MeasureAs' not in extended_attributes:
30351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return None
30451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    includes.add('core/frame/UseCounter.h')
30551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return extended_attributes['MeasureAs']
3061e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
3071e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
308bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)# [PerContextEnabled]
309bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)def per_context_enabled_function_name(definition_or_member):
310bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    extended_attributes = definition_or_member.extended_attributes
311bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if 'PerContextEnabled' not in extended_attributes:
312bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return None
313bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    feature_name = extended_attributes['PerContextEnabled']
314bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return 'ContextFeatures::%sEnabled' % uncapitalize(feature_name)
315bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
316bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
3171e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)# [RuntimeEnabled]
3181e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)def runtime_enabled_function_name(definition_or_member):
3191e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    """Returns the name of the RuntimeEnabledFeatures function.
3208abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
3218abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    The returned function checks if a method/attribute is enabled.
3221e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    Given extended attribute RuntimeEnabled=FeatureName, return:
3238abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        RuntimeEnabledFeatures::{featureName}Enabled
3248abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    """
3251e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    extended_attributes = definition_or_member.extended_attributes
3261e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if 'RuntimeEnabled' not in extended_attributes:
3271e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return None
3281e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    feature_name = extended_attributes['RuntimeEnabled']
3298abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return 'RuntimeEnabledFeatures::%sEnabled' % uncapitalize(feature_name)
330