1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# Copyright (C) 2008 Luke Kenneth Casson Leighton <lkcl@lkcl.net>
2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# Copyright (C) 2008 Martin Soto <soto@freedesktop.org>
3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# Copyright (C) 2008 Alp Toker <alp@atoker.com>
4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# Copyright (C) 2009 Adam Dingle <adam@yorba.org>
5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# Copyright (C) 2009 Jim Nelson <jim@yorba.org>
6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# Copyright (C) 2009, 2010 Igalia S.L.
7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#
8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# This library is free software; you can redistribute it and/or
9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# modify it under the terms of the GNU Library General Public
10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# License as published by the Free Software Foundation; either
11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# version 2 of the License, or (at your option) any later version.
12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#
13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# This library is distributed in the hope that it will be useful,
14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# but WITHOUT ANY WARRANTY; without even the implied warranty of
15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# Library General Public License for more details.
17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#
18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# You should have received a copy of the GNU Library General Public License
19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# along with this library; see the file COPYING.LIB.  If not, write to
20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# Boston, MA 02111-1307, USA.
22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockpackage CodeGeneratorGObject;
24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# Global Variables
26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockmy %implIncludes = ();
27dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockmy %hdrIncludes = ();
28dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
295af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkemy $defineTypeMacro = "G_DEFINE_TYPE";
305af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkemy $defineTypeInterfaceImplementation = ")";
315af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkemy @txtEventListeners = ();
325af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkemy @txtInstallEventListeners = ();
335af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkemy @txtInstallSignals = ();
3421939df44de1705786c545cd1bf519d47250322dBen Murdochmy @txtInstallProps = ();
3521939df44de1705786c545cd1bf519d47250322dBen Murdochmy @txtSetProps = ();
3621939df44de1705786c545cd1bf519d47250322dBen Murdochmy @txtGetProps = ();
3721939df44de1705786c545cd1bf519d47250322dBen Murdoch
38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockmy $className = "";
39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# Default constructor
41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub new {
42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $object = shift;
43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $reference = { };
44dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $codeGenerator = shift;
46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $outputDir = shift;
47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    mkdir $outputDir;
48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bless($reference, $object);
50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub finish {
53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockmy $licenceTemplate = << "EOF";
56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/*
57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    This file is part of the WebKit open source project.
58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    This file has been generated by generate-bindings.pl. DO NOT MODIFY!
59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    This library is free software; you can redistribute it and/or
61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    modify it under the terms of the GNU Library General Public
62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    License as published by the Free Software Foundation; either
63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    version 2 of the License, or (at your option) any later version.
64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    This library is distributed in the hope that it will be useful,
66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    but WITHOUT ANY WARRANTY; without even the implied warranty of
67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Library General Public License for more details.
69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    You should have received a copy of the GNU Library General Public License
71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    along with this library; see the file COPYING.LIB.  If not, write to
72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Boston, MA 02110-1301, USA.
74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block*/
75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEOF
76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub GenerateModule {
78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub GetParentClassName {
81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $dataNode = shift;
82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "WebKitDOMObject" if @{$dataNode->parents} eq 0;
84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "WebKitDOM" . $codeGenerator->StripModule($dataNode->parents(0));
85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# From String::CamelCase 0.01
88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub camelize
89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        my $s = shift;
91dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        join('', map{ ucfirst $_ } split(/(?<=[A-Za-z])_(?=[A-Za-z])|\b/, $s));
92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub decamelize
95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        my $s = shift;
97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        $s =~ s{([^a-zA-Z]?)([A-Z]*)([A-Z])([a-z]?)}{
98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                my $fc = pos($s)==0;
99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                my ($p0,$p1,$p2,$p3) = ($1,lc$2,lc$3,$4);
100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                my $t = $p0 || $fc ? $p0 : '_';
101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                $t .= $p3 ? $p1 ? "${p1}_$p2$p3" : "$p2$p3" : "$p1$p2";
102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                $t;
103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }ge;
104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        $s;
105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
10721939df44de1705786c545cd1bf519d47250322dBen Murdochsub FixUpDecamelizedName {
10821939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $classname = shift;
10921939df44de1705786c545cd1bf519d47250322dBen Murdoch
11021939df44de1705786c545cd1bf519d47250322dBen Murdoch    # FIXME: try to merge this somehow with the fixes in ClassNameToGobjectType
11121939df44de1705786c545cd1bf519d47250322dBen Murdoch    $classname =~ s/x_path/xpath/;
11221939df44de1705786c545cd1bf519d47250322dBen Murdoch    $classname =~ s/web_kit/webkit/;
1134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    $classname =~ s/htmli_frame/html_iframe/;
11421939df44de1705786c545cd1bf519d47250322dBen Murdoch
11521939df44de1705786c545cd1bf519d47250322dBen Murdoch    return $classname;
11621939df44de1705786c545cd1bf519d47250322dBen Murdoch}
11721939df44de1705786c545cd1bf519d47250322dBen Murdoch
118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub ClassNameToGObjectType {
119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $className = shift;
120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $CLASS_NAME = uc(decamelize($className));
121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    # Fixup: with our prefix being 'WebKitDOM' decamelize can't get
1224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    # WebKitDOMCSS and similar names right, so we have to fix it
1234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    # manually.
124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $CLASS_NAME =~ s/DOMCSS/DOM_CSS/;
12521939df44de1705786c545cd1bf519d47250322dBen Murdoch    $CLASS_NAME =~ s/DOMHTML/DOM_HTML/;
12621939df44de1705786c545cd1bf519d47250322dBen Murdoch    $CLASS_NAME =~ s/DOMDOM/DOM_DOM/;
12721939df44de1705786c545cd1bf519d47250322dBen Murdoch    $CLASS_NAME =~ s/DOMCDATA/DOM_CDATA/;
12821939df44de1705786c545cd1bf519d47250322dBen Murdoch    $CLASS_NAME =~ s/DOMX_PATH/DOM_XPATH/;
12921939df44de1705786c545cd1bf519d47250322dBen Murdoch    $CLASS_NAME =~ s/DOM_WEB_KIT/DOM_WEBKIT/;
130dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    $CLASS_NAME =~ s/DOMUI/DOM_UI/;
1314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    $CLASS_NAME =~ s/HTMLI_FRAME/HTML_IFRAME/;
132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return $CLASS_NAME;
133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub GetParentGObjType {
136dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $dataNode = shift;
137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "WEBKIT_TYPE_DOM_OBJECT" if @{$dataNode->parents} eq 0;
139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "WEBKIT_TYPE_DOM_" . ClassNameToGObjectType($codeGenerator->StripModule($dataNode->parents(0)));
140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub GetClassName {
143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $name = $codeGenerator->StripModule(shift);
144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "WebKitDOM$name";
146dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub GetCoreObject {
149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my ($interfaceName, $name, $parameter) = @_;
150dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "WebCore::${interfaceName}* $name = WebKit::core($parameter);";
152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub SkipAttribute {
155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $attribute = shift;
156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if ($attribute->signature->extendedAttributes->{"CustomGetter"} ||
15821939df44de1705786c545cd1bf519d47250322dBen Murdoch        $attribute->signature->extendedAttributes->{"CustomSetter"} ||
15921939df44de1705786c545cd1bf519d47250322dBen Murdoch        $attribute->signature->extendedAttributes->{"Replaceable"}) {
160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 1;
161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
163dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $propType = $attribute->signature->type;
164dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if ($propType =~ /Constructor$/) {
165dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 1;
166dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
16821939df44de1705786c545cd1bf519d47250322dBen Murdoch    # This is for DOMWindow.idl location attribute
16921939df44de1705786c545cd1bf519d47250322dBen Murdoch    if ($attribute->signature->name eq "location") {
17021939df44de1705786c545cd1bf519d47250322dBen Murdoch        return 1;
17121939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
17221939df44de1705786c545cd1bf519d47250322dBen Murdoch
17321939df44de1705786c545cd1bf519d47250322dBen Murdoch    # This is for HTMLInput.idl valueAsDate
17421939df44de1705786c545cd1bf519d47250322dBen Murdoch    if ($attribute->signature->name eq "valueAsDate") {
17521939df44de1705786c545cd1bf519d47250322dBen Murdoch        return 1;
17621939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
17721939df44de1705786c545cd1bf519d47250322dBen Murdoch
17821939df44de1705786c545cd1bf519d47250322dBen Murdoch    # This is for DOMWindow.idl Crypto attribute
17921939df44de1705786c545cd1bf519d47250322dBen Murdoch    if ($attribute->signature->type eq "Crypto") {
18021939df44de1705786c545cd1bf519d47250322dBen Murdoch        return 1;
18121939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
18221939df44de1705786c545cd1bf519d47250322dBen Murdoch
18321939df44de1705786c545cd1bf519d47250322dBen Murdoch    return 0;
18421939df44de1705786c545cd1bf519d47250322dBen Murdoch}
18521939df44de1705786c545cd1bf519d47250322dBen Murdoch
18621939df44de1705786c545cd1bf519d47250322dBen Murdochsub SkipFunction {
18721939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $function = shift;
18821939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $decamelize = shift;
18921939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $prefix = shift;
19021939df44de1705786c545cd1bf519d47250322dBen Murdoch
19121939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $functionName = "webkit_dom_" . $decamelize . "_" . $prefix . decamelize($function->signature->name);
19221939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $isCustomFunction = $function->signature->extendedAttributes->{"Custom"} ||
19321939df44de1705786c545cd1bf519d47250322dBen Murdoch        $function->signature->extendedAttributes->{"CustomArgumentHandling"};
19421939df44de1705786c545cd1bf519d47250322dBen Murdoch
19521939df44de1705786c545cd1bf519d47250322dBen Murdoch    if ($isCustomFunction &&
19621939df44de1705786c545cd1bf519d47250322dBen Murdoch        $functionName ne "webkit_dom_node_replace_child" &&
19721939df44de1705786c545cd1bf519d47250322dBen Murdoch        $functionName ne "webkit_dom_node_insert_before" &&
198ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        $functionName ne "webkit_dom_node_remove_child" &&
19921939df44de1705786c545cd1bf519d47250322dBen Murdoch        $functionName ne "webkit_dom_node_append_child" &&
20021939df44de1705786c545cd1bf519d47250322dBen Murdoch        $functionName ne "webkit_dom_html_collection_item" &&
20121939df44de1705786c545cd1bf519d47250322dBen Murdoch        $functionName ne "webkit_dom_html_collection_named_item") {
20221939df44de1705786c545cd1bf519d47250322dBen Murdoch        return 1;
20321939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
20421939df44de1705786c545cd1bf519d47250322dBen Murdoch
20521939df44de1705786c545cd1bf519d47250322dBen Murdoch    if ($function->signature->name eq "getSVGDocument") {
20621939df44de1705786c545cd1bf519d47250322dBen Murdoch        return 1;
20721939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
20821939df44de1705786c545cd1bf519d47250322dBen Murdoch
20921939df44de1705786c545cd1bf519d47250322dBen Murdoch    if ($function->signature->name eq "getCSSCanvasContext") {
21021939df44de1705786c545cd1bf519d47250322dBen Murdoch        return 1;
21121939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
21221939df44de1705786c545cd1bf519d47250322dBen Murdoch
213dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    # Skip functions that have ["Callback"] parameters, because this
214dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    # code generator doesn't know how to auto-generate callbacks.
2154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    # Skip functions that have "MediaQueryListListener" parameters, because this
2164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    # code generator doesn't know how to auto-generate MediaQueryListListener.
217dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    foreach my $param (@{$function->parameters}) {
2184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if ($param->extendedAttributes->{"Callback"} ||
2194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            $param->type eq "MediaQueryListListener") {
220dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            return 1;
221dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        }
222dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    }
223dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return 0;
225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# Name type used in the g_value_{set,get}_* functions
228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub GetGValueTypeName {
229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $type = shift;
230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my %types = ("DOMString", "string",
2325af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke                 "DOMTimeStamp", "uint",
233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "float", "float",
234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "double", "double",
235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "boolean", "boolean",
236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "char", "char",
237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "long", "long",
23821939df44de1705786c545cd1bf519d47250322dBen Murdoch                 "long long", "int64",
239dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "short", "int",
240dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "uchar", "uchar",
241dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "unsigned", "uint",
242dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "int", "int",
243dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "unsigned int", "uint",
244dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "unsigned long long", "uint64",
245dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "unsigned long", "ulong",
246dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "unsigned short", "ushort");
247dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
248dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return $types{$type} ? $types{$type} : "object";
249dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
250dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
251dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# Name type used in C declarations
252dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub GetGlibTypeName {
253dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $type = shift;
254dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $name = GetClassName($type);
255dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
256dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    my %types = ("DOMString", "gchar*",
2575af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke                 "DOMTimeStamp", "guint32",
25821939df44de1705786c545cd1bf519d47250322dBen Murdoch                 "CompareHow", "gushort",
259dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "float", "gfloat",
260dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "double", "gdouble",
261dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "boolean", "gboolean",
262dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "char", "gchar",
263dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "long", "glong",
26421939df44de1705786c545cd1bf519d47250322dBen Murdoch                 "long long", "gint64",
265dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "short", "gshort",
266dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "uchar", "guchar",
267dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "unsigned", "guint",
268dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "int", "gint",
269dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "unsigned int", "guint",
270dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "unsigned long", "gulong",
271dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "unsigned long long", "guint64",
272dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "unsigned short", "gushort",
273dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                 "void", "void");
274dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
275dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return $types{$type} ? $types{$type} : "$name*";
276dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
278dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub IsGDOMClassType {
279dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $type = shift;
280dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
28121939df44de1705786c545cd1bf519d47250322dBen Murdoch    return 0 if $codeGenerator->IsNonPointerType($type) || $codeGenerator->IsStringType($type);
282dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return 1;
283dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
284dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
28521939df44de1705786c545cd1bf519d47250322dBen Murdochsub GetReadableProperties {
28621939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $properties = shift;
28721939df44de1705786c545cd1bf519d47250322dBen Murdoch
28821939df44de1705786c545cd1bf519d47250322dBen Murdoch    my @result = ();
28921939df44de1705786c545cd1bf519d47250322dBen Murdoch
29021939df44de1705786c545cd1bf519d47250322dBen Murdoch    foreach my $property (@{$properties}) {
29121939df44de1705786c545cd1bf519d47250322dBen Murdoch        if (!SkipAttribute($property)) {
29221939df44de1705786c545cd1bf519d47250322dBen Murdoch            push(@result, $property);
29321939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
29421939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
29521939df44de1705786c545cd1bf519d47250322dBen Murdoch
29621939df44de1705786c545cd1bf519d47250322dBen Murdoch    return @result;
29721939df44de1705786c545cd1bf519d47250322dBen Murdoch}
29821939df44de1705786c545cd1bf519d47250322dBen Murdoch
29921939df44de1705786c545cd1bf519d47250322dBen Murdochsub GetWriteableProperties {
30021939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $properties = shift;
30121939df44de1705786c545cd1bf519d47250322dBen Murdoch    my @result = ();
30221939df44de1705786c545cd1bf519d47250322dBen Murdoch
30321939df44de1705786c545cd1bf519d47250322dBen Murdoch    foreach my $property (@{$properties}) {
30421939df44de1705786c545cd1bf519d47250322dBen Murdoch        my $writeable = $property->type !~ /^readonly/;
30521939df44de1705786c545cd1bf519d47250322dBen Murdoch        my $gtype = GetGValueTypeName($property->signature->type);
30621939df44de1705786c545cd1bf519d47250322dBen Murdoch        my $hasGtypeSignature = ($gtype eq "boolean" || $gtype eq "float" || $gtype eq "double" ||
30721939df44de1705786c545cd1bf519d47250322dBen Murdoch                                 $gtype eq "uint64" || $gtype eq "ulong" || $gtype eq "long" ||
30821939df44de1705786c545cd1bf519d47250322dBen Murdoch                                 $gtype eq "uint" || $gtype eq "ushort" || $gtype eq "uchar" ||
30921939df44de1705786c545cd1bf519d47250322dBen Murdoch                                 $gtype eq "char" || $gtype eq "string");
31021939df44de1705786c545cd1bf519d47250322dBen Murdoch        if ($writeable && $hasGtypeSignature) {
31121939df44de1705786c545cd1bf519d47250322dBen Murdoch            push(@result, $property);
31221939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
31321939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
31421939df44de1705786c545cd1bf519d47250322dBen Murdoch
31521939df44de1705786c545cd1bf519d47250322dBen Murdoch    return @result;
31621939df44de1705786c545cd1bf519d47250322dBen Murdoch}
31721939df44de1705786c545cd1bf519d47250322dBen Murdoch
31806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsensub GenerateConditionalString
31906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
32006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    my $node = shift;
32106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    my $conditional = $node->extendedAttributes->{"Conditional"};
32206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if ($conditional) {
32306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if ($conditional =~ /&/) {
32406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            return "ENABLE(" . join(") && ENABLE(", split(/&/, $conditional)) . ")";
32506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        } elsif ($conditional =~ /\|/) {
32606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            return "ENABLE(" . join(") || ENABLE(", split(/\|/, $conditional)) . ")";
32706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        } else {
32806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            return "ENABLE(" . $conditional . ")";
32906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        }
33006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    } else {
33106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return "";
33206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
33306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
33406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
33521939df44de1705786c545cd1bf519d47250322dBen Murdochsub GenerateProperty {
33621939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $attribute = shift;
33721939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $interfaceName = shift;
33821939df44de1705786c545cd1bf519d47250322dBen Murdoch    my @writeableProperties = @{shift @_};
33921939df44de1705786c545cd1bf519d47250322dBen Murdoch
34006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    my $conditionalString = GenerateConditionalString($attribute->signature);
34121939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $camelPropName = $attribute->signature->name;
34221939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $setPropNameFunction = $codeGenerator->WK_ucfirst($camelPropName);
34321939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $getPropNameFunction = $codeGenerator->WK_lcfirst($camelPropName);
34421939df44de1705786c545cd1bf519d47250322dBen Murdoch
34521939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $propName = decamelize($camelPropName);
34621939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $propNameCaps = uc($propName);
34721939df44de1705786c545cd1bf519d47250322dBen Murdoch    $propName =~ s/_/-/g;
34821939df44de1705786c545cd1bf519d47250322dBen Murdoch    my ${propEnum} = "PROP_${propNameCaps}";
34906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    push(@cBodyPriv, "#if ${conditionalString}\n") if $conditionalString;
35021939df44de1705786c545cd1bf519d47250322dBen Murdoch    push(@cBodyPriv, "    ${propEnum},\n");
35106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    push(@cBodyPriv, "#endif /* ${conditionalString} */\n") if $conditionalString;
35221939df44de1705786c545cd1bf519d47250322dBen Murdoch
35321939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $propType = $attribute->signature->type;
35421939df44de1705786c545cd1bf519d47250322dBen Murdoch    my ${propGType} = decamelize($propType);
35521939df44de1705786c545cd1bf519d47250322dBen Murdoch    my ${ucPropGType} = uc($propGType);
35621939df44de1705786c545cd1bf519d47250322dBen Murdoch
35721939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $gtype = GetGValueTypeName($propType);
35821939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $gparamflag = "WEBKIT_PARAM_READABLE";
35921939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $writeable = $attribute->type !~ /^readonly/;
36021939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $const = "read-only ";
36121939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $custom = $attribute->signature->extendedAttributes->{"Custom"};
36221939df44de1705786c545cd1bf519d47250322dBen Murdoch    if ($writeable && $custom) {
36321939df44de1705786c545cd1bf519d47250322dBen Murdoch        $const = "read-only (due to custom functions needed in webkitdom)";
36421939df44de1705786c545cd1bf519d47250322dBen Murdoch        return;
36521939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
36621939df44de1705786c545cd1bf519d47250322dBen Murdoch    if ($writeable && !$custom) {
36721939df44de1705786c545cd1bf519d47250322dBen Murdoch        $gparamflag = "WEBKIT_PARAM_READWRITE";
36821939df44de1705786c545cd1bf519d47250322dBen Murdoch        $const = "read-write ";
36921939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
37021939df44de1705786c545cd1bf519d47250322dBen Murdoch
37121939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $type = GetGlibTypeName($propType);
37221939df44de1705786c545cd1bf519d47250322dBen Murdoch    $nick = decamelize("${interfaceName}_${propName}");
37321939df44de1705786c545cd1bf519d47250322dBen Murdoch    $long = "${const} ${type} ${interfaceName}.${propName}";
37421939df44de1705786c545cd1bf519d47250322dBen Murdoch
37521939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $convertFunction = "";
37621939df44de1705786c545cd1bf519d47250322dBen Murdoch    if ($gtype eq "string") {
377dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        $convertFunction = "WTF::String::fromUTF8";
37821939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
37921939df44de1705786c545cd1bf519d47250322dBen Murdoch
38006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    my $getterExpressionPrefix = $codeGenerator->GetterExpressionPrefix(\%implIncludes, $interfaceName, $attribute);
38106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    my $setterExpressionPrefix = $codeGenerator->SetterExpressionPrefix(\%implIncludes, $interfaceName, $attribute);
38206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
38306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    my $getterContentHead = "coreSelf->$getterExpressionPrefix";
38406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    my $setterContentHead = "coreSelf->$setterExpressionPrefix${convertFunction}(g_value_get_$gtype(value))";
38521939df44de1705786c545cd1bf519d47250322dBen Murdoch
38621939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (grep {$_ eq $attribute} @writeableProperties) {
38706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        push(@txtSetProps, "#if ${conditionalString}\n") if $conditionalString;
388545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        push(@txtSetProps, "    case ${propEnum}:\n    {\n");
38921939df44de1705786c545cd1bf519d47250322dBen Murdoch        push(@txtSetProps, "        WebCore::ExceptionCode ec = 0;\n") if @{$attribute->setterExceptions};
39021939df44de1705786c545cd1bf519d47250322dBen Murdoch        push(@txtSetProps, "        ${setterContentHead}");
39121939df44de1705786c545cd1bf519d47250322dBen Murdoch        push(@txtSetProps, ", ec") if @{$attribute->setterExceptions};
39221939df44de1705786c545cd1bf519d47250322dBen Murdoch        push(@txtSetProps, ");\n");
39321939df44de1705786c545cd1bf519d47250322dBen Murdoch        push(@txtSetProps, "        break;\n    }\n");
39406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        push(@txtSetProps, "#endif /* ${conditionalString} */\n") if $conditionalString;
39521939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
39621939df44de1705786c545cd1bf519d47250322dBen Murdoch
39706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    push(@txtGetProps, "#if ${conditionalString}\n") if $conditionalString;
398545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    push(@txtGetProps, "    case ${propEnum}:\n    {\n");
39921939df44de1705786c545cd1bf519d47250322dBen Murdoch
40021939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $exception = "";
40121939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (@{$attribute->getterExceptions}) {
40221939df44de1705786c545cd1bf519d47250322dBen Murdoch        $exception = "ec";
40321939df44de1705786c545cd1bf519d47250322dBen Murdoch        push(@txtGetProps, "        WebCore::ExceptionCode ec = 0;\n");
40421939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
40521939df44de1705786c545cd1bf519d47250322dBen Murdoch
40621939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $postConvertFunction = "";
40721939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $done = 0;
40821939df44de1705786c545cd1bf519d47250322dBen Murdoch    if ($gtype eq "string") {
40921939df44de1705786c545cd1bf519d47250322dBen Murdoch        push(@txtGetProps, "        g_value_take_string(value, convertToUTF8String(${getterContentHead}${exception})));\n");
41021939df44de1705786c545cd1bf519d47250322dBen Murdoch        $done = 1;
41121939df44de1705786c545cd1bf519d47250322dBen Murdoch    } elsif ($gtype eq "object") {
41221939df44de1705786c545cd1bf519d47250322dBen Murdoch        $txtGetProp = << "EOF";
41321939df44de1705786c545cd1bf519d47250322dBen Murdoch        RefPtr<WebCore::${propType}> ptr = coreSelf->${getPropNameFunction}(${exception});
41421939df44de1705786c545cd1bf519d47250322dBen Murdoch        g_value_set_object(value, WebKit::kit(ptr.get()));
41521939df44de1705786c545cd1bf519d47250322dBen MurdochEOF
41621939df44de1705786c545cd1bf519d47250322dBen Murdoch        push(@txtGetProps, $txtGetProp);
41721939df44de1705786c545cd1bf519d47250322dBen Murdoch        $done = 1;
41821939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
41921939df44de1705786c545cd1bf519d47250322dBen Murdoch
42021939df44de1705786c545cd1bf519d47250322dBen Murdoch    # FIXME: get rid of this glitch?
42121939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $_gtype = $gtype;
42221939df44de1705786c545cd1bf519d47250322dBen Murdoch    if ($gtype eq "ushort") {
42321939df44de1705786c545cd1bf519d47250322dBen Murdoch        $_gtype = "uint";
42421939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
42521939df44de1705786c545cd1bf519d47250322dBen Murdoch
42621939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (!$done) {
42706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        push(@txtGetProps, "        g_value_set_$_gtype(value, ${convertFunction}coreSelf->${getterExpressionPrefix}${exception})${postConvertFunction});\n");
42821939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
42921939df44de1705786c545cd1bf519d47250322dBen Murdoch
43021939df44de1705786c545cd1bf519d47250322dBen Murdoch    push(@txtGetProps, "        break;\n    }\n");
43106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    push(@txtGetProps, "#endif /* ${conditionalString} */\n") if $conditionalString;
43221939df44de1705786c545cd1bf519d47250322dBen Murdoch
43321939df44de1705786c545cd1bf519d47250322dBen Murdoch    my %param_spec_options = ("int", "G_MININT, /* min */\nG_MAXINT, /* max */\n0, /* default */",
43421939df44de1705786c545cd1bf519d47250322dBen Murdoch                              "boolean", "FALSE, /* default */",
43521939df44de1705786c545cd1bf519d47250322dBen Murdoch                              "float", "-G_MAXFLOAT, /* min */\nG_MAXFLOAT, /* max */\n0.0, /* default */",
43621939df44de1705786c545cd1bf519d47250322dBen Murdoch                              "double", "-G_MAXDOUBLE, /* min */\nG_MAXDOUBLE, /* max */\n0.0, /* default */",
43721939df44de1705786c545cd1bf519d47250322dBen Murdoch                              "uint64", "0, /* min */\nG_MAXUINT64, /* min */\n0, /* default */",
43821939df44de1705786c545cd1bf519d47250322dBen Murdoch                              "long", "G_MINLONG, /* min */\nG_MAXLONG, /* max */\n0, /* default */",
43921939df44de1705786c545cd1bf519d47250322dBen Murdoch                              "int64", "G_MININT64, /* min */\nG_MAXINT64, /* max */\n0, /* default */",
44021939df44de1705786c545cd1bf519d47250322dBen Murdoch                              "ulong", "0, /* min */\nG_MAXULONG, /* max */\n0, /* default */",
44121939df44de1705786c545cd1bf519d47250322dBen Murdoch                              "uint", "0, /* min */\nG_MAXUINT, /* max */\n0, /* default */",
44221939df44de1705786c545cd1bf519d47250322dBen Murdoch                              "ushort", "0, /* min */\nG_MAXUINT16, /* max */\n0, /* default */",
44321939df44de1705786c545cd1bf519d47250322dBen Murdoch                              "uchar", "G_MININT8, /* min */\nG_MAXINT8, /* max */\n0, /* default */",
44421939df44de1705786c545cd1bf519d47250322dBen Murdoch                              "char", "0, /* min */\nG_MAXUINT8, /* max */\n0, /* default */",
44521939df44de1705786c545cd1bf519d47250322dBen Murdoch                              "string", "\"\", /* default */",
44621939df44de1705786c545cd1bf519d47250322dBen Murdoch                              "object", "WEBKIT_TYPE_DOM_${ucPropGType}, /* gobject type */");
44721939df44de1705786c545cd1bf519d47250322dBen Murdoch
44821939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $txtInstallProp = << "EOF";
44921939df44de1705786c545cd1bf519d47250322dBen Murdoch    g_object_class_install_property(gobjectClass,
45021939df44de1705786c545cd1bf519d47250322dBen Murdoch                                    ${propEnum},
45121939df44de1705786c545cd1bf519d47250322dBen Murdoch                                    g_param_spec_${_gtype}("${propName}", /* name */
45221939df44de1705786c545cd1bf519d47250322dBen Murdoch                                                           "$nick", /* short description */
45321939df44de1705786c545cd1bf519d47250322dBen Murdoch                                                           "$long", /* longer - could do with some extra doc stuff here */
45421939df44de1705786c545cd1bf519d47250322dBen Murdoch                                                           $param_spec_options{$gtype}
45521939df44de1705786c545cd1bf519d47250322dBen Murdoch                                                           ${gparamflag}));
45621939df44de1705786c545cd1bf519d47250322dBen MurdochEOF
45706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    push(@txtInstallProps, "#if ${conditionalString}\n") if $conditionalString;
45821939df44de1705786c545cd1bf519d47250322dBen Murdoch    push(@txtInstallProps, $txtInstallProp);
45906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    push(@txtInstallProps, "#endif /* ${conditionalString} */\n") if $conditionalString;
46021939df44de1705786c545cd1bf519d47250322dBen Murdoch}
46121939df44de1705786c545cd1bf519d47250322dBen Murdoch
462dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub GenerateProperties {
463dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my ($object, $interfaceName, $dataNode) = @_;
464dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
465dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $clsCaps = substr(ClassNameToGObjectType($className), 12);
46621939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $lowerCaseIfaceName = "webkit_dom_" . (FixUpDecamelizedName(decamelize($interfaceName)));
467dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
468dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    # Properties
469dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $implContent = "";
470dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
471dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    # Properties
472dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $implContent = << "EOF";
473dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockenum {
474dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    PROP_0,
475dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEOF
476dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    push(@cBodyPriv, $implContent);
477dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
47821939df44de1705786c545cd1bf519d47250322dBen Murdoch    my @readableProperties = GetReadableProperties($dataNode->attributes);
479dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
480dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $privFunction = GetCoreObject($interfaceName, "coreSelf", "self");
481dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
482dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $txtGetProp = << "EOF";
483dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void ${lowerCaseIfaceName}_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec)
484dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
485ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    WebCore::JSMainThreadNullState state;
48621939df44de1705786c545cd1bf519d47250322dBen MurdochEOF
48721939df44de1705786c545cd1bf519d47250322dBen Murdoch    push(@txtGetProps, $txtGetProp);
48821939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (scalar @readableProperties > 0) {
48921939df44de1705786c545cd1bf519d47250322dBen Murdoch        $txtGetProp = << "EOF";
490dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ${className}* self = WEBKIT_DOM_${clsCaps}(object);
491dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $privFunction
49221939df44de1705786c545cd1bf519d47250322dBen MurdochEOF
49321939df44de1705786c545cd1bf519d47250322dBen Murdoch    push(@txtGetProps, $txtGetProp);
49421939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
495dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
49621939df44de1705786c545cd1bf519d47250322dBen Murdoch    $txtGetProp = << "EOF";
497dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    switch (prop_id) {
498dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEOF
499dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    push(@txtGetProps, $txtGetProp);
500dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
50121939df44de1705786c545cd1bf519d47250322dBen Murdoch    my @writeableProperties = GetWriteableProperties(\@readableProperties);
50221939df44de1705786c545cd1bf519d47250322dBen Murdoch
503dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $txtSetProps = << "EOF";
504dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void ${lowerCaseIfaceName}_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec)
505dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
506ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    WebCore::JSMainThreadNullState state;
50721939df44de1705786c545cd1bf519d47250322dBen MurdochEOF
50821939df44de1705786c545cd1bf519d47250322dBen Murdoch    push(@txtSetProps, $txtSetProps);
50921939df44de1705786c545cd1bf519d47250322dBen Murdoch
51021939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (scalar @writeableProperties > 0) {
51121939df44de1705786c545cd1bf519d47250322dBen Murdoch        $txtSetProps = << "EOF";
512545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    ${className}* self = WEBKIT_DOM_${clsCaps}(object);
513dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $privFunction
51421939df44de1705786c545cd1bf519d47250322dBen MurdochEOF
51521939df44de1705786c545cd1bf519d47250322dBen Murdoch        push(@txtSetProps, $txtSetProps);
51621939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
517dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
51821939df44de1705786c545cd1bf519d47250322dBen Murdoch    $txtSetProps = << "EOF";
519dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    switch (prop_id) {
520dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEOF
521dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    push(@txtSetProps, $txtSetProps);
522dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
52321939df44de1705786c545cd1bf519d47250322dBen Murdoch    foreach my $attribute (@readableProperties) {
5244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if ($attribute->signature->type ne "EventListener" &&
5254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            $attribute->signature->type ne "MediaQueryListListener") {
5265af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            GenerateProperty($attribute, $interfaceName, \@writeableProperties);
5275af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        }
528dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
529dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
530dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    push(@cBodyPriv, "};\n\n");
531dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
532dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $txtGetProp = << "EOF";
533dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    default:
534dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
535dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
536dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
537dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
538dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEOF
539dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    push(@txtGetProps, $txtGetProp);
540dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
541dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $txtSetProps = << "EOF";
542dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    default:
543dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
544dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
545dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
546dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
547dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEOF
548dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    push(@txtSetProps, $txtSetProps);
549dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
550545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    # Do not insert extra spaces when interpolating array variables
551545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    $" = "";
552545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
553dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $implContent = << "EOF";
554dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
555dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void ${lowerCaseIfaceName}_finalize(GObject* object)
556dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
557dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebKitDOMObject* dom_object = WEBKIT_DOM_OBJECT(object);
558dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5595af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (dom_object->coreObject) {
560dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        WebCore::${interfaceName}* coreObject = static_cast<WebCore::${interfaceName} *>(dom_object->coreObject);
561dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
562dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        WebKit::DOMObjectCache::forget(coreObject);
563dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        coreObject->deref();
564dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
565dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        dom_object->coreObject = NULL;
566dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
567dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
568dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    G_OBJECT_CLASS(${lowerCaseIfaceName}_parent_class)->finalize(object);
569dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
570dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
571dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block@txtSetProps
572dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
573dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block@txtGetProps
574dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
575ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockstatic void ${lowerCaseIfaceName}_constructed(GObject* object)
576ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
577ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve BlockEOF
578ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    push(@cBodyPriv, $implContent);
579ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
580ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    $implContent = << "EOF";
581ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block@txtInstallEventListeners
582ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (G_OBJECT_CLASS(${lowerCaseIfaceName}_parent_class)->constructed)
583ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        G_OBJECT_CLASS(${lowerCaseIfaceName}_parent_class)->constructed(object);
584ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
585ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
586dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void ${lowerCaseIfaceName}_class_init(${className}Class* requestClass)
587dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
588dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    GObjectClass *gobjectClass = G_OBJECT_CLASS(requestClass);
589dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    gobjectClass->finalize = ${lowerCaseIfaceName}_finalize;
590dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    gobjectClass->set_property = ${lowerCaseIfaceName}_set_property;
591dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    gobjectClass->get_property = ${lowerCaseIfaceName}_get_property;
592ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    gobjectClass->constructed = ${lowerCaseIfaceName}_constructed;
593dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
594dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block@txtInstallProps
5955af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke@txtInstallSignals
596dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
597dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
598dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void ${lowerCaseIfaceName}_init(${className}* request)
599dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
600dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
601dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
602dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEOF
603dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    push(@cBodyPriv, $implContent);
604dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
605dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
606dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub GenerateHeader {
607dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my ($object, $interfaceName, $parentClassName) = @_;
608dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
609dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $implContent = "";
610dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
611dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    # Add the default header template
612dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    @hPrefix = split("\r", $licenceTemplate);
613dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    push(@hPrefix, "\n");
614dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
615dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    #Header guard
616dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $guard = $className . "_h";
617dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
618dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    @hPrefixGuard = << "EOF";
619dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifndef $guard
620dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define $guard
621dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
622dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEOF
623dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
624dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $implContent = << "EOF";
625dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockG_BEGIN_DECLS
626dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEOF
627dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
628dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    push(@hBodyPre, $implContent);
629dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
63021939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $decamelize = FixUpDecamelizedName(decamelize($interfaceName));
63121939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $clsCaps = uc($decamelize);
63221939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $lowerCaseIfaceName = "webkit_dom_" . ($decamelize);
633dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
634dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $implContent = << "EOF";
635dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define WEBKIT_TYPE_DOM_${clsCaps}            (${lowerCaseIfaceName}_get_type())
636dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define WEBKIT_DOM_${clsCaps}(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), WEBKIT_TYPE_DOM_${clsCaps}, ${className}))
637dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define WEBKIT_DOM_${clsCaps}_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass),  WEBKIT_TYPE_DOM_${clsCaps}, ${className}Class)
638dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define WEBKIT_DOM_IS_${clsCaps}(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), WEBKIT_TYPE_DOM_${clsCaps}))
639dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define WEBKIT_DOM_IS_${clsCaps}_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),  WEBKIT_TYPE_DOM_${clsCaps}))
640dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define WEBKIT_DOM_${clsCaps}_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj),  WEBKIT_TYPE_DOM_${clsCaps}, ${className}Class))
641dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
642dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstruct _${className} {
643dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ${parentClassName} parent_instance;
644dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block};
645dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
646dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstruct _${className}Class {
647dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ${parentClassName}Class parent_class;
648dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block};
649dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
650dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWEBKIT_API GType
651dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block${lowerCaseIfaceName}_get_type (void);
652dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
653dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEOF
654dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
655dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    push(@hBody, $implContent);
656dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
657dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
658dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub getIncludeHeader {
659dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $type = shift;
660dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $name = GetClassName($type);
661dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
662dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "" if $type eq "int";
663dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "" if $type eq "long";
66421939df44de1705786c545cd1bf519d47250322dBen Murdoch    return "" if $type eq "long long";
665dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "" if $type eq "short";
666dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "" if $type eq "char";
667dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "" if $type eq "float";
668dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "" if $type eq "double";
669dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "" if $type eq "unsigned";
670dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "" if $type eq "unsigned int";
671dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "" if $type eq "unsigned long";
672dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "" if $type eq "unsigned long long";
673dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "" if $type eq "unsigned short";
674dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "" if $type eq "DOMTimeStamp";
675dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "" if $type eq "EventListener";
6764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return "" if $type eq "MediaQueryListListener";
677dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "" if $type eq "unsigned char";
678dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "" if $type eq "DOMString";
679dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "" if $type eq "float";
680dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "" if $type eq "boolean";
681dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "" if $type eq "void";
68221939df44de1705786c545cd1bf519d47250322dBen Murdoch    return "" if $type eq "CompareHow";
683dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
684dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return "$name.h";
685dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
686dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
687dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub addIncludeInBody {
688dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $type = shift;
689dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
69021939df44de1705786c545cd1bf519d47250322dBen Murdoch    if ($type eq "DOMObject") {
69121939df44de1705786c545cd1bf519d47250322dBen Murdoch        return;
69221939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
69321939df44de1705786c545cd1bf519d47250322dBen Murdoch
694dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $header = getIncludeHeader($type);
695dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if ($header eq "") {
696dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
697dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
698dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
699dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (IsGDOMClassType($type)) {
700dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        $implIncludes{"webkit/$header"} = 1;
701dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else {
702dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        $implIncludes{$header} = 1
703dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
704dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
705dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
706dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub GenerateFunction {
707dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my ($object, $interfaceName, $function, $prefix) = @_;
708dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
70921939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $decamelize = FixUpDecamelizedName(decamelize($interfaceName));
71021939df44de1705786c545cd1bf519d47250322dBen Murdoch
7114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if ($object eq "MediaQueryListListener") {
7124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        return;
7134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    }
7144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
71521939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (SkipFunction($function, $decamelize, $prefix)) {
71621939df44de1705786c545cd1bf519d47250322dBen Murdoch        return;
71721939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
71821939df44de1705786c545cd1bf519d47250322dBen Murdoch
719dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $functionSigName = $function->signature->name;
72006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    my $functionSigType = $prefix eq "set_" ? "void" : $function->signature->type;
72121939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $functionName = "webkit_dom_" . $decamelize . "_" . $prefix . decamelize($functionSigName);
722dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $returnType = GetGlibTypeName($functionSigType);
723dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $returnValueIsGDOMType = IsGDOMClassType($functionSigType);
72406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    my $conditionalString = GenerateConditionalString($function->signature);
725dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
726545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    my $functionSig = "${className}* self";
727dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
728dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $callImplParams = "";
729dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
730dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    # skip some custom functions for now
731dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $isCustomFunction = $function->signature->extendedAttributes->{"Custom"} ||
732dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                       $function->signature->extendedAttributes->{"CustomArgumentHandling"};
733dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
734dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    foreach my $param (@{$function->parameters}) {
735dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        my $paramIDLType = $param->type;
7364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if ($paramIDLType eq "EventListener" || $paramIDLType eq "MediaQueryListListener") {
7372bde8e466a4451c7319e3a072d118917957d6554Steve Block            # EventListeners are handled elsewhere.
738dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return;
739dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
740dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        addIncludeInBody($paramIDLType);
741dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        my $paramType = GetGlibTypeName($paramIDLType);
742dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        my $const = $paramType eq "gchar*" ? "const " : "";
743dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        my $paramName = decamelize($param->name);
744dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
745dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        $functionSig .= ", ${const}$paramType $paramName";
746dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
747dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        my $paramIsGDOMType = IsGDOMClassType($paramIDLType);
748dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if ($paramIsGDOMType) {
749dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if ($paramIDLType ne "DOMObject") {
750dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                $implIncludes{"webkit/WebKitDOM${paramIDLType}Private.h"} = 1;
751dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            }
752dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
75321939df44de1705786c545cd1bf519d47250322dBen Murdoch        if ($paramIsGDOMType || ($paramIDLType eq "DOMString") || ($paramIDLType eq "CompareHow")) {
75406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            $paramName = "converted_" . $paramName;
755dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
756dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if ($callImplParams) {
757dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            $callImplParams .= ", $paramName";
758dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else {
759dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            $callImplParams = "$paramName";
760dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
761dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
762dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
763db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    # Not quite sure what to do with this yet, but we need to take into
764db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    # account the difference in parameters between the IDL file and the
765db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    # actual implementation.
766db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    if ($function->signature->extendedAttributes->{"NeedsUserGestureCheck"}) {
767db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        $functionSig .= ", gboolean isUserGesture";
768db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        $callImplParams .= ", " if $callImplParams;
769db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        $callImplParams .= "false";
770db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    }
771db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
77221939df44de1705786c545cd1bf519d47250322dBen Murdoch    if ($returnType ne "void" && $returnValueIsGDOMType && $functionSigType ne "DOMObject") {
773dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if ($functionSigType ne "EventTarget") {
774dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            $implIncludes{"webkit/WebKitDOM${functionSigType}Private.h"} = 1;
775dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            $implIncludes{"webkit/WebKitDOM${functionSigType}.h"} = 1;
7765af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        } else {
7775af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            $implIncludes{"WebKitDOM${functionSigType}.h"} = 1;
778dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
779dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
780dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        $implIncludes{"${functionSigType}.h"} = 1;
781dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
782dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
783dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if(@{$function->raisesExceptions}) {
784dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        $functionSig .= ", GError **error";
785dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
786dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
78706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    push(@hBody, "WEBKIT_API $returnType\n$functionName($functionSig);\n");
78806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    push(@hBody, "\n");
78906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
790545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    push(@cBody, "$returnType\n$functionName($functionSig)\n{\n");
791e14391e94c850b8bd03680c23b38978db68687a8John Reck    push(@cBody, "#if ${conditionalString}\n") if $conditionalString;
7925af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
793dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if ($returnType ne "void") {
794dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        # TODO: return proper default result
79506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        push(@cBody, "    g_return_val_if_fail(self, 0);\n");
796dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else {
79706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        push(@cBody, "    g_return_if_fail(self);\n");
798dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
799dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
800e14391e94c850b8bd03680c23b38978db68687a8John Reck    push(@cBody, "    WebCore::JSMainThreadNullState state;\n");
801e14391e94c850b8bd03680c23b38978db68687a8John Reck
802dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    # The WebKit::core implementations check for NULL already; no need to
803dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    # duplicate effort.
804dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    push(@cBody, "    WebCore::${interfaceName} * item = WebKit::core(self);\n");
805dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
806dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    foreach my $param (@{$function->parameters}) {
807dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        my $paramName = decamelize($param->name);
808dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        my $paramIDLType = $param->type;
809dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        my $paramTypeIsPrimitive = $codeGenerator->IsPrimitiveType($paramIDLType);
810dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        my $paramIsGDOMType = IsGDOMClassType($paramIDLType);
811dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!$paramTypeIsPrimitive) {
812dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if ($returnType ne "void") {
813dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                # TODO: return proper default result
8145ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                # FIXME: Temporary hack for generating a proper implementation
8155ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                #        of the webkit_dom_document_evaluate function (Bug-ID: 42115)
8165ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                if (!(($functionName eq "webkit_dom_document_evaluate") && ($paramIDLType eq "XPathResult"))) {
8175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    push(@cBody, "    g_return_val_if_fail($paramName, 0);\n");
8185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
819dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            } else {
82006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                push(@cBody, "    g_return_if_fail($paramName);\n");
821dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            }
822dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
823dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
824dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
825dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $returnParamName = "";
826dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    foreach my $param (@{$function->parameters}) {
827dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        my $paramIDLType = $param->type;
828dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        my $paramName = decamelize($param->name);
829dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
830dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        my $paramIsGDOMType = IsGDOMClassType($paramIDLType);
831dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if ($paramIDLType eq "DOMString") {
832dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            push(@cBody, "    WTF::String converted_${paramName} = WTF::String::fromUTF8($paramName);\n");
83321939df44de1705786c545cd1bf519d47250322dBen Murdoch        } elsif ($paramIDLType eq "CompareHow") {
83406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            push(@cBody, "    WebCore::Range::CompareHow converted_${paramName} = static_cast<WebCore::Range::CompareHow>($paramName);\n");
83521939df44de1705786c545cd1bf519d47250322dBen Murdoch        } elsif ($paramIsGDOMType) {
8365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            push(@cBody, "    WebCore::${paramIDLType} * converted_${paramName} = NULL;\n");
8375ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            push(@cBody, "    if (${paramName} != NULL) {\n");
8385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            push(@cBody, "        converted_${paramName} = WebKit::core($paramName);\n");
8395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
840dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if ($returnType ne "void") {
841dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                # TODO: return proper default result
8425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                push(@cBody, "        g_return_val_if_fail(converted_${paramName}, 0);\n");
843dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            } else {
8445ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                push(@cBody, "        g_return_if_fail(converted_${paramName});\n");
845dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            }
8465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
8475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            push(@cBody, "    }\n");
848dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
84906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        $returnParamName = "converted_".$paramName if $param->extendedAttributes->{"Return"};
850dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
851dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
852dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $assign = "";
853dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $assignPre = "";
854dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $assignPost = "";
855dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
85621939df44de1705786c545cd1bf519d47250322dBen Murdoch    # We need to special-case these Node methods because their C++
85721939df44de1705786c545cd1bf519d47250322dBen Murdoch    # signature is different from what we'd expect given their IDL
85821939df44de1705786c545cd1bf519d47250322dBen Murdoch    # description; see Node.h.
85921939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $functionHasCustomReturn = $functionName eq "webkit_dom_node_append_child" ||
86021939df44de1705786c545cd1bf519d47250322dBen Murdoch        $functionName eq "webkit_dom_node_insert_before" ||
86121939df44de1705786c545cd1bf519d47250322dBen Murdoch        $functionName eq "webkit_dom_node_replace_child" ||
86221939df44de1705786c545cd1bf519d47250322dBen Murdoch        $functionName eq "webkit_dom_node_remove_child";
86321939df44de1705786c545cd1bf519d47250322dBen Murdoch
86421939df44de1705786c545cd1bf519d47250322dBen Murdoch    if ($returnType ne "void" && !$functionHasCustomReturn) {
865dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if ($returnValueIsGDOMType) {
866dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            $assign = "PassRefPtr<WebCore::${functionSigType}> g_res = ";
867dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            $assignPre = "WTF::getPtr(";
868dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            $assignPost = ")";
869dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else {
870dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            $assign = "${returnType} res = ";
871dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
872dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
873dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $exceptions = "";
874dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (@{$function->raisesExceptions}) {
875dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        push(@cBody, "    WebCore::ExceptionCode ec = 0;\n");
876dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (${callImplParams} ne "") {
877dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            $exceptions = ", ec";
878dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else {
879dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            $exceptions = "ec";
880dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
881dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
882dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
88321939df44de1705786c545cd1bf519d47250322dBen Murdoch    if ($functionHasCustomReturn) {
884dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        my $customNodeAppendChild = << "EOF";
885dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool ok = item->${functionSigName}(${callImplParams}${exceptions});
886dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (ok)
887dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
8884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ${returnType} res = WebKit::kit($returnParamName);
889dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return res;
890dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
891dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEOF
892dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        push(@cBody, $customNodeAppendChild);
893dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
894dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if(@{$function->raisesExceptions}) {
895dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            my $exceptionHandling = << "EOF";
896dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
897dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::ExceptionCodeDescription ecdesc;
898dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::getExceptionCodeDescription(ec, ecdesc);
899dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), ecdesc.code, ecdesc.name);
900dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEOF
901dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            push(@cBody, $exceptionHandling);
902dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
903dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        push(@cBody, "return NULL;");
904dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        push(@cBody, "}\n\n");
905dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
906dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } elsif ($functionSigType eq "DOMString") {
90721939df44de1705786c545cd1bf519d47250322dBen Murdoch        my $getterContentHead;
90806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if ($prefix) {
90906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            my $getterExpressionPrefix = $codeGenerator->GetterExpressionPrefix(\%implIncludes, $interfaceName, $function);
91006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            $getterContentHead = "${assign}convertToUTF8String(item->$getterExpressionPrefix${exceptions}));\n";
91121939df44de1705786c545cd1bf519d47250322dBen Murdoch        } else {
91221939df44de1705786c545cd1bf519d47250322dBen Murdoch            $getterContentHead = "${assign}convertToUTF8String(item->${functionSigName}(${callImplParams}${exceptions}));\n";
91321939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
91421939df44de1705786c545cd1bf519d47250322dBen Murdoch        push(@cBody, "    ${getterContentHead}");
915dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else {
91606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        my $contentHead;
91706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if ($prefix eq "get_") {
91806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            my $getterExpressionPrefix = $codeGenerator->GetterExpressionPrefix(\%implIncludes, $interfaceName, $function);
91906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            $contentHead = "${assign}${assignPre}item->$getterExpressionPrefix${callImplParams}${exceptions}${assignPost});\n";
92006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        } elsif ($prefix eq "set_") {
92106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            my $setterExpressionPrefix = $codeGenerator->SetterExpressionPrefix(\%implIncludes, $interfaceName, $function);
92206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            $contentHead = "${assign}${assignPre}item->$setterExpressionPrefix${callImplParams}${exceptions}${assignPost});\n";
92321939df44de1705786c545cd1bf519d47250322dBen Murdoch        } else {
92406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            $contentHead = "${assign}${assignPre}item->${functionSigName}(${callImplParams}${exceptions}${assignPost});\n";
92521939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
92606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        push(@cBody, "    ${contentHead}");
927dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
928dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if(@{$function->raisesExceptions}) {
929dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            my $exceptionHandling = << "EOF";
93021939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (ec) {
931dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        WebCore::ExceptionCodeDescription ecdesc;
932dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        WebCore::getExceptionCodeDescription(ec, ecdesc);
933dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), ecdesc.code, ecdesc.name);
934dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
935dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEOF
936dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            push(@cBody, $exceptionHandling);
937dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
938dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
939dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
94021939df44de1705786c545cd1bf519d47250322dBen Murdoch    if ($returnType ne "void" && !$functionHasCustomReturn) {
941dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if ($functionSigType ne "DOMObject") {
942dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if ($returnValueIsGDOMType) {
9434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                push(@cBody, "    ${returnType} res = WebKit::kit(g_res.get());\n");
944dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            }
945dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
946dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if ($functionSigType eq "DOMObject") {
947dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            push(@cBody, "    return NULL; /* TODO: return canvas object */\n");
948dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else {
949dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            push(@cBody, "    return res;\n");
950dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
951dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
9525af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
953e14391e94c850b8bd03680c23b38978db68687a8John Reck    if ($conditionalString) {
954e14391e94c850b8bd03680c23b38978db68687a8John Reck        if ($returnType ne "void") {
955e14391e94c850b8bd03680c23b38978db68687a8John Reck            push(@cBody, "#else\n");
956e14391e94c850b8bd03680c23b38978db68687a8John Reck            if ($codeGenerator->IsNonPointerType($functionSigType)) {
957e14391e94c850b8bd03680c23b38978db68687a8John Reck                push(@cBody, "    return static_cast<${returnType}>(0);\n");
958e14391e94c850b8bd03680c23b38978db68687a8John Reck            } else {
959e14391e94c850b8bd03680c23b38978db68687a8John Reck                push(@cBody, "    return NULL;\n");
960e14391e94c850b8bd03680c23b38978db68687a8John Reck            }
961e14391e94c850b8bd03680c23b38978db68687a8John Reck        }
962e14391e94c850b8bd03680c23b38978db68687a8John Reck        push(@cBody, "#endif /* ${conditionalString} */\n") if $conditionalString;
9635af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    }
9645af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
965e14391e94c850b8bd03680c23b38978db68687a8John Reck    push(@cBody, "}\n\n");
966dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
967dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
968dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub ClassHasFunction {
969dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my ($class, $name) = @_;
970dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
971dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    foreach my $function (@{$class->functions}) {
972dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if ($function->signature->name eq $name) {
973dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return 1;
974dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
975dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
976dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
977dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return 0;
978dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
979dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
980dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub GenerateFunctions {
981dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my ($object, $interfaceName, $dataNode) = @_;
982dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
983dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    foreach my $function (@{$dataNode->functions}) {
984dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        $object->GenerateFunction($interfaceName, $function, "");
985dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
986dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
987dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    TOP:
988dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    foreach my $attribute (@{$dataNode->attributes}) {
9894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (SkipAttribute($attribute) ||
9904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            $attribute->signature->type eq "EventListener" ||
9914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            $attribute->signature->type eq "MediaQueryListListener") {
992dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            next TOP;
993dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
994dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
995dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if ($attribute->signature->name eq "type"
996dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            # This will conflict with the get_type() function we define to return a GType
997dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            # according to GObject conventions.  Skip this for now.
998dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            || $attribute->signature->name eq "URL"     # TODO: handle this
999dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ) {
1000dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            next TOP;
1001dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
1002dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1003dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        my $attrNameUpper = $codeGenerator->WK_ucfirst($attribute->signature->name);
1004dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        my $getname = "get${attrNameUpper}";
1005dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        my $setname = "set${attrNameUpper}";
1006dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (ClassHasFunction($dataNode, $getname) || ClassHasFunction($dataNode, $setname)) {
1007dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            # Very occasionally an IDL file defines getter/setter functions for one of its
1008dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            # attributes; in this case we don't need to autogenerate the getter/setter.
1009dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            next TOP;
1010dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
1011dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1012dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        # Generate an attribute getter.  For an attribute "foo", this is a function named
1013dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        # "get_foo" which calls a DOM class method named foo().
1014dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        my $function = new domFunction();
1015dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        $function->signature($attribute->signature);
1016dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        $function->raisesExceptions($attribute->getterExceptions);
1017dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        $object->GenerateFunction($interfaceName, $function, "get_");
1018dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
101921939df44de1705786c545cd1bf519d47250322dBen Murdoch        if ($attribute->type =~ /^readonly/) {
1020dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            next TOP;
1021dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
1022dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1023dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        # Generate an attribute setter.  For an attribute, "foo", this is a function named
1024dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        # "set_foo" which calls a DOM class method named setFoo().
1025dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        $function = new domFunction();
1026dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1027dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        $function->signature(new domSignature());
102806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        $function->signature->name($attribute->signature->name);
102906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        $function->signature->type($attribute->signature->type);
1030dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        $function->signature->extendedAttributes($attribute->signature->extendedAttributes);
1031dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1032dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        my $param = new domSignature();
1033dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        $param->name("value");
1034dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        $param->type($attribute->signature->type);
1035dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        my %attributes = ();
1036dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        $param->extendedAttributes(attributes);
1037dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        my $arrayRef = $function->parameters;
1038dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        push(@$arrayRef, $param);
1039dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1040dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        $function->raisesExceptions($attribute->setterExceptions);
1041dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
104206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        $object->GenerateFunction($interfaceName, $function, "set_");
1043dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1044dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1045dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1046dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub GenerateCFile {
1047dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my ($object, $interfaceName, $parentClassName, $parentGObjType, $dataNode) = @_;
10485af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
10495af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if ($dataNode->extendedAttributes->{"EventTarget"}) {
10505af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        $object->GenerateEventTargetIface($dataNode);
10515af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    }
10525af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
1053dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $implContent = "";
1054dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
105521939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $clsCaps = uc(FixUpDecamelizedName(decamelize($interfaceName)));
105621939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $lowerCaseIfaceName = "webkit_dom_" . FixUpDecamelizedName(decamelize($interfaceName));
1057dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1058dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $implContent = << "EOF";
10595af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke${defineTypeMacro}(${className}, ${lowerCaseIfaceName}, ${parentGObjType}${defineTypeInterfaceImplementation}
1060dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1061dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocknamespace WebKit {
1062dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
10635af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeWebCore::${interfaceName}* core(${className}* request)
10645af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
10655af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    g_return_val_if_fail(request, 0);
10665af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
10675af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    WebCore::${interfaceName}* coreObject = static_cast<WebCore::${interfaceName}*>(WEBKIT_DOM_OBJECT(request)->coreObject);
10685af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    g_return_val_if_fail(coreObject, 0);
10695af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
10705af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    return coreObject;
10715af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
10725af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
10735af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke} // namespace WebKit
10745af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeEOF
10755af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
10765af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    push(@cBodyPriv, $implContent);
10775af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    $object->GenerateProperties($interfaceName, $dataNode);
10785af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    $object->GenerateFunctions($interfaceName, $dataNode);
10795af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
10805af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    my $wrapMethod = << "EOF";
10815af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkenamespace WebKit {
1082dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block${className}* wrap${interfaceName}(WebCore::${interfaceName}* coreObject)
1083dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
10845af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    g_return_val_if_fail(coreObject, 0);
1085dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1086dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    /* We call ref() rather than using a C++ smart pointer because we can't store a C++ object
1087dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block     * in a C-allocated GObject structure.  See the finalize() code for the
1088dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block     * matching deref().
1089dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block     */
1090dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    coreObject->ref();
1091dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1092ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return  WEBKIT_DOM_${clsCaps}(g_object_new(WEBKIT_TYPE_DOM_${clsCaps},
1093ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                                               "core-object", coreObject, NULL));
1094dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1095dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} // namespace WebKit
1096dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEOF
10975af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    push(@cBodyPriv, $wrapMethod);
1098dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1099dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub GenerateEndHeader {
1101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my ($object) = @_;
1102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    #Header guard
1104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $guard = $className . "_h";
1105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    push(@hBody, "G_END_DECLS\n\n");
110706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    push(@hPrefixGuardEnd, "#endif /* $guard */\n");
1108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub GeneratePrivateHeader {
1111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $object = shift;
1112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $dataNode = shift;
1113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $interfaceName = $dataNode->name;
1115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $filename = "$outputDir/" . $className . "Private.h";
1116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $guard = uc(decamelize($className)) . "_PRIVATE_H";
1117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $parentClassName = GetParentClassName($dataNode);
1118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $hasLegacyParent = $dataNode->extendedAttributes->{"LegacyParent"};
1119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $hasRealParent = @{$dataNode->parents} > 0;
1120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $hasParent = $hasLegacyParent || $hasRealParent;
1121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    open(PRIVHEADER, ">$filename") or die "Couldn't open file $filename for writing";
1123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print PRIVHEADER split("\r", $licenceTemplate);
1125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print PRIVHEADER "\n";
1126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $text = << "EOF";
1128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifndef $guard
1129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define $guard
1130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <glib-object.h>
1132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <webkit/${parentClassName}.h>
1133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "${interfaceName}.h"
1134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEOF
1135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1136dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print PRIVHEADER $text;
1137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print PRIVHEADER map { "#include \"$_\"\n" } sort keys(%hdrPropIncludes);
1139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print PRIVHEADER "\n" if keys(%hdrPropIncludes);
1140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $text = << "EOF";
1142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocknamespace WebKit {
1143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ${className} *
1144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    wrap${interfaceName}(WebCore::${interfaceName} *coreObject);
1145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1146dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::${interfaceName} *
1147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    core(${className} *request);
1148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEOF
1150dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print PRIVHEADER $text;
1152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if ($className ne "WebKitDOMNode") {
1154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        $text = << "EOF";
11554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ${className}*
1156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    kit(WebCore::${interfaceName}* node);
1157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEOF
1159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        print PRIVHEADER $text;
1160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $text = << "EOF";
1163dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} // namespace WebKit
1164dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1165dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif /* ${guard} */
1166dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEOF
1167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print PRIVHEADER $text;
116806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
1169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    close(PRIVHEADER);
1170dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1171dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
117221939df44de1705786c545cd1bf519d47250322dBen Murdochsub UsesManualKitImplementation {
1173dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $type = shift;
1174dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1175dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return 1 if $type eq "Node" or $type eq "Element" or $type eq "Event";
1176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return 0;
1177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
11795af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkesub GenerateEventTargetIface {
11805af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    my $object = shift;
11815af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    my $dataNode = shift;
11825af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
11835af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    my $interfaceName = $dataNode->name;
11845af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    my $decamelize = FixUpDecamelizedName(decamelize($interfaceName));
11855af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
11862bde8e466a4451c7319e3a072d118917957d6554Steve Block    $implIncludes{"GObjectEventListener.h"} = 1;
11875af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    $implIncludes{"WebKitDOMEventTarget.h"} = 1;
11885af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    $implIncludes{"WebKitDOMEventPrivate.h"} = 1;
11895af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
11905af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    my $impl = << "EOF";
11915af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkestatic void webkit_dom_${decamelize}_dispatch_event(WebKitDOMEventTarget* target, WebKitDOMEvent* event, GError** error)
11925af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
11935af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    WebCore::Event* coreEvent = WebKit::core(event);
11945af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    WebCore::${interfaceName}* coreTarget = static_cast<WebCore::${interfaceName}*>(WEBKIT_DOM_OBJECT(target)->coreObject);
11955af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
11965af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    WebCore::ExceptionCode ec = 0;
11975af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    coreTarget->dispatchEvent(coreEvent, ec);
11985af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (ec) {
11995af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        WebCore::ExceptionCodeDescription description;
12005af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        WebCore::getExceptionCodeDescription(ec, description);
12015af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), description.code, description.name);
12025af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    }
12035af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
12045af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
12052bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic gboolean webkit_dom_${decamelize}_add_event_listener(WebKitDOMEventTarget* target, const char* eventName, GCallback handler, gboolean bubble, gpointer userData)
12062bde8e466a4451c7319e3a072d118917957d6554Steve Block{
12072bde8e466a4451c7319e3a072d118917957d6554Steve Block    WebCore::${interfaceName}* coreTarget = static_cast<WebCore::${interfaceName}*>(WEBKIT_DOM_OBJECT(target)->coreObject);
12082bde8e466a4451c7319e3a072d118917957d6554Steve Block    return WebCore::GObjectEventListener::addEventListener(G_OBJECT(target), coreTarget, eventName, handler, bubble, userData);
12092bde8e466a4451c7319e3a072d118917957d6554Steve Block}
12102bde8e466a4451c7319e3a072d118917957d6554Steve Block
12112bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic gboolean webkit_dom_${decamelize}_remove_event_listener(WebKitDOMEventTarget* target, const char* eventName, GCallback handler, gboolean bubble)
12122bde8e466a4451c7319e3a072d118917957d6554Steve Block{
12132bde8e466a4451c7319e3a072d118917957d6554Steve Block    WebCore::${interfaceName}* coreTarget = static_cast<WebCore::${interfaceName}*>(WEBKIT_DOM_OBJECT(target)->coreObject);
12142bde8e466a4451c7319e3a072d118917957d6554Steve Block    return WebCore::GObjectEventListener::removeEventListener(G_OBJECT(target), coreTarget, eventName, handler, bubble);
12152bde8e466a4451c7319e3a072d118917957d6554Steve Block}
12162bde8e466a4451c7319e3a072d118917957d6554Steve Block
12175af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkestatic void webkit_dom_event_target_init(WebKitDOMEventTargetIface* iface)
12185af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
12195af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    iface->dispatch_event = webkit_dom_${decamelize}_dispatch_event;
12202bde8e466a4451c7319e3a072d118917957d6554Steve Block    iface->add_event_listener = webkit_dom_${decamelize}_add_event_listener;
12212bde8e466a4451c7319e3a072d118917957d6554Steve Block    iface->remove_event_listener = webkit_dom_${decamelize}_remove_event_listener;
12225af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
12235af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
12245af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeEOF
12255af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
12265af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    push(@cBody, $impl);
12275af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
12285af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    $defineTypeMacro = "G_DEFINE_TYPE_WITH_CODE";
12295af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    $defineTypeInterfaceImplementation = ", G_IMPLEMENT_INTERFACE(WEBKIT_TYPE_DOM_EVENT_TARGET, webkit_dom_event_target_init))";
12305af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
12315af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
1232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub Generate {
1233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my ($object, $dataNode) = @_;
1234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $hasLegacyParent = $dataNode->extendedAttributes->{"LegacyParent"};
1236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $hasRealParent = @{$dataNode->parents} > 0;
1237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $hasParent = $hasLegacyParent || $hasRealParent;
1238dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $parentClassName = GetParentClassName($dataNode);
1239dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $parentGObjType = GetParentGObjType($dataNode);
1240dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $interfaceName = $dataNode->name;
1241dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
124206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    # Add the guard if the 'Conditional' extended attribute exists
124306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    my $conditionalString = GenerateConditionalString($dataNode);
124406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    push(@conditionGuardStart, "#if ${conditionalString}\n\n") if $conditionalString;
124506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    push(@conditionGuardEnd, "#endif /* ${conditionalString} */\n") if $conditionalString;
124606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
1247dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    # Add the default impl header template
1248dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    @cPrefix = split("\r", $licenceTemplate);
1249dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    push(@cPrefix, "\n");
1250dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1251cad810f21b803229eb11403f9209855525a25d57Steve Block    $implIncludes{"webkitdefines.h"} = 1;
1252cad810f21b803229eb11403f9209855525a25d57Steve Block    $implIncludes{"webkitglobalsprivate.h"} = 1;
1253dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $implIncludes{"webkitmarshal.h"} = 1;
12544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    $implIncludes{"DOMObjectCache.h"} = 1;
1255dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $implIncludes{"WebKitDOMBinding.h"} = 1;
1256dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $implIncludes{"gobject/ConvertToUTF8String.h"} = 1;
1257dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $implIncludes{"webkit/$className.h"} = 1;
1258dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $implIncludes{"webkit/${className}Private.h"} = 1;
1259dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $implIncludes{"${interfaceName}.h"} = 1;
1260ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    $implIncludes{"JSMainThreadExecState.h"} = 1;
1261dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $implIncludes{"ExceptionCode.h"} = 1;
1262dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1263dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $hdrIncludes{"webkit/${parentClassName}.h"} = 1;
1264dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
126521939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (!UsesManualKitImplementation($interfaceName)) {
1266dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        my $converter = << "EOF";
1267dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocknamespace WebKit {
1268dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
12694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang${className}* kit(WebCore::$interfaceName* obj)
1270dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
12715af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    g_return_val_if_fail(obj, 0);
1272dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1273dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (gpointer ret = DOMObjectCache::get(obj))
12744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        return static_cast<${className}*>(ret);
1275dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
12764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return static_cast<${className}*>(DOMObjectCache::put(obj, WebKit::wrap${interfaceName}(obj)));
1277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1278dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1279dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} // namespace WebKit //
1280dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1281dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEOF
1282dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    push(@cBody, $converter);
1283dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1284dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1285dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $object->GenerateHeader($interfaceName, $parentClassName);
1286dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $object->GenerateCFile($interfaceName, $parentClassName, $parentGObjType, $dataNode);
1287dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $object->GenerateEndHeader();
1288dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $object->GeneratePrivateHeader($dataNode);
12895af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
1290dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1291dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1292dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# Internal helper
1293dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub WriteData {
1294dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my ($object, $name) = @_;
1295dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1296dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    # Write public header.
1297dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $hdrFName = "$outputDir/" . $name . ".h";
1298dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    open(HEADER, ">$hdrFName") or die "Couldn't open file $hdrFName";
1299dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1300dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print HEADER @hPrefix;
1301dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print HEADER @hPrefixGuard;
1302dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print HEADER "#include \"webkit/webkitdomdefines.h\"\n";
1303dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print HEADER "#include <glib-object.h>\n";
1304dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print HEADER "#include <webkit/webkitdefines.h>\n";
1305dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print HEADER map { "#include \"$_\"\n" } sort keys(%hdrIncludes);
1306dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print HEADER "\n" if keys(%hdrIncludes);
1307dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print HEADER "\n";
1308dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print HEADER @hBodyPre;
1309dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print HEADER @hBody;
131006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    print HEADER @hPrefixGuardEnd;
1311dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1312dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    close(HEADER);
1313dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1314dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    # Write the implementation sources
1315dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $implFileName = "$outputDir/" . $name . ".cpp";
1316dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    open(IMPL, ">$implFileName") or die "Couldn't open file $implFileName";
1317dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1318dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print IMPL @cPrefix;
1319dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print IMPL "#include <glib-object.h>\n";
1320dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print IMPL "#include \"config.h\"\n\n";
132106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    print IMPL @conditionGuardStart;
1322dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print IMPL "#include <wtf/GetPtr.h>\n";
1323dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print IMPL "#include <wtf/RefPtr.h>\n";
1324dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print IMPL map { "#include \"$_\"\n" } sort keys(%implIncludes);
1325dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print IMPL "\n" if keys(%implIncludes);
1326dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print IMPL @cBody;
1327dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print IMPL "\n";
1329dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    print IMPL @cBodyPriv;
133006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    print IMPL @conditionGuardEnd;
1331dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1332dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    close(IMPL);
1333dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1334dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    %implIncludes = ();
1335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    %hdrIncludes = ();
1336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    @hPrefix = ();
1337dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    @hBody = ();
1338dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1339dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    @cPrefix = ();
1340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    @cBody = ();
1341dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    @cBodyPriv = ();
1342dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1343dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1344dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocksub GenerateInterface {
1345dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my ($object, $dataNode, $defines) = @_;
1346dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $name = $dataNode->name;
1347dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1348dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    # Set up some global variables
1349dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $className = GetClassName($dataNode->name);
1350dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $object->Generate($dataNode);
1351dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1352dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    # Write changes
1353dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $fname = "WebKitDOM_" . $name;
1354dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $fname =~ s/_//g;
1355dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    $object->WriteData($fname);
1356dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1357