Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Unified Diff: Source/core/scripts/make_names.pl

Issue 26414004: Move core/scripts to build/scripts so that platform can use them. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/scripts/make_names.pl
diff --git a/Source/core/scripts/make_names.pl b/Source/core/scripts/make_names.pl
deleted file mode 100755
index d2570770c259b45fd6961033c9b9b3a8e036bd7c..0000000000000000000000000000000000000000
--- a/Source/core/scripts/make_names.pl
+++ /dev/null
@@ -1,1284 +0,0 @@
-#!/usr/bin/perl -w
-
-# Copyright (C) 2005, 2006, 2007, 2009 Apple Inc. All rights reserved.
-# Copyright (C) 2009, Julien Chaffraix <jchaffraix@webkit.org>
-# Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
-# Copyright (C) 2011 Ericsson AB. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
-# its contributors may be used to endorse or promote products derived
-# from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
-# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
-# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-# LOSS OF USE, DATA, OR 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.
-
-use strict;
-
-use StaticString;
-use Config;
-use Getopt::Long;
-use File::Path;
-use File::Spec;
-use IO::File;
-use InFilesParser;
-
-sub readTags($$);
-sub readAttrs($$);
-
-my $printFactory = 0;
-my $fontNamesIn = "";
-my $tagsFile = "";
-my $attrsFile = "";
-my $outputDir = ".";
-my %parsedTags = ();
-my %parsedAttrs = ();
-my %enabledTags = ();
-my %enabledAttrs = ();
-my %allTags = ();
-my %allAttrs = ();
-my %allStrings = ();
-my %parameters = ();
-my $extraDefines = 0;
-my $initDefaults = 1;
-my %extensionAttrs = ();
-
-require Config;
-
-my $gccLocation = "";
-if ($ENV{CC}) {
- $gccLocation = $ENV{CC};
-} elsif (($Config::Config{'osname'}) =~ /solaris/i) {
- $gccLocation = "/usr/sfw/bin/gcc";
-} else {
- $gccLocation = "/usr/bin/gcc";
-}
-my $preprocessor = $gccLocation . " -E -x c++";
-
-GetOptions(
- 'tags=s' => \$tagsFile,
- 'attrs=s' => \$attrsFile,
- 'factory' => \$printFactory,
- 'outputDir=s' => \$outputDir,
- 'extraDefines=s' => \$extraDefines,
- 'preprocessor=s' => \$preprocessor,
- 'fonts=s' => \$fontNamesIn,
-);
-
-mkpath($outputDir);
-
-if (length($fontNamesIn)) {
- my $familyNamesFileBase = "FontFamily";
- my $familyNamesPrefix = "CSS";
- createGenericNamesFile($fontNamesIn, $familyNamesFileBase, $familyNamesPrefix);
-}
-
-die "You must specify at least one of --tags <file> or --attrs <file>" unless (length($tagsFile) || length($attrsFile));
-
-if (length($tagsFile)) {
- %allTags = %{readTags($tagsFile, 0)};
- %enabledTags = %{readTags($tagsFile, 1)};
- namesToStrings(\%allTags, \%allStrings);
-}
-
-if (length($attrsFile)) {
- %allAttrs = %{readAttrs($attrsFile, 0)};
- %enabledAttrs = %{readAttrs($attrsFile, 1)};
- namesToStrings(\%allAttrs, \%allStrings);
-}
-
-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{fallbackJSInterfaceName} = $parameters{fallbackInterfaceName} unless $parameters{fallbackJSInterfaceName};
-
-my $namesBasePath = "$outputDir/$parameters{namespace}Names";
-my $factoryBasePath = "$outputDir/$parameters{namespace}ElementFactory";
-my $wrapperFactoryFileName = "$parameters{namespace}ElementWrapperFactory";
-
-printNamesHeaderFile("$namesBasePath.h");
-printNamesCppFile("$namesBasePath.cpp");
-
-if ($printFactory) {
- printFactoryCppFile("$factoryBasePath.cpp");
- printFactoryHeaderFile("$factoryBasePath.h");
-}
-
-printWrapperFactoryCppFile($outputDir, $wrapperFactoryFileName);
-printWrapperFactoryHeaderFile($outputDir, $wrapperFactoryFileName);
-
-### Hash initialization
-
-sub defaultTagPropertyHash
-{
- return (
- 'constructorNeedsCreatedByParser' => 0,
- 'constructorNeedsFormElement' => 0,
- 'noConstructor' => 0,
- 'interfaceName' => defaultInterfaceName($_[0]),
- # By default, the JSInterfaceName is the same as the interfaceName.
- 'JSInterfaceName' => defaultInterfaceName($_[0]),
- 'mapToTagName' => '',
- 'wrapperOnlyIfMediaIsAvailable' => 0,
- 'conditional' => 0,
- 'contextConditional' => 0,
- 'runtimeConditional' => 0
- );
-}
-
-sub defaultParametersHash
-{
- return (
- 'namespace' => '',
- 'namespacePrefix' => '',
- 'namespaceURI' => '',
- 'guardFactoryWith' => '',
- 'tagsNullNamespace' => 0,
- 'attrsNullNamespace' => 0,
- 'fallbackInterfaceName' => '',
- 'fallbackJSInterfaceName' => ''
- );
-}
-
-sub defaultInterfaceName
-{
- die "No namespace found" if !$parameters{namespace};
- return $parameters{namespace} . upperCaseName($_[0]) . "Element"
-}
-
-### Parsing handlers
-
-sub valueForName
-{
- my $name = shift;
- my $value = $extensionAttrs{$name};
-
- if (!$value) {
- $value = $name;
- $value =~ s/_/-/g;
- }
-
- return $value;
-}
-
-sub namesToStrings
-{
- my $namesRef = shift;
- my $stringsRef = shift;
-
- my %names = %$namesRef;
-
- for my $name (keys %names) {
- $stringsRef->{$name} = valueForName($name);
- }
-}
-
-sub tagsHandler
-{
- my ($tag, $property, $value) = @_;
-
- $tag =~ s/-/_/g;
-
- # Initialize default property values.
- $parsedTags{$tag} = { defaultTagPropertyHash($tag) } if !defined($parsedTags{$tag});
-
- if ($property) {
- die "Unknown property $property for tag $tag\n" if !defined($parsedTags{$tag}{$property});
-
- # The code relies on JSInterfaceName deriving from interfaceName to check for custom JSInterfaceName.
- # So override JSInterfaceName if it was not already set.
- $parsedTags{$tag}{JSInterfaceName} = $value if $property eq "interfaceName" && $parsedTags{$tag}{JSInterfaceName} eq $parsedTags{$tag}{interfaceName};
-
- $parsedTags{$tag}{$property} = $value;
- }
-}
-
-sub attrsHandler
-{
- my ($attr, $property, $value) = @_;
- # Translate HTML5 extension attributes of the form 'x-webkit-feature' to 'webkitfeature'.
- # We don't just check for the 'x-' prefix because there are attributes such as x-height
- # which should follow the default path below.
- if ($attr =~ m/^x-webkit-(.*)/) {
- my $newAttr = "webkit$1";
- $extensionAttrs{$newAttr} = $attr;
- $attr = $newAttr;
- }
- $attr =~ s/-/_/g;
-
- # Initialize default properties' values.
- $parsedAttrs{$attr} = {} if !defined($parsedAttrs{$attr});
-
- if ($property) {
- die "Unknown property $property for attribute $attr\n" if !defined($parsedAttrs{$attr}{$property});
- $parsedAttrs{$attr}{$property} = $value;
- }
-}
-
-sub parametersHandler
-{
- my ($parameter, $value) = @_;
-
- # Initialize default properties' values.
- %parameters = defaultParametersHash() if (!(keys %parameters) && $initDefaults);
-
- # If the input is an array, we want the strings to have the same value as the key.
- if ( $value eq 1) {
- $value = $parameter;
- }
-
- die "Unknown parameter $parameter for tags/attrs\n" if (!defined($parameters{$parameter}) && $initDefaults);
- $parameters{$parameter} = $value;
-}
-
-## Support routines
-
-sub preprocessorCommand()
-{
- return $preprocessor if $extraDefines eq 0;
- return $preprocessor . " -D" . join(" -D", split(" ", $extraDefines));
-}
-
-sub readNames($$$$)
-{
- my ($namesFile, $hashToFillRef, $handler, $usePreprocessor) = @_;
-
- my $names = new IO::File;
- if ($usePreprocessor) {
- open($names, preprocessorCommand() . " " . $namesFile . "|") or die "Failed to open file: $namesFile";
- } else {
- open($names, $namesFile) or die "Failed to open file: $namesFile";
- }
-
- my $InParser = InFilesParser->new();
- $InParser->parse($names, \&parametersHandler, $handler);
-
- close($names);
- die "Failed to read names from file: $namesFile" if (keys %{$hashToFillRef} == 0);
- return $hashToFillRef;
-}
-
-sub readAttrs($$)
-{
- my ($namesFile, $usePreprocessor) = @_;
- %parsedAttrs = ();
- return readNames($namesFile, \%parsedAttrs, \&attrsHandler, $usePreprocessor);
-}
-
-sub readTags($$)
-{
- my ($namesFile, $usePreprocessor) = @_;
- %parsedTags = ();
- return readNames($namesFile, \%parsedTags, \&tagsHandler, $usePreprocessor);
-}
-
-sub printMacros
-{
- my ($F, $macro, $suffix, $namesRef) = @_;
- my %names = %$namesRef;
-
- for my $name (sort keys %names) {
- print F "$macro $name","$suffix;\n";
- }
-}
-
-sub usesDefaultWrapper
-{
- my $tagName = shift;
- return $tagName eq $parameters{namespace} . "Element";
-}
-
-# Build a direct mapping from the tags to the Element to create.
-sub buildConstructorMap
-{
- my %tagConstructorMap = ();
- for my $tagName (keys %enabledTags) {
- my $interfaceName = $enabledTags{$tagName}{interfaceName};
-
- if ($enabledTags{$tagName}{mapToTagName}) {
- die "Cannot handle multiple mapToTagName for $tagName\n" if $enabledTags{$enabledTags{$tagName}{mapToTagName}}{mapToTagName};
- $interfaceName = $enabledTags{ $enabledTags{$tagName}{mapToTagName} }{interfaceName};
- }
-
- # Chop the string to keep the interesting part.
- $interfaceName =~ s/$parameters{namespace}(.*)Element/$1/;
- $tagConstructorMap{$tagName} = lc($interfaceName);
- }
-
- return %tagConstructorMap;
-}
-
-# Helper method that print the constructor's signature avoiding
-# unneeded arguments.
-sub printConstructorSignature
-{
- my ($F, $tagName, $constructorName, $constructorTagName) = @_;
-
- print F "static PassRefPtr<$parameters{namespace}Element> ${constructorName}Constructor(const QualifiedName& $constructorTagName, Document& document";
- if ($parameters{namespace} eq "HTML") {
- print F ", HTMLFormElement*";
- print F " formElement" if $enabledTags{$tagName}{constructorNeedsFormElement};
- }
- print F ", bool";
- print F " createdByParser" if $enabledTags{$tagName}{constructorNeedsCreatedByParser};
- print F ")\n{\n";
-}
-
-# Helper method to dump the constructor interior and call the
-# Element constructor with the right arguments.
-# The variable names should be kept in sync with the previous method.
-sub printConstructorInterior
-{
- my ($F, $tagName, $interfaceName, $constructorTagName) = @_;
-
- # Handle media elements.
- if ($enabledTags{$tagName}{wrapperOnlyIfMediaIsAvailable}) {
- print F <<END
- Settings* settings = document.settings();
- if (!RuntimeEnabledFeatures::mediaEnabled() || (settings && !settings->mediaEnabled()))
- return 0;
-
-END
-;
- }
-
- my $contextConditional = $enabledTags{$tagName}{contextConditional};
- if ($contextConditional) {
- print F <<END
- if (!ContextFeatures::${contextConditional}Enabled(&document))
- return 0;
-END
-;
- }
-
- my $runtimeConditional = $enabledTags{$tagName}{runtimeConditional};
- if ($runtimeConditional) {
- print F <<END
- if (!RuntimeEnabledFeatures::${runtimeConditional}Enabled())
- return 0;
-END
-;
- }
-
- # Call the constructor with the right parameters.
- print F " return ${interfaceName}::create($constructorTagName, document";
- print F ", formElement" if $enabledTags{$tagName}{constructorNeedsFormElement};
- print F ", createdByParser" if $enabledTags{$tagName}{constructorNeedsCreatedByParser};
- print F ");\n}\n\n";
-}
-
-sub printConstructors
-{
- my ($F, $tagConstructorMapRef) = @_;
- my %tagConstructorMap = %$tagConstructorMapRef;
-
- # This is to avoid generating the same constructor several times.
- my %uniqueTags = ();
- for my $tagName (sort keys %tagConstructorMap) {
- my $interfaceName = $enabledTags{$tagName}{interfaceName};
-
- # Ignore the mapped tag
- # FIXME: It could be moved inside this loop but was split for readibility.
- next if (defined($uniqueTags{$interfaceName}) || $enabledTags{$tagName}{mapToTagName});
- # Tags can have wrappers without constructors.
- # This is useful to make user-agent shadow elements internally testable
- # while keeping them from being avaialble in the HTML markup.
- next if $enabledTags{$tagName}{noConstructor};
-
- $uniqueTags{$interfaceName} = '1';
-
- my $conditional = $enabledTags{$tagName}{conditional};
- if ($conditional) {
- my $conditionalString = "ENABLE(" . join(") && ENABLE(", split(/&/, $conditional)) . ")";
- print F "#if ${conditionalString}\n\n";
- }
-
- printConstructorSignature($F, $tagName, $tagConstructorMap{$tagName}, "tagName");
- printConstructorInterior($F, $tagName, $interfaceName, "tagName");
-
- if ($conditional) {
- 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 ($enabledTags{$tagName}{mapToTagName}) {
- my $mappedName = $enabledTags{$tagName}{mapToTagName};
- printConstructorSignature($F, $mappedName, $mappedName . "To" . $tagName, "tagName");
- printConstructorInterior($F, $mappedName, $enabledTags{$mappedName}{interfaceName}, "QualifiedName(tagName.prefix(), ${mappedName}Tag.localName(), tagName.namespaceURI())");
- }
- }
-}
-
-sub printFunctionInits
-{
- my ($F, $tagConstructorMap) = @_;
- my %tagConstructorMap = %$tagConstructorMap;
-
- for my $tagName (sort keys %tagConstructorMap) {
- next if $enabledTags{$tagName}{noConstructor};
-
- my $conditional = $enabledTags{$tagName}{conditional};
- if ($conditional) {
- my $conditionalString = "ENABLE(" . join(") && ENABLE(", split(/&/, $conditional)) . ")";
- print F "#if ${conditionalString}\n";
- }
-
- if ($enabledTags{$tagName}{mapToTagName}) {
- print F " addTag(${tagName}Tag, $enabledTags{$tagName}{mapToTagName}To${tagName}Constructor);\n";
- } else {
- print F " addTag(${tagName}Tag, $tagConstructorMap{$tagName}Constructor);\n";
- }
-
- if ($conditional) {
- print F "#endif\n\n";
- }
- }
-}
-
-sub svgCapitalizationHacks
-{
- my $name = shift;
-
- $name = "FE" . ucfirst $1 if $name =~ /^fe(.+)$/;
-
- return $name;
-}
-
-sub upperCaseName
-{
- my $name = shift;
-
- $name = svgCapitalizationHacks($name) if ($parameters{namespace} eq "SVG");
-
- while ($name =~ /^(.*?)_(.*)/) {
- $name = $1 . ucfirst $2;
- }
-
- return ucfirst $name;
-}
-
-sub printHeaderHead
-{
- my ($F, $prefix, $nsName, $includes) = @_;
-
- print F "#ifndef ${prefix}_${nsName}Names_h\n";
- print F "#define ${prefix}_${nsName}Names_h\n\n";
- print F "$includes\n\n";
-
- print F "namespace WebCore {\n\n";
- print F "namespace ${nsName}Names {\n\n";
-
- print F "#ifndef ${prefix}_${nsName}NAMES_HIDE_GLOBALS\n";
-}
-
-sub printCppHead
-{
- my ($F, $prefix, $nsName, $usedNamespace) = @_;
-
- print F "#include \"config.h\"\n\n";
- print F "#ifdef SKIP_STATIC_CONSTRUCTORS_ON_GCC\n";
- print F "#define ${prefix}_${nsName}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 \"${nsName}Names.h\"\n\n";
- print F "#include \"wtf/StaticConstructors.h\"\n";
-
- print F "namespace WebCore {\n\n";
- print F "namespace ${nsName}Names {\n\n";
- print F "using namespace $usedNamespace;\n\n";
-}
-
-sub printInit
-{
- my ($F, $isDefinition) = @_;
-
- if ($isDefinition) {
- print F "\nvoid init();\n\n";
- print F "} }\n\n";
- print F "#endif\n\n";
- return;
- }
-
-print F "\nvoid init()
-{
- // Use placement new to initialize the globals.
-
-";
-}
-
-sub printLicenseHeader
-{
- my $F = shift;
- print F "/*
- * THIS FILE WAS AUTOMATICALLY GENERATED, DO NOT EDIT.
- *
- * This file was generated by the core/scripts/make_names.pl script.
- *
- * 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
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * 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.
- */
-
-";
-}
-
-sub printNamesHeaderFile
-{
- my ($headerPath) = shift;
- my $F;
- open F, ">$headerPath";
-
- printLicenseHeader($F);
- printHeaderHead($F, "DOM", $parameters{namespace}, "#include \"core/dom/QualifiedName.h\"");
-
- my $lowerNamespace = lc($parameters{namespacePrefix});
- print F "// Namespace\n";
- print F "extern const WTF::AtomicString ${lowerNamespace}NamespaceURI;\n\n";
-
- if (keys %allTags) {
- print F "// Tags\n";
- printMacros($F, "extern const WebCore::QualifiedName", "Tag", \%allTags);
- }
-
- if (keys %allAttrs) {
- print F "// Attributes\n";
- printMacros($F, "extern const WebCore::QualifiedName", "Attr", \%allAttrs);
- }
- print F "#endif\n\n";
-
- if (keys %allTags) {
- print F "const unsigned $parameters{namespace}TagsCount = ", scalar(keys %allTags), ";\n";
- print F "WebCore::QualifiedName** get$parameters{namespace}Tags();\n";
- }
-
- if (keys %allAttrs) {
- print F "const unsigned $parameters{namespace}AttrsCount = ", scalar(keys %allAttrs), ";\n";
- print F "WebCore::QualifiedName** get$parameters{namespace}Attrs();\n";
- }
-
- printInit($F, 1);
- close F;
-}
-
-sub printNamesCppFile
-{
- my $cppPath = shift;
- my $F;
- open F, ">$cppPath";
-
- printLicenseHeader($F);
- printCppHead($F, "DOM", $parameters{namespace}, "WebCore");
-
- my $lowerNamespace = lc($parameters{namespacePrefix});
-
- print F "DEFINE_GLOBAL(AtomicString, ${lowerNamespace}NamespaceURI)\n\n";
-
- if (keys %allTags) {
- print F "// Tags\n";
- for my $name (sort keys %allTags) {
- print F "DEFINE_GLOBAL(QualifiedName, ", $name, "Tag)\n";
- }
-
- print F "\n\nWebCore::QualifiedName** get$parameters{namespace}Tags()\n";
- print F "{\n static WebCore::QualifiedName* $parameters{namespace}Tags[] = {\n";
- for my $name (sort keys %allTags) {
- print F " (WebCore::QualifiedName*)&${name}Tag,\n";
- }
- print F " };\n";
- print F " return $parameters{namespace}Tags;\n";
- print F "}\n";
- }
-
- if (keys %allAttrs) {
- print F "\n// Attributes\n";
- for my $name (sort keys %allAttrs) {
- print F "DEFINE_GLOBAL(QualifiedName, ", $name, "Attr)\n";
- }
- print F "\n\nWebCore::QualifiedName** get$parameters{namespace}Attrs()\n";
- print F "{\n static WebCore::QualifiedName* $parameters{namespace}Attr[] = {\n";
- for my $name (sort keys %allAttrs) {
- print F " (WebCore::QualifiedName*)&${name}Attr,\n";
- }
- print F " };\n";
- print F " return $parameters{namespace}Attr;\n";
- print F "}\n";
- }
-
- printInit($F, 0);
-
- print(F " AtomicString ${lowerNamespace}NS(\"$parameters{namespaceURI}\", AtomicString::ConstructFromLiteral);\n\n");
-
- print(F " // Namespace\n");
- print(F " new ((void*)&${lowerNamespace}NamespaceURI) AtomicString(${lowerNamespace}NS);\n");
- print(F "\n");
- print F StaticString::GenerateStringImpls(\%allStrings);
-
- if (keys %allTags) {
- my $tagsNamespace = $parameters{tagsNullNamespace} ? "nullAtom" : "${lowerNamespace}NS";
- printDefinitions($F, \%allTags, "tags", $tagsNamespace);
- }
- if (keys %allAttrs) {
- my $attrsNamespace = $parameters{attrsNullNamespace} ? "nullAtom" : "${lowerNamespace}NS";
- printDefinitions($F, \%allAttrs, "attributes", $attrsNamespace);
- }
-
- print F "}\n\n} }\n\n";
- close F;
-}
-
-sub printJSElementIncludes
-{
- my $F = shift;
-
- my %tagsSeen;
- for my $tagName (sort keys %enabledTags) {
- my $JSInterfaceName = $enabledTags{$tagName}{JSInterfaceName};
- next if defined($tagsSeen{$JSInterfaceName}) || usesDefaultJSWrapper($tagName);
- if ($enabledTags{$tagName}{conditional}) {
- # We skip feature-define-specific #includes here since we handle them separately.
- next;
- }
- $tagsSeen{$JSInterfaceName} = 1;
-
- print F "#include \"V8${JSInterfaceName}.h\"\n";
- }
- print F "#include \"V8$parameters{fallbackJSInterfaceName}.h\"\n";
-}
-
-sub printElementIncludes
-{
- my $F = shift;
-
- my %tagsSeen;
- for my $tagName (sort keys %enabledTags) {
- my $interfaceName = $enabledTags{$tagName}{interfaceName};
- next if defined($tagsSeen{$interfaceName});
- if ($enabledTags{$tagName}{conditional}) {
- # We skip feature-define-specific #includes here since we handle them separately.
- next;
- }
- $tagsSeen{$interfaceName} = 1;
-
- print F "#include \"${interfaceName}.h\"\n";
- }
- print F "#include \"$parameters{fallbackInterfaceName}.h\"\n";
-}
-
-sub printConditionalElementIncludes
-{
- my ($F, $shouldIncludeV8Headers) = @_;
-
- my %conditionals;
- my %unconditionalElementIncludes;
- my %unconditionalJSElementIncludes;
-
- for my $tagName (keys %enabledTags) {
- my $conditional = $enabledTags{$tagName}{conditional};
- my $interfaceName = $enabledTags{$tagName}{interfaceName};
- my $JSInterfaceName = $enabledTags{$tagName}{JSInterfaceName};
-
- if ($conditional) {
- $conditionals{$conditional}{interfaceNames}{$interfaceName} = 1;
- $conditionals{$conditional}{JSInterfaceNames}{$JSInterfaceName} = 1;
- } else {
- $unconditionalElementIncludes{$interfaceName} = 1;
- $unconditionalJSElementIncludes{$JSInterfaceName} = 1;
- }
- }
-
- for my $conditional (sort keys %conditionals) {
- print F "\n#if ENABLE($conditional)\n";
- for my $interfaceName (sort keys %{$conditionals{$conditional}{interfaceNames}}) {
- next if $unconditionalElementIncludes{$interfaceName};
- print F "#include \"$interfaceName.h\"\n";
- }
- if ($shouldIncludeV8Headers) {
- for my $JSInterfaceName (sort keys %{$conditionals{$conditional}{JSInterfaceNames}}) {
- next if $unconditionalJSElementIncludes{$JSInterfaceName};
- print F "#include \"V8$JSInterfaceName.h\"\n";
- }
- }
- print F "#endif\n";
- }
-}
-
-sub printDefinitions
-{
- my ($F, $namesRef, $type, $namespaceURI) = @_;
- my $singularType = substr($type, 0, -1);
- my $shortType = substr($singularType, 0, 4);
- my $shortCamelType = ucfirst($shortType);
- my $shortUpperType = uc($shortType);
-
- print F " // " . ucfirst($type) . "\n";
-
- for my $name (sort keys %$namesRef) {
- # To generate less code in init(), the common case of nullAtom for the namespace, we call createQualifiedName() without passing $namespaceURI.
- if ($namespaceURI eq "nullAtom") {
- print F " createQualifiedName((void*)&$name","${shortCamelType}, ${name}Impl);\n";
- } else {
- print F " createQualifiedName((void*)&$name","${shortCamelType}, ${name}Impl, $namespaceURI);\n";
- }
- }
-}
-
-## ElementFactory routines
-
-sub printFactoryCppFile
-{
- my $cppPath = shift;
- my $F;
- open F, ">$cppPath";
-
-printLicenseHeader($F);
-
-print F <<END
-#include "config.h"
-END
-;
-
-print F "\n#if $parameters{guardFactoryWith}\n\n" if $parameters{guardFactoryWith};
-
-print F <<END
-#include "$parameters{namespace}ElementFactory.h"
-#include "$parameters{namespace}Names.h"
-END
-;
-
-printElementIncludes($F);
-
-print F "\n#include \"wtf/HashMap.h\"\n";
-
-printConditionalElementIncludes($F);
-
-print F <<END
-
-#include "RuntimeEnabledFeatures.h"
-#include "core/dom/ContextFeatures.h"
-#include "core/dom/custom/CustomElement.h"
-#include "core/dom/custom/CustomElementRegistrationContext.h"
-#include "core/dom/Document.h"
-#include "core/page/Settings.h"
-
-namespace WebCore {
-
-using namespace $parameters{namespace}Names;
-
-END
-;
-
-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<StringImpl*, ConstructorFunction> FunctionMap;
-
-static FunctionMap* gFunctionMap = 0;
-
-END
-;
-
-my %tagConstructorMap = buildConstructorMap();
-
-printConstructors($F, \%tagConstructorMap);
-
-print F <<END
-static void addTag(const QualifiedName& tag, ConstructorFunction func)
-{
- gFunctionMap->set(tag.localName().impl(), func);
-}
-
-static void createFunctionMap()
-{
- ASSERT(!gFunctionMap);
-
- // Create the table.
- gFunctionMap = new FunctionMap;
-
- // Populate it with constructor functions.
-END
-;
-
-printFunctionInits($F, \%tagConstructorMap);
-
-print F "}\n";
-
-
-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 <<END
- if (!document)
- return 0;
-
- if (CustomElement::isValidName(qName.localName()) && document->registrationContext()) {
- RefPtr<Element> element = document->registrationContext()->createCustomTagElement(*document, qName, createdByParser ? CustomElementRegistrationContext::CreatedByParser : CustomElementRegistrationContext::NotCreatedByParser);
- ASSERT_WITH_SECURITY_IMPLICATION(element->is$parameters{namespace}Element());
- return static_pointer_cast<$parameters{namespace}Element>(element.release());
- }
-
- if (!gFunctionMap)
- createFunctionMap();
- if (ConstructorFunction function = gFunctionMap->get(qName.localName().impl())) {
-END
-;
-
-if ($parameters{namespace} eq "HTML") {
- print F " if (PassRefPtr<$parameters{namespace}Element> element = function(qName, *document, formElement, createdByParser))\n";
- print F " return element;\n";
-} else {
- print F " if (PassRefPtr<$parameters{namespace}Element> element = function(qName, *document, createdByParser))\n";
- print F " return element;\n";
-}
-print F <<END
- }
-
- return $parameters{fallbackInterfaceName}::create(qName, *document);
-}
-
-} // namespace WebCore
-
-END
-;
-
- print F "#endif\n" if $parameters{guardFactoryWith};
-
- close F;
-}
-
-sub printFactoryHeaderFile
-{
- my $headerPath = shift;
- my $F;
- open F, ">$headerPath";
-
- printLicenseHeader($F);
-
- print F<<END
-#ifndef $parameters{namespace}ElementFactory_h
-#define $parameters{namespace}ElementFactory_h
-
-#include "wtf/Forward.h"
-#include "wtf/PassRefPtr.h"
-
-namespace WebCore {
- class Element;
- class Document;
- class QualifiedName;
-}
-
-namespace WebCore {
-
- class $parameters{namespace}Element;
-END
-;
-
-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 {
- 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*";
-print F ", HTMLFormElement* = 0" if $parameters{namespace} eq "HTML";
-print F ", bool createdByParser = true);\n";
-
-printf F<<END
- };
-}
-
-#endif // $parameters{namespace}ElementFactory_h
-
-END
-;
-
- close F;
-}
-
-## Wrapper Factory routines
-
-sub usesDefaultJSWrapper
-{
- my $name = shift;
-
- # A tag reuses the default wrapper if its JSInterfaceName matches the default namespace Element.
- return $enabledTags{$name}{JSInterfaceName} eq $parameters{namespace} . "Element";
-}
-
-sub printWrapperFunctions
-{
- my $F = shift;
-
- my %tagsSeen;
- for my $tagName (sort keys %enabledTags) {
- # Avoid defining the same wrapper method twice.
- my $JSInterfaceName = $enabledTags{$tagName}{JSInterfaceName};
- next if defined($tagsSeen{$JSInterfaceName}) || (usesDefaultJSWrapper($tagName) && ($parameters{fallbackJSInterfaceName} eq $parameters{namespace} . "Element"));
- $tagsSeen{$JSInterfaceName} = 1;
-
- my $conditional = $enabledTags{$tagName}{conditional};
- if ($conditional) {
- my $conditionalString = "ENABLE(" . join(") && ENABLE(", split(/&/, $conditional)) . ")";
- print F "#if ${conditionalString}\n\n";
- }
-
- if ($enabledTags{$tagName}{wrapperOnlyIfMediaIsAvailable}) {
- print F <<END
-static v8::Handle<v8::Object> create${JSInterfaceName}Wrapper($parameters{namespace}Element* element, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate)
-{
- Settings* settings = element->document().settings();
- if (!RuntimeEnabledFeatures::mediaEnabled() || (settings && !settings->mediaEnabled()))
- return createV8$parameters{namespace}FallbackWrapper(to$parameters{fallbackInterfaceName}(element), creationContext, isolate);
- return wrap(static_cast<${JSInterfaceName}*>(element), creationContext, isolate);
-}
-
-END
-;
- } elsif ($enabledTags{$tagName}{contextConditional}) {
- my $contextConditional = $enabledTags{$tagName}{contextConditional};
- print F <<END
-static v8::Handle<v8::Object> create${JSInterfaceName}Wrapper($parameters{namespace}Element* element, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate)
-{
- if (!ContextFeatures::${contextConditional}Enabled(&element->document()))
- return createV8$parameters{namespace}FallbackWrapper(to$parameters{fallbackInterfaceName}(element), creationContext, isolate);
- return wrap(static_cast<${JSInterfaceName}*>(element), creationContext, isolate);
-}
-END
-;
- } elsif ($enabledTags{$tagName}{runtimeConditional}) {
- my $runtimeConditional = $enabledTags{$tagName}{runtimeConditional};
- print F <<END
-static v8::Handle<v8::Object> create${JSInterfaceName}Wrapper($parameters{namespace}Element* element, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate)
-{
- if (!RuntimeEnabledFeatures::${runtimeConditional}Enabled())
- return createV8$parameters{namespace}FallbackWrapper(to$parameters{fallbackInterfaceName}(element), creationContext, isolate);
- return wrap(static_cast<${JSInterfaceName}*>(element), creationContext, isolate);
-}
-END
-;
- } elsif (${JSInterfaceName} eq "HTMLElement") {
- print F <<END
-static v8::Handle<v8::Object> create${JSInterfaceName}Wrapper($parameters{namespace}Element* element, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate)
-{
- ASSERT_NOT_REACHED();
- return v8::Handle<v8::Object>();
-}
-
-END
-;
- } else {
- print F <<END
-static v8::Handle<v8::Object> create${JSInterfaceName}Wrapper($parameters{namespace}Element* element, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate)
-{
- return wrap(static_cast<${JSInterfaceName}*>(element), creationContext, isolate);
-}
-
-
-END
-;
- }
-
- if ($conditional) {
- print F "#endif\n\n";
- }
- }
-}
-
-sub printWrapperFactoryCppFile
-{
- my $outputDir = shift;
- my $wrapperFactoryFileName = shift;
- my $F;
- open F, ">" . $outputDir . "/V8" . $wrapperFactoryFileName . ".cpp";
-
- printLicenseHeader($F);
-
- print F "#include \"config.h\"\n";
- print F "#include \"V8$parameters{namespace}ElementWrapperFactory.h\"\n";
-
- print F "\n#if $parameters{guardFactoryWith}\n\n" if $parameters{guardFactoryWith};
-
- printJSElementIncludes($F);
-
- print F "\n#include \"$parameters{namespace}Names.h\"\n\n";
-
- printElementIncludes($F);
-
- print F "\n#include \"wtf/StdLibExtras.h\"\n";
-
- printConditionalElementIncludes($F, 1);
-
- print F <<END
-
-#include "RuntimeEnabledFeatures.h"
-#include "core/dom/ContextFeatures.h"
-#include "core/dom/Document.h"
-#include "core/page/Settings.h"
-
-#include "V8$parameters{namespace}Element.h"
-
-#include "bindings/v8/CustomElementWrapper.h"
-
-#include <v8.h>
-
-namespace WebCore {
-
-using namespace $parameters{namespace}Names;
-
-typedef v8::Handle<v8::Object> (*Create$parameters{namespace}ElementWrapperFunction)($parameters{namespace}Element*, v8::Handle<v8::Object> creationContext, v8::Isolate*);
-
-END
-;
-
- printWrapperFunctions($F);
-
- print F <<END
-v8::Handle<v8::Object> createV8$parameters{namespace}Wrapper($parameters{namespace}Element* element, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate)
-{
- typedef HashMap<WTF::StringImpl*, Create$parameters{namespace}ElementWrapperFunction> FunctionMap;
- DEFINE_STATIC_LOCAL(FunctionMap, map, ());
- if (map.isEmpty()) {
-END
-;
-
- for my $tag (sort keys %enabledTags) {
- # 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, \%enabledTags) && ($parameters{fallbackJSInterfaceName} eq $parameters{namespace} . "Element"));
-
- my $conditional = $enabledTags{$tag}{conditional};
- if ($conditional) {
- my $conditionalString = "ENABLE(" . join(") && ENABLE(", split(/&/, $conditional)) . ")";
- print F "#if ${conditionalString}\n";
- }
-
- my $ucTag = $enabledTags{$tag}{JSInterfaceName};
- print F " map.set(${tag}Tag.localName().impl(), create${ucTag}Wrapper);\n";
-
- if ($conditional) {
- print F "#endif\n";
- }
- }
-
- print F <<END
- }
-
- Create$parameters{namespace}ElementWrapperFunction createWrapperFunction = map.get(element->localName().impl());
-END
-;
- if ($parameters{namespace} eq "HTML") {
- print F <<END
- if (createWrapperFunction == createHTMLElementWrapper)
- createWrapperFunction = createV8HTMLDirectWrapper;
-END
-;
- }
- print F <<END
- if (element->isCustomElement())
- return CustomElementWrapper<$parameters{namespace}Element, V8$parameters{namespace}Element>::wrap(element, creationContext, isolate, createWrapperFunction);
-
- if (createWrapperFunction)
- return createWrapperFunction(element, creationContext, isolate);
-END
-;
- if ($parameters{namespace} eq "SVG") {
- print F <<END
- return V8SVGElement::createWrapper(element, creationContext, isolate);
-END
-;
- } else {
- print F <<END
- return wrap(to$parameters{fallbackInterfaceName}(element), creationContext, isolate);
-END
-;
- }
-
- my $fallbackWrapper = $parameters{fallbackInterfaceName};
- if ($parameters{namespace} eq "SVG") {
- $fallbackWrapper = "SVGElement";
- }
-
- print F <<END
-}
-
-WrapperTypeInfo* findWrapperTypeFor$parameters{namespace}TagName(const AtomicString& name)
-{
- typedef HashMap<WTF::StringImpl*, WrapperTypeInfo*> NameTypeMap;
- DEFINE_STATIC_LOCAL(NameTypeMap, map, ());
- if (map.isEmpty()) {
-END
-;
-
- for my $tagName (sort keys %enabledTags) {
- if (!usesDefaultJSWrapper($tagName)) {
- my $conditional = $enabledTags{$tagName}{conditional};
- if ($conditional) {
- my $conditionalString = "ENABLE(" . join(") && ENABLE(", split(/&/, $conditional)) . ")";
- print F "#if ${conditionalString}\n";
- }
-
- my $JSInterfaceName = $enabledTags{$tagName}{JSInterfaceName};
- print F " map.set(${tagName}Tag.localName().impl(), WrapperTypeTraits<${JSInterfaceName}>::info());\n";
-
- if ($conditional) {
- print F "#endif\n";
- }
- }
- }
-
- print F <<END
- }
-
- if (WrapperTypeInfo* result = map.get(name.impl()))
- return result;
-
- return WrapperTypeTraits<$fallbackWrapper>::info();
-}
-
-END
-;
-
- print F "}\n\n";
- print F "#endif\n" if $parameters{guardFactoryWith};
-
- close F;
-}
-
-sub printWrapperFactoryHeaderFile
-{
- my $outputDir = shift;
- my $wrapperFactoryFileName = shift;
- my $F;
- open F, ">" . $outputDir . "/V8" . $wrapperFactoryFileName . ".h";
-
- printLicenseHeader($F);
-
- print F "#ifndef V8$parameters{namespace}ElementWrapperFactory_h\n";
- print F "#define V8$parameters{namespace}ElementWrapperFactory_h\n\n";
-
- print F "#if $parameters{guardFactoryWith}\n" if $parameters{guardFactoryWith};
-
- print F <<END
-#include <V8$parameters{namespace}Element.h>
-#include <V8$parameters{fallbackJSInterfaceName}.h>
-#include <v8.h>
-
-namespace WebCore {
-
- class $parameters{namespace}Element;
-
- WrapperTypeInfo* findWrapperTypeFor$parameters{namespace}TagName(const AtomicString& name);
-
- v8::Handle<v8::Object> createV8$parameters{namespace}Wrapper($parameters{namespace}Element*, v8::Handle<v8::Object> creationContext, v8::Isolate*);
- inline v8::Handle<v8::Object> createV8$parameters{namespace}DirectWrapper($parameters{namespace}Element* element, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate)
- {
- return V8$parameters{namespace}Element::createWrapper(element, creationContext, isolate);
- }
- inline v8::Handle<v8::Object> createV8$parameters{namespace}FallbackWrapper($parameters{fallbackJSInterfaceName}* element, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate)
- {
- return V8$parameters{fallbackJSInterfaceName}::createWrapper(element, creationContext, isolate);
- }
-}
-END
-;
- print F "#endif // $parameters{guardFactoryWith}\n\n" if $parameters{guardFactoryWith};
-
- print F "#endif // V8$parameters{namespace}ElementWrapperFactory_h\n";
-
- close F;
-}
-
-sub createGenericNamesFile
-{
- my $inputName = shift;
- my $baseName = shift;
- my $basePrefix = shift;
-
- my $names = new IO::File;
- open($names, $inputName) or die "Failed to open file: $inputName";
-
- $initDefaults = 0;
- my $Parser = InFilesParser->new();
- my $dummy;
- $Parser->parse($names, \&parametersHandler, \&dummy);
-
- my $F;
- my $header = File::Spec->catfile($outputDir, "${baseName}Names.h");
- open F, ">$header" or die "Unable to open $header for writing.";
-
- printLicenseHeader($F);
- printHeaderHead($F, $basePrefix, $baseName, "#include \"wtf/text/AtomicString.h\"");
-
- printMacros($F, "extern const WTF::AtomicString", "", \%parameters);
- print F "#endif\n\n";
-
- printInit($F, 1);
- close F;
-
- my $source = File::Spec->catfile($outputDir, "${baseName}Names.cpp");
- open F, ">$source" or die "Unable to open $source for writing.";
-
- printLicenseHeader($F);
- printCppHead($F, $basePrefix, $baseName, "WTF");
-
- while ( my ($name, $identifier) = each %parameters ) {
- print F "DEFINE_GLOBAL(AtomicString, $name)\n";
- }
-
- printInit($F, 0);
-
- print F "\n";
- print F StaticString::GenerateStringImpls(\%parameters);
-
- while ( my ($name, $identifier) = each %parameters ) {
- print F " new ((void*)&$name) AtomicString(${name}Impl);\n";
- }
-
- print F "}\n}\n}\n";
- close F;
- exit 0;
-}

Powered by Google App Engine
This is Rietveld 408576698