18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#!/usr/bin/perl -w 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project# Copyright (C) 2005, 2006, 2007, 2009 Apple Inc. All rights reserved. 4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project# Copyright (C) 2009, Julien Chaffraix <jchaffraix@webkit.org> 55f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian# Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) 62daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# Copyright (C) 2011 Ericsson AB. All rights reserved. 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Redistribution and use in source and binary forms, with or without 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# modification, are permitted provided that the following conditions 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# are met: 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# 1. Redistributions of source code must retain the above copyright 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# notice, this list of conditions and the following disclaimer. 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# 2. Redistributions in binary form must reproduce the above copyright 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# notice, this list of conditions and the following disclaimer in the 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# documentation and/or other materials provided with the distribution. 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# its contributors may be used to endorse or promote products derived 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# from this software without specific prior written permission. 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectuse strict; 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectuse Config; 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectuse Getopt::Long; 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectuse File::Path; 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectuse IO::File; 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectuse InFilesParser; 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 40e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkesub readTags($$); 41e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkesub readAttrs($$); 42e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy $printFactory = 0; 445e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockmy $printWrapperFactory = 0; 455e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockmy $printWrapperFactoryV8 = 0; 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy $tagsFile = ""; 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy $attrsFile = ""; 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy $outputDir = "."; 49e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkemy %parsedTags = (); 50e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkemy %parsedAttrs = (); 51e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkemy %enabledTags = (); 52e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkemy %enabledAttrs = (); 53e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkemy %allTags = (); 54e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkemy %allAttrs = (); 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy %parameters = (); 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy $extraDefines = 0; 57a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochmy %extensionAttrs = (); 58e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockrequire Config; 60e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockmy $gccLocation = ""; 625af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkeif ($ENV{CC}) { 635af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke $gccLocation = $ENV{CC}; 645af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke} elsif (($Config::Config{'osname'}) =~ /solaris/i) { 65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block $gccLocation = "/usr/sfw/bin/gcc"; 66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} else { 67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block $gccLocation = "/usr/bin/gcc"; 68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochmy $preprocessor = $gccLocation . " -E -x c++"; 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 71231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockGetOptions( 72231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 'tags=s' => \$tagsFile, 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 'attrs=s' => \$attrsFile, 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 'factory' => \$printFactory, 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 'outputDir=s' => \$outputDir, 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 'extraDefines=s' => \$extraDefines, 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 'preprocessor=s' => \$preprocessor, 785e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 'wrapperFactory' => \$printWrapperFactory, 795e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 'wrapperFactoryV8' => \$printWrapperFactoryV8 80231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block); 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectdie "You must specify at least one of --tags <file> or --attrs <file>" unless (length($tagsFile) || length($attrsFile)); 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 84e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkeif (length($tagsFile)) { 85e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke %allTags = %{readTags($tagsFile, 0)}; 86e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke %enabledTags = %{readTags($tagsFile, 1)}; 87e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke} 88e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 89e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkeif (length($attrsFile)) { 90e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke %allAttrs = %{readAttrs($attrsFile, 0)}; 91e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke %enabledAttrs = %{readAttrs($attrsFile, 1)}; 92e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke} 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 94231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockdie "You must specify a namespace (e.g. SVG) for <namespace>Names.h" unless $parameters{namespace}; 95231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockdie "You must specify a namespaceURI (e.g. http://www.w3.org/2000/svg)" unless $parameters{namespaceURI}; 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 97231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block$parameters{namespacePrefix} = $parameters{namespace} unless $parameters{namespacePrefix}; 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmkpath($outputDir); 100231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockmy $namesBasePath = "$outputDir/$parameters{namespace}Names"; 101231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockmy $factoryBasePath = "$outputDir/$parameters{namespace}ElementFactory"; 1025e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockmy $wrapperFactoryFileName = "$parameters{namespace}ElementWrapperFactory"; 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectprintNamesHeaderFile("$namesBasePath.h"); 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectprintNamesCppFile("$namesBasePath.cpp"); 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif ($printFactory) { 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printFactoryCppFile("$factoryBasePath.cpp"); 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printFactoryHeaderFile("$factoryBasePath.h"); 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1125e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockdie "You cannot specify both --wrapperFactory and --wrapperFactoryV8" if $printWrapperFactory && $printWrapperFactoryV8; 1135e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockmy $wrapperFactoryType = ""; 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif ($printWrapperFactory) { 1155e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block $wrapperFactoryType = "JS"; 1165e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} elsif ($printWrapperFactoryV8) { 1175e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block $wrapperFactoryType = "V8"; 1185e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} 1195e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 1205e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockif ($wrapperFactoryType) { 1215e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block printWrapperFactoryCppFile($outputDir, $wrapperFactoryType, $wrapperFactoryFileName); 1225e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block printWrapperFactoryHeaderFile($outputDir, $wrapperFactoryType, $wrapperFactoryFileName); 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project### Hash initialization 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 127231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blocksub defaultTagPropertyHash 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 129231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return ( 130231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 'constructorNeedsCreatedByParser' => 0, 131231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 'constructorNeedsFormElement' => 0, 132231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 'interfaceName' => defaultInterfaceName($_[0]), 133231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block # By default, the JSInterfaceName is the same as the interfaceName. 134231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 'JSInterfaceName' => defaultInterfaceName($_[0]), 135231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 'mapToTagName' => '', 136231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 'wrapperOnlyIfMediaIsAvailable' => 0, 137231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 'conditional' => 0 138231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ); 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 141231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blocksub defaultParametersHash 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 143231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return ( 144231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 'namespace' => '', 145231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 'namespacePrefix' => '', 146231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 'namespaceURI' => '', 147231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 'guardFactoryWith' => '', 148231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 'tagsNullNamespace' => 0, 149d0825bca7fe65beaee391d30da42e937db621564Steve Block 'attrsNullNamespace' => 0 150231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ); 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 153635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectsub defaultInterfaceName 154635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 155231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block die "No namespace found" if !$parameters{namespace}; 156231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return $parameters{namespace} . upperCaseName($_[0]) . "Element" 157635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 158635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project### Parsing handlers 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub tagsHandler 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my ($tag, $property, $value) = @_; 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project $tag =~ s/-/_/g; 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 167231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block # Initialize default property values. 168e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke $parsedTags{$tag} = { defaultTagPropertyHash($tag) } if !defined($parsedTags{$tag}); 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ($property) { 171e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke die "Unknown property $property for tag $tag\n" if !defined($parsedTags{$tag}{$property}); 172231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 173231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block # The code relies on JSInterfaceName deriving from interfaceName to check for custom JSInterfaceName. 174231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block # So override JSInterfaceName if it was not already set. 175e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke $parsedTags{$tag}{JSInterfaceName} = $value if $property eq "interfaceName" && $parsedTags{$tag}{JSInterfaceName} eq $parsedTags{$tag}{interfaceName}; 176231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 177e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke $parsedTags{$tag}{$property} = $value; 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub attrsHandler 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my ($attr, $property, $value) = @_; 184a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch # Translate HTML5 extension attributes of the form 'x-webkit-feature' to 'webkitfeature'. 185a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch # We don't just check for the 'x-' prefix because there are attributes such as x-height 186a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch # which should follow the default path below. 187a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if ($attr =~ m/^x-webkit-(.*)/) { 188a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch my $newAttr = "webkit$1"; 189a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch $extensionAttrs{$newAttr} = $attr; 190a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch $attr = $newAttr; 191a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch } 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project $attr =~ s/-/_/g; 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project # Initialize default properties' values. 195e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke $parsedAttrs{$attr} = {} if !defined($parsedAttrs{$attr}); 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ($property) { 198e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke die "Unknown property $property for attribute $attr\n" if !defined($parsedAttrs{$attr}{$property}); 199e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke $parsedAttrs{$attr}{$property} = $value; 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub parametersHandler 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my ($parameter, $value) = @_; 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project # Initialize default properties' values. 208231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block %parameters = defaultParametersHash() if !(keys %parameters); 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project die "Unknown parameter $parameter for tags/attrs\n" if !defined($parameters{$parameter}); 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project $parameters{$parameter} = $value; 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project## Support routines 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 216e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkesub preprocessorCommand() 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 218e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return $preprocessor if $extraDefines eq 0; 219e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return $preprocessor . " -D" . join(" -D", split(" ", $extraDefines)); 220e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke} 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 222e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkesub readNames($$$$) 223e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{ 224e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke my ($namesFile, $hashToFillRef, $handler, $usePreprocessor) = @_; 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 226e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke my $names = new IO::File; 227e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if ($usePreprocessor) { 228e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke open($names, preprocessorCommand() . " " . $namesFile . "|") or die "Failed to open file: $namesFile"; 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 230e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke open($names, $namesFile) or die "Failed to open file: $namesFile"; 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my $InParser = InFilesParser->new(); 234e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke $InParser->parse($names, \¶metersHandler, $handler); 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project close($names); 237e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke die "Failed to read names from file: $namesFile" if (keys %{$hashToFillRef} == 0); 238e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return $hashToFillRef; 239e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke} 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 241e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkesub readAttrs($$) 242e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{ 243e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke my ($namesFile, $usePreprocessor) = @_; 244e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke %parsedAttrs = (); 245e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return readNames($namesFile, \%parsedAttrs, \&attrsHandler, $usePreprocessor); 246e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke} 247e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 248e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkesub readTags($$) 249e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{ 250e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke my ($namesFile, $usePreprocessor) = @_; 251e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke %parsedTags = (); 252e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return readNames($namesFile, \%parsedTags, \&tagsHandler, $usePreprocessor); 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub printMacros 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my ($F, $macro, $suffix, $namesRef) = @_; 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my %names = %$namesRef; 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for my $name (sort keys %$namesRef) { 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print F "$macro $name","$suffix;\n"; 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qiansub usesDefaultWrapper 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian my $tagName = shift; 268231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return $tagName eq $parameters{namespace} . "Element"; 2698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian# Build a direct mapping from the tags to the Element to create, excluding 2728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian# Element that have not constructor. 2738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qiansub buildConstructorMap 2748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 2758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian my %tagConstructorMap = (); 276e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke for my $tagName (keys %enabledTags) { 277e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke my $interfaceName = $enabledTags{$tagName}{interfaceName}; 2788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian next if (usesDefaultWrapper($interfaceName)); 2798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 280e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if ($enabledTags{$tagName}{mapToTagName}) { 281e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke die "Cannot handle multiple mapToTagName for $tagName\n" if $enabledTags{$enabledTags{$tagName}{mapToTagName}}{mapToTagName}; 282e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke $interfaceName = $enabledTags{ $enabledTags{$tagName}{mapToTagName} }{interfaceName}; 283635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian # Chop the string to keep the interesting part. 286231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block $interfaceName =~ s/$parameters{namespace}(.*)Element/$1/; 2878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian $tagConstructorMap{$tagName} = lc($interfaceName); 2888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 2898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return %tagConstructorMap; 2918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 2928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian# Helper method that print the constructor's signature avoiding 2948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian# unneeded arguments. 2958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qiansub printConstructorSignature 2968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 2978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian my ($F, $tagName, $constructorName, $constructorTagName) = @_; 2988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 299231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block print F "static PassRefPtr<$parameters{namespace}Element> ${constructorName}Constructor(const QualifiedName& $constructorTagName, Document* document"; 300231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if ($parameters{namespace} eq "HTML") { 3018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian print F ", HTMLFormElement*"; 302e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke print F " formElement" if $enabledTags{$tagName}{constructorNeedsFormElement}; 3038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian print F ", bool"; 305e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke print F " createdByParser" if $enabledTags{$tagName}{constructorNeedsCreatedByParser}; 3068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian print F ")\n{\n"; 3078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 3088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian# Helper method to dump the constructor interior and call the 3108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian# Element constructor with the right arguments. 3118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian# The variable names should be kept in sync with the previous method. 3128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qiansub printConstructorInterior 3138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 3148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian my ($F, $tagName, $interfaceName, $constructorTagName) = @_; 3158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian # Handle media elements. 317e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if ($enabledTags{$tagName}{wrapperOnlyIfMediaIsAvailable}) { 3188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian print F <<END 319dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Settings* settings = document->settings(); 320dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!MediaPlayer::isAvailable() || (settings && !settings->isMediaEnabled())) 321231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return HTMLElement::create($constructorTagName, document); 322dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 3238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianEND 3248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian; 3258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 327231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block # Call the constructor with the right parameters. 3285ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen print F " return ${interfaceName}::create($constructorTagName, document"; 329e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke print F ", formElement" if $enabledTags{$tagName}{constructorNeedsFormElement}; 330e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke print F ", createdByParser" if $enabledTags{$tagName}{constructorNeedsCreatedByParser}; 3318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian print F ");\n}\n\n"; 3328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 3338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qiansub printConstructors 3358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 3368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian my ($F, $tagConstructorMapRef) = @_; 3378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian my %tagConstructorMap = %$tagConstructorMapRef; 3388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian # This is to avoid generating the same constructor several times. 3408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian my %uniqueTags = (); 3418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian for my $tagName (sort keys %tagConstructorMap) { 342e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke my $interfaceName = $enabledTags{$tagName}{interfaceName}; 3438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian # Ignore the mapped tag 3458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian # FIXME: It could be moved inside this loop but was split for readibility. 346e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke next if (defined($uniqueTags{$interfaceName}) || $enabledTags{$tagName}{mapToTagName}); 3478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian $uniqueTags{$interfaceName} = '1'; 3498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 350e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke my $conditional = $enabledTags{$tagName}{conditional}; 3515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if ($conditional) { 3525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian my $conditionalString = "ENABLE(" . join(") && ENABLE(", split(/&/, $conditional)) . ")"; 3535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian print F "#if ${conditionalString}\n\n"; 3545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 3555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian printConstructorSignature($F, $tagName, $tagConstructorMap{$tagName}, "tagName"); 3578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian printConstructorInterior($F, $tagName, $interfaceName, "tagName"); 3585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if ($conditional) { 360231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block print F "#endif\n"; 3615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 3628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian # Mapped tag name uses a special wrapper to keep their prefix and namespaceURI while using the mapped localname. 3658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian for my $tagName (sort keys %tagConstructorMap) { 366e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if ($enabledTags{$tagName}{mapToTagName}) { 367e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke my $mappedName = $enabledTags{$tagName}{mapToTagName}; 3688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian printConstructorSignature($F, $mappedName, $mappedName . "To" . $tagName, "tagName"); 369e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke printConstructorInterior($F, $mappedName, $enabledTags{$mappedName}{interfaceName}, "QualifiedName(tagName.prefix(), ${mappedName}Tag.localName(), tagName.namespaceURI())"); 370635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub printFunctionInits 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian my ($F, $tagConstructorMap) = @_; 3778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian my %tagConstructorMap = %$tagConstructorMap; 3788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian for my $tagName (sort keys %tagConstructorMap) { 3805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 381e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke my $conditional = $enabledTags{$tagName}{conditional}; 3825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if ($conditional) { 3835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian my $conditionalString = "ENABLE(" . join(") && ENABLE(", split(/&/, $conditional)) . ")"; 3845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian print F "#if ${conditionalString}\n"; 3855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 3865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 387e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if ($enabledTags{$tagName}{mapToTagName}) { 388e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke print F " addTag(${tagName}Tag, $enabledTags{$tagName}{mapToTagName}To${tagName}Constructor);\n"; 3898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } else { 3908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian print F " addTag(${tagName}Tag, $tagConstructorMap{$tagName}Constructor);\n"; 3918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 3925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if ($conditional) { 3945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian print F "#endif\n\n"; 3955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub svgCapitalizationHacks 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my $name = shift; 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 403231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block $name = "FE" . ucfirst $1 if $name =~ /^fe(.+)$/; 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return $name; 4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub upperCaseName 4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my $name = shift; 4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 412231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block $name = svgCapitalizationHacks($name) if ($parameters{namespace} eq "SVG"); 4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while ($name =~ /^(.*?)_(.*)/) { 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project $name = $1 . ucfirst $2; 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ucfirst $name; 4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub printLicenseHeader 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my $F = shift; 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print F "/* 425231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * THIS FILE WAS AUTOMATICALLY GENERATED, DO NOT EDIT. 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 427231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * This file was generated by the dom/make_names.pl script. 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 429231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 450231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project"; 4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub printNamesHeaderFile 4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my ($headerPath) = shift; 4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my $F; 4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project open F, ">$headerPath"; 461231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printLicenseHeader($F); 463231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block print F "#ifndef DOM_$parameters{namespace}NAMES_H\n"; 464231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block print F "#define DOM_$parameters{namespace}NAMES_H\n\n"; 4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print F "#include \"QualifiedName.h\"\n\n"; 466231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 467231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block print F "namespace WebCore {\n\n namespace $parameters{namespace}Names {\n\n"; 468231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 469231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block my $lowerNamespace = lc($parameters{namespacePrefix}); 470231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block print F "#ifndef DOM_$parameters{namespace}NAMES_HIDE_GLOBALS\n"; 4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print F "// Namespace\n"; 472dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch print F "extern const WTF::AtomicString ${lowerNamespace}NamespaceURI;\n\n"; 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 474e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (keys %allTags) { 4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print F "// Tags\n"; 476e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke printMacros($F, "extern const WebCore::QualifiedName", "Tag", \%allTags); 4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 479e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (keys %allAttrs) { 4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print F "// Attributes\n"; 481e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke printMacros($F, "extern const WebCore::QualifiedName", "Attr", \%allAttrs); 4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print F "#endif\n\n"; 484231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 485e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (keys %allTags) { 486231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block print F "WebCore::QualifiedName** get$parameters{namespace}Tags(size_t* size);\n"; 487635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 488635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 489e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (keys %allAttrs) { 490231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block print F "WebCore::QualifiedName** get$parameters{namespace}Attrs(size_t* size);\n"; 491635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 492231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 493635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project print F "\nvoid init();\n\n"; 4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print F "} }\n\n"; 4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print F "#endif\n\n"; 496231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project close F; 4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub printNamesCppFile 5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my $cppPath = shift; 5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my $F; 5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project open F, ">$cppPath"; 5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printLicenseHeader($F); 5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 508231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block my $lowerNamespace = lc($parameters{namespacePrefix}); 5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprint F "#include \"config.h\"\n"; 5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprint F "#ifdef SKIP_STATIC_CONSTRUCTORS_ON_GCC\n"; 513231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockprint F "#define DOM_$parameters{namespace}NAMES_HIDE_GLOBALS 1\n"; 5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprint F "#else\n"; 5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprint F "#define QNAME_DEFAULT_CONSTRUCTOR 1\n"; 5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprint F "#endif\n\n"; 5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 519231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockprint F "#include \"$parameters{namespace}Names.h\"\n\n"; 520dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockprint F "#include <wtf/StaticConstructors.h>\n"; 5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 522231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockprint F "namespace WebCore {\n\n namespace $parameters{namespace}Names { 5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WebCore; 5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 526231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockDEFINE_GLOBAL(AtomicString, ${lowerNamespace}NamespaceURI, \"$parameters{namespaceURI}\") 5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project"; 5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 529e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (keys %allTags) { 5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print F "// Tags\n"; 531e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke for my $name (sort keys %allTags) { 5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print F "DEFINE_GLOBAL(QualifiedName, ", $name, "Tag, nullAtom, \"$name\", ${lowerNamespace}NamespaceURI);\n"; 5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 535231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block print F "\n\nWebCore::QualifiedName** get$parameters{namespace}Tags(size_t* size)\n"; 536231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block print F "{\n static WebCore::QualifiedName* $parameters{namespace}Tags[] = {\n"; 537e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke for my $name (sort keys %allTags) { 5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print F " (WebCore::QualifiedName*)&${name}Tag,\n"; 5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print F " };\n"; 541e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke print F " *size = ", scalar(keys %allTags), ";\n"; 542231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block print F " return $parameters{namespace}Tags;\n"; 5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print F "}\n"; 5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 546e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (keys %allAttrs) { 5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print F "\n// Attributes\n"; 548e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke for my $name (sort keys %allAttrs) { 5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print F "DEFINE_GLOBAL(QualifiedName, ", $name, "Attr, nullAtom, \"$name\", ${lowerNamespace}NamespaceURI);\n"; 5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 551231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block print F "\n\nWebCore::QualifiedName** get$parameters{namespace}Attrs(size_t* size)\n"; 552231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block print F "{\n static WebCore::QualifiedName* $parameters{namespace}Attr[] = {\n"; 553e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke for my $name (sort keys %allAttrs) { 5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print F " (WebCore::QualifiedName*)&${name}Attr,\n"; 5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print F " };\n"; 557e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke print F " *size = ", scalar(keys %allAttrs), ";\n"; 558231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block print F " return $parameters{namespace}Attr;\n"; 5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print F "}\n"; 5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprint F "\nvoid init() 5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static bool initialized = false; 5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (initialized) 5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project initialized = true; 5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Use placement new to initialize the globals. 5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project AtomicString::init(); 5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project"; 5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 574231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block print(F " AtomicString ${lowerNamespace}NS(\"$parameters{namespaceURI}\");\n\n"); 5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print(F " // Namespace\n"); 5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print(F " new ((void*)&${lowerNamespace}NamespaceURI) AtomicString(${lowerNamespace}NS);\n\n"); 578e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (keys %allTags) { 579231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block my $tagsNamespace = $parameters{tagsNullNamespace} ? "nullAtom" : "${lowerNamespace}NS"; 580e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke printDefinitions($F, \%allTags, "tags", $tagsNamespace); 5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 582e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (keys %allAttrs) { 583231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block my $attrsNamespace = $parameters{attrsNullNamespace} ? "nullAtom" : "${lowerNamespace}NS"; 584e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke printDefinitions($F, \%allAttrs, "attributes", $attrsNamespace); 5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print F "}\n\n} }\n\n"; 5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project close F; 5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub printJSElementIncludes 5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 593635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project my $F = shift; 5945e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block my $wrapperFactoryType = shift; 595635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 596635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project my %tagsSeen; 597e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke for my $tagName (sort keys %enabledTags) { 598e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke my $JSInterfaceName = $enabledTags{$tagName}{JSInterfaceName}; 599635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project next if defined($tagsSeen{$JSInterfaceName}) || usesDefaultJSWrapper($tagName); 6002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if ($enabledTags{$tagName}{conditional}) { 6012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch # We skip feature-define-specific #includes here since we handle them separately. 6022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch next; 6032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 604635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project $tagsSeen{$JSInterfaceName} = 1; 6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6065e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block print F "#include \"${wrapperFactoryType}${JSInterfaceName}.h\"\n"; 6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub printElementIncludes 6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 612635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project my $F = shift; 6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 614635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project my %tagsSeen; 615e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke for my $tagName (sort keys %enabledTags) { 616e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke my $interfaceName = $enabledTags{$tagName}{interfaceName}; 617635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project next if defined($tagsSeen{$interfaceName}); 6182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if ($enabledTags{$tagName}{conditional}) { 6192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch # We skip feature-define-specific #includes here since we handle them separately. 6202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch next; 6212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 622635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project $tagsSeen{$interfaceName} = 1; 623635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 624635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project print F "#include \"${interfaceName}.h\"\n"; 6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochsub printConditionalElementIncludes 6292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 6302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch my ($F, $wrapperFactoryType) = @_; 6312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 6322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch my %conditionals; 6332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch my %unconditionalElementIncludes; 6342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch my %unconditionalJSElementIncludes; 6352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 6362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for my $tagName (keys %enabledTags) { 6372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch my $conditional = $enabledTags{$tagName}{conditional}; 6382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch my $interfaceName = $enabledTags{$tagName}{interfaceName}; 6392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch my $JSInterfaceName = $enabledTags{$tagName}{JSInterfaceName}; 6402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 6412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if ($conditional) { 6422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch $conditionals{$conditional}{interfaceNames}{$interfaceName} = 1; 6432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch $conditionals{$conditional}{JSInterfaceNames}{$JSInterfaceName} = 1; 6442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } else { 6452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch $unconditionalElementIncludes{$interfaceName} = 1; 6462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch $unconditionalJSElementIncludes{$JSInterfaceName} = 1; 6472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 6482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 6492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 6502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for my $conditional (sort keys %conditionals) { 6512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch print F "\n#if ENABLE($conditional)\n"; 6522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for my $interfaceName (sort keys %{$conditionals{$conditional}{interfaceNames}}) { 6532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch next if $unconditionalElementIncludes{$interfaceName}; 6542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch print F "#include \"$interfaceName.h\"\n"; 6552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 6562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if ($wrapperFactoryType) { 6572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for my $JSInterfaceName (sort keys %{$conditionals{$conditional}{JSInterfaceNames}}) { 6582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch next if $unconditionalJSElementIncludes{$JSInterfaceName}; 6592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch print F "#include \"$wrapperFactoryType$JSInterfaceName.h\"\n"; 6602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 6612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 6622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch print F "#endif\n"; 6632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 6642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 6652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub printDefinitions 6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my ($F, $namesRef, $type, $namespaceURI) = @_; 6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my $singularType = substr($type, 0, -1); 6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my $shortType = substr($singularType, 0, 4); 6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my $shortCamelType = ucfirst($shortType); 6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my $shortUpperType = uc($shortType); 6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print F " // " . ucfirst($type) . "\n"; 6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for my $name (sort keys %$namesRef) { 677a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch my $realName = $extensionAttrs{$name}; 678a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (!$realName) { 679a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch $realName = $name; 680a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch $realName =~ s/_/-/g; 681a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch } 682d0825bca7fe65beaee391d30da42e937db621564Steve Block print F " new ((void*)&$name","${shortCamelType}) QualifiedName(nullAtom, \"$realName\", $namespaceURI);\n"; 6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project## ElementFactory routines 6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub printFactoryCppFile 6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my $cppPath = shift; 6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my $F; 6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project open F, ">$cppPath"; 6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectprintLicenseHeader($F); 6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprint F <<END 6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectEND 6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project; 7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 701e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkeprint F "\n#if $parameters{guardFactoryWith}\n\n" if $parameters{guardFactoryWith}; 702e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 703f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickprint F <<END 704f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include "$parameters{namespace}ElementFactory.h" 705f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include "$parameters{namespace}Names.h" 706f486d19d62f1bc33246748b14b14a9dfa617b57fIain MerrickEND 707f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick; 708f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 709635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectprintElementIncludes($F); 7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochprint F "\n#include <wtf/HashMap.h>\n"; 7122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 7132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochprintConditionalElementIncludes($F); 7142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprint F <<END 7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 717dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ENABLE(DASHBOARD_SUPPORT) || ENABLE(VIDEO) 718231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "Document.h" 719231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "Settings.h" 720231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 721231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 7228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qiannamespace WebCore { 7238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 724231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockusing namespace $parameters{namespace}Names; 7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 726635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectEND 727635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project; 728635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 729231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockprint F "typedef PassRefPtr<$parameters{namespace}Element> (*ConstructorFunction)(const QualifiedName&, Document*"; 730231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockprint F ", HTMLFormElement*" if $parameters{namespace} eq "HTML"; 731635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectprint F ", bool createdByParser);\n"; 732635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectprint F <<END 7338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qiantypedef HashMap<AtomicStringImpl*, ConstructorFunction> FunctionMap; 7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic FunctionMap* gFunctionMap = 0; 7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectEND 7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project; 7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianmy %tagConstructorMap = buildConstructorMap(); 7418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 7428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianprintConstructors($F, \%tagConstructorMap); 7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprint F <<END 7458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianstatic void addTag(const QualifiedName& tag, ConstructorFunction func) 7468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 7478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian gFunctionMap->set(tag.localName().impl(), func); 7488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 7498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 750231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic void createFunctionMap() 7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 752231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(!gFunctionMap); 753231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Create the table. 7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project gFunctionMap = new FunctionMap; 7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Populate it with constructor functions. 7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectEND 7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project; 7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianprintFunctionInits($F, \%tagConstructorMap); 7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprint F "}\n"; 764635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 765231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockprint F "\nPassRefPtr<$parameters{namespace}Element> $parameters{namespace}ElementFactory::create$parameters{namespace}Element(const QualifiedName& qName, Document* document"; 766231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockprint F ", HTMLFormElement* formElement" if $parameters{namespace} eq "HTML"; 767635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectprint F ", bool createdByParser)\n{\n"; 7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprint F <<END 770231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!document) 7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianEND 7748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian; 7758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 776231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockif ($parameters{namespace} ne "HTML") { 7778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianprint F <<END 7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT) 779231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block Settings* settings = document->settings(); 7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (settings && settings->usesDashboardBackwardCompatibilityMode()) 7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 7838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianEND 7848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian; 7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 7878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 7888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianprint F <<END 789231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!gFunctionMap) 790231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block createFunctionMap(); 791231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (ConstructorFunction function = gFunctionMap->get(qName.localName().impl())) 7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectEND 7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project; 7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 795231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockif ($parameters{namespace} eq "HTML") { 796231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block print F " return function(qName, document, formElement, createdByParser);\n"; 797635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} else { 798231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block print F " return function(qName, document, createdByParser);\n"; 799635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 800635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 801231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockprint F " return $parameters{namespace}Element::create(qName, document);\n"; 802635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprint F <<END 8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 806635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} // namespace WebCore 8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectEND 8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project; 8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 811e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke print F "#endif\n" if $parameters{guardFactoryWith}; 812e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project close F; 8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub printFactoryHeaderFile 8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my $headerPath = shift; 8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my $F; 8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project open F, ">$headerPath"; 8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printLicenseHeader($F); 8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 824635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project print F<<END 825231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#ifndef $parameters{namespace}ElementFactory_h 826231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#define $parameters{namespace}ElementFactory_h 827635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 828dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include <wtf/Forward.h> 829635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/PassRefPtr.h> 8308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project class Element; 8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project class Document; 8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project class QualifiedName; 8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 839231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block class $parameters{namespace}Element; 840635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectEND 841635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project; 842635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 843231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockprint F " class HTMLFormElement;\n" if $parameters{namespace} eq "HTML"; 8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 845635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectprint F<<END 8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The idea behind this class is that there will eventually be a mapping from namespace URIs to ElementFactories that can dispense 847635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // elements. In a compound document world, the generic createElement function (will end up being virtual) will be called. 848231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block class $parameters{namespace}ElementFactory { 8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project public: 850635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project PassRefPtr<Element> createElement(const WebCore::QualifiedName&, WebCore::Document*, bool createdByParser = true); 851635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectEND 852635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project; 853231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockprint F " static PassRefPtr<$parameters{namespace}Element> create$parameters{namespace}Element(const WebCore::QualifiedName&, WebCore::Document*"; 854231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockprint F ", HTMLFormElement* = 0" if $parameters{namespace} eq "HTML"; 855e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkeprint F ", bool createdByParser = true);\n"; 856635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 857635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectprintf F<<END 8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 861231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif // $parameters{namespace}ElementFactory_h 8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 863635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectEND 864635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project; 8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project close F; 8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project## Wrapper Factory routines 8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 871635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectsub usesDefaultJSWrapper 8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my $name = shift; 874635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 875635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project # A tag reuses the default wrapper if its JSInterfaceName matches the default namespace Element. 876e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke return $enabledTags{$name}{JSInterfaceName} eq $parameters{namespace} . "Element" || $enabledTags{$name}{JSInterfaceName} eq "HTMLNoScriptElement"; 8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub printWrapperFunctions 8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 881635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project my $F = shift; 8825e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block my $wrapperFactoryType = shift; 883635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 884635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project my %tagsSeen; 885e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke for my $tagName (sort keys %enabledTags) { 886635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project # Avoid defining the same wrapper method twice. 887e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke my $JSInterfaceName = $enabledTags{$tagName}{JSInterfaceName}; 888635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project next if defined($tagsSeen{$JSInterfaceName}) || usesDefaultJSWrapper($tagName); 889635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project $tagsSeen{$JSInterfaceName} = 1; 8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 891e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke my $conditional = $enabledTags{$tagName}{conditional}; 8925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if ($conditional) { 8935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian my $conditionalString = "ENABLE(" . join(") && ENABLE(", split(/&/, $conditional)) . ")"; 8945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian print F "#if ${conditionalString}\n\n"; 8955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 8965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 8975e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block if ($wrapperFactoryType eq "JS") { 8985e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block # Hack for the media tags 8995e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block # FIXME: This should have been done via a CustomWrapper attribute and a separate *Custom file. 900e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if ($enabledTags{$tagName}{wrapperOnlyIfMediaIsAvailable}) { 9015e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block print F <<END 902231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic JSNode* create${JSInterfaceName}Wrapper(ExecState* exec, JSDOMGlobalObject* globalObject, PassRefPtr<$parameters{namespace}Element> element) 9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 904dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Settings* settings = element->document()->settings(); 905dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!MediaPlayer::isAvailable() || (settings && !settings->isMediaEnabled())) 906231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return CREATE_DOM_NODE_WRAPPER(exec, globalObject, $parameters{namespace}Element, element.get()); 9070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return CREATE_DOM_NODE_WRAPPER(exec, globalObject, ${JSInterfaceName}, element.get()); 9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectEND 9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project; 9125e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block } else { 9135e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block print F <<END 914231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic JSNode* create${JSInterfaceName}Wrapper(ExecState* exec, JSDOMGlobalObject* globalObject, PassRefPtr<$parameters{namespace}Element> element) 9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return CREATE_DOM_NODE_WRAPPER(exec, globalObject, ${JSInterfaceName}, element.get()); 9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectEND 9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project; 9215e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block } 9225e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block } elsif ($wrapperFactoryType eq "V8") { 923e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if ($enabledTags{$tagName}{wrapperOnlyIfMediaIsAvailable}) { 924dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block print F <<END 925dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic v8::Handle<v8::Value> create${JSInterfaceName}Wrapper($parameters{namespace}Element* element) 926dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 927dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Settings* settings = element->document()->settings(); 928dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!MediaPlayer::isAvailable() || (settings && !settings->isMediaEnabled())) 929545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return V8$parameters{namespace}Element::wrap(element); 930dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return toV8(static_cast<${JSInterfaceName}*>(element)); 931dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 932dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 933dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEND 934dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block; 935dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } else { 9365e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block print F <<END 9375e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockstatic v8::Handle<v8::Value> create${JSInterfaceName}Wrapper($parameters{namespace}Element* element) 9385e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{ 9395e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block return toV8(static_cast<${JSInterfaceName}*>(element)); 9405e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} 9415e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 942dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 9435e2bc6953fe6923165b8a5d7679939693a1d58d6Steve BlockEND 9445e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block; 945dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 947231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 9485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if ($conditional) { 9495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian print F "#endif\n\n"; 9505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 9518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub printWrapperFactoryCppFile 9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9565e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block my $outputDir = shift; 9575e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block my $wrapperFactoryType = shift; 9585e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block my $wrapperFactoryFileName = shift; 9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my $F; 9605e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block open F, ">" . $outputDir . "/" . $wrapperFactoryType . $wrapperFactoryFileName . ".cpp"; 9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printLicenseHeader($F); 9638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 964e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke print F "#include \"config.h\"\n"; 9655e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block print F "#include \"$wrapperFactoryType$parameters{namespace}ElementWrapperFactory.h\"\n"; 9668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 967e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke print F "\n#if $parameters{guardFactoryWith}\n\n" if $parameters{guardFactoryWith}; 968e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 9695e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block printJSElementIncludes($F, $wrapperFactoryType); 9708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 971231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block print F "\n#include \"$parameters{namespace}Names.h\"\n\n"; 9728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 973635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printElementIncludes($F); 9748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch print F "\n#include <wtf/StdLibExtras.h>\n"; 9762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 9772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch printConditionalElementIncludes($F, $wrapperFactoryType); 9782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 979dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block print F <<END 980dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 981dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ENABLE(VIDEO) 982dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "Document.h" 983dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "Settings.h" 984dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif 985dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 986dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEND 987dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block; 9885e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 9895e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block if ($wrapperFactoryType eq "JS") { 9905e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block print F <<END 9918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace JSC; 9925e2bc6953fe6923165b8a5d7679939693a1d58d6Steve BlockEND 9935e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block; 9945e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block } elsif ($wrapperFactoryType eq "V8") { 9955e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block print F <<END 9965e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "V8$parameters{namespace}Element.h" 9975e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 9985e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include <v8.h> 9995e2bc6953fe6923165b8a5d7679939693a1d58d6Steve BlockEND 10005e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block; 10015e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block } 10025e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 10035e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block print F <<END 10048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 10068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1007231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockusing namespace $parameters{namespace}Names; 10088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10095e2bc6953fe6923165b8a5d7679939693a1d58d6Steve BlockEND 10105e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block; 10115e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block if ($wrapperFactoryType eq "JS") { 10125e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block print F <<END 1013231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blocktypedef JSNode* (*Create$parameters{namespace}ElementWrapperFunction)(ExecState*, JSDOMGlobalObject*, PassRefPtr<$parameters{namespace}Element>); 10148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectEND 10168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project; 10175e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block } elsif ($wrapperFactoryType eq "V8") { 10185e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block print F <<END 10195e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blocktypedef v8::Handle<v8::Value> (*Create$parameters{namespace}ElementWrapperFunction)($parameters{namespace}Element*); 10205e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 10215e2bc6953fe6923165b8a5d7679939693a1d58d6Steve BlockEND 10225e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block; 10235e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block } 10248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10255e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block printWrapperFunctions($F, $wrapperFactoryType); 10268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10275e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block if ($wrapperFactoryType eq "JS") { 10285e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block print F <<END 1029231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockJSNode* createJS$parameters{namespace}Wrapper(ExecState* exec, JSDOMGlobalObject* globalObject, PassRefPtr<$parameters{namespace}Element> element) 10305e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{ 1031dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch typedef HashMap<WTF::AtomicStringImpl*, Create$parameters{namespace}ElementWrapperFunction> FunctionMap; 10325e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block DEFINE_STATIC_LOCAL(FunctionMap, map, ()); 10335e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block if (map.isEmpty()) { 10345e2bc6953fe6923165b8a5d7679939693a1d58d6Steve BlockEND 10355e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block; 10365e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block } elsif ($wrapperFactoryType eq "V8") { 10375e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block print F <<END 10385e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockv8::Handle<v8::Value> createV8$parameters{namespace}Wrapper($parameters{namespace}Element* element, bool forceNewObject) 10395e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{ 1040dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch typedef HashMap<WTF::AtomicStringImpl*, Create$parameters{namespace}ElementWrapperFunction> FunctionMap; 1041635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project DEFINE_STATIC_LOCAL(FunctionMap, map, ()); 10428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (map.isEmpty()) { 10438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectEND 10448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project; 10455e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block } 10468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1047e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke for my $tag (sort keys %enabledTags) { 1048635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project # Do not add the name to the map if it does not have a JS wrapper constructor or uses the default wrapper. 1049e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke next if usesDefaultJSWrapper($tag, \%enabledTags); 10508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1051e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke my $conditional = $enabledTags{$tag}{conditional}; 10525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if ($conditional) { 10535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian my $conditionalString = "ENABLE(" . join(") && ENABLE(", split(/&/, $conditional)) . ")"; 10545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian print F "#if ${conditionalString}\n"; 10555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 10565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1057e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke my $ucTag = $enabledTags{$tag}{JSInterfaceName}; 10588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print F " map.set(${tag}Tag.localName().impl(), create${ucTag}Wrapper);\n"; 10595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 10605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if ($conditional) { 10615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian print F "#endif\n"; 10625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 10638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print F <<END 10668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1067231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block Create$parameters{namespace}ElementWrapperFunction createWrapperFunction = map.get(element->localName().impl()); 10688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (createWrapperFunction) 10695e2bc6953fe6923165b8a5d7679939693a1d58d6Steve BlockEND 10705e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block; 10715e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block if ($wrapperFactoryType eq "JS") { 10725e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block print F <<END 10730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return createWrapperFunction(exec, globalObject, element); 1074231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return CREATE_DOM_NODE_WRAPPER(exec, globalObject, $parameters{namespace}Element, element.get()); 10755e2bc6953fe6923165b8a5d7679939693a1d58d6Steve BlockEND 10765e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block; 10775e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block } elsif ($wrapperFactoryType eq "V8") { 10785e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block print F <<END 10795e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block return createWrapperFunction(element); 10805e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block return V8$parameters{namespace}Element::wrap(element, forceNewObject); 10815e2bc6953fe6923165b8a5d7679939693a1d58d6Steve BlockEND 10825e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block; 10835e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block } 10845e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block print F <<END 10858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectEND 10908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project; 10918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1092231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block print F "#endif\n" if $parameters{guardFactoryWith}; 10938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project close F; 10958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub printWrapperFactoryHeaderFile 10988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10995e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block my $outputDir = shift; 11005e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block my $wrapperFactoryType = shift; 11015e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block my $wrapperFactoryFileName = shift; 11028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project my $F; 11035e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block open F, ">" . $outputDir . "/" . $wrapperFactoryType . $wrapperFactoryFileName . ".h"; 11048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printLicenseHeader($F); 11068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11075e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block print F "#ifndef $wrapperFactoryType$parameters{namespace}ElementWrapperFactory_h\n"; 11085e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block print F "#define $wrapperFactoryType$parameters{namespace}ElementWrapperFactory_h\n\n"; 11098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1110231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block print F "#if $parameters{guardFactoryWith}\n" if $parameters{guardFactoryWith}; 11118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11125e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block if ($wrapperFactoryType eq "JS") { 11135e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block print F <<END 11148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Forward.h> 11158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC { 11178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project class ExecState; 11188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 11218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project class JSNode; 11230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch class JSDOMGlobalObject; 1124231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block class $parameters{namespace}Element; 11258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1126231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block JSNode* createJS$parameters{namespace}Wrapper(JSC::ExecState*, JSDOMGlobalObject*, PassRefPtr<$parameters{namespace}Element>); 11278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectEND 11318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project; 11325e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block } elsif ($wrapperFactoryType eq "V8") { 11335e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block print F <<END 11345e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include <v8.h> 11355e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 11365e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blocknamespace WebCore { 11375e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 11385e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block class $parameters{namespace}Element; 11395e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 11405e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block v8::Handle<v8::Value> createV8$parameters{namespace}Wrapper($parameters{namespace}Element*, bool); 11415e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} 11425e2bc6953fe6923165b8a5d7679939693a1d58d6Steve BlockEND 11435e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block; 11445e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block } 11458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1146231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block print F "#endif // $parameters{guardFactoryWith}\n\n" if $parameters{guardFactoryWith}; 11478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11485e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block print F "#endif // $wrapperFactoryType$parameters{namespace}ElementWrapperFactory_h\n"; 11498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project close F; 11518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1152