Use a 1-byte enum class for TextDirection
[WebKit-https.git] / Source / WebCore / dom / make_event_factory.pl
1 #!/usr/bin/env perl
2
3 # Copyright (C) 2005, 2006, 2007, 2009 Apple Inc. All rights reserved.
4 # Copyright (C) 2009, Julien Chaffraix <jchaffraix@webkit.org>
5 # Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
6 # Copyright (C) 2011 Ericsson AB. All rights reserved.
7 # Copyright (C) 2011 Google, Inc. All rights reserved.
8 #
9 # Redistribution and use in source and binary forms, with or without
10 # modification, are permitted provided that the following conditions
11 # are met:
12 #
13 # 1.  Redistributions of source code must retain the above copyright
14 #     notice, this list of conditions and the following disclaimer. 
15 # 2.  Redistributions in binary form must reproduce the above copyright
16 #     notice, this list of conditions and the following disclaimer in the
17 #     documentation and/or other materials provided with the distribution. 
18 # 3.  Neither the name of Apple Inc. ("Apple") nor the names of
19 #     its contributors may be used to endorse or promote products derived
20 #     from this software without specific prior written permission. 
21 #
22 # THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
23 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
24 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25 # DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
26 # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
27 # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
29 # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
33 use strict;
34 use warnings;
35 use FindBin;
36 use lib "$FindBin::Bin/../bindings/scripts";
37
38 use InFilesCompiler;
39
40 my %defaultParameters = (
41     'namespace' => 0,
42     'factoryFunction' => 0,
43     'useNamespaceAsSuffix' => 0,
44 );
45
46 sub defaultItemFactory
47 {
48     return (
49         'interfaceName' => 0,
50         'conditional' => 0,
51         'runtimeEnabled' => 0
52     );
53 }
54
55 my $InCompiler = InFilesCompiler->new(\%defaultParameters, \&defaultItemFactory);
56
57 my $outputDir = $InCompiler->initializeFromCommandLine();
58 $InCompiler->compile(\&generateCode);
59
60 sub generateCode()
61 {
62     my $parsedParametersRef = shift;
63     my $parsedItemsRef = shift;
64
65     generateImplementation($parsedParametersRef, $parsedItemsRef);
66     $InCompiler->generateInterfacesHeader();
67     $InCompiler->generateHeadersHeader();
68 }
69
70 sub generateImplementation()
71 {
72     my $parsedParametersRef = shift;
73     my $parsedItemsRef = shift;
74
75     my %parsedEvents = %{ $parsedItemsRef };
76     my %parsedParameters = %{ $parsedParametersRef };
77
78     my $namespace = $parsedParameters{"namespace"};
79     my $factoryFunction = $parsedParameters{"factoryFunction"};
80     ($factoryFunction eq "toJS" or $factoryFunction eq "toNewlyCreated") or die "factoryFunction should be either toJS or toNewlyCreated";
81     my $useNamespaceAsSuffix = $parsedParameters{"useNamespaceAsSuffix"};
82
83     my $F;
84     open F, ">", "$outputDir/${namespace}Factory.cpp" or die "Failed to open file: $!";
85
86     print F $InCompiler->license();
87
88     my $interfaceMethodName = lcfirst $namespace . "Interface";
89
90     print F "#include \"config.h\"\n";
91     print F "#include \"${namespace}Headers.h\"\n";
92     print F "\n";
93     print F "#include \"JSDOMGlobalObject.h\"\n";
94     print F "#include <JavaScriptCore/StructureInlines.h>\n";
95     print F "\n";
96     print F "namespace WebCore {\n";
97     print F "\n";
98     # FIXME: Why does Event need toNewlyCreated but EventTarget need toJS?
99     if ($factoryFunction eq "toNewlyCreated") {
100         print F "JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject* globalObject, Ref<${namespace}>&& impl)\n";
101         print F "{\n";
102         print F "    switch (impl->${interfaceMethodName}()) {\n";
103     } else {
104         print F "JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, ${namespace}& impl)\n";
105         print F "{\n";
106         print F "    switch (impl.${interfaceMethodName}()) {\n";
107     }
108
109     my %generatedInterfaceNames = ();
110
111     for my $eventName (sort keys %parsedEvents) {
112         my $conditional = $parsedEvents{$eventName}{"conditional"};
113         my $runtimeEnabled = $parsedEvents{$eventName}{"runtimeEnabled"};
114         my $interfaceName = $InCompiler->interfaceForItem($eventName);
115
116         next if $generatedInterfaceNames{$interfaceName};
117         $generatedInterfaceNames{$interfaceName} = 1;
118
119         my $suffix = "";
120         if ($useNamespaceAsSuffix eq "true") {
121             $suffix = $namespace . $suffix;
122         }
123
124         # FIXME: This should pay attention to $runtimeConditional so it can support RuntimeEnabledFeatures.
125         if ($conditional) {
126             my $conditionals = "#if ENABLE(" . join(") || ENABLE(", split("\\|", $conditional)) . ")";
127             print F "$conditionals\n";
128         }
129         print F "    case ${interfaceName}${suffix}InterfaceType:\n";
130         if ($factoryFunction eq "toNewlyCreated") {
131             print F "        return createWrapper<$interfaceName$suffix>(globalObject, WTFMove(impl));\n";
132         } else {
133             print F "        return toJS(state, globalObject, static_cast<$interfaceName&>(impl));\n";
134         }
135         print F "#endif\n" if $conditional;
136     }
137
138     print F "    }\n";
139     if ($factoryFunction eq "toNewlyCreated") {
140         print F "    return createWrapper<$namespace>(globalObject, WTFMove(impl));\n";
141     } else {
142         print F "    ASSERT_NOT_REACHED();\n";
143         print F "    return JSC::jsNull();\n";
144     }
145     print F "}\n";
146     print F "\n";
147     print F "} // namespace WebCore\n";
148
149     close F;
150 }