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, \&parametersHandler, $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