diff options
Diffstat (limited to 'WebCore/dom/make_names.pl')
-rwxr-xr-x | WebCore/dom/make_names.pl | 377 |
1 files changed, 182 insertions, 195 deletions
diff --git a/WebCore/dom/make_names.pl b/WebCore/dom/make_names.pl index e6d59a0..6b5ddb4 100755 --- a/WebCore/dom/make_names.pl +++ b/WebCore/dom/make_names.pl @@ -48,28 +48,30 @@ my %parameters = (); my $extraDefines = 0; my $preprocessor = "/usr/bin/gcc -E -P -x c++"; -GetOptions('tags=s' => \$tagsFile, +GetOptions( + 'tags=s' => \$tagsFile, 'attrs=s' => \$attrsFile, 'factory' => \$printFactory, 'outputDir=s' => \$outputDir, 'extraDefines=s' => \$extraDefines, 'preprocessor=s' => \$preprocessor, - 'wrapperFactory' => \$printWrapperFactory); + 'wrapperFactory' => \$printWrapperFactory +); die "You must specify at least one of --tags <file> or --attrs <file>" unless (length($tagsFile) || length($attrsFile)); readNames($tagsFile, "tags") if length($tagsFile); readNames($attrsFile, "attrs") if length($attrsFile); -die "You must specify a namespace (e.g. SVG) for <namespace>Names.h" unless $parameters{'namespace'}; -die "You must specify a namespaceURI (e.g. http://www.w3.org/2000/svg)" unless $parameters{'namespaceURI'}; +die "You must specify a namespace (e.g. SVG) for <namespace>Names.h" unless $parameters{namespace}; +die "You must specify a namespaceURI (e.g. http://www.w3.org/2000/svg)" unless $parameters{namespaceURI}; -$parameters{'namespacePrefix'} = $parameters{'namespace'} unless $parameters{'namespacePrefix'}; +$parameters{namespacePrefix} = $parameters{namespace} unless $parameters{namespacePrefix}; mkpath($outputDir); -my $namesBasePath = "$outputDir/$parameters{'namespace'}Names"; -my $factoryBasePath = "$outputDir/$parameters{'namespace'}ElementFactory"; -my $wrapperFactoryBasePath = "$outputDir/JS$parameters{'namespace'}ElementWrapperFactory"; +my $namesBasePath = "$outputDir/$parameters{namespace}Names"; +my $factoryBasePath = "$outputDir/$parameters{namespace}ElementFactory"; +my $wrapperFactoryBasePath = "$outputDir/JS$parameters{namespace}ElementWrapperFactory"; printNamesHeaderFile("$namesBasePath.h"); printNamesCppFile("$namesBasePath.cpp"); @@ -86,39 +88,44 @@ if ($printWrapperFactory) { ### Hash initialization -sub initializeTagPropertyHash +sub defaultTagPropertyHash { - return ('constructorNeedsCreatedByParser' => 0, - 'constructorNeedsFormElement' => 0, - 'exportString' => 0, - 'interfaceName' => defaultInterfaceName($_[0]), - # By default, the JSInterfaceName is the same as the interfaceName. - 'JSInterfaceName' => defaultInterfaceName($_[0]), - 'mapToTagName' => '', - 'wrapperOnlyIfMediaIsAvailable' => 0, - 'conditional' => 0); + return ( + 'constructorNeedsCreatedByParser' => 0, + 'constructorNeedsFormElement' => 0, + 'createWithNew' => 0, + 'exportString' => 0, + 'interfaceName' => defaultInterfaceName($_[0]), + # By default, the JSInterfaceName is the same as the interfaceName. + 'JSInterfaceName' => defaultInterfaceName($_[0]), + 'mapToTagName' => '', + 'wrapperOnlyIfMediaIsAvailable' => 0, + 'conditional' => 0 + ); } -sub initializeAttrPropertyHash +sub defaultAttrPropertyHash { return ('exportString' => 0); } -sub initializeParametersHash +sub defaultParametersHash { - return ('namespace' => '', - 'namespacePrefix' => '', - 'namespaceURI' => '', - 'guardFactoryWith' => '', - 'tagsNullNamespace' => 0, - 'attrsNullNamespace' => 0, - 'exportStrings' => 0); + return ( + 'namespace' => '', + 'namespacePrefix' => '', + 'namespaceURI' => '', + 'guardFactoryWith' => '', + 'tagsNullNamespace' => 0, + 'attrsNullNamespace' => 0, + 'exportStrings' => 0 + ); } sub defaultInterfaceName { - die "No namespace found" if !$parameters{'namespace'}; - return $parameters{'namespace'} . upperCaseName($_[0]) . "Element" + die "No namespace found" if !$parameters{namespace}; + return $parameters{namespace} . upperCaseName($_[0]) . "Element" } ### Parsing handlers @@ -129,16 +136,16 @@ sub tagsHandler $tag =~ s/-/_/g; - # Initialize default properties' values. - $tags{$tag} = { initializeTagPropertyHash($tag) } if !defined($tags{$tag}); + # Initialize default property values. + $tags{$tag} = { defaultTagPropertyHash($tag) } if !defined($tags{$tag}); if ($property) { die "Unknown property $property for tag $tag\n" if !defined($tags{$tag}{$property}); - # The code rely on JSInterfaceName deriving from interfaceName to check for custom JSInterfaceName. - # So just override JSInterfaceName if it was not already set. - if ($property eq "interfaceName" && $tags{$tag}{'JSInterfaceName'} eq $tags{$tag}{'interfaceName'}) { - $tags{$tag}{'JSInterfaceName'} = $value; - } + + # The code relies on JSInterfaceName deriving from interfaceName to check for custom JSInterfaceName. + # So override JSInterfaceName if it was not already set. + $tags{$tag}{JSInterfaceName} = $value if $property eq "interfaceName" && $tags{$tag}{JSInterfaceName} eq $tags{$tag}{interfaceName}; + $tags{$tag}{$property} = $value; } } @@ -150,7 +157,7 @@ sub attrsHandler $attr =~ s/-/_/g; # Initialize default properties' values. - $attrs{$attr} = { initializeAttrPropertyHash($attr) } if !defined($attrs{$attr}); + $attrs{$attr} = { defaultAttrPropertyHash($attr) } if !defined($attrs{$attr}); if ($property) { die "Unknown property $property for attribute $attr\n" if !defined($attrs{$attr}{$property}); @@ -163,7 +170,7 @@ sub parametersHandler my ($parameter, $value) = @_; # Initialize default properties' values. - %parameters = initializeParametersHash() if !(keys %parameters); + %parameters = defaultParametersHash() if !(keys %parameters); die "Unknown parameter $parameter for tags/attrs\n" if !defined($parameters{$parameter}); $parameters{$parameter} = $value; @@ -214,7 +221,7 @@ sub printMacros for my $name (sort keys %$namesRef) { print F "$macro $name","$suffix;\n"; - if ($parameters{'exportStrings'} or $names{$name}{"exportString"}) { + if ($parameters{exportStrings} or $names{$name}{exportString}) { print F "extern char $name", "${suffix}String[];\n"; } } @@ -223,7 +230,7 @@ sub printMacros sub usesDefaultWrapper { my $tagName = shift; - return $tagName eq $parameters{'namespace'} . "Element"; + return $tagName eq $parameters{namespace} . "Element"; } # Build a direct mapping from the tags to the Element to create, excluding @@ -232,16 +239,16 @@ sub buildConstructorMap { my %tagConstructorMap = (); for my $tagName (keys %tags) { - my $interfaceName = $tags{$tagName}{'interfaceName'}; + my $interfaceName = $tags{$tagName}{interfaceName}; next if (usesDefaultWrapper($interfaceName)); - if ($tags{$tagName}{'mapToTagName'}) { - die "Cannot handle multiple mapToTagName for $tagName\n" if $tags{$tags{$tagName}{'mapToTagName'}}{'mapToTagName'}; - $interfaceName = $tags{ $tags{$tagName}{'mapToTagName'} }{'interfaceName'}; + if ($tags{$tagName}{mapToTagName}) { + die "Cannot handle multiple mapToTagName for $tagName\n" if $tags{$tags{$tagName}{mapToTagName}}{mapToTagName}; + $interfaceName = $tags{ $tags{$tagName}{mapToTagName} }{interfaceName}; } # Chop the string to keep the interesting part. - $interfaceName =~ s/$parameters{'namespace'}(.*)Element/$1/; + $interfaceName =~ s/$parameters{namespace}(.*)Element/$1/; $tagConstructorMap{$tagName} = lc($interfaceName); } @@ -254,17 +261,13 @@ sub printConstructorSignature { my ($F, $tagName, $constructorName, $constructorTagName) = @_; - print F "static PassRefPtr<$parameters{'namespace'}Element> ${constructorName}Constructor(const QualifiedName& $constructorTagName, Document* doc"; - if ($parameters{'namespace'} eq "HTML") { + print F "static PassRefPtr<$parameters{namespace}Element> ${constructorName}Constructor(const QualifiedName& $constructorTagName, Document* document"; + if ($parameters{namespace} eq "HTML") { print F ", HTMLFormElement*"; - if ($tags{$tagName}{'constructorNeedsFormElement'}) { - print F " formElement"; - } + print F " formElement" if $tags{$tagName}{constructorNeedsFormElement}; } print F ", bool"; - if ($tags{$tagName}{'constructorNeedsCreatedByParser'}) { - print F " createdByParser"; - } + print F " createdByParser" if $tags{$tagName}{constructorNeedsCreatedByParser}; print F ")\n{\n"; } @@ -276,22 +279,26 @@ sub printConstructorInterior my ($F, $tagName, $interfaceName, $constructorTagName) = @_; # Handle media elements. - if ($tags{$tagName}{'wrapperOnlyIfMediaIsAvailable'}) { + if ($tags{$tagName}{wrapperOnlyIfMediaIsAvailable}) { print F <<END if (!MediaPlayer::isAvailable()) - return new HTMLElement($constructorTagName, doc); + return HTMLElement::create($constructorTagName, document); END ; } - # Now call the constructor with the right parameters. - print F " return new ${interfaceName}($constructorTagName, doc"; - if ($tags{$tagName}{'constructorNeedsFormElement'}) { - print F ", formElement"; - } - if ($tags{$tagName}{'constructorNeedsCreatedByParser'}) { - print F ", createdByParser"; + my $newPrefix = ""; + my $createSuffix = "::create"; + + if ($tags{$tagName}{createWithNew}) { + $newPrefix = "new "; + $createSuffix = ""; } + + # Call the constructor with the right parameters. + print F " return $newPrefix$interfaceName${createSuffix}($constructorTagName, document"; + print F ", formElement" if $tags{$tagName}{constructorNeedsFormElement}; + print F ", createdByParser" if $tags{$tagName}{constructorNeedsCreatedByParser}; print F ");\n}\n\n"; } @@ -300,20 +307,20 @@ sub printConstructors my ($F, $tagConstructorMapRef) = @_; my %tagConstructorMap = %$tagConstructorMapRef; - print F "#if $parameters{'guardFactoryWith'}\n" if $parameters{'guardFactoryWith'}; + print F "#if $parameters{guardFactoryWith}\n" if $parameters{guardFactoryWith}; # This is to avoid generating the same constructor several times. my %uniqueTags = (); for my $tagName (sort keys %tagConstructorMap) { - my $interfaceName = $tags{$tagName}{'interfaceName'}; + my $interfaceName = $tags{$tagName}{interfaceName}; # Ignore the mapped tag # FIXME: It could be moved inside this loop but was split for readibility. - next if (defined($uniqueTags{$interfaceName}) || $tags{$tagName}{'mapToTagName'}); + next if (defined($uniqueTags{$interfaceName}) || $tags{$tagName}{mapToTagName}); $uniqueTags{$interfaceName} = '1'; - my $conditional = $tags{$tagName}{"conditional"}; + my $conditional = $tags{$tagName}{conditional}; if ($conditional) { my $conditionalString = "ENABLE(" . join(") && ENABLE(", split(/&/, $conditional)) . ")"; print F "#if ${conditionalString}\n\n"; @@ -323,20 +330,20 @@ sub printConstructors printConstructorInterior($F, $tagName, $interfaceName, "tagName"); if ($conditional) { - print F "#endif\n\n"; + print F "#endif\n"; } } # Mapped tag name uses a special wrapper to keep their prefix and namespaceURI while using the mapped localname. for my $tagName (sort keys %tagConstructorMap) { - if ($tags{$tagName}{'mapToTagName'}) { - my $mappedName = $tags{$tagName}{'mapToTagName'}; + if ($tags{$tagName}{mapToTagName}) { + my $mappedName = $tags{$tagName}{mapToTagName}; printConstructorSignature($F, $mappedName, $mappedName . "To" . $tagName, "tagName"); - printConstructorInterior($F, $mappedName, $tags{$mappedName}{'interfaceName'}, "QualifiedName(tagName.prefix(), ${mappedName}Tag.localName(), tagName.namespaceURI())"); + printConstructorInterior($F, $mappedName, $tags{$mappedName}{interfaceName}, "QualifiedName(tagName.prefix(), ${mappedName}Tag.localName(), tagName.namespaceURI())"); } } - print F "#endif\n" if $parameters{'guardFactoryWith'}; + print F "#endif\n" if $parameters{guardFactoryWith}; } sub printFunctionInits @@ -346,14 +353,14 @@ sub printFunctionInits for my $tagName (sort keys %tagConstructorMap) { - my $conditional = $tags{$tagName}{"conditional"}; + my $conditional = $tags{$tagName}{conditional}; if ($conditional) { my $conditionalString = "ENABLE(" . join(") && ENABLE(", split(/&/, $conditional)) . ")"; print F "#if ${conditionalString}\n"; } - if ($tags{$tagName}{'mapToTagName'}) { - print F " addTag(${tagName}Tag, $tags{$tagName}{'mapToTagName'}To${tagName}Constructor);\n"; + if ($tags{$tagName}{mapToTagName}) { + print F " addTag(${tagName}Tag, $tags{$tagName}{mapToTagName}To${tagName}Constructor);\n"; } else { print F " addTag(${tagName}Tag, $tagConstructorMap{$tagName}Constructor);\n"; } @@ -368,9 +375,7 @@ sub svgCapitalizationHacks { my $name = shift; - if ($name =~ /^fe(.+)$/) { - $name = "FE" . ucfirst $1; - } + $name = "FE" . ucfirst $1 if $name =~ /^fe(.+)$/; return $name; } @@ -379,7 +384,7 @@ sub upperCaseName { my $name = shift; - $name = svgCapitalizationHacks($name) if ($parameters{'namespace'} eq "SVG"); + $name = svgCapitalizationHacks($name) if ($parameters{namespace} eq "SVG"); while ($name =~ /^(.*?)_(.*)/) { $name = $1 . ucfirst $2; @@ -392,10 +397,11 @@ sub printLicenseHeader { my $F = shift; print F "/* - * THIS FILE IS AUTOMATICALLY GENERATED, DO NOT EDIT. + * THIS FILE WAS AUTOMATICALLY GENERATED, DO NOT EDIT. * + * This file was generated by the dom/make_names.pl script. * - * Copyright (C) 2005 Apple Computer, Inc. All rights reserved. + * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -416,10 +422,9 @@ sub printLicenseHeader * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - "; } @@ -428,16 +433,16 @@ sub printNamesHeaderFile my ($headerPath) = shift; my $F; open F, ">$headerPath"; - + printLicenseHeader($F); - print F "#ifndef DOM_$parameters{'namespace'}NAMES_H\n"; - print F "#define DOM_$parameters{'namespace'}NAMES_H\n\n"; + print F "#ifndef DOM_$parameters{namespace}NAMES_H\n"; + print F "#define DOM_$parameters{namespace}NAMES_H\n\n"; print F "#include \"QualifiedName.h\"\n\n"; - - print F "namespace WebCore {\n\n namespace $parameters{'namespace'}Names {\n\n"; - - my $lowerNamespace = lc($parameters{'namespacePrefix'}); - print F "#ifndef DOM_$parameters{'namespace'}NAMES_HIDE_GLOBALS\n"; + + print F "namespace WebCore {\n\n namespace $parameters{namespace}Names {\n\n"; + + my $lowerNamespace = lc($parameters{namespacePrefix}); + print F "#ifndef DOM_$parameters{namespace}NAMES_HIDE_GLOBALS\n"; print F "// Namespace\n"; print F "extern const WebCore::AtomicString ${lowerNamespace}NamespaceURI;\n\n"; @@ -451,19 +456,19 @@ sub printNamesHeaderFile printMacros($F, "extern const WebCore::QualifiedName", "Attr", \%attrs); } print F "#endif\n\n"; - + if (keys %tags) { - print F "WebCore::QualifiedName** get$parameters{'namespace'}Tags(size_t* size);\n"; + print F "WebCore::QualifiedName** get$parameters{namespace}Tags(size_t* size);\n"; } if (keys %attrs) { - print F "WebCore::QualifiedName** get$parameters{'namespace'}Attrs(size_t* size);\n"; + print F "WebCore::QualifiedName** get$parameters{namespace}Attrs(size_t* size);\n"; } - + print F "\nvoid init();\n\n"; print F "} }\n\n"; print F "#endif\n\n"; - + close F; } @@ -475,25 +480,25 @@ sub printNamesCppFile printLicenseHeader($F); - my $lowerNamespace = lc($parameters{'namespacePrefix'}); + my $lowerNamespace = lc($parameters{namespacePrefix}); print F "#include \"config.h\"\n"; print F "#ifdef SKIP_STATIC_CONSTRUCTORS_ON_GCC\n"; -print F "#define DOM_$parameters{'namespace'}NAMES_HIDE_GLOBALS 1\n"; +print F "#define DOM_$parameters{namespace}NAMES_HIDE_GLOBALS 1\n"; print F "#else\n"; print F "#define QNAME_DEFAULT_CONSTRUCTOR 1\n"; print F "#endif\n\n"; -print F "#include \"$parameters{'namespace'}Names.h\"\n\n"; +print F "#include \"$parameters{namespace}Names.h\"\n\n"; print F "#include \"StaticConstructors.h\"\n"; -print F "namespace WebCore {\n\n namespace $parameters{'namespace'}Names { +print F "namespace WebCore {\n\n namespace $parameters{namespace}Names { using namespace WebCore; -DEFINE_GLOBAL(AtomicString, ${lowerNamespace}NamespaceURI, \"$parameters{'namespaceURI'}\") +DEFINE_GLOBAL(AtomicString, ${lowerNamespace}NamespaceURI, \"$parameters{namespaceURI}\") "; if (keys %tags) { @@ -502,14 +507,14 @@ DEFINE_GLOBAL(AtomicString, ${lowerNamespace}NamespaceURI, \"$parameters{'namesp print F "DEFINE_GLOBAL(QualifiedName, ", $name, "Tag, nullAtom, \"$name\", ${lowerNamespace}NamespaceURI);\n"; } - print F "\n\nWebCore::QualifiedName** get$parameters{'namespace'}Tags(size_t* size)\n"; - print F "{\n static WebCore::QualifiedName* $parameters{'namespace'}Tags[] = {\n"; + print F "\n\nWebCore::QualifiedName** get$parameters{namespace}Tags(size_t* size)\n"; + print F "{\n static WebCore::QualifiedName* $parameters{namespace}Tags[] = {\n"; for my $name (sort keys %tags) { print F " (WebCore::QualifiedName*)&${name}Tag,\n"; } print F " };\n"; print F " *size = ", scalar(keys %tags), ";\n"; - print F " return $parameters{'namespace'}Tags;\n"; + print F " return $parameters{namespace}Tags;\n"; print F "}\n"; } @@ -518,14 +523,14 @@ DEFINE_GLOBAL(AtomicString, ${lowerNamespace}NamespaceURI, \"$parameters{'namesp for my $name (sort keys %attrs) { print F "DEFINE_GLOBAL(QualifiedName, ", $name, "Attr, nullAtom, \"$name\", ${lowerNamespace}NamespaceURI);\n"; } - print F "\n\nWebCore::QualifiedName** get$parameters{'namespace'}Attrs(size_t* size)\n"; - print F "{\n static WebCore::QualifiedName* $parameters{'namespace'}Attr[] = {\n"; + print F "\n\nWebCore::QualifiedName** get$parameters{namespace}Attrs(size_t* size)\n"; + print F "{\n static WebCore::QualifiedName* $parameters{namespace}Attr[] = {\n"; for my $name (sort keys %attrs) { print F " (WebCore::QualifiedName*)&${name}Attr,\n"; } print F " };\n"; print F " *size = ", scalar(keys %attrs), ";\n"; - print F " return $parameters{'namespace'}Attr;\n"; + print F " return $parameters{namespace}Attr;\n"; print F "}\n"; } @@ -549,16 +554,16 @@ print F "\nvoid init() AtomicString::init(); "; - print(F " AtomicString ${lowerNamespace}NS(\"$parameters{'namespaceURI'}\");\n\n"); + print(F " AtomicString ${lowerNamespace}NS(\"$parameters{namespaceURI}\");\n\n"); print(F " // Namespace\n"); print(F " new ((void*)&${lowerNamespace}NamespaceURI) AtomicString(${lowerNamespace}NS);\n\n"); if (keys %tags) { - my $tagsNamespace = $parameters{'tagsNullNamespace'} ? "nullAtom" : "${lowerNamespace}NS"; + my $tagsNamespace = $parameters{tagsNullNamespace} ? "nullAtom" : "${lowerNamespace}NS"; printDefinitions($F, \%tags, "tags", $tagsNamespace); } if (keys %attrs) { - my $attrsNamespace = $parameters{'attrsNullNamespace'} ? "nullAtom" : "${lowerNamespace}NS"; + my $attrsNamespace = $parameters{attrsNullNamespace} ? "nullAtom" : "${lowerNamespace}NS"; printDefinitions($F, \%attrs, "attributes", $attrsNamespace); } @@ -572,7 +577,7 @@ sub printJSElementIncludes my %tagsSeen; for my $tagName (sort keys %tags) { - my $JSInterfaceName = $tags{$tagName}{"JSInterfaceName"}; + my $JSInterfaceName = $tags{$tagName}{JSInterfaceName}; next if defined($tagsSeen{$JSInterfaceName}) || usesDefaultJSWrapper($tagName); $tagsSeen{$JSInterfaceName} = 1; @@ -586,7 +591,7 @@ sub printElementIncludes my %tagsSeen; for my $tagName (sort keys %tags) { - my $interfaceName = $tags{$tagName}{"interfaceName"}; + my $interfaceName = $tags{$tagName}{interfaceName}; next if defined($tagsSeen{$interfaceName}); $tagsSeen{$interfaceName} = 1; @@ -604,7 +609,7 @@ sub printDefinitionStrings my %names = %$namesRef; for my $name (sort keys %$namesRef) { - next if (!$parameters{'exportStrings'} and !$names{$name}{"exportString"}); + next if (!$parameters{exportStrings} and !$names{$name}{exportString}); my $realName = $name; $realName =~ s/_/-/g; @@ -625,7 +630,7 @@ sub printDefinitions my %names = %$namesRef; for my $name (sort keys %$namesRef) { - next if ($parameters{'exportStrings'} or $names{$name}{"exportString"}); + next if ($parameters{exportStrings} or $names{$name}{exportString}); my $realName = $name; $realName =~ s/_/-/g; @@ -651,39 +656,31 @@ printLicenseHeader($F); print F <<END #include "config.h" -#include "$parameters{'namespace'}ElementFactory.h" - -#include "$parameters{'namespace'}Names.h" -#if ENABLE(DASHBOARD_SUPPORT) -#include "Document.h" -#include "Settings.h" -#endif +#include "$parameters{namespace}ElementFactory.h" +#include "$parameters{namespace}Names.h" END ; -if ($parameters{'namespace'} eq "HTML") { - print F "#include \"HTMLFormElement.h\"\n"; -} - printElementIncludes($F); print F <<END #include <wtf/HashMap.h> +#if ENABLE(DASHBOARD_SUPPORT) +#include "Document.h" +#include "Settings.h" +#endif + namespace WebCore { -using namespace $parameters{'namespace'}Names; +using namespace $parameters{namespace}Names; END ; -print F "typedef PassRefPtr<$parameters{'namespace'}Element> (*ConstructorFunction)(const QualifiedName&, Document*"; - -if ($parameters{'namespace'} eq "HTML") { - print F ", HTMLFormElement*"; -} - +print F "typedef PassRefPtr<$parameters{namespace}Element> (*ConstructorFunction)(const QualifiedName&, Document*"; +print F ", HTMLFormElement*" if $parameters{namespace} eq "HTML"; print F ", bool createdByParser);\n"; print F <<END typedef HashMap<AtomicStringImpl*, ConstructorFunction> FunctionMap; @@ -697,7 +694,7 @@ my %tagConstructorMap = buildConstructorMap(); printConstructors($F, \%tagConstructorMap); -print F "#if $parameters{'guardFactoryWith'}\n" if $parameters{'guardFactoryWith'}; +print F "#if $parameters{guardFactoryWith}\n" if $parameters{guardFactoryWith}; print F <<END static void addTag(const QualifiedName& tag, ConstructorFunction func) @@ -705,10 +702,10 @@ static void addTag(const QualifiedName& tag, ConstructorFunction func) gFunctionMap->set(tag.localName().impl(), func); } -static inline void createFunctionMapIfNecessary() +static void createFunctionMap() { - if (gFunctionMap) - return; + ASSERT(!gFunctionMap); + // Create the table. gFunctionMap = new FunctionMap; @@ -719,30 +716,25 @@ END printFunctionInits($F, \%tagConstructorMap); print F "}\n"; -print F "#endif\n" if $parameters{'guardFactoryWith'}; - -print F "\nPassRefPtr<$parameters{'namespace'}Element> $parameters{'namespace'}ElementFactory::create$parameters{'namespace'}Element(const QualifiedName& qName, Document* doc"; - -if ($parameters{"namespace"} eq "HTML") { - print F ", HTMLFormElement* formElement"; -} +print F "#endif\n" if $parameters{guardFactoryWith}; +print F "\nPassRefPtr<$parameters{namespace}Element> $parameters{namespace}ElementFactory::create$parameters{namespace}Element(const QualifiedName& qName, Document* document"; +print F ", HTMLFormElement* formElement" if $parameters{namespace} eq "HTML"; print F ", bool createdByParser)\n{\n"; -print F "#if $parameters{'guardFactoryWith'}\n" if $parameters{'guardFactoryWith'}; +print F "#if $parameters{guardFactoryWith}\n" if $parameters{guardFactoryWith}; print F <<END - // Don't make elements without a document - if (!doc) + if (!document) return 0; END ; -if ($parameters{'namespace'} ne "HTML") { +if ($parameters{namespace} ne "HTML") { print F <<END #if ENABLE(DASHBOARD_SUPPORT) - Settings* settings = doc->settings(); + Settings* settings = document->settings(); if (settings && settings->usesDashboardBackwardCompatibilityMode()) return 0; #endif @@ -752,21 +744,21 @@ END } print F <<END - createFunctionMapIfNecessary(); - ConstructorFunction func = gFunctionMap->get(qName.localName().impl()); - if (func) + if (!gFunctionMap) + createFunctionMap(); + if (ConstructorFunction function = gFunctionMap->get(qName.localName().impl())) END ; -if ($parameters{"namespace"} eq "HTML") { - print F " return func(qName, doc, formElement, createdByParser);\n"; +if ($parameters{namespace} eq "HTML") { + print F " return function(qName, document, formElement, createdByParser);\n"; } else { - print F " return func(qName, doc, createdByParser);\n"; + print F " return function(qName, document, createdByParser);\n"; } -print F " return new $parameters{'namespace'}Element(qName, doc);\n"; +print F " return $parameters{namespace}Element::create(qName, document);\n"; -if ($parameters{'guardFactoryWith'}) { +if ($parameters{guardFactoryWith}) { print F <<END #else @@ -797,8 +789,8 @@ sub printFactoryHeaderFile printLicenseHeader($F); print F<<END -#ifndef $parameters{'namespace'}ElementFactory_h -#define $parameters{'namespace'}ElementFactory_h +#ifndef $parameters{namespace}ElementFactory_h +#define $parameters{namespace}ElementFactory_h #include <wtf/PassRefPtr.h> @@ -811,35 +803,29 @@ namespace WebCore { namespace WebCore { - class $parameters{'namespace'}Element; + class $parameters{namespace}Element; END ; -if ($parameters{'namespace'} eq "HTML") { - print F " class HTMLFormElement;\n"; -} +print F " class HTMLFormElement;\n" if $parameters{namespace} eq "HTML"; print F<<END // The idea behind this class is that there will eventually be a mapping from namespace URIs to ElementFactories that can dispense // elements. In a compound document world, the generic createElement function (will end up being virtual) will be called. - class $parameters{'namespace'}ElementFactory { + class $parameters{namespace}ElementFactory { public: PassRefPtr<Element> createElement(const WebCore::QualifiedName&, WebCore::Document*, bool createdByParser = true); END ; -print F " static PassRefPtr<$parameters{'namespace'}Element> create$parameters{'namespace'}Element(const WebCore::QualifiedName&, WebCore::Document*"; - -if ($parameters{'namespace'} eq "HTML") { - print F ", HTMLFormElement* = 0"; -} - +print F " static PassRefPtr<$parameters{namespace}Element> create$parameters{namespace}Element(const WebCore::QualifiedName&, WebCore::Document*"; +print F ", HTMLFormElement* = 0" if $parameters{namespace} eq "HTML"; print F ", bool /*createdByParser*/ = true);\n"; printf F<<END }; } -#endif // $parameters{'namespace'}ElementFactory_h +#endif // $parameters{namespace}ElementFactory_h END ; @@ -854,7 +840,7 @@ sub usesDefaultJSWrapper my $name = shift; # A tag reuses the default wrapper if its JSInterfaceName matches the default namespace Element. - return $tags{$name}{'JSInterfaceName'} eq $parameters{"namespace"} . "Element" || $tags{$name}{'JSInterfaceName'} eq "HTMLNoScriptElement"; + return $tags{$name}{JSInterfaceName} eq $parameters{namespace} . "Element" || $tags{$name}{JSInterfaceName} eq "HTMLNoScriptElement"; } sub printWrapperFunctions @@ -864,11 +850,11 @@ sub printWrapperFunctions my %tagsSeen; for my $tagName (sort keys %tags) { # Avoid defining the same wrapper method twice. - my $JSInterfaceName = $tags{$tagName}{"JSInterfaceName"}; + my $JSInterfaceName = $tags{$tagName}{JSInterfaceName}; next if defined($tagsSeen{$JSInterfaceName}) || usesDefaultJSWrapper($tagName); $tagsSeen{$JSInterfaceName} = 1; - my $conditional = $tags{$tagName}{"conditional"}; + my $conditional = $tags{$tagName}{conditional}; if ($conditional) { my $conditionalString = "ENABLE(" . join(") && ENABLE(", split(/&/, $conditional)) . ")"; print F "#if ${conditionalString}\n\n"; @@ -876,12 +862,12 @@ sub printWrapperFunctions # Hack for the media tags # FIXME: This should have been done via a CustomWrapper attribute and a separate *Custom file. - if ($tags{$tagName}{"wrapperOnlyIfMediaIsAvailable"}) { + if ($tags{$tagName}{wrapperOnlyIfMediaIsAvailable}) { print F <<END -static JSNode* create${JSInterfaceName}Wrapper(ExecState* exec, JSDOMGlobalObject* globalObject, PassRefPtr<$parameters{'namespace'}Element> element) +static JSNode* create${JSInterfaceName}Wrapper(ExecState* exec, JSDOMGlobalObject* globalObject, PassRefPtr<$parameters{namespace}Element> element) { if (!MediaPlayer::isAvailable()) - return CREATE_DOM_NODE_WRAPPER(exec, globalObject, $parameters{'namespace'}Element, element.get()); + return CREATE_DOM_NODE_WRAPPER(exec, globalObject, $parameters{namespace}Element, element.get()); return CREATE_DOM_NODE_WRAPPER(exec, globalObject, ${JSInterfaceName}, element.get()); } @@ -889,7 +875,7 @@ END ; } else { print F <<END -static JSNode* create${JSInterfaceName}Wrapper(ExecState* exec, JSDOMGlobalObject* globalObject, PassRefPtr<$parameters{'namespace'}Element> element) +static JSNode* create${JSInterfaceName}Wrapper(ExecState* exec, JSDOMGlobalObject* globalObject, PassRefPtr<$parameters{namespace}Element> element) { return CREATE_DOM_NODE_WRAPPER(exec, globalObject, ${JSInterfaceName}, element.get()); } @@ -897,6 +883,7 @@ static JSNode* create${JSInterfaceName}Wrapper(ExecState* exec, JSDOMGlobalObjec END ; } + if ($conditional) { print F "#endif\n\n"; } @@ -913,13 +900,13 @@ sub printWrapperFactoryCppFile print F "#include \"config.h\"\n\n"; - print F "#if $parameters{'guardFactoryWith'}\n\n" if $parameters{'guardFactoryWith'}; + print F "#if $parameters{guardFactoryWith}\n\n" if $parameters{guardFactoryWith}; - print F "#include \"JS$parameters{'namespace'}ElementWrapperFactory.h\"\n"; + print F "#include \"JS$parameters{namespace}ElementWrapperFactory.h\"\n"; printJSElementIncludes($F); - print F "\n#include \"$parameters{'namespace'}Names.h\"\n\n"; + print F "\n#include \"$parameters{namespace}Names.h\"\n\n"; printElementIncludes($F); @@ -930,9 +917,9 @@ using namespace JSC; namespace WebCore { -using namespace $parameters{'namespace'}Names; +using namespace $parameters{namespace}Names; -typedef JSNode* (*Create$parameters{'namespace'}ElementWrapperFunction)(ExecState*, JSDOMGlobalObject*, PassRefPtr<$parameters{'namespace'}Element>); +typedef JSNode* (*Create$parameters{namespace}ElementWrapperFunction)(ExecState*, JSDOMGlobalObject*, PassRefPtr<$parameters{namespace}Element>); END ; @@ -940,9 +927,9 @@ END printWrapperFunctions($F); print F <<END -JSNode* createJS$parameters{'namespace'}Wrapper(ExecState* exec, JSDOMGlobalObject* globalObject, PassRefPtr<$parameters{'namespace'}Element> element) +JSNode* createJS$parameters{namespace}Wrapper(ExecState* exec, JSDOMGlobalObject* globalObject, PassRefPtr<$parameters{namespace}Element> element) { - typedef HashMap<WebCore::AtomicStringImpl*, Create$parameters{'namespace'}ElementWrapperFunction> FunctionMap; + typedef HashMap<WebCore::AtomicStringImpl*, Create$parameters{namespace}ElementWrapperFunction> FunctionMap; DEFINE_STATIC_LOCAL(FunctionMap, map, ()); if (map.isEmpty()) { END @@ -952,13 +939,13 @@ END # Do not add the name to the map if it does not have a JS wrapper constructor or uses the default wrapper. next if usesDefaultJSWrapper($tag, \%tags); - my $conditional = $tags{$tag}{"conditional"}; + my $conditional = $tags{$tag}{conditional}; if ($conditional) { my $conditionalString = "ENABLE(" . join(") && ENABLE(", split(/&/, $conditional)) . ")"; print F "#if ${conditionalString}\n"; } - my $ucTag = $tags{$tag}{"JSInterfaceName"}; + my $ucTag = $tags{$tag}{JSInterfaceName}; print F " map.set(${tag}Tag.localName().impl(), create${ucTag}Wrapper);\n"; if ($conditional) { @@ -968,10 +955,10 @@ END print F <<END } - Create$parameters{'namespace'}ElementWrapperFunction createWrapperFunction = map.get(element->localName().impl()); + Create$parameters{namespace}ElementWrapperFunction createWrapperFunction = map.get(element->localName().impl()); if (createWrapperFunction) return createWrapperFunction(exec, globalObject, element); - return CREATE_DOM_NODE_WRAPPER(exec, globalObject, $parameters{'namespace'}Element, element.get()); + return CREATE_DOM_NODE_WRAPPER(exec, globalObject, $parameters{namespace}Element, element.get()); } } @@ -979,7 +966,7 @@ END END ; - print F "#endif\n" if $parameters{'guardFactoryWith'}; + print F "#endif\n" if $parameters{guardFactoryWith}; close F; } @@ -992,10 +979,10 @@ sub printWrapperFactoryHeaderFile printLicenseHeader($F); - print F "#ifndef JS$parameters{'namespace'}ElementWrapperFactory_h\n"; - print F "#define JS$parameters{'namespace'}ElementWrapperFactory_h\n\n"; + print F "#ifndef JS$parameters{namespace}ElementWrapperFactory_h\n"; + print F "#define JS$parameters{namespace}ElementWrapperFactory_h\n\n"; - print F "#if $parameters{'guardFactoryWith'}\n" if $parameters{'guardFactoryWith'}; + print F "#if $parameters{guardFactoryWith}\n" if $parameters{guardFactoryWith}; print F <<END #include <wtf/Forward.h> @@ -1008,18 +995,18 @@ namespace WebCore { class JSNode; class JSDOMGlobalObject; - class $parameters{'namespace'}Element; + class $parameters{namespace}Element; - JSNode* createJS$parameters{'namespace'}Wrapper(JSC::ExecState*, JSDOMGlobalObject*, PassRefPtr<$parameters{'namespace'}Element>); + JSNode* createJS$parameters{namespace}Wrapper(JSC::ExecState*, JSDOMGlobalObject*, PassRefPtr<$parameters{namespace}Element>); } END ; - print F "#endif // $parameters{'guardFactoryWith'}\n\n" if $parameters{'guardFactoryWith'}; + print F "#endif // $parameters{guardFactoryWith}\n\n" if $parameters{guardFactoryWith}; - print F "#endif // JS$parameters{'namespace'}ElementWrapperFactory_h\n"; + print F "#endif // JS$parameters{namespace}ElementWrapperFactory_h\n"; close F; } |