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