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