128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Copyright (C) 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Copyright (C) 2006 Anders Carlsson <andersca@mac.com>
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Copyright (C) 2006, 2007 Samuel Weinig <sam@webkit.org>
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Copyright (C) 2006 Alexey Proskuryakov <ap@webkit.org>
606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen# Copyright (C) 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
7231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block# Copyright (C) 2009 Cameron McCormack <cam@mcc.id.au>
8545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch# Copyright (C) 2010 Google Inc.
9e14391e94c850b8bd03680c23b38978db68687a8John Reck# Copyright (C) Research In Motion Limited 2010. All rights reserved.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# This library is free software; you can redistribute it and/or
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# modify it under the terms of the GNU Library General Public
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# License as published by the Free Software Foundation; either
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# version 2 of the License, or (at your option) any later version.
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# This library is distributed in the hope that it will be useful,
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# but WITHOUT ANY WARRANTY; without even the implied warranty of
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Library General Public License for more details.
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# You should have received a copy of the GNU Library General Public License
22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block# along with this library; see the file COPYING.LIB.  If not, write to
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Boston, MA 02110-1301, USA.
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpackage CodeGeneratorObjC;
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Global Variables
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy $module = "";
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy $outputDir = "";
32231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockmy $writeDependencies = 0;
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy %publicInterfaces = ();
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy $newPublicClass = 0;
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy $interfaceAvailabilityVersion = "";
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy $isProtocol = 0;
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy $noImpl = 0;
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy @headerContentHeader = ();
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy @headerContent = ();
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy %headerForwardDeclarations = ();
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy %headerForwardDeclarationsForProtocols = ();
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy @privateHeaderContentHeader = ();
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy @privateHeaderContent = ();
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy %privateHeaderForwardDeclarations = ();
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy %privateHeaderForwardDeclarationsForProtocols = ();
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy @internalHeaderContent = ();
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy @implContentHeader = ();
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy @implContent = ();
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy %implIncludes = ();
54231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockmy @depsContent = ();
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Hashes
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy %protocolTypeHash = ("XPathNSResolver" => 1, "EventListener" => 1, "EventTarget" => 1, "NodeFilter" => 1,
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        "SVGLocatable" => 1, "SVGTransformable" => 1, "SVGStylable" => 1, "SVGFilterPrimitiveStandardAttributes" => 1,
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        "SVGTests" => 1, "SVGLangSpace" => 1, "SVGExternalResourcesRequired" => 1, "SVGURIReference" => 1,
6028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                        "SVGZoomAndPan" => 1, "SVGFitToViewBox" => 1, "SVGAnimatedPathData" => 1, "ElementTimeControl" => 1);
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy %nativeObjCTypeHash = ("URL" => 1, "Color" => 1);
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# FIXME: this should be replaced with a function that recurses up the tree
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# to find the actual base type.
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy %baseTypeHash = ("Object" => 1, "Node" => 1, "NodeList" => 1, "NamedNodeMap" => 1, "DOMImplementation" => 1,
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    "Event" => 1, "CSSRule" => 1, "CSSValue" => 1, "StyleSheet" => 1, "MediaList" => 1,
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    "Counter" => 1, "Rect" => 1, "RGBColor" => 1, "XPathExpression" => 1, "XPathResult" => 1,
68d0825bca7fe65beaee391d30da42e937db621564Steve Block                    "NodeIterator" => 1, "TreeWalker" => 1, "AbstractView" => 1, "Blob" => 1,
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    "SVGAngle" => 1, "SVGAnimatedAngle" => 1, "SVGAnimatedBoolean" => 1, "SVGAnimatedEnumeration" => 1,
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    "SVGAnimatedInteger" => 1, "SVGAnimatedLength" => 1, "SVGAnimatedLengthList" => 1,
7128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                    "SVGAnimatedNumber" => 1, "SVGAnimatedNumberList" => 1,
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    "SVGAnimatedPreserveAspectRatio" => 1, "SVGAnimatedRect" => 1, "SVGAnimatedString" => 1,
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    "SVGAnimatedTransformList" => 1, "SVGLength" => 1, "SVGLengthList" => 1, "SVGMatrix" => 1,
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    "SVGNumber" => 1, "SVGNumberList" => 1, "SVGPathSeg" => 1, "SVGPathSegList" => 1, "SVGPoint" => 1,
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    "SVGPointList" => 1, "SVGPreserveAspectRatio" => 1, "SVGRect" => 1, "SVGRenderingIntent" => 1,
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    "SVGStringList" => 1, "SVGTransform" => 1, "SVGTransformList" => 1, "SVGUnitTypes" => 1);
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Constants
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy $buildingForTigerOrEarlier = 1 if $ENV{"MACOSX_DEPLOYMENT_TARGET"} and $ENV{"MACOSX_DEPLOYMENT_TARGET"} <= 10.4;
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy $buildingForLeopardOrLater = 1 if $ENV{"MACOSX_DEPLOYMENT_TARGET"} and $ENV{"MACOSX_DEPLOYMENT_TARGET"} >= 10.5;
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy $exceptionInit = "WebCore::ExceptionCode ec = 0;";
82e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockmy $jsContextSetter = "WebCore::JSMainThreadNullState state;";
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy $exceptionRaiseOnError = "WebCore::raiseOnDOMError(ec);";
848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianmy $assertMainThread = "{ DOM_ASSERT_MAIN_THREAD(); WebCoreThreadViolationCheckRoundOne(); }";
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy %conflictMethod = (
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # FIXME: Add C language keywords?
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # FIXME: Add other predefined types like "id"?
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "callWebScriptMethod:withArguments:" => "WebScriptObject",
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "evaluateWebScript:" => "WebScriptObject",
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "removeWebScriptKey:" => "WebScriptObject",
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "setException:" => "WebScriptObject",
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "setWebScriptValueAtIndex:value:" => "WebScriptObject",
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "stringRepresentation" => "WebScriptObject",
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "webScriptValueAtIndex:" => "WebScriptObject",
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "autorelease" => "NSObject",
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "awakeAfterUsingCoder:" => "NSObject",
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "class" => "NSObject",
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "classForCoder" => "NSObject",
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "conformsToProtocol:" => "NSObject",
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "copy" => "NSObject",
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "copyWithZone:" => "NSObject",
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "dealloc" => "NSObject",
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "description" => "NSObject",
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "doesNotRecognizeSelector:" => "NSObject",
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "encodeWithCoder:" => "NSObject",
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "finalize" => "NSObject",
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "forwardInvocation:" => "NSObject",
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "hash" => "NSObject",
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "init" => "NSObject",
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "initWithCoder:" => "NSObject",
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "isEqual:" => "NSObject",
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "isKindOfClass:" => "NSObject",
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "isMemberOfClass:" => "NSObject",
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "isProxy" => "NSObject",
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "methodForSelector:" => "NSObject",
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "methodSignatureForSelector:" => "NSObject",
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "mutableCopy" => "NSObject",
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "mutableCopyWithZone:" => "NSObject",
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "performSelector:" => "NSObject",
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "release" => "NSObject",
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "replacementObjectForCoder:" => "NSObject",
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "respondsToSelector:" => "NSObject",
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "retain" => "NSObject",
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "retainCount" => "NSObject",
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "self" => "NSObject",
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "superclass" => "NSObject",
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    "zone" => "NSObject",
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project);
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmy $fatalError = 0;
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian# Default License Templates
1365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianmy $headerLicenseTemplate = << "EOF";
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
1385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006 Samuel Weinig <sam.weinig\@gmail.com>
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectEOF
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianmy $implementationLicenseTemplate = << "EOF";
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This file is part of the WebKit open source project.
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This file has been generated by generate-bindings.pl. DO NOT MODIFY!
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectEOF
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Default constructor
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub new
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $object = shift;
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $reference = { };
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $codeGenerator = shift;
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $outputDir = shift;
200967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    shift; # $outputHeadersDir
201231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    shift; # $useLayerOnTop
202231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    shift; # $preprocessor
203231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    $writeDependencies = shift;
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bless($reference, $object);
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return $reference;
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub finish
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $object = shift;
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub ReadPublicInterfaces
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $class = shift;
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $superClass = shift;
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $defines = shift;
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $isProtocol = shift;
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $found = 0;
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $actualSuperClass;
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    %publicInterfaces = ();
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $fileName = "WebCore/bindings/objc/PublicDOMInterfaces.h";
226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    my $gccLocation = "";
2275af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if ($ENV{CC}) {
2285af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        $gccLocation = $ENV{CC};
2295af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    } elsif (($Config::Config{'osname'}) =~ /solaris/i) {
230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        $gccLocation = "/usr/sfw/bin/gcc";
231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else {
232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        $gccLocation = "/usr/bin/gcc";
233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    open FILE, "-|", $gccLocation, "-E", "-P", "-x", "objective-c",
2355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        (map { "-D$_" } split(/ +/, $defines)), "-DOBJC_CODE_GENERATION", $fileName or die "Could not open $fileName";
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my @documentContent = <FILE>;
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    close FILE;
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    foreach $line (@documentContent) {
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!$isProtocol && $line =~ /^\s*\@interface\s*$class\s*:\s*(\w+)\s*([A-Z0-9_]*)/) {
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ($superClass ne $1) {
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                warn "Public API change. Superclass for \"$class\" differs ($1 != $superClass)";
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $fatalError = 1;
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $interfaceAvailabilityVersion = $2 if defined $2;
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $found = 1;
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            next;
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } elsif ($isProtocol && $line =~ /^\s*\@protocol $class\s*<[^>]+>\s*([A-Z0-9_]*)/) {
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $interfaceAvailabilityVersion = $1 if defined $1;
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $found = 1;
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            next;
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        last if $found and $line =~ /^\s?\@end\s?$/;
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ($found) {
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            # trim whitspace
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $line =~ s/^\s+//;
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $line =~ s/\s+$//;
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $availabilityMacro = "";
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $line =~ s/\s([A-Z0-9_]+)\s*;$/;/;
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $availabilityMacro = $1 if defined $1;
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $publicInterfaces{$line} = $availabilityMacro if length $line;
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # If this class was not found in PublicDOMInterfaces.h then it should be considered as an entirely new public class.
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $newPublicClass = !$found;
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $interfaceAvailabilityVersion = "WEBKIT_VERSION_LATEST" if $newPublicClass;
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
27521939df44de1705786c545cd1bf519d47250322dBen Murdochsub GenerateConditionalString
27621939df44de1705786c545cd1bf519d47250322dBen Murdoch{
27721939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $node = shift;
27821939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $conditional = $node->extendedAttributes->{"Conditional"};
27921939df44de1705786c545cd1bf519d47250322dBen Murdoch    if ($conditional) {
28021939df44de1705786c545cd1bf519d47250322dBen Murdoch        if ($conditional =~ /&/) {
28121939df44de1705786c545cd1bf519d47250322dBen Murdoch            return "ENABLE(" . join(") && ENABLE(", split(/&/, $conditional)) . ")";
28221939df44de1705786c545cd1bf519d47250322dBen Murdoch        } elsif ($conditional =~ /\|/) {
28321939df44de1705786c545cd1bf519d47250322dBen Murdoch            return "ENABLE(" . join(") || ENABLE(", split(/\|/, $conditional)) . ")";
28421939df44de1705786c545cd1bf519d47250322dBen Murdoch        } else {
28521939df44de1705786c545cd1bf519d47250322dBen Murdoch            return "ENABLE(" . $conditional . ")";
28621939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
28721939df44de1705786c545cd1bf519d47250322dBen Murdoch    } else {
28821939df44de1705786c545cd1bf519d47250322dBen Murdoch        return "";
28921939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
29021939df44de1705786c545cd1bf519d47250322dBen Murdoch}
29121939df44de1705786c545cd1bf519d47250322dBen Murdoch
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Params: 'domClass' struct
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub GenerateInterface
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $object = shift;
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $dataNode = shift;
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $defines = shift;
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $fatalError = 0;
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $name = $dataNode->name;
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $className = GetClassName($name);
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $parentClassName = "DOM" . GetParentImplClassName($dataNode);
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $isProtocol = $dataNode->extendedAttributes->{ObjCProtocol};
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $noImpl = $dataNode->extendedAttributes->{ObjCCustomImplementation} || $isProtocol;
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ReadPublicInterfaces($className, $parentClassName, $defines, $isProtocol);
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # Start actual generation..
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $object->GenerateHeader($dataNode);
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $object->GenerateImplementation($dataNode) unless $noImpl;
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # Write changes.
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $object->WriteData("DOM" . $name);
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # Check for missing public API
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (keys %publicInterfaces > 0) {
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        my $missing = join("\n", keys %publicInterfaces);
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        warn "Public API change. There are missing public properties and/or methods from the \"$className\" class.\n$missing\n";
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $fatalError = 1;
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    die if $fatalError;
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Params: 'idlDocument' struct
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub GenerateModule
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $object = shift;
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $dataNode = shift;
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $module = $dataNode->module;
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub GetClassName
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $name = $codeGenerator->StripModule(shift);
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # special cases
340231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return "NSString" if $codeGenerator->IsStringType($name) or $name eq "SerializedScriptValue";
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return "NS$name" if IsNativeObjCType($name);
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return "BOOL" if $name eq "boolean";
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return "unsigned" if $name eq "unsigned long";
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return "int" if $name eq "long";
345d0825bca7fe65beaee391d30da42e937db621564Steve Block    return "NSTimeInterval" if $name eq "Date";
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return "DOMAbstractView" if $name eq "DOMWindow";
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return $name if $codeGenerator->IsPrimitiveType($name) or $name eq "DOMImplementation" or $name eq "DOMTimeStamp";
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # Default, assume Objective-C type has the same type name as
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # idl type prefixed with "DOM".
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return "DOM$name";
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub GetClassHeaderName
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $name = shift;
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return "DOMDOMImplementation" if $name eq "DOMImplementation";
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return $name;
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub GetImplClassName
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $name = $codeGenerator->StripModule(shift);
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return "DOMImplementationFront" if $name eq "DOMImplementation";
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return "DOMWindow" if $name eq "AbstractView";
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return $name;
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub GetParentImplClassName
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $dataNode = shift;
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return "Object" if @{$dataNode->parents} eq 0;
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $parent = $codeGenerator->StripModule($dataNode->parents(0));
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # special cases
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return "Object" if $parent eq "HTMLCollection";
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return $parent;
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub GetParentAndProtocols
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $dataNode = shift;
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $numParents = @{$dataNode->parents};
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $parent = "";
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my @protocols = ();
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($numParents eq 0) {
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ($isProtocol) {
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@protocols, "NSObject");
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@protocols, "NSCopying") if $dataNode->name eq "EventTarget";
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $parent = "DOMObject";
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } elsif ($numParents eq 1) {
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        my $parentName = $codeGenerator->StripModule($dataNode->parents(0));
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ($isProtocol) {
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            die "Parents of protocols must also be protocols." unless IsProtocolType($parentName);
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@protocols, "DOM" . $parentName);
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (IsProtocolType($parentName)) {
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@protocols, "DOM" . $parentName);
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } elsif ($parentName eq "HTMLCollection") {
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $parent = "DOMObject";
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else {
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $parent = "DOM" . $parentName;
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        my @parents = @{$dataNode->parents};
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        my $firstParent = $codeGenerator->StripModule(shift(@parents));
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (IsProtocolType($firstParent)) {
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@protocols, "DOM" . $firstParent);
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!$isProtocol) {
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $parent = "DOMObject";
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $parent = "DOM" . $firstParent;
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        foreach my $parentName (@parents) {
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $parentName = $codeGenerator->StripModule($parentName);
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            die "Everything past the first class should be a protocol!" unless IsProtocolType($parentName);
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@protocols, "DOM" . $parentName);
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return ($parent, @protocols);
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub GetBaseClass
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $parent = shift;
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return $parent if $parent eq "Object" or IsBaseType($parent);
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return "Event" if $parent eq "UIEvent";
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return "CSSValue" if $parent eq "SVGColor" or $parent eq "CSSValueList";
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return "Node";
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub IsBaseType
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $type = shift;
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 1 if $baseTypeHash{$type};
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub IsProtocolType
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $type = shift;
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 1 if $protocolTypeHash{$type};
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub IsNativeObjCType
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $type = shift;
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 1 if $nativeObjCTypeHash{$type};
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub GetObjCType
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $type = shift;
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $name = GetClassName($type);
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return "id <$name>" if IsProtocolType($type);
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return $name if $codeGenerator->IsPrimitiveType($type) or $type eq "DOMTimeStamp";
47781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return "unsigned short" if $type eq "CompareHow";
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return "$name *";
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub GetPropertyAttributes
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $type = $codeGenerator->StripModule(shift);
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $readOnly = shift;
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my @attributes = ();
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    push(@attributes, "readonly") if $readOnly;
4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    # FIXME: <rdar://problem/5049934> Consider using 'nonatomic' on the DOM @property declarations.
4915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if ($codeGenerator->IsStringType($type) || IsNativeObjCType($type)) {
4925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        push(@attributes, "copy");
4936b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    } elsif ($codeGenerator->IsSVGAnimatedType($type)) {
4945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        push(@attributes, "retain");
49581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } elsif (!$codeGenerator->IsStringType($type) && !$codeGenerator->IsPrimitiveType($type) && $type ne "DOMTimeStamp" && $type ne "CompareHow") {
4965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        push(@attributes, "retain");
4975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return "" unless @attributes > 0;
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return "(" . join(", ", @attributes) . ")";
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qiansub ConversionNeeded
5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $type = $codeGenerator->StripModule(shift);
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return !$codeGenerator->IsNonPointerType($type) && !$codeGenerator->IsStringType($type) && !IsNativeObjCType($type);
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub GetObjCTypeGetter
5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $argName = shift;
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $type = $codeGenerator->StripModule(shift);
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return $argName if $codeGenerator->IsPrimitiveType($type) or $codeGenerator->IsStringType($type) or IsNativeObjCType($type);
5168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return $argName . "Node" if $type eq "EventTarget";
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return "static_cast<WebCore::Range::CompareHow>($argName)" if $type eq "CompareHow";
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return "WTF::getPtr(nativeEventListener)" if $type eq "EventListener";
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return "WTF::getPtr(nativeNodeFilter)" if $type eq "NodeFilter";
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return "WTF::getPtr(nativeResolver)" if $type eq "XPathNSResolver";
521231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
522231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if ($type eq "SerializedScriptValue") {
523231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        $implIncludes{"SerializedScriptValue.h"} = 1;
524dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        return "WebCore::SerializedScriptValue::create(WTF::String($argName))";
525231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
5265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return "core($argName)";
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub AddForwardDeclarationsForType
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $type = $codeGenerator->StripModule(shift);
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $public = shift;
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return if $codeGenerator->IsNonPointerType($type) ;
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $class = GetClassName($type);
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (IsProtocolType($type)) {
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $headerForwardDeclarationsForProtocols{$class} = 1 if $public;
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $privateHeaderForwardDeclarationsForProtocols{$class} = 1 if !$public and !$headerForwardDeclarationsForProtocols{$class};
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $headerForwardDeclarations{$class} = 1 if $public;
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # Private headers include the public header, so only add a forward declaration to the private header
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # if the public header does not already have the same forward declaration.
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $privateHeaderForwardDeclarations{$class} = 1 if !$public and !$headerForwardDeclarations{$class};
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub AddIncludesForType
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $type = $codeGenerator->StripModule(shift);
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return if $codeGenerator->IsNonPointerType($type);
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (IsNativeObjCType($type)) {
5580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if ($type eq "Color") {
5590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            $implIncludes{"ColorMac.h"} = 1;
5600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if ($codeGenerator->IsStringType($type)) {
5650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        $implIncludes{"KURL.h"} = 1;
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($type eq "DOMWindow") {
5705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        $implIncludes{"DOMAbstractViewInternal.h"} = 1;
5715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        $implIncludes{"DOMWindow.h"} = 1;
5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($type eq "DOMImplementation") {
5765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        $implIncludes{"DOMDOMImplementationInternal.h"} = 1;
5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $implIncludes{"DOMImplementationFront.h"} = 1;
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($type eq "EventTarget") {
5828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        $implIncludes{"Node.h"} = 1;
5835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        $implIncludes{"DOMEventTarget.h"} = 1;
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
587e14391e94c850b8bd03680c23b38978db68687a8John Reck    if ($codeGenerator->IsSVGAnimatedType($type)) {
5886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        $implIncludes{"${type}.h"} = 1;
589e14391e94c850b8bd03680c23b38978db68687a8John Reck        $implIncludes{"DOM${type}Internal.h"} = 1;
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($type =~ /(\w+)(Abs|Rel)$/) {
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $implIncludes{"$1.h"} = 1;
5955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        $implIncludes{"DOM${type}Internal.h"} = 1;
5965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return;
5975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
5985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
5995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if ($type eq "NodeFilter") {
6005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        $implIncludes{"NodeFilter.h"} = 1;
6015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        $implIncludes{"ObjCNodeFilterCondition.h"} = 1;
6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if ($type eq "EventListener") {
6065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        $implIncludes{"EventListener.h"} = 1;
6075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        $implIncludes{"ObjCEventListener.h"} = 1;
6085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return;
6095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
6105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
6115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if ($type eq "XPathNSResolver") {
6125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        $implIncludes{"DOMCustomXPathNSResolver.h"} = 1;
6135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        $implIncludes{"XPathNSResolver.h"} = 1;
6145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return;
6155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
617231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if ($type eq "SerializedScriptValue") {
618231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        $implIncludes{"SerializedScriptValue.h"} = 1;
619231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
620231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
621231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # FIXME: won't compile without these
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $implIncludes{"CSSMutableStyleDeclaration.h"} = 1 if $type eq "CSSStyleDeclaration";
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $implIncludes{"NameNodeList.h"} = 1 if $type eq "NodeList";
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # Default, include the same named file (the implementation) and the same name prefixed with "DOM".
627e14391e94c850b8bd03680c23b38978db68687a8John Reck    $implIncludes{"$type.h"} = 1 if not $codeGenerator->AvoidInclusionOfType($type);
6285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    $implIncludes{"DOM${type}Internal.h"} = 1;
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhusub GetSVGTypeWithNamespace
63228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{
63328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    my $type = shift;
63428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    my $typeWithNamespace = "WebCore::" . $codeGenerator->GetSVGTypeNeedingTearOff($type);
63528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
63628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    # Special case for DOMSVGNumber
63728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    $typeWithNamespace =~ s/</\<WebCore::/ unless $type eq "SVGNumber";
63828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    return $typeWithNamespace;
63928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu}
64028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
641e14391e94c850b8bd03680c23b38978db68687a8John Recksub GetSVGPropertyTypes
642e14391e94c850b8bd03680c23b38978db68687a8John Reck{
643e14391e94c850b8bd03680c23b38978db68687a8John Reck    my $implType = shift;
644e14391e94c850b8bd03680c23b38978db68687a8John Reck
645e14391e94c850b8bd03680c23b38978db68687a8John Reck    my $svgPropertyType;
646e14391e94c850b8bd03680c23b38978db68687a8John Reck    my $svgListPropertyType;
647e14391e94c850b8bd03680c23b38978db68687a8John Reck    my $svgNativeType;
648e14391e94c850b8bd03680c23b38978db68687a8John Reck
649e14391e94c850b8bd03680c23b38978db68687a8John Reck    return ($svgPropertyType, $svgListPropertyType, $svgNativeType) if not $implType =~ /SVG/;
650e14391e94c850b8bd03680c23b38978db68687a8John Reck
651e14391e94c850b8bd03680c23b38978db68687a8John Reck    $svgNativeType = $codeGenerator->GetSVGTypeNeedingTearOff($implType);
652e14391e94c850b8bd03680c23b38978db68687a8John Reck    return ($svgPropertyType, $svgListPropertyType, $svgNativeType) if not $svgNativeType;
653e14391e94c850b8bd03680c23b38978db68687a8John Reck
654e14391e94c850b8bd03680c23b38978db68687a8John Reck    # Append space to avoid compilation errors when using  PassRefPtr<$svgNativeType>
655e14391e94c850b8bd03680c23b38978db68687a8John Reck    $svgNativeType = "WebCore::$svgNativeType ";
65628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    $svgNativeType =~ s/</\<WebCore::/ if not $svgNativeType =~ /float/;
657e14391e94c850b8bd03680c23b38978db68687a8John Reck
658e14391e94c850b8bd03680c23b38978db68687a8John Reck    my $svgWrappedNativeType = $codeGenerator->GetSVGWrappedTypeNeedingTearOff($implType);
659e14391e94c850b8bd03680c23b38978db68687a8John Reck    if ($svgNativeType =~ /SVGPropertyTearOff/) {
66028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if ($svgWrappedNativeType eq "float") {
66128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            # Special case for DOMSVGNumber
66228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            $svgPropertyType = $svgWrappedNativeType;
66328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        } else {
66428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            $svgPropertyType = "WebCore::$svgWrappedNativeType";
66528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            $svgPropertyType =~ s/</\<WebCore::/;
66628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        }
66728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    } elsif ($svgNativeType =~ /SVGListPropertyTearOff/ or $svgNativeType =~ /SVGStaticListPropertyTearOff/) {
668e14391e94c850b8bd03680c23b38978db68687a8John Reck        $svgListPropertyType = "WebCore::$svgWrappedNativeType";
669e14391e94c850b8bd03680c23b38978db68687a8John Reck        $svgListPropertyType =~ s/</\<WebCore::/;
6706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    } elsif ($svgNativeType =~ /SVGTransformListPropertyTearOff/) {
6716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        $svgListPropertyType = "WebCore::$svgWrappedNativeType";
6726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        $svgListPropertyType =~ s/</\<WebCore::/;
6734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    } elsif ($svgNativeType =~ /SVGPathSegListPropertyTearOff/) {
6744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        $svgListPropertyType = "WebCore::$svgWrappedNativeType";
6754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        $svgListPropertyType =~ s/</\<WebCore::/;
676e14391e94c850b8bd03680c23b38978db68687a8John Reck    }
677e14391e94c850b8bd03680c23b38978db68687a8John Reck
678e14391e94c850b8bd03680c23b38978db68687a8John Reck    return ($svgPropertyType, $svgListPropertyType, $svgNativeType);
679e14391e94c850b8bd03680c23b38978db68687a8John Reck}
680e14391e94c850b8bd03680c23b38978db68687a8John Reck
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub GenerateHeader
6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $object = shift;
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $dataNode = shift;
6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $interfaceName = $dataNode->name;
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $className = GetClassName($interfaceName);
6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $parentName = "";
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my @protocolsToImplement = ();
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ($parentName, @protocolsToImplement) = GetParentAndProtocols($dataNode);
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $numConstants = @{$dataNode->constants};
6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $numAttributes = @{$dataNode->attributes};
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $numFunctions = @{$dataNode->functions};
6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # - Add default header template
6985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    @headerContentHeader = split("\r", $headerLicenseTemplate);
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    push(@headerContentHeader, "\n");
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # - INCLUDES -
7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $includedWebKitAvailabilityHeader = 0;
7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unless ($isProtocol) {
7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        my $parentHeaderName = GetClassHeaderName($parentName);
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@headerContentHeader, "#import <WebCore/$parentHeaderName.h>\n");
7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $includedWebKitAvailabilityHeader = 1;
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    foreach my $parentProtocol (@protocolsToImplement) {
7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        next if $parentProtocol =~ /^NS/;
7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $parentProtocol = GetClassHeaderName($parentProtocol);
7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@headerContentHeader, "#import <WebCore/$parentProtocol.h>\n");
7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $includedWebKitAvailabilityHeader = 1;
7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # Special case needed for legacy support of DOMRange
7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($interfaceName eq "Range") {
7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@headerContentHeader, "#import <WebCore/DOMCore.h>\n");
7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@headerContentHeader, "#import <WebCore/DOMDocument.h>\n");
7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@headerContentHeader, "#import <WebCore/DOMRangeException.h>\n");
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $includedWebKitAvailabilityHeader = 1;
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    push(@headerContentHeader, "#import <JavaScriptCore/WebKitAvailability.h>\n") unless $includedWebKitAvailabilityHeader;
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $interfaceAvailabilityVersionCheck = "#if WEBKIT_VERSION_MAX_ALLOWED >= $interfaceAvailabilityVersion\n\n";
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    push(@headerContentHeader, "\n");
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    push(@headerContentHeader, $interfaceAvailabilityVersionCheck) if length $interfaceAvailabilityVersion;
7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # - Add constants.
7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($numConstants > 0) {
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        my @headerConstants = ();
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        # FIXME: we need a way to include multiple enums.
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        foreach my $constant (@{$dataNode->constants}) {
7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $constantName = $constant->name;
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $constantValue = $constant->value;
7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $output = "    DOM_" . $constantName . " = " . $constantValue;
7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@headerConstants, $output);
7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        my $combinedConstants = join(",\n", @headerConstants);
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        # FIXME: the formatting of the enums should line up the equal signs.
7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        # FIXME: enums are unconditionally placed in the public header.
7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@headerContent, "enum {\n");
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@headerContent, $combinedConstants);
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@headerContent, "\n};\n\n");
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # - Begin @interface or @protocol
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $interfaceDeclaration = ($isProtocol ? "\@protocol $className" : "\@interface $className : $parentName");
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $interfaceDeclaration .= " <" . join(", ", @protocolsToImplement) . ">" if @protocolsToImplement > 0;
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    $interfaceDeclaration .= "\n";
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    push(@headerContent, $interfaceDeclaration);
7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my @headerAttributes = ();
7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my @privateHeaderAttributes = ();
7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # - Add attribute getters/setters.
7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($numAttributes > 0) {
7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        foreach my $attribute (@{$dataNode->attributes}) {
7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $attributeName = $attribute->signature->name;
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
768545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            if ($attributeName eq "id" or $attributeName eq "hash" or $attributeName eq "description") {
769545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                # Special case some attributes (like id and hash) to have a "Name" suffix to avoid ObjC naming conflicts.
7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $attributeName .= "Name";
7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } elsif ($attributeName eq "frame") {
7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                # Special case attribute frame to be frameBorders.
7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $attributeName .= "Borders";
7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $attributeType = GetObjCType($attribute->signature->type);
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $attributeIsReadonly = ($attribute->type =~ /^readonly/);
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $property = "\@property" . GetPropertyAttributes($attribute->signature->type, $attributeIsReadonly);
780cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            # Some SVGFE*Element.idl use 'operator' as attribute name, rewrite as '_operator' to avoid clashes with C/C++
781cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            $attributeName =~ s/operator/_operator/ if ($attributeName =~ /operator/);
7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $property .= " " . $attributeType . ($attributeType =~ /\*$/ ? "" : " ") . $attributeName;
7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $publicInterfaceKey = $property . ";";
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $availabilityMacro = "";
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (defined $publicInterfaces{$publicInterfaceKey} and length $publicInterfaces{$publicInterfaceKey}) {
7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $availabilityMacro = $publicInterfaces{$publicInterfaceKey};
7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $availabilityMacro = "WEBKIT_OBJC_METHOD_ANNOTATION($availabilityMacro)" if length $availabilityMacro and $buildingForTigerOrEarlier;
7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $declarationSuffix = ";\n";
7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $declarationSuffix = " $availabilityMacro;\n" if length $availabilityMacro;
7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $public = (defined $publicInterfaces{$publicInterfaceKey} or $newPublicClass);
7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            delete $publicInterfaces{$publicInterfaceKey};
7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            AddForwardDeclarationsForType($attribute->signature->type, $public);
8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $setterName = "set" . ucfirst($attributeName) . ":";
8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $conflict = $conflictMethod{$attributeName};
8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ($conflict) {
8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                warn "$className conflicts with $conflict method $attributeName\n";
8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $fatalError = 1;
8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $conflict = $conflictMethod{$setterName};
8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ($conflict) {
8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                warn "$className conflicts with $conflict method $setterName\n";
8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $fatalError = 1;
8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ($buildingForLeopardOrLater) {
8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $property .= $declarationSuffix;
8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@headerAttributes, $property) if $public;
8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@privateHeaderAttributes, $property) unless $public;
8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else {
82006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                my $attributeConditionalString = GenerateConditionalString($attribute->signature);
82106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                if ($attributeConditionalString) {
82206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                    push(@headerAttributes, "#if ${attributeConditionalString}\n") if $public;
82306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                    push(@privateHeaderAttributes, "#if ${attributeConditionalString}\n") unless $public;
82406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                }
82506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                # - GETTER
8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                my $getter = "- (" . $attributeType . ")" . $attributeName . $declarationSuffix;
8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@headerAttributes, $getter) if $public;
8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@privateHeaderAttributes, $getter) unless $public;
8308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                # - SETTER
8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!$attributeIsReadonly) {
8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    my $setter = "- (void)$setterName(" . $attributeType . ")new" . ucfirst($attributeName) . $declarationSuffix;
8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    push(@headerAttributes, $setter) if $public;
8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    push(@privateHeaderAttributes, $setter) unless $public;
8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
83706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
83806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                if ($attributeConditionalString) {
83906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                    push(@headerAttributes, "#endif\n") if $public;
84006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                    push(@privateHeaderAttributes, "#endif\n") unless $public;
84106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                }
8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@headerContent, @headerAttributes) if @headerAttributes > 0;
8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my @headerFunctions = ();
8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my @privateHeaderFunctions = ();
8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my @deprecatedHeaderFunctions = ();
8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # - Add functions.
8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($numFunctions > 0) {
8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        foreach my $function (@{$dataNode->functions}) {
8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $functionName = $function->signature->name;
8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $returnType = GetObjCType($function->signature->type);
8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $needsDeprecatedVersion = (@{$function->parameters} > 1 and $function->signature->extendedAttributes->{"OldStyleObjC"});
8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $numberOfParameters = @{$function->parameters};
8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my %typesToForwardDeclare = ($function->signature->type => 1);
8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $parameterIndex = 0;
8638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $functionSig = "- ($returnType)$functionName";
8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $methodName = $functionName;
8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            foreach my $param (@{$function->parameters}) {
8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                my $paramName = $param->name;
8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                my $paramType = GetObjCType($param->type);
8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $typesToForwardDeclare{$param->type} = 1;
8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if ($parameterIndex >= 1) {
8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    my $paramPrefix = $param->extendedAttributes->{"ObjCPrefix"};
8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    $paramPrefix = $paramName unless defined($paramPrefix);
8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    $functionSig .= " $paramPrefix";
8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    $methodName .= $paramPrefix;
8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $functionSig .= ":($paramType)$paramName";
8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $methodName .= ":";
8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $parameterIndex++;
8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $publicInterfaceKey = $functionSig . ";";
8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $conflict = $conflictMethod{$methodName};
8878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ($conflict) {
8888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                warn "$className conflicts with $conflict method $methodName\n";
8898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $fatalError = 1;
8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
8918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ($isProtocol && !$newPublicClass && !defined $publicInterfaces{$publicInterfaceKey}) {
8938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                warn "Protocol method $publicInterfaceKey is not in PublicDOMInterfaces.h. Protocols require all methods to be public";
8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $fatalError = 1;
8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $availabilityMacro = "";
8988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (defined $publicInterfaces{$publicInterfaceKey} and length $publicInterfaces{$publicInterfaceKey}) {
8998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $availabilityMacro = $publicInterfaces{$publicInterfaceKey};
9008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
9018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $availabilityMacro = "WEBKIT_OBJC_METHOD_ANNOTATION($availabilityMacro)" if length $availabilityMacro and $buildingForTigerOrEarlier;
9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $functionDeclaration = $functionSig;
9058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $functionDeclaration .= " " . $availabilityMacro if length $availabilityMacro;
9068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $functionDeclaration .= ";\n";
9078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $public = (defined $publicInterfaces{$publicInterfaceKey} or $newPublicClass);
9098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            delete $publicInterfaces{$publicInterfaceKey};
9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            foreach my $type (keys %typesToForwardDeclare) {
9128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                # add any forward declarations to the public header if a deprecated version will be generated
9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                AddForwardDeclarationsForType($type, 1) if $needsDeprecatedVersion;
9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                AddForwardDeclarationsForType($type, $public) unless $public and $needsDeprecatedVersion;
9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@headerFunctions, $functionDeclaration) if $public;
9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@privateHeaderFunctions, $functionDeclaration) unless $public;
9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            # generate the old style method names with un-named parameters, these methods are deprecated
9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ($needsDeprecatedVersion) {
9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                my $deprecatedFunctionSig = $functionSig;
9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $deprecatedFunctionSig =~ s/\s\w+:/ :/g; # remove parameter names
9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $publicInterfaceKey = $deprecatedFunctionSig . ";";
9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                my $availabilityMacro = "AVAILABLE_WEBKIT_VERSION_1_3_AND_LATER_BUT_DEPRECATED_IN_WEBKIT_VERSION_3_0";
9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (defined $publicInterfaces{$publicInterfaceKey} and length $publicInterfaces{$publicInterfaceKey}) {
9298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    $availabilityMacro = $publicInterfaces{$publicInterfaceKey};
9308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
9318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $availabilityMacro = "WEBKIT_OBJC_METHOD_ANNOTATION($availabilityMacro)" if $buildingForTigerOrEarlier;
9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $functionDeclaration = "$deprecatedFunctionSig $availabilityMacro;\n";
9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@deprecatedHeaderFunctions, $functionDeclaration);
9378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                unless (defined $publicInterfaces{$publicInterfaceKey}) {
9398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    warn "Deprecated method $publicInterfaceKey is not in PublicDOMInterfaces.h. All deprecated methods need to be public, or should have the OldStyleObjC IDL attribute removed";
9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    $fatalError = 1;
9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                delete $publicInterfaces{$publicInterfaceKey};
9448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
9458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (@headerFunctions > 0) {
9488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@headerContent, "\n") if $buildingForLeopardOrLater and @headerAttributes > 0;
9498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@headerContent, @headerFunctions);
9508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
9518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (@deprecatedHeaderFunctions > 0 && $isProtocol) {
9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@headerContent, @deprecatedHeaderFunctions);
9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # - End @interface or @protocol
9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    push(@headerContent, "\@end\n");
9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (@deprecatedHeaderFunctions > 0 && !$isProtocol) {
9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        # - Deprecated category @interface
9628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@headerContent, "\n\@interface $className (" . $className . "Deprecated)\n");
9638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@headerContent, @deprecatedHeaderFunctions);
9648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@headerContent, "\@end\n");
9658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    push(@headerContent, "\n#endif\n") if length $interfaceAvailabilityVersion;
9688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my %alwaysGenerateForNoSVGBuild = map { $_ => 1 } qw(DOMHTMLEmbedElement DOMHTMLObjectElement);
9708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (@privateHeaderAttributes > 0 or @privateHeaderFunctions > 0 or exists $alwaysGenerateForNoSVGBuild{$className}) {
9728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        # - Private category @interface
9735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        @privateHeaderContentHeader = split("\r", $headerLicenseTemplate);
9748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@privateHeaderContentHeader, "\n");
9758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        my $classHeaderName = GetClassHeaderName($className);
9778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@privateHeaderContentHeader, "#import <WebCore/$classHeaderName.h>\n\n");
9788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@privateHeaderContentHeader, $interfaceAvailabilityVersionCheck) if length $interfaceAvailabilityVersion;
9798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        @privateHeaderContent = ();
9818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@privateHeaderContent, "\@interface $className (" . $className . "Private)\n");
9828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@privateHeaderContent, @privateHeaderAttributes) if @privateHeaderAttributes > 0;
9838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@privateHeaderContent, "\n") if $buildingForLeopardOrLater and @privateHeaderAttributes > 0 and @privateHeaderFunctions > 0;
9848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@privateHeaderContent, @privateHeaderFunctions) if @privateHeaderFunctions > 0;
9858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@privateHeaderContent, "\@end\n");
9868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@privateHeaderContent, "\n#endif\n") if length $interfaceAvailabilityVersion;
9888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unless ($isProtocol) {
9918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        # Generate internal interfaces
992e14391e94c850b8bd03680c23b38978db68687a8John Reck        my $implClassName = GetImplClassName($interfaceName);
993e14391e94c850b8bd03680c23b38978db68687a8John Reck        my $implClassNameWithNamespace = "WebCore::" . $implClassName;
994e14391e94c850b8bd03680c23b38978db68687a8John Reck
995e14391e94c850b8bd03680c23b38978db68687a8John Reck        my $implType = $implClassNameWithNamespace;
996e14391e94c850b8bd03680c23b38978db68687a8John Reck        my ($svgPropertyType, $svgListPropertyType, $svgNativeType) = GetSVGPropertyTypes($implClassName);
997e14391e94c850b8bd03680c23b38978db68687a8John Reck        $implType = $svgNativeType if $svgNativeType;
9988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        # Generate interface definitions.
10005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        @internalHeaderContent = split("\r", $implementationLicenseTemplate);
10018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@internalHeaderContent, "\n#import <WebCore/$className.h>\n\n");
1003e14391e94c850b8bd03680c23b38978db68687a8John Reck        push(@internalHeaderContent, "#import <WebCore/SVGAnimatedPropertyTearOff.h>\n\n") if $svgPropertyType;
10046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if ($svgListPropertyType) {
10056b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            push(@internalHeaderContent, "#import <WebCore/SVGAnimatedListPropertyTearOff.h>\n\n");
10066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            push(@internalHeaderContent, "#import <WebCore/SVGTransformListPropertyTearOff.h>\n\n") if $svgListPropertyType =~ /SVGTransformList/;
10074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            push(@internalHeaderContent, "#import <WebCore/SVGPathSegListPropertyTearOff.h>\n\n") if $svgListPropertyType =~ /SVGPathSegList/;
10086b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        }
10098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@internalHeaderContent, $interfaceAvailabilityVersionCheck) if length $interfaceAvailabilityVersion;
10108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if ($interfaceName eq "Node") {
10128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@internalHeaderContent, "\@protocol DOMEventTarget;\n\n");
10138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
10148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        my $startedNamespace = 0;
10165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
10176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if ($codeGenerator->IsSVGAnimatedType($interfaceName)) {
1018e14391e94c850b8bd03680c23b38978db68687a8John Reck            push(@internalHeaderContent, "#import <WebCore/$implClassName.h>\n\n");
10198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
10205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            push(@internalHeaderContent, "namespace WebCore {\n");
10215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            $startedNamespace = 1;
10226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            if ($interfaceName eq "Node") {
10235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                push(@internalHeaderContent, "    class EventTarget;\n    class Node;\n");
10245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            } else {
10255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                push(@internalHeaderContent, "    class $implClassName;\n");
10265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            }
10275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            push(@internalHeaderContent, "}\n\n");
10285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
10295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
10306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        push(@internalHeaderContent, "$implType* core($className *);\n");
10316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        push(@internalHeaderContent, "$className *kit($implType*);\n");
10328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if ($dataNode->extendedAttributes->{Polymorphic}) {
1034e14391e94c850b8bd03680c23b38978db68687a8John Reck            push(@internalHeaderContent, "Class kitClass($implType*);\n");
10355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
10368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if ($interfaceName eq "Node") {
10385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            push(@internalHeaderContent, "id <DOMEventTarget> kit(WebCore::EventTarget*);\n");
10398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
10408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@internalHeaderContent, "\n#endif\n") if length $interfaceAvailabilityVersion;
10428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub GenerateImplementation
10468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $object = shift;
10488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $dataNode = shift;
10498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1050231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    my @ancestorInterfaceNames = ();
1051231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
10528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (@{$dataNode->parents} > 1) {
1053231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        $codeGenerator->AddMethodsConstantsAndAttributesFromParentClasses($dataNode, \@ancestorInterfaceNames);
10548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $interfaceName = $dataNode->name;
10578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $className = GetClassName($interfaceName);
10588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $implClassName = GetImplClassName($interfaceName);
10598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $parentImplClassName = GetParentImplClassName($dataNode);
10608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $implClassNameWithNamespace = "WebCore::" . $implClassName;
10618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $baseClass = GetBaseClass($parentImplClassName);
10628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $classHeaderName = GetClassHeaderName($className);
10638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $numAttributes = @{$dataNode->attributes};
10658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $numFunctions = @{$dataNode->functions};
1066e14391e94c850b8bd03680c23b38978db68687a8John Reck    my $implType = $implClassNameWithNamespace;
1067e14391e94c850b8bd03680c23b38978db68687a8John Reck
1068e14391e94c850b8bd03680c23b38978db68687a8John Reck    my ($svgPropertyType, $svgListPropertyType, $svgNativeType) = GetSVGPropertyTypes($implClassName);
1069e14391e94c850b8bd03680c23b38978db68687a8John Reck    $implType = $svgNativeType if $svgNativeType;
10708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # - Add default header template.
10725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    @implContentHeader = split("\r", $implementationLicenseTemplate);
10738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # - INCLUDES -
10758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    push(@implContentHeader, "\n#import \"config.h\"\n");
10768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
107721939df44de1705786c545cd1bf519d47250322dBen Murdoch    my $conditionalString = GenerateConditionalString($dataNode);
107821939df44de1705786c545cd1bf519d47250322dBen Murdoch    push(@implContentHeader, "\n#if ${conditionalString}\n\n") if $conditionalString;
10798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    push(@implContentHeader, "#import \"DOMInternal.h\"\n\n");
10815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    push(@implContentHeader, "#import \"$classHeaderName.h\"\n\n");
10825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
10835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    $implIncludes{"ExceptionHandlers.h"} = 1;
10845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    $implIncludes{"ThreadCheck.h"} = 1;
1085e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    $implIncludes{"JSMainThreadExecState.h"} = 1;
10865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    $implIncludes{"WebScriptObjectPrivate.h"} = 1;
10875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    $implIncludes{$classHeaderName . "Internal.h"} = 1;
10885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
10895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    # FIXME: These includes are only needed when the class is a subclass of one of these polymorphic classes.
1090d0825bca7fe65beaee391d30da42e937db621564Steve Block    $implIncludes{"DOMBlobInternal.h"} = 1;
10915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    $implIncludes{"DOMCSSRuleInternal.h"} = 1;
10925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    $implIncludes{"DOMCSSValueInternal.h"} = 1;
10935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    $implIncludes{"DOMEventInternal.h"} = 1;
10945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    $implIncludes{"DOMNodeInternal.h"} = 1;
10955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    $implIncludes{"DOMStyleSheetInternal.h"} = 1;
10968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    $implIncludes{"DOMSVGPathSegInternal.h"} = 1 if $interfaceName =~ /^SVGPathSeg.+/;
10988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if ($interfaceName =~ /(\w+)(Abs|Rel)$/) {
11008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $implIncludes{"$1.h"} = 1;
11018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
11026b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!$codeGenerator->AvoidInclusionOfType($implClassName)) {
11036b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            $implIncludes{"$implClassName.h"} = 1 ;
11046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        } elsif ($codeGenerator->IsSVGTypeNeedingTearOff($implClassName)) {
11056b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            my $includeType = $codeGenerator->GetSVGWrappedTypeNeedingTearOff($implClassName);
11066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            $implIncludes{"${includeType}.h"} = 1;
11078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
11088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    @implContent = ();
11118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    push(@implContent, "#import <wtf/GetPtr.h>\n\n");
11135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
11148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # add implementation accessor
11156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if ($parentImplClassName eq "Object") {
1116e14391e94c850b8bd03680c23b38978db68687a8John Reck        push(@implContent, "#define IMPL reinterpret_cast<$implType*>(_internal)\n\n");
11178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
11188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        my $baseClassWithNamespace = "WebCore::$baseClass";
11198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@implContent, "#define IMPL static_cast<$implClassNameWithNamespace*>(reinterpret_cast<$baseClassWithNamespace*>(_internal))\n\n");
11208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # START implementation
11238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    push(@implContent, "\@implementation $className\n\n");
11248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # Only generate 'dealloc' and 'finalize' methods for direct subclasses of DOMObject.
11268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($parentImplClassName eq "Object") {
11270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        $implIncludes{"WebCoreObjCExtras.h"} = 1;
11288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@implContent, "- (void)dealloc\n");
11298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@implContent, "{\n");
11300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        push(@implContent, "    if (WebCoreObjCScheduleDeallocateOnMainThread([$className class], self))\n");
11310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        push(@implContent, "        return;\n");
11320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        push(@implContent, "\n");
11338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ($interfaceName eq "NodeIterator") {
11348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@implContent, "    if (_internal) {\n");
11358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@implContent, "        [self detach];\n");
11368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@implContent, "        IMPL->deref();\n");
11378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@implContent, "    };\n");
11388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
11398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@implContent, "    if (_internal)\n");
11408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@implContent, "        IMPL->deref();\n");
11418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
11428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@implContent, "    [super dealloc];\n");
11438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@implContent, "}\n\n");
11448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@implContent, "- (void)finalize\n");
11468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@implContent, "{\n");
11478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ($interfaceName eq "NodeIterator") {
11488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@implContent, "    if (_internal) {\n");
11498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@implContent, "        [self detach];\n");
11508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@implContent, "        IMPL->deref();\n");
11518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@implContent, "    };\n");
11528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
11538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@implContent, "    if (_internal)\n");
11548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@implContent, "        IMPL->deref();\n");
11558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
11568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@implContent, "    [super finalize];\n");
11578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        push(@implContent, "}\n\n");
11588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    %attributeNames = ();
11628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # - Attributes
11648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($numAttributes > 0) {
11658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        foreach my $attribute (@{$dataNode->attributes}) {
11668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            AddIncludesForType($attribute->signature->type);
11678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $idlType = $codeGenerator->StripModule($attribute->signature->type);
11698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $attributeName = $attribute->signature->name;
11718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $attributeType = GetObjCType($attribute->signature->type);
11728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $attributeIsReadonly = ($attribute->type =~ /^readonly/);
11738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $attributeClassName = GetClassName($attribute->signature->type);
11748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $attributeInterfaceName = $attributeName;
1176545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            if ($attributeName eq "id" or $attributeName eq "hash" or $attributeName eq "description") {
1177545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                # Special case some attributes (like id and hash) to have a "Name" suffix to avoid ObjC naming conflicts.
11788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $attributeInterfaceName .= "Name";
11798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } elsif ($attributeName eq "frame") {
11808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                # Special case attribute frame to be frameBorders.
11818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $attributeInterfaceName .= "Borders";
118206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            } elsif ($attributeName eq "operator") {
118306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                # Avoid clash with C++ keyword.
118406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                $attributeInterfaceName = "_operator";
11858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
11868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $attributeNames{$attributeInterfaceName} = 1;
11888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            # - GETTER
11908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $getterSig = "- ($attributeType)$attributeInterfaceName\n";
1191cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
119206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            my $getterExpressionPrefix = $codeGenerator->GetterExpressionPrefix(\%implIncludes, $interfaceName, $attribute);
119306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
119406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            # FIXME: Special case attribute ownerDocument to call document. This makes it return the
119506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            # document when called on the document itself. Legacy behavior, see <https://bugs.webkit.org/show_bug.cgi?id=10889>.
119606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            $getterExpressionPrefix =~ s/\bownerDocument\b/document/;
1197cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
11988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $hasGetterException = @{$attribute->getterExceptions};
119906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            my $getterContentHead = "IMPL->$getterExpressionPrefix";
12008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $getterContentTail = ")";
12018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1202e14391e94c850b8bd03680c23b38978db68687a8John Reck            if ($svgPropertyType) {
1203e14391e94c850b8bd03680c23b38978db68687a8John Reck                $getterContentHead = "$getterExpressionPrefix";
12048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1205e14391e94c850b8bd03680c23b38978db68687a8John Reck                # TODO: Handle special case for DOMSVGLength. We do need Custom code support for this.
1206e14391e94c850b8bd03680c23b38978db68687a8John Reck                if ($svgPropertyType eq "WebCore::SVGLength" and $attributeName eq "value") {
120728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                    $getterContentHead = "value(IMPL->contextElement(), ";
1208e14391e94c850b8bd03680c23b38978db68687a8John Reck                }
12098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
12108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $attributeTypeSansPtr = $attributeType;
12128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $attributeTypeSansPtr =~ s/ \*$//; # Remove trailing " *" from pointer types.
12138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            # special case for EventTarget protocol
12158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            $attributeTypeSansPtr = "DOMNode" if $idlType eq "EventTarget";
12168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            # Special cases
12188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my @customGetterContent = ();
12198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ($attributeTypeSansPtr eq "DOMImplementation") {
12208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                # FIXME: We have to special case DOMImplementation until DOMImplementationFront is removed
12215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                $getterContentHead = "kit(implementationFront(IMPL";
12225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                $getterContentTail .= ")";
12238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } elsif ($attributeName =~ /(\w+)DisplayString$/) {
12248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                my $attributeToDisplay = $1;
12255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                $getterContentHead = "WebCore::displayString(IMPL->$attributeToDisplay(), core(self)";
12265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                $implIncludes{"HitTestResult.h"} = 1;
12278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } elsif ($attributeName =~ /^absolute(\w+)URL$/) {
12288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                my $typeOfURL = $1;
12298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $getterContentHead = "[self _getURLAttribute:";
12308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if ($typeOfURL eq "Link") {
12318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    $getterContentTail = "\@\"href\"]";
12328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                } elsif ($typeOfURL eq "Image") {
12338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if ($interfaceName eq "HTMLObjectElement") {
12348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        $getterContentTail = "\@\"data\"]";
12358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    } else {
12368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        $getterContentTail = "\@\"src\"]";
12378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
12388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    unless ($interfaceName eq "HTMLImageElement") {
12398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        push(@customGetterContent, "    if (!IMPL->renderer() || !IMPL->renderer()->isImage())\n");
12408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        push(@customGetterContent, "        return nil;\n");
12418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        $implIncludes{"RenderObject.h"} = 1;
12428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
12448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $implIncludes{"DOMPrivate.h"} = 1;
12458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } elsif ($attribute->signature->extendedAttributes->{"ConvertToString"}) {
1246dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                $getterContentHead = "WTF::String::number(" . $getterContentHead;
12478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $getterContentTail .= ")";
12486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            } elsif ($idlType eq "Date") {
12495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                $getterContentHead = "kit($getterContentHead";
12505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                $getterContentTail .= ")";
1251e14391e94c850b8bd03680c23b38978db68687a8John Reck            } elsif ($svgPropertyType) {
125228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                # Special case for DOMSVGNumber
125328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                if ($svgPropertyType eq "float") {
125428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                    # Intentional leave out closing brace, it's already contained in getterContentTail
125528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                    $getterContentHead = "IMPL->propertyReference(";
125628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                } else {
125728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                    $getterContentHead = "IMPL->propertyReference().$getterContentHead";
125828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                }
12596b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
12606b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if ($codeGenerator->IsSVGTypeWithWritablePropertiesNeedingTearOff($idlType) and not defined $attribute->signature->extendedAttributes->{"Immutable"}) {
12616b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    my $getter = $getterContentHead;
12626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    $getter =~ s/\(\)//;
12636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
12646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    my $tearOffType = GetSVGTypeWithNamespace($idlType);
12656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    my $selfIsTearOffType = $codeGenerator->IsSVGTypeNeedingTearOff($implClassName);
12666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    if ($selfIsTearOffType) {
12676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        $implIncludes{"SVGStaticPropertyWithParentTearOff.h"} = 1;
12686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        $tearOffType =~ s/SVGPropertyTearOff</SVGStaticPropertyWithParentTearOff<$implClassNameWithNamespace, /;
12696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
12706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        my $getter = $getterExpressionPrefix;
12716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        $getter =~ s/IMPL->//;
12726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        $getter =~ s/\(//;
12736b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        my $updateMethod = "&${implClassNameWithNamespace}::update" . $codeGenerator->WK_ucfirst($getter);
12746b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
12756b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if ($getterContentHead =~ /matrix/ and $implClassName eq "SVGTransform") {
12766b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            # SVGTransform offers a matrix() method for internal usage that returns an AffineTransform
12776b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            # and a svgMatrix() method returning a SVGMatrix, used for the bindings.
12786b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            $getterContentHead =~ s/matrix/svgMatrix/;
12796b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        }
12806b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
12816b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        $getterContentHead = "${tearOffType}::create(IMPL, $getterContentHead$getterContentTail, $updateMethod)";
12826b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
12836b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        $getterContentHead = "kit(WTF::getPtr($getterContentHead";
12846b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        $getterContentTail = "))";
12856b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    }
12866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                }
12876b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            } elsif ($codeGenerator->IsSVGAnimatedType($implClassName) and $codeGenerator->IsSVGTypeNeedingTearOff($idlType)) {
128828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                my $idlTypeWithNamespace = GetSVGTypeWithNamespace($idlType);
1289e14391e94c850b8bd03680c23b38978db68687a8John Reck                $getterContentHead = "kit(static_cast<$idlTypeWithNamespace*>($getterContentHead)";
1290e14391e94c850b8bd03680c23b38978db68687a8John Reck                $getterContentTail .= ")";
12918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } elsif (IsProtocolType($idlType) and $idlType ne "EventTarget") {
12925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                $getterContentHead = "kit($getterContentHead";
12935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                $getterContentTail .= ")";
12940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            } elsif ($idlType eq "Color") {
12950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                $getterContentHead = "WebCore::nsColor($getterContentHead";
12960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                $getterContentTail .= ")";
1297231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            } elsif ($attribute->signature->type eq "SerializedScriptValue") {
1298231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                $getterContentHead = "$getterContentHead";
1299231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                $getterContentTail .= "->toString()";
13005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            } elsif (ConversionNeeded($attribute->signature->type)) {
130128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                my $type = $attribute->signature->type;
130228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                if ($codeGenerator->IsSVGTypeNeedingTearOff($type) and not $implClassName =~ /List$/) {
130328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                    my $idlTypeWithNamespace = GetSVGTypeWithNamespace($type);
1304f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                    $implIncludes{"$type.h"} = 1 if not $codeGenerator->AvoidInclusionOfType($type);
130528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                    if ($codeGenerator->IsSVGTypeWithWritablePropertiesNeedingTearOff($type) and not defined $attribute->signature->extendedAttributes->{"Immutable"}) {
130628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                        $idlTypeWithNamespace =~ s/SVGPropertyTearOff</SVGStaticPropertyTearOff<$implClassNameWithNamespace, /;
130728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                        $implIncludes{"SVGStaticPropertyTearOff.h"} = 1;
130828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
130928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                        my $getter = $getterContentHead;
131028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                        $getter =~ s/IMPL->//;
131128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                        $getter =~ s/\(//;
13126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        my $updateMethod = "&${implClassNameWithNamespace}::update" . $codeGenerator->WK_ucfirst($getter);
13136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        $getterContentHead = "kit(WTF::getPtr(${idlTypeWithNamespace}::create(IMPL, $getterContentHead$getterContentTail, $updateMethod";
131428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                        $getterContentTail .= "))";
13154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                    } elsif ($idlTypeWithNamespace =~ /SVG(Point|PathSeg)List/) {
13164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                        $getterContentHead = "kit(WTF::getPtr($getterContentHead";
13174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                        $getterContentTail .= "))";
131828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                    } elsif ($idlTypeWithNamespace =~ /SVGStaticListPropertyTearOff/) {
131928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                        my $extraImp = "WebCore::GetOwnerElementForType<$implClassNameWithNamespace, WebCore::IsDerivedFromSVGElement<$implClassNameWithNamespace>::value>::ownerElement(IMPL), ";
132028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                        $getterContentHead = "kit(WTF::getPtr(${idlTypeWithNamespace}::create($extraImp$getterContentHead";
132128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                        $getterContentTail .= ")))";
132228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                    } else {
132328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                        $getterContentHead = "kit(WTF::getPtr(${idlTypeWithNamespace}::create($getterContentHead";
132428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                        $getterContentTail .= ")))";
132528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                    }
1326e14391e94c850b8bd03680c23b38978db68687a8John Reck                } else {
1327e14391e94c850b8bd03680c23b38978db68687a8John Reck                    $getterContentHead = "kit(WTF::getPtr($getterContentHead";
1328e14391e94c850b8bd03680c23b38978db68687a8John Reck                    $getterContentTail .= "))";
1329e14391e94c850b8bd03680c23b38978db68687a8John Reck                }
13308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
13318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $getterContent;
13338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ($hasGetterException) {
13348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $getterContent = $getterContentHead . "ec" . $getterContentTail;
13358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else {
13368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $getterContent = $getterContentHead . $getterContentTail;
13378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
13388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
133906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            my $attributeConditionalString = GenerateConditionalString($attribute->signature);
134006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            push(@implContent, "#if ${attributeConditionalString}\n") if $attributeConditionalString;
13418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@implContent, $getterSig);
13428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@implContent, "{\n");
1343e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            push(@implContent, "    $jsContextSetter\n");
13448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@implContent, @customGetterContent);
13458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ($hasGetterException) {
13468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                # Differentiated between when the return type is a pointer and
13478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                # not for white space issue (ie. Foo *result vs. int result).
13488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if ($attributeType =~ /\*$/) {
13498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    $getterContent = $attributeType . "result = " . $getterContent;
13508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                } else {
13518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    $getterContent = $attributeType . " result = " . $getterContent;
13528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
13538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@implContent, "    $exceptionInit\n");
13558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@implContent, "    $getterContent;\n");
13568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@implContent, "    $exceptionRaiseOnError\n");
13578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@implContent, "    return result;\n");
13588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else {
13598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@implContent, "    return $getterContent;\n");
13608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
136106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            push(@implContent, "}\n");
13628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            # - SETTER
13648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!$attributeIsReadonly) {
13658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                # Exception handling
13668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                my $hasSetterException = @{$attribute->setterExceptions};
13678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                my $coreSetterName = "set" . $codeGenerator->WK_ucfirst($attributeName);
13698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                my $setterName = "set" . ucfirst($attributeInterfaceName);
13708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                my $argName = "new" . ucfirst($attributeInterfaceName);
13718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                my $arg = GetObjCTypeGetter($argName, $idlType);
13728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
137306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                # The definition of ConvertToString is flipped for the setter
137406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                if ($attribute->signature->extendedAttributes->{"ConvertToString"}) {
1375dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                    $arg = "WTF::String($arg).toInt()";
13768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
13778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                my $setterSig = "- (void)$setterName:($attributeType)$argName\n";
13798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
138006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                push(@implContent, "\n");
13818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@implContent, $setterSig);
13828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@implContent, "{\n");
1383e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                push(@implContent, "    $jsContextSetter\n");
13848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                unless ($codeGenerator->IsPrimitiveType($idlType) or $codeGenerator->IsStringType($idlType)) {
13868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    push(@implContent, "    ASSERT($argName);\n\n");
13878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
13888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1389d0825bca7fe65beaee391d30da42e937db621564Steve Block                if ($idlType eq "Date") {
1390d0825bca7fe65beaee391d30da42e937db621564Steve Block                    $arg = "core(" . $arg . ")";
1391d0825bca7fe65beaee391d30da42e937db621564Steve Block                }
1392d0825bca7fe65beaee391d30da42e937db621564Steve Block
1393e14391e94c850b8bd03680c23b38978db68687a8John Reck                if ($svgPropertyType) {
1394e14391e94c850b8bd03680c23b38978db68687a8John Reck                    $getterContentHead = "$getterExpressionPrefix";
13954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                    push(@implContent, "    if (IMPL->role() == WebCore::AnimValRole) {\n");
13964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                    push(@implContent, "        WebCore::raiseOnDOMError(WebCore::NO_MODIFICATION_ALLOWED_ERR);\n");
13974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                    push(@implContent, "        return;\n");
13984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                    push(@implContent, "    }\n");
1399e14391e94c850b8bd03680c23b38978db68687a8John Reck                    push(@implContent, "    $svgPropertyType& podImpl = IMPL->propertyReference();\n");
1400e14391e94c850b8bd03680c23b38978db68687a8John Reck                    my $ec = $hasSetterException ? ", ec" : "";
1401e14391e94c850b8bd03680c23b38978db68687a8John Reck                    push(@implContent, "    $exceptionInit\n") if $hasSetterException;
140228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
140328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                    # Special case for DOMSVGNumber
140428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                    if ($svgPropertyType eq "float") {
140528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                        push(@implContent, "    podImpl = $arg;\n");
140628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                    } else {
140728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                        # FIXME: Special case for DOMSVGLength. We do need Custom code support for this.
140828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                        if ($svgPropertyType eq "WebCore::SVGLength" and $attributeName eq "value") {
140928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                            push(@implContent, "    podImpl.$coreSetterName($arg, IMPL->contextElement()$ec);\n");
141028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                        } else {
141128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                            push(@implContent, "    podImpl.$coreSetterName($arg$ec);\n");
141228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                        }
141328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                    }
141428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
1415e14391e94c850b8bd03680c23b38978db68687a8John Reck                    if ($hasSetterException) {
1416e14391e94c850b8bd03680c23b38978db68687a8John Reck                        push(@implContent, "    if (!ec)\n");
1417e14391e94c850b8bd03680c23b38978db68687a8John Reck                        push(@implContent, "        IMPL->commitChange();\n");
1418e14391e94c850b8bd03680c23b38978db68687a8John Reck                        push(@implContent, "    $exceptionRaiseOnError\n");
1419e14391e94c850b8bd03680c23b38978db68687a8John Reck                    } else {
142028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                        push(@implContent, "    IMPL->commitChange();\n");
1421e14391e94c850b8bd03680c23b38978db68687a8John Reck                    }
1422e14391e94c850b8bd03680c23b38978db68687a8John Reck                } elsif ($svgListPropertyType) {
1423e14391e94c850b8bd03680c23b38978db68687a8John Reck                    $getterContentHead = "$getterExpressionPrefix";
1424e14391e94c850b8bd03680c23b38978db68687a8John Reck                    push(@implContent, "    IMPL->$coreSetterName($arg);\n");
14258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                } else {
142606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                    my $setterExpressionPrefix = $codeGenerator->SetterExpressionPrefix(\%implIncludes, $interfaceName, $attribute);
1427cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                    my $ec = $hasSetterException ? ", ec" : "";
142806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                    push(@implContent, "    $exceptionInit\n") if $hasSetterException;
142906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                    push(@implContent, "    IMPL->$setterExpressionPrefix$arg$ec);\n");
1430cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                    push(@implContent, "    $exceptionRaiseOnError\n") if $hasSetterException;
14318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
14328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
143306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                push(@implContent, "}\n");
14348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
143506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
143606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            push(@implContent, "#endif\n") if $attributeConditionalString;
143706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            push(@implContent, "\n");
14388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
14398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
14408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # - Functions
14428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ($numFunctions > 0) {
14438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        foreach my $function (@{$dataNode->functions}) {
14448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            AddIncludesForType($function->signature->type);
14458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $functionName = $function->signature->name;
14478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $returnType = GetObjCType($function->signature->type);
14488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $hasParameters = @{$function->parameters};
14498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $raisesExceptions = @{$function->raisesExceptions};
14508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my @parameterNames = ();
14528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my @needsAssert = ();
14538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my %needsCustom = ();
14548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $parameterIndex = 0;
14568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $functionSig = "- ($returnType)$functionName";
14578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            foreach my $param (@{$function->parameters}) {
14588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                my $paramName = $param->name;
14598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                my $paramType = GetObjCType($param->type);
14608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                # make a new parameter name if the original conflicts with a property name
14628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $paramName = "in" . ucfirst($paramName) if $attributeNames{$paramName};
14638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                AddIncludesForType($param->type);
14658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                my $idlType = $codeGenerator->StripModule($param->type);
14678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                my $implGetter = GetObjCTypeGetter($paramName, $idlType);
14688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@parameterNames, $implGetter);
14708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $needsCustom{"XPathNSResolver"} = $paramName if $idlType eq "XPathNSResolver";
14718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $needsCustom{"NodeFilter"} = $paramName if $idlType eq "NodeFilter";
14728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $needsCustom{"EventListener"} = $paramName if $idlType eq "EventListener";
14738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $needsCustom{"EventTarget"} = $paramName if $idlType eq "EventTarget";
14748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $needsCustom{"NodeToReturn"} = $paramName if $param->extendedAttributes->{"Return"};
14758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                unless ($codeGenerator->IsPrimitiveType($idlType) or $codeGenerator->IsStringType($idlType)) {
14778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    push(@needsAssert, "    ASSERT($paramName);\n");
14788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
14798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if ($parameterIndex >= 1) {
14818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    my $paramPrefix = $param->extendedAttributes->{"ObjCPrefix"};
14828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    $paramPrefix = $param->name unless defined($paramPrefix);
14838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    $functionSig .= " $paramPrefix";
14848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
14858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $functionSig .= ":($paramType)$paramName";
14878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $parameterIndex++;
14898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
14908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my @functionContent = ();
14928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            my $caller = "IMPL";
14938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            # special case the XPathNSResolver
14958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (defined $needsCustom{"XPathNSResolver"}) {
14968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                my $paramName = $needsCustom{"XPathNSResolver"};
14978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@functionContent, "    WebCore::XPathNSResolver* nativeResolver = 0;\n");
14988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@functionContent, "    RefPtr<WebCore::XPathNSResolver> customResolver;\n");
14998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@functionContent, "    if ($paramName) {\n");
15008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@functionContent, "        if ([$paramName isMemberOfClass:[DOMNativeXPathNSResolver class]])\n");
15015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                push(@functionContent, "            nativeResolver = core(static_cast<DOMNativeXPathNSResolver *>($paramName));\n");
15028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@functionContent, "        else {\n");
15038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@functionContent, "            customResolver = WebCore::DOMCustomXPathNSResolver::create($paramName);\n");
15048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@functionContent, "            nativeResolver = WTF::getPtr(customResolver);\n");
15058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@functionContent, "        }\n");
15068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@functionContent, "    }\n");
15078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
15088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            # special case the EventTarget
15108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (defined $needsCustom{"EventTarget"}) {
15118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                my $paramName = $needsCustom{"EventTarget"};
15128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@functionContent, "    DOMNode* ${paramName}ObjC = $paramName;\n");
15135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                push(@functionContent, "    WebCore::Node* ${paramName}Node = core(${paramName}ObjC);\n");
15148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $implIncludes{"DOMNode.h"} = 1;
15158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $implIncludes{"Node.h"} = 1;
15168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
15178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ($function->signature->extendedAttributes->{"UsesView"}) {
15198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@functionContent, "    WebCore::DOMWindow* dv = $caller->defaultView();\n");
15208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@functionContent, "    if (!dv)\n");
15218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@functionContent, "        return nil;\n");
15228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $implIncludes{"DOMWindow.h"} = 1;
15238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $caller = "dv";
15248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
15258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            # special case the EventListener
15278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (defined $needsCustom{"EventListener"}) {
15288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                my $paramName = $needsCustom{"EventListener"};
15298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@functionContent, "    RefPtr<WebCore::EventListener> nativeEventListener = WebCore::ObjCEventListener::wrap($paramName);\n");
15308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
15318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            # special case the NodeFilter
15338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (defined $needsCustom{"NodeFilter"}) {
15348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                my $paramName = $needsCustom{"NodeFilter"};
15358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@functionContent, "    RefPtr<WebCore::NodeFilter> nativeNodeFilter;\n");
15368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@functionContent, "    if ($paramName)\n");
15378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@functionContent, "        nativeNodeFilter = WebCore::NodeFilter::create(WebCore::ObjCNodeFilterCondition::create($paramName));\n");
15388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
15398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            # FIXME! We need [Custom] support for ObjC, to move these hacks into DOMSVGLength/MatrixCustom.mm
1541e14391e94c850b8bd03680c23b38978db68687a8John Reck            my $svgLengthConvertToSpecifiedUnits = ($svgPropertyType and $svgPropertyType eq "WebCore::SVGLength" and $functionName eq "convertToSpecifiedUnits");
15428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
154328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            push(@parameterNames, "IMPL->contextElement()") if $svgLengthConvertToSpecifiedUnits;
15446b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            push(@parameterNames, "ec") if $raisesExceptions;
1545e14391e94c850b8bd03680c23b38978db68687a8John Reck
1546e14391e94c850b8bd03680c23b38978db68687a8John Reck            # Handle arguments that are 'SVGProperty' based (SVGAngle/SVGLength). We need to convert from SVGPropertyTearOff<Type>* to Type,
1547e14391e94c850b8bd03680c23b38978db68687a8John Reck            # to be able to call the desired WebCore function. If the conversion fails, we can't extract Type and need to raise an exception.
1548e14391e94c850b8bd03680c23b38978db68687a8John Reck            my $currentParameter = -1;
1549e14391e94c850b8bd03680c23b38978db68687a8John Reck            foreach my $param (@{$function->parameters}) {
1550e14391e94c850b8bd03680c23b38978db68687a8John Reck                $currentParameter++;
1551e14391e94c850b8bd03680c23b38978db68687a8John Reck
1552e14391e94c850b8bd03680c23b38978db68687a8John Reck                my $paramName = $param->name;
15536b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
15546b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                # make a new parameter name if the original conflicts with a property name
15556b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                $paramName = "in" . ucfirst($paramName) if $attributeNames{$paramName};
15566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
1557e14391e94c850b8bd03680c23b38978db68687a8John Reck                my $idlType = $codeGenerator->StripModule($param->type);
1558e14391e94c850b8bd03680c23b38978db68687a8John Reck                next if not $codeGenerator->IsSVGTypeNeedingTearOff($idlType) or $implClassName =~ /List$/;
1559e14391e94c850b8bd03680c23b38978db68687a8John Reck
1560e14391e94c850b8bd03680c23b38978db68687a8John Reck                my $implGetter = GetObjCTypeGetter($paramName, $idlType);
156128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                my $idlTypeWithNamespace = GetSVGTypeWithNamespace($idlType);
1562e14391e94c850b8bd03680c23b38978db68687a8John Reck
1563e14391e94c850b8bd03680c23b38978db68687a8John Reck                push(@functionContent, "    $idlTypeWithNamespace* ${paramName}Core = $implGetter;\n");
1564e14391e94c850b8bd03680c23b38978db68687a8John Reck                push(@functionContent, "    if (!${paramName}Core) {\n");
1565e14391e94c850b8bd03680c23b38978db68687a8John Reck                push(@functionContent, "        WebCore::ExceptionCode ec = WebCore::TYPE_MISMATCH_ERR;\n");
1566e14391e94c850b8bd03680c23b38978db68687a8John Reck                push(@functionContent, "        $exceptionRaiseOnError\n");
1567e14391e94c850b8bd03680c23b38978db68687a8John Reck                if ($returnType eq "void") {
1568e14391e94c850b8bd03680c23b38978db68687a8John Reck                    push(@functionContent, "        return;\n");
1569e14391e94c850b8bd03680c23b38978db68687a8John Reck                } else {
1570e14391e94c850b8bd03680c23b38978db68687a8John Reck                    push(@functionContent, "        return nil;\n");
1571e14391e94c850b8bd03680c23b38978db68687a8John Reck                }
1572e14391e94c850b8bd03680c23b38978db68687a8John Reck                push(@functionContent, "    }\n");
1573e14391e94c850b8bd03680c23b38978db68687a8John Reck
1574e14391e94c850b8bd03680c23b38978db68687a8John Reck                # Replace the paramter core() getter, by the cached variable.
1575e14391e94c850b8bd03680c23b38978db68687a8John Reck                splice(@parameterNames, $currentParameter, 1, "${paramName}Core->propertyReference()");
1576e14391e94c850b8bd03680c23b38978db68687a8John Reck            }
1577e14391e94c850b8bd03680c23b38978db68687a8John Reck
1578e14391e94c850b8bd03680c23b38978db68687a8John Reck            my $content = $codeGenerator->WK_lcfirst($functionName) . "(" . join(", ", @parameterNames) . ")";
1579e14391e94c850b8bd03680c23b38978db68687a8John Reck
1580e14391e94c850b8bd03680c23b38978db68687a8John Reck            if ($svgPropertyType) {
15814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                push(@functionContent, "    if (IMPL->role() == WebCore::AnimValRole) {\n");
15824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                push(@functionContent, "        WebCore::raiseOnDOMError(WebCore::NO_MODIFICATION_ALLOWED_ERR);\n");
15834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                if ($returnType eq "void") {
15844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                    push(@functionContent, "        return;\n");
15854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                } else {
15864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                    push(@functionContent, "        return nil;\n");
15874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                }
15884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                push(@functionContent, "    }\n");
1589e14391e94c850b8bd03680c23b38978db68687a8John Reck                push(@functionContent, "    $svgPropertyType& podImpl = IMPL->propertyReference();\n");
159028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                $content = "podImpl.$content";
1591e14391e94c850b8bd03680c23b38978db68687a8John Reck            } else {
1592e14391e94c850b8bd03680c23b38978db68687a8John Reck                $content = $caller . "->$content";
1593e14391e94c850b8bd03680c23b38978db68687a8John Reck            }
15948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15956b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            if ($returnType eq "void") {
15968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                # Special case 'void' return type.
15978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if ($raisesExceptions) {
15988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    push(@functionContent, "    $exceptionInit\n");
15998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    push(@functionContent, "    $content;\n");
160028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                    if ($svgPropertyType) {
160128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                        push(@functionContent, "    if (!ec)\n");
160228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                        push(@functionContent, "        IMPL->commitChange();\n");
160328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                    }
16048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    push(@functionContent, "    $exceptionRaiseOnError\n");
16058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                } else {
16068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    push(@functionContent, "    $content;\n");
16076b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    push(@functionContent, "    IMPL->commitChange();\n") if $svgPropertyType;
16088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
16098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } elsif (defined $needsCustom{"NodeToReturn"}) {
16108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                # Special case the insertBefore, replaceChild, removeChild
16118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                # and appendChild functions from DOMNode
16128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                my $toReturn = $needsCustom{"NodeToReturn"};
16138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if ($raisesExceptions) {
16148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    push(@functionContent, "    $exceptionInit\n");
16158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    push(@functionContent, "    if ($content)\n");
16168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    push(@functionContent, "        return $toReturn;\n");
16178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    push(@functionContent, "    $exceptionRaiseOnError\n");
16188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    push(@functionContent, "    return nil;\n");
16198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                } else {
16208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    push(@functionContent, "    if ($content)\n");
16218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    push(@functionContent, "        return $toReturn;\n");
16228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    push(@functionContent, "    return nil;\n");
16238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
1624231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            } elsif ($returnType eq "SerializedScriptValue") {
1625231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                $content = "foo";
16268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else {
16275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                if (ConversionNeeded($function->signature->type)) {
1628e14391e94c850b8bd03680c23b38978db68687a8John Reck                    if ($codeGenerator->IsSVGTypeNeedingTearOff($function->signature->type) and not $implClassName =~ /List$/) {
162928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                        my $idlTypeWithNamespace = GetSVGTypeWithNamespace($function->signature->type);
1630e14391e94c850b8bd03680c23b38978db68687a8John Reck                        $content = "kit(WTF::getPtr(${idlTypeWithNamespace}::create($content)))";
16318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    } else {
16325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                        $content = "kit(WTF::getPtr($content))";
16338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
16348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
16358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if ($raisesExceptions) {
16378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    # Differentiated between when the return type is a pointer and
16388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    # not for white space issue (ie. Foo *result vs. int result).
16398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if ($returnType =~ /\*$/) {
16408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        $content = $returnType . "result = " . $content;
16418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    } else {
16428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        $content = $returnType . " result = " . $content;
16438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
16448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    push(@functionContent, "    $exceptionInit\n");
16468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    push(@functionContent, "    $content;\n");
16478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    push(@functionContent, "    $exceptionRaiseOnError\n");
16488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    push(@functionContent, "    return result;\n");
16498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                } else {
16508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    push(@functionContent, "    return $content;\n");
16518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
16528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
16538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@implContent, "$functionSig\n");
16558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@implContent, "{\n");
1656e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            push(@implContent, "    $jsContextSetter\n");
16578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@implContent, @functionContent);
16588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@implContent, "}\n\n");
16598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            # generate the old style method names with un-named parameters, these methods are deprecated
16618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (@{$function->parameters} > 1 and $function->signature->extendedAttributes->{"OldStyleObjC"}) {
16628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                my $deprecatedFunctionSig = $functionSig;
16638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                $deprecatedFunctionSig =~ s/\s\w+:/ :/g; # remove parameter names
16648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@implContent, "$deprecatedFunctionSig\n");
16668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@implContent, "{\n");
1667e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                push(@implContent, "    $jsContextSetter\n");
16688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@implContent, @functionContent);
16698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                push(@implContent, "}\n\n");
16708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
16718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            # Clear the hash
16738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            %needsCustom = ();
16748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
16758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
16768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # END implementation
16788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    push(@implContent, "\@end\n");
16798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # Generate internal interfaces
16816b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    push(@implContent, "\n$implType* core($className *wrapper)\n");
16826b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    push(@implContent, "{\n");
16836b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    push(@implContent, "    return wrapper ? reinterpret_cast<$implType*>(wrapper->_internal) : 0;\n");
16846b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    push(@implContent, "}\n\n");
16858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if ($parentImplClassName eq "Object") {
1687e14391e94c850b8bd03680c23b38978db68687a8John Reck        push(@implContent, "$className *kit($implType* value)\n");
16885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        push(@implContent, "{\n");
16895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        push(@implContent, "    $assertMainThread;\n");
16905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        push(@implContent, "    if (!value)\n");
16915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        push(@implContent, "        return nil;\n");
16925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        push(@implContent, "    if ($className *wrapper = getDOMWrapper(value))\n");
16935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        push(@implContent, "        return [[wrapper retain] autorelease];\n");
16945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if ($dataNode->extendedAttributes->{Polymorphic}) {
16955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            push(@implContent, "    $className *wrapper = [[kitClass(value) alloc] _init];\n");
16965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            push(@implContent, "    if (!wrapper)\n");
16978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            push(@implContent, "        return nil;\n");
16988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
16995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            push(@implContent, "    $className *wrapper = [[$className alloc] _init];\n");
17008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
17015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        push(@implContent, "    wrapper->_internal = reinterpret_cast<DOMObjectInternal*>(value);\n");
17025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        push(@implContent, "    value->ref();\n");
17035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        push(@implContent, "    addDOMWrapper(wrapper, value);\n");
17045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        push(@implContent, "    return [wrapper autorelease];\n");
17055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        push(@implContent, "}\n");
17065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    } else {
1707e14391e94c850b8bd03680c23b38978db68687a8John Reck        push(@implContent, "$className *kit($implType* value)\n");
17085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        push(@implContent, "{\n");
17095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        push(@implContent, "    $assertMainThread;\n");
17105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        push(@implContent, "    return static_cast<$className*>(kit(static_cast<WebCore::$baseClass*>(value)));\n");
17115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        push(@implContent, "}\n");
17128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
17138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # - End the ifdef conditional if necessary
171521939df44de1705786c545cd1bf519d47250322dBen Murdoch    push(@implContent, "\n#endif // ${conditionalString}\n") if $conditionalString;
1716231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1717231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    # - Generate dependencies.
1718231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if ($writeDependencies && @ancestorInterfaceNames) {
1719231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        push(@depsContent, "$className.h : ", join(" ", map { "$_.idl" } @ancestorInterfaceNames), "\n");
1720231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        push(@depsContent, map { "$_.idl :\n" } @ancestorInterfaceNames);
1721231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
17228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project# Internal helper
17258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsub WriteData
17268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $object = shift;
17288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $name = shift;
17298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # Open files for writing...
17318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $headerFileName = "$outputDir/" . $name . ".h";
17328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $privateHeaderFileName = "$outputDir/" . $name . "Private.h";
17338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $implFileName = "$outputDir/" . $name . ".mm";
17348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $internalHeaderFileName = "$outputDir/" . $name . "Internal.h";
1735231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    my $depsFileName = "$outputDir/" . $name . ".dep";
17368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # Remove old files.
17388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unlink($headerFileName);
17398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unlink($privateHeaderFileName);
17408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unlink($implFileName);
17418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unlink($internalHeaderFileName);
1742231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    unlink($depsFileName);
17438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # Write public header.
17458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    open(HEADER, ">$headerFileName") or die "Couldn't open file $headerFileName";
17468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    print HEADER @headerContentHeader;
17488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    print HEADER map { "\@class $_;\n" } sort keys(%headerForwardDeclarations);
17498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    print HEADER map { "\@protocol $_;\n" } sort keys(%headerForwardDeclarationsForProtocols);
17508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    my $hasForwardDeclarations = keys(%headerForwardDeclarations) + keys(%headerForwardDeclarationsForProtocols);
17528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    print HEADER "\n" if $hasForwardDeclarations;
17538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    print HEADER @headerContent;
17548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    close(HEADER);
17568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    @headerContentHeader = ();
17588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    @headerContent = ();
17598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    %headerForwardDeclarations = ();
17608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    %headerForwardDeclarationsForProtocols = ();
17618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (@privateHeaderContent > 0) {
17638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        open(PRIVATE_HEADER, ">$privateHeaderFileName") or die "Couldn't open file $privateHeaderFileName";
17648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print PRIVATE_HEADER @privateHeaderContentHeader;
17668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print PRIVATE_HEADER map { "\@class $_;\n" } sort keys(%privateHeaderForwardDeclarations);
17678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print PRIVATE_HEADER map { "\@protocol $_;\n" } sort keys(%privateHeaderForwardDeclarationsForProtocols);
17688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        $hasForwardDeclarations = keys(%privateHeaderForwardDeclarations) + keys(%privateHeaderForwardDeclarationsForProtocols);
17708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print PRIVATE_HEADER "\n" if $hasForwardDeclarations;
17718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print PRIVATE_HEADER @privateHeaderContent;
17728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        close(PRIVATE_HEADER);
17748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        @privateHeaderContentHeader = ();
17768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        @privateHeaderContent = ();
17778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        %privateHeaderForwardDeclarations = ();
17788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        %privateHeaderForwardDeclarationsForProtocols = ();
17798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
17808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    # Write implementation file.
17828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unless ($noImpl) {
17838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        open(IMPL, ">$implFileName") or die "Couldn't open file $implFileName";
17848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print IMPL @implContentHeader;
17868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print IMPL map { "#import \"$_\"\n" } sort keys(%implIncludes);
17878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print IMPL @implContent;
17888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        close(IMPL);
17908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        @implContentHeader = ();
17928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        @implContent = ();
17938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        %implIncludes = ();
17948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
17958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (@internalHeaderContent > 0) {
17978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project       open(INTERNAL_HEADER, ">$internalHeaderFileName") or die "Couldn't open file $internalHeaderFileName";
17988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project       print INTERNAL_HEADER @internalHeaderContent;
18008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project       close(INTERNAL_HEADER);
18028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project       @internalHeaderContent = ();
18048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1805231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1806231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    # Write dependency file.
1807231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (@depsContent) {
1808231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        open(DEPS, ">$depsFileName") or die "Couldn't open file $depsFileName";
1809231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        print DEPS @depsContent;
1810231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        close(DEPS);
1811231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        @depsContent = ();
1812231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
18138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
18148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project1;
1816