summaryrefslogtreecommitdiffstats
path: root/WebCore/bindings/scripts/CodeGeneratorGObject.pm
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/bindings/scripts/CodeGeneratorGObject.pm')
-rw-r--r--WebCore/bindings/scripts/CodeGeneratorGObject.pm1440
1 files changed, 0 insertions, 1440 deletions
diff --git a/WebCore/bindings/scripts/CodeGeneratorGObject.pm b/WebCore/bindings/scripts/CodeGeneratorGObject.pm
deleted file mode 100644
index e2773b8..0000000
--- a/WebCore/bindings/scripts/CodeGeneratorGObject.pm
+++ /dev/null
@@ -1,1440 +0,0 @@
-# Copyright (C) 2008 Luke Kenneth Casson Leighton <lkcl@lkcl.net>
-# Copyright (C) 2008 Martin Soto <soto@freedesktop.org>
-# Copyright (C) 2008 Alp Toker <alp@atoker.com>
-# Copyright (C) 2009 Adam Dingle <adam@yorba.org>
-# Copyright (C) 2009 Jim Nelson <jim@yorba.org>
-# Copyright (C) 2009, 2010 Igalia S.L.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Library General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Library General Public License for more details.
-#
-# You should have received a copy of the GNU Library General Public License
-# along with this library; see the file COPYING.LIB. If not, write to
-# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
-package CodeGeneratorGObject;
-
-# Global Variables
-my %implIncludes = ();
-my %hdrIncludes = ();
-
-my $defineTypeMacro = "G_DEFINE_TYPE";
-my $defineTypeInterfaceImplementation = ")";
-my @txtEventListeners = ();
-my @txtInstallEventListeners = ();
-my @txtInstallSignals = ();
-my @txtInstallProps = ();
-my @txtSetProps = ();
-my @txtGetProps = ();
-
-my $className = "";
-
-# Default constructor
-sub new {
- my $object = shift;
- my $reference = { };
-
- $codeGenerator = shift;
- $outputDir = shift;
- mkdir $outputDir;
-
- bless($reference, $object);
-}
-
-sub finish {
-}
-
-my $licenceTemplate = << "EOF";
-/*
- This file is part of the WebKit open source project.
- This file has been generated by generate-bindings.pl. DO NOT MODIFY!
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-EOF
-
-sub GenerateModule {
-}
-
-sub GetParentClassName {
- my $dataNode = shift;
-
- return "WebKitDOMObject" if @{$dataNode->parents} eq 0;
- return "WebKitDOM" . $codeGenerator->StripModule($dataNode->parents(0));
-}
-
-# From String::CamelCase 0.01
-sub camelize
-{
- my $s = shift;
- join('', map{ ucfirst $_ } split(/(?<=[A-Za-z])_(?=[A-Za-z])|\b/, $s));
-}
-
-sub decamelize
-{
- my $s = shift;
- $s =~ s{([^a-zA-Z]?)([A-Z]*)([A-Z])([a-z]?)}{
- my $fc = pos($s)==0;
- my ($p0,$p1,$p2,$p3) = ($1,lc$2,lc$3,$4);
- my $t = $p0 || $fc ? $p0 : '_';
- $t .= $p3 ? $p1 ? "${p1}_$p2$p3" : "$p2$p3" : "$p1$p2";
- $t;
- }ge;
- $s;
-}
-
-sub FixUpDecamelizedName {
- my $classname = shift;
-
- # FIXME: try to merge this somehow with the fixes in ClassNameToGobjectType
- $classname =~ s/x_path/xpath/;
- $classname =~ s/web_kit/webkit/;
- $classname =~ s/htmli_frame/html_iframe/;
-
- return $classname;
-}
-
-sub ClassNameToGObjectType {
- my $className = shift;
- my $CLASS_NAME = uc(decamelize($className));
- # Fixup: with our prefix being 'WebKitDOM' decamelize can't get
- # WebKitDOMCSS and similar names right, so we have to fix it
- # manually.
- $CLASS_NAME =~ s/DOMCSS/DOM_CSS/;
- $CLASS_NAME =~ s/DOMHTML/DOM_HTML/;
- $CLASS_NAME =~ s/DOMDOM/DOM_DOM/;
- $CLASS_NAME =~ s/DOMCDATA/DOM_CDATA/;
- $CLASS_NAME =~ s/DOMX_PATH/DOM_XPATH/;
- $CLASS_NAME =~ s/DOM_WEB_KIT/DOM_WEBKIT/;
- $CLASS_NAME =~ s/DOMUI/DOM_UI/;
- $CLASS_NAME =~ s/HTMLI_FRAME/HTML_IFRAME/;
- return $CLASS_NAME;
-}
-
-sub GetParentGObjType {
- my $dataNode = shift;
-
- return "WEBKIT_TYPE_DOM_OBJECT" if @{$dataNode->parents} eq 0;
- return "WEBKIT_TYPE_DOM_" . ClassNameToGObjectType($codeGenerator->StripModule($dataNode->parents(0)));
-}
-
-sub GetClassName {
- my $name = $codeGenerator->StripModule(shift);
-
- return "WebKitDOM$name";
-}
-
-sub GetCoreObject {
- my ($interfaceName, $name, $parameter) = @_;
-
- return "WebCore::${interfaceName}* $name = WebKit::core($parameter);";
-}
-
-sub SkipAttribute {
- my $attribute = shift;
-
- if ($attribute->signature->extendedAttributes->{"CustomGetter"} ||
- $attribute->signature->extendedAttributes->{"CustomSetter"} ||
- $attribute->signature->extendedAttributes->{"Replaceable"}) {
- return 1;
- }
-
- my $propType = $attribute->signature->type;
- if ($propType =~ /Constructor$/) {
- return 1;
- }
-
- # This is for DOMWindow.idl location attribute
- if ($attribute->signature->name eq "location") {
- return 1;
- }
-
- # This is for HTMLInput.idl valueAsDate
- if ($attribute->signature->name eq "valueAsDate") {
- return 1;
- }
-
- # This is for DOMWindow.idl Crypto attribute
- if ($attribute->signature->type eq "Crypto") {
- return 1;
- }
-
- return 0;
-}
-
-sub SkipFunction {
- my $function = shift;
- my $decamelize = shift;
- my $prefix = shift;
-
- my $functionName = "webkit_dom_" . $decamelize . "_" . $prefix . decamelize($function->signature->name);
- my $isCustomFunction = $function->signature->extendedAttributes->{"Custom"} ||
- $function->signature->extendedAttributes->{"CustomArgumentHandling"};
-
- if ($isCustomFunction &&
- $functionName ne "webkit_dom_node_replace_child" &&
- $functionName ne "webkit_dom_node_insert_before" &&
- $functionName ne "webkit_dom_node_remove_child" &&
- $functionName ne "webkit_dom_node_append_child" &&
- $functionName ne "webkit_dom_html_collection_item" &&
- $functionName ne "webkit_dom_html_collection_named_item") {
- return 1;
- }
-
- if ($function->signature->name eq "getSVGDocument") {
- return 1;
- }
-
- if ($function->signature->name eq "getCSSCanvasContext") {
- return 1;
- }
-
- # Skip functions that have ["Callback"] parameters, because this
- # code generator doesn't know how to auto-generate callbacks.
- # Skip functions that have "MediaQueryListListener" parameters, because this
- # code generator doesn't know how to auto-generate MediaQueryListListener.
- foreach my $param (@{$function->parameters}) {
- if ($param->extendedAttributes->{"Callback"} ||
- $param->type eq "MediaQueryListListener") {
- return 1;
- }
- }
-
- return 0;
-}
-
-# Name type used in the g_value_{set,get}_* functions
-sub GetGValueTypeName {
- my $type = shift;
-
- my %types = ("DOMString", "string",
- "DOMTimeStamp", "uint",
- "float", "float",
- "double", "double",
- "boolean", "boolean",
- "char", "char",
- "long", "long",
- "long long", "int64",
- "short", "int",
- "uchar", "uchar",
- "unsigned", "uint",
- "int", "int",
- "unsigned int", "uint",
- "unsigned long long", "uint64",
- "unsigned long", "ulong",
- "unsigned short", "ushort");
-
- return $types{$type} ? $types{$type} : "object";
-}
-
-# Name type used in C declarations
-sub GetGlibTypeName {
- my $type = shift;
- my $name = GetClassName($type);
-
- my %types = ("DOMString", "gchar*",
- "DOMTimeStamp", "guint32",
- "CompareHow", "gushort",
- "float", "gfloat",
- "double", "gdouble",
- "boolean", "gboolean",
- "char", "gchar",
- "long", "glong",
- "long long", "gint64",
- "short", "gshort",
- "uchar", "guchar",
- "unsigned", "guint",
- "int", "gint",
- "unsigned int", "guint",
- "unsigned long", "gulong",
- "unsigned long long", "guint64",
- "unsigned short", "gushort",
- "void", "void");
-
- return $types{$type} ? $types{$type} : "$name*";
-}
-
-sub IsGDOMClassType {
- my $type = shift;
-
- return 0 if $codeGenerator->IsNonPointerType($type) || $codeGenerator->IsStringType($type);
- return 1;
-}
-
-sub GetReadableProperties {
- my $properties = shift;
-
- my @result = ();
-
- foreach my $property (@{$properties}) {
- if (!SkipAttribute($property)) {
- push(@result, $property);
- }
- }
-
- return @result;
-}
-
-sub GetWriteableProperties {
- my $properties = shift;
- my @result = ();
-
- foreach my $property (@{$properties}) {
- my $writeable = $property->type !~ /^readonly/;
- my $gtype = GetGValueTypeName($property->signature->type);
- my $hasGtypeSignature = ($gtype eq "boolean" || $gtype eq "float" || $gtype eq "double" ||
- $gtype eq "uint64" || $gtype eq "ulong" || $gtype eq "long" ||
- $gtype eq "uint" || $gtype eq "ushort" || $gtype eq "uchar" ||
- $gtype eq "char" || $gtype eq "string");
- if ($writeable && $hasGtypeSignature) {
- push(@result, $property);
- }
- }
-
- return @result;
-}
-
-sub GenerateConditionalString
-{
- my $node = shift;
- my $conditional = $node->extendedAttributes->{"Conditional"};
- if ($conditional) {
- if ($conditional =~ /&/) {
- return "ENABLE(" . join(") && ENABLE(", split(/&/, $conditional)) . ")";
- } elsif ($conditional =~ /\|/) {
- return "ENABLE(" . join(") || ENABLE(", split(/\|/, $conditional)) . ")";
- } else {
- return "ENABLE(" . $conditional . ")";
- }
- } else {
- return "";
- }
-}
-
-sub GenerateProperty {
- my $attribute = shift;
- my $interfaceName = shift;
- my @writeableProperties = @{shift @_};
-
- my $conditionalString = GenerateConditionalString($attribute->signature);
- my $camelPropName = $attribute->signature->name;
- my $setPropNameFunction = $codeGenerator->WK_ucfirst($camelPropName);
- my $getPropNameFunction = $codeGenerator->WK_lcfirst($camelPropName);
-
- my $propName = decamelize($camelPropName);
- my $propNameCaps = uc($propName);
- $propName =~ s/_/-/g;
- my ${propEnum} = "PROP_${propNameCaps}";
- push(@cBodyPriv, "#if ${conditionalString}\n") if $conditionalString;
- push(@cBodyPriv, " ${propEnum},\n");
- push(@cBodyPriv, "#endif /* ${conditionalString} */\n") if $conditionalString;
-
- my $propType = $attribute->signature->type;
- my ${propGType} = decamelize($propType);
- my ${ucPropGType} = uc($propGType);
-
- my $gtype = GetGValueTypeName($propType);
- my $gparamflag = "WEBKIT_PARAM_READABLE";
- my $writeable = $attribute->type !~ /^readonly/;
- my $const = "read-only ";
- my $custom = $attribute->signature->extendedAttributes->{"Custom"};
- if ($writeable && $custom) {
- $const = "read-only (due to custom functions needed in webkitdom)";
- return;
- }
- if ($writeable && !$custom) {
- $gparamflag = "WEBKIT_PARAM_READWRITE";
- $const = "read-write ";
- }
-
- my $type = GetGlibTypeName($propType);
- $nick = decamelize("${interfaceName}_${propName}");
- $long = "${const} ${type} ${interfaceName}.${propName}";
-
- my $convertFunction = "";
- if ($gtype eq "string") {
- $convertFunction = "WTF::String::fromUTF8";
- }
-
- my $getterExpressionPrefix = $codeGenerator->GetterExpressionPrefix(\%implIncludes, $interfaceName, $attribute);
- my $setterExpressionPrefix = $codeGenerator->SetterExpressionPrefix(\%implIncludes, $interfaceName, $attribute);
-
- my $getterContentHead = "coreSelf->$getterExpressionPrefix";
- my $setterContentHead = "coreSelf->$setterExpressionPrefix${convertFunction}(g_value_get_$gtype(value))";
-
- if (grep {$_ eq $attribute} @writeableProperties) {
- push(@txtSetProps, "#if ${conditionalString}\n") if $conditionalString;
- push(@txtSetProps, " case ${propEnum}:\n {\n");
- push(@txtSetProps, " WebCore::ExceptionCode ec = 0;\n") if @{$attribute->setterExceptions};
- push(@txtSetProps, " ${setterContentHead}");
- push(@txtSetProps, ", ec") if @{$attribute->setterExceptions};
- push(@txtSetProps, ");\n");
- push(@txtSetProps, " break;\n }\n");
- push(@txtSetProps, "#endif /* ${conditionalString} */\n") if $conditionalString;
- }
-
- push(@txtGetProps, "#if ${conditionalString}\n") if $conditionalString;
- push(@txtGetProps, " case ${propEnum}:\n {\n");
-
- my $exception = "";
- if (@{$attribute->getterExceptions}) {
- $exception = "ec";
- push(@txtGetProps, " WebCore::ExceptionCode ec = 0;\n");
- }
-
- my $postConvertFunction = "";
- my $done = 0;
- if ($gtype eq "string") {
- push(@txtGetProps, " g_value_take_string(value, convertToUTF8String(${getterContentHead}${exception})));\n");
- $done = 1;
- } elsif ($gtype eq "object") {
- $txtGetProp = << "EOF";
- RefPtr<WebCore::${propType}> ptr = coreSelf->${getPropNameFunction}(${exception});
- g_value_set_object(value, WebKit::kit(ptr.get()));
-EOF
- push(@txtGetProps, $txtGetProp);
- $done = 1;
- }
-
- # FIXME: get rid of this glitch?
- my $_gtype = $gtype;
- if ($gtype eq "ushort") {
- $_gtype = "uint";
- }
-
- if (!$done) {
- push(@txtGetProps, " g_value_set_$_gtype(value, ${convertFunction}coreSelf->${getterExpressionPrefix}${exception})${postConvertFunction});\n");
- }
-
- push(@txtGetProps, " break;\n }\n");
- push(@txtGetProps, "#endif /* ${conditionalString} */\n") if $conditionalString;
-
- my %param_spec_options = ("int", "G_MININT, /* min */\nG_MAXINT, /* max */\n0, /* default */",
- "boolean", "FALSE, /* default */",
- "float", "-G_MAXFLOAT, /* min */\nG_MAXFLOAT, /* max */\n0.0, /* default */",
- "double", "-G_MAXDOUBLE, /* min */\nG_MAXDOUBLE, /* max */\n0.0, /* default */",
- "uint64", "0, /* min */\nG_MAXUINT64, /* min */\n0, /* default */",
- "long", "G_MINLONG, /* min */\nG_MAXLONG, /* max */\n0, /* default */",
- "int64", "G_MININT64, /* min */\nG_MAXINT64, /* max */\n0, /* default */",
- "ulong", "0, /* min */\nG_MAXULONG, /* max */\n0, /* default */",
- "uint", "0, /* min */\nG_MAXUINT, /* max */\n0, /* default */",
- "ushort", "0, /* min */\nG_MAXUINT16, /* max */\n0, /* default */",
- "uchar", "G_MININT8, /* min */\nG_MAXINT8, /* max */\n0, /* default */",
- "char", "0, /* min */\nG_MAXUINT8, /* max */\n0, /* default */",
- "string", "\"\", /* default */",
- "object", "WEBKIT_TYPE_DOM_${ucPropGType}, /* gobject type */");
-
- my $txtInstallProp = << "EOF";
- g_object_class_install_property(gobjectClass,
- ${propEnum},
- g_param_spec_${_gtype}("${propName}", /* name */
- "$nick", /* short description */
- "$long", /* longer - could do with some extra doc stuff here */
- $param_spec_options{$gtype}
- ${gparamflag}));
-EOF
- push(@txtInstallProps, "#if ${conditionalString}\n") if $conditionalString;
- push(@txtInstallProps, $txtInstallProp);
- push(@txtInstallProps, "#endif /* ${conditionalString} */\n") if $conditionalString;
-}
-
-my %breakWords = ("before" => 1, "can" => 1, "context" => 1, "dbl" => 1, "drag" => 1,
- "drag" => 1, "duration" => 1, "has" => 1, "key" => 1, "loaded" => 1,
- "mouse" => 1, "page" => 1, "pop" => 1, "rate" => 1, "select" => 1,
- "time" => 1, "touch" => 1, "volume" => 1);
-
-sub SplitEventListenerAttrName {
- my $attrName = shift;
-
- my @matches = grep { $attrName =~ /^$_/ } keys (%breakWords);
-
- if (@matches && (length $matches[0] < length $attrName)) {
- $attrName = $matches[0] . "-" . substr($attrName, length $matches[0]);
- }
-
- return $attrName;
-}
-
-sub EventSignalName {
- my $attrName = shift;
- my $name = SplitEventListenerAttrName($attrName) . "-event";
-
- return $name;
-}
-
-sub GenerateEventListener {
- my $name = shift;
- my $object = shift;
- my $interfaceName = shift;
-
- my $gobjectSignalName = EventSignalName($name);
-
- my $txtInstallSignal = << "EOF";
- g_signal_new("${gobjectSignalName}",
- G_TYPE_FROM_CLASS(gobjectClass),
- G_SIGNAL_RUN_LAST,
- 0,
- g_signal_accumulator_true_handled, 0,
- webkit_marshal_BOOLEAN__OBJECT,
- G_TYPE_BOOLEAN, 1,
- WEBKIT_TYPE_DOM_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
-
-EOF
- push(@txtInstallSignals, $txtInstallSignal);
-
- my ${listenerName} = $name . "Listener";
-
- my $txtInstallEventListener = << "EOF";
- WebCore::GObjectEventListener::addEventListener(object, coreObject, "${name}", "${gobjectSignalName}");
-EOF
- push(@txtInstallEventListeners, $txtInstallEventListener);
-
- $implIncludes{"webkit/WebKitDOMEvent.h"} = 1;
- $implIncludes{"GObjectEventListener.h"} = 1;
-}
-
-my @eventSignalNames = (
- # User Interface Event types
- "focus", "blur",
- # Basic Event types
- "load", "unload", "abort", "error", "select", "change", "submit", "reset",
- "resize", "scroll",
- # Mouse Event types
- "click", "dblclick", "mousedown", "mouseup",
- "mousemove", "mouseover", "mouseout",
- # Mouse Wheel Event types
- "mousewheel",
- # Keyboard Event types
- "keydown", "keypress", "keyup",
- # -- Events not in the spec but defined in WebKit
- # Media Event types,
- "loadstart", "progress", "suspend", "emptied", "stalled", "play",
- "loadedmetadata", "loadeddata", "waiting", "playing", "canplay",
- "canplaythrough", "seeking", "seeked", "timeupdate", "ended",
- "ratechange", "durationchange", "volumechange",
- # Drag and Drop Event types
- "drag", "dragend", "dragenter", "dragleave", "dragover", "dragstart", "drop",
- # Cut and Paste Event types
- "beforecut", "cut", "beforecopy", "copy", "beforepaste", "paste",
- # Animations
- "webkitanimationend", "webkitanimationstart", "webkitanimationiteration",
- # Other
- "contextmenu", "input", "invalid", "search", "selectstart");
-
-sub GenerateProperties {
- my ($object, $interfaceName, $dataNode) = @_;
-
- my $clsCaps = substr(ClassNameToGObjectType($className), 12);
- my $lowerCaseIfaceName = "webkit_dom_" . (FixUpDecamelizedName(decamelize($interfaceName)));
-
- # Properties
- my $implContent = "";
-
- # Properties
- $implContent = << "EOF";
-enum {
- PROP_0,
-EOF
- push(@cBodyPriv, $implContent);
-
- my @readableProperties = GetReadableProperties($dataNode->attributes);
-
- my $privFunction = GetCoreObject($interfaceName, "coreSelf", "self");
-
- my $txtGetProp = << "EOF";
-static void ${lowerCaseIfaceName}_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec)
-{
- WebCore::JSMainThreadNullState state;
-EOF
- push(@txtGetProps, $txtGetProp);
- if (scalar @readableProperties > 0) {
- $txtGetProp = << "EOF";
- ${className}* self = WEBKIT_DOM_${clsCaps}(object);
- $privFunction
-EOF
- push(@txtGetProps, $txtGetProp);
- }
-
- $txtGetProp = << "EOF";
- switch (prop_id) {
-EOF
- push(@txtGetProps, $txtGetProp);
-
- my @writeableProperties = GetWriteableProperties(\@readableProperties);
-
- my $txtSetProps = << "EOF";
-static void ${lowerCaseIfaceName}_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec)
-{
- WebCore::JSMainThreadNullState state;
-EOF
- push(@txtSetProps, $txtSetProps);
-
- if (scalar @writeableProperties > 0) {
- $txtSetProps = << "EOF";
- ${className}* self = WEBKIT_DOM_${clsCaps}(object);
- $privFunction
-EOF
- push(@txtSetProps, $txtSetProps);
- }
-
- $txtSetProps = << "EOF";
- switch (prop_id) {
-EOF
- push(@txtSetProps, $txtSetProps);
-
- foreach my $attribute (@readableProperties) {
- if ($attribute->signature->type ne "EventListener" &&
- $attribute->signature->type ne "MediaQueryListListener") {
- GenerateProperty($attribute, $interfaceName, \@writeableProperties);
- }
- }
-
- # We need to define all the events there are in all base classes
- # that implement EventTarget. For now we only care about these
- # two.
- if ($interfaceName eq "Node" || $interfaceName eq "DOMWindow") {
- foreach my $signalName (@eventSignalNames) {
- GenerateEventListener($signalName, $object, $interfaceName);
- }
- }
-
- push(@cBodyPriv, "};\n\n");
-
- $txtGetProp = << "EOF";
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
- break;
- }
-}
-EOF
- push(@txtGetProps, $txtGetProp);
-
- $txtSetProps = << "EOF";
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
- break;
- }
-}
-EOF
- push(@txtSetProps, $txtSetProps);
-
- # Do not insert extra spaces when interpolating array variables
- $" = "";
-
- $implContent = << "EOF";
-
-static void ${lowerCaseIfaceName}_finalize(GObject* object)
-{
- WebKitDOMObject* dom_object = WEBKIT_DOM_OBJECT(object);
-
- if (dom_object->coreObject) {
- WebCore::${interfaceName}* coreObject = static_cast<WebCore::${interfaceName} *>(dom_object->coreObject);
-
- WebKit::DOMObjectCache::forget(coreObject);
- coreObject->deref();
-
- dom_object->coreObject = NULL;
- }
-
- G_OBJECT_CLASS(${lowerCaseIfaceName}_parent_class)->finalize(object);
-}
-
-@txtSetProps
-
-@txtGetProps
-
-static void ${lowerCaseIfaceName}_constructed(GObject* object)
-{
-EOF
- push(@cBodyPriv, $implContent);
-
- if (scalar @txtInstallEventListeners > 0) {
- $implContent = << "EOF";
- WebCore::${interfaceName}* coreObject = static_cast<WebCore::${interfaceName}*>(WEBKIT_DOM_OBJECT(object)->coreObject);
-EOF
- push(@cBodyPriv, $implContent);
- }
-
- $implContent = << "EOF";
-@txtInstallEventListeners
- if (G_OBJECT_CLASS(${lowerCaseIfaceName}_parent_class)->constructed)
- G_OBJECT_CLASS(${lowerCaseIfaceName}_parent_class)->constructed(object);
-}
-
-static void ${lowerCaseIfaceName}_class_init(${className}Class* requestClass)
-{
- GObjectClass *gobjectClass = G_OBJECT_CLASS(requestClass);
- gobjectClass->finalize = ${lowerCaseIfaceName}_finalize;
- gobjectClass->set_property = ${lowerCaseIfaceName}_set_property;
- gobjectClass->get_property = ${lowerCaseIfaceName}_get_property;
- gobjectClass->constructed = ${lowerCaseIfaceName}_constructed;
-
-@txtInstallProps
-@txtInstallSignals
-}
-
-static void ${lowerCaseIfaceName}_init(${className}* request)
-{
-}
-
-EOF
- push(@cBodyPriv, $implContent);
-}
-
-sub GenerateHeader {
- my ($object, $interfaceName, $parentClassName) = @_;
-
- my $implContent = "";
-
- # Add the default header template
- @hPrefix = split("\r", $licenceTemplate);
- push(@hPrefix, "\n");
-
- #Header guard
- my $guard = $className . "_h";
-
- @hPrefixGuard = << "EOF";
-#ifndef $guard
-#define $guard
-
-EOF
-
- $implContent = << "EOF";
-G_BEGIN_DECLS
-EOF
-
- push(@hBodyPre, $implContent);
-
- my $decamelize = FixUpDecamelizedName(decamelize($interfaceName));
- my $clsCaps = uc($decamelize);
- my $lowerCaseIfaceName = "webkit_dom_" . ($decamelize);
-
- $implContent = << "EOF";
-#define WEBKIT_TYPE_DOM_${clsCaps} (${lowerCaseIfaceName}_get_type())
-#define WEBKIT_DOM_${clsCaps}(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), WEBKIT_TYPE_DOM_${clsCaps}, ${className}))
-#define WEBKIT_DOM_${clsCaps}_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), WEBKIT_TYPE_DOM_${clsCaps}, ${className}Class)
-#define WEBKIT_DOM_IS_${clsCaps}(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), WEBKIT_TYPE_DOM_${clsCaps}))
-#define WEBKIT_DOM_IS_${clsCaps}_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), WEBKIT_TYPE_DOM_${clsCaps}))
-#define WEBKIT_DOM_${clsCaps}_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), WEBKIT_TYPE_DOM_${clsCaps}, ${className}Class))
-
-struct _${className} {
- ${parentClassName} parent_instance;
-};
-
-struct _${className}Class {
- ${parentClassName}Class parent_class;
-};
-
-WEBKIT_API GType
-${lowerCaseIfaceName}_get_type (void);
-
-EOF
-
- push(@hBody, $implContent);
-}
-
-sub getIncludeHeader {
- my $type = shift;
- my $name = GetClassName($type);
-
- return "" if $type eq "int";
- return "" if $type eq "long";
- return "" if $type eq "long long";
- return "" if $type eq "short";
- return "" if $type eq "char";
- return "" if $type eq "float";
- return "" if $type eq "double";
- return "" if $type eq "unsigned";
- return "" if $type eq "unsigned int";
- return "" if $type eq "unsigned long";
- return "" if $type eq "unsigned long long";
- return "" if $type eq "unsigned short";
- return "" if $type eq "DOMTimeStamp";
- return "" if $type eq "EventListener";
- return "" if $type eq "MediaQueryListListener";
- return "" if $type eq "unsigned char";
- return "" if $type eq "DOMString";
- return "" if $type eq "float";
- return "" if $type eq "boolean";
- return "" if $type eq "void";
- return "" if $type eq "CompareHow";
-
- return "$name.h";
-}
-
-sub addIncludeInBody {
- my $type = shift;
-
- if ($type eq "DOMObject") {
- return;
- }
-
- my $header = getIncludeHeader($type);
- if ($header eq "") {
- return;
- }
-
- if (IsGDOMClassType($type)) {
- $implIncludes{"webkit/$header"} = 1;
- } else {
- $implIncludes{$header} = 1
- }
-}
-
-sub GenerateFunction {
- my ($object, $interfaceName, $function, $prefix) = @_;
-
- my $decamelize = FixUpDecamelizedName(decamelize($interfaceName));
-
- if ($object eq "MediaQueryListListener") {
- return;
- }
-
- if (SkipFunction($function, $decamelize, $prefix)) {
- return;
- }
-
- my $functionSigName = $function->signature->name;
- my $functionSigType = $prefix eq "set_" ? "void" : $function->signature->type;
- my $functionName = "webkit_dom_" . $decamelize . "_" . $prefix . decamelize($functionSigName);
- my $returnType = GetGlibTypeName($functionSigType);
- my $returnValueIsGDOMType = IsGDOMClassType($functionSigType);
- my $conditionalString = GenerateConditionalString($function->signature);
-
- my $functionSig = "${className}* self";
-
- my $callImplParams = "";
-
- # skip some custom functions for now
- my $isCustomFunction = $function->signature->extendedAttributes->{"Custom"} ||
- $function->signature->extendedAttributes->{"CustomArgumentHandling"};
-
- foreach my $param (@{$function->parameters}) {
- my $paramIDLType = $param->type;
- if ($paramIDLType eq "EventListener" || $paramIDLType eq "MediaQueryListListener") {
- push(@hBody, "\n/* TODO: event function ${functionName} */\n\n");
- push(@cBody, "\n/* TODO: event function ${functionName} */\n\n");
- return;
- }
- addIncludeInBody($paramIDLType);
- my $paramType = GetGlibTypeName($paramIDLType);
- my $const = $paramType eq "gchar*" ? "const " : "";
- my $paramName = decamelize($param->name);
-
- $functionSig .= ", ${const}$paramType $paramName";
-
- my $paramIsGDOMType = IsGDOMClassType($paramIDLType);
- if ($paramIsGDOMType) {
- if ($paramIDLType ne "DOMObject") {
- $implIncludes{"webkit/WebKitDOM${paramIDLType}Private.h"} = 1;
- }
- }
- if ($paramIsGDOMType || ($paramIDLType eq "DOMString") || ($paramIDLType eq "CompareHow")) {
- $paramName = "converted_" . $paramName;
- }
- if ($callImplParams) {
- $callImplParams .= ", $paramName";
- } else {
- $callImplParams = "$paramName";
- }
- }
-
- # Not quite sure what to do with this yet, but we need to take into
- # account the difference in parameters between the IDL file and the
- # actual implementation.
- if ($function->signature->extendedAttributes->{"NeedsUserGestureCheck"}) {
- $functionSig .= ", gboolean isUserGesture";
- $callImplParams .= ", " if $callImplParams;
- $callImplParams .= "false";
- }
-
- if ($returnType ne "void" && $returnValueIsGDOMType && $functionSigType ne "DOMObject") {
- if ($functionSigType ne "EventTarget") {
- $implIncludes{"webkit/WebKitDOM${functionSigType}Private.h"} = 1;
- $implIncludes{"webkit/WebKitDOM${functionSigType}.h"} = 1;
- } else {
- $implIncludes{"WebKitDOM${functionSigType}.h"} = 1;
- }
-
- $implIncludes{"${functionSigType}.h"} = 1;
- }
-
- if(@{$function->raisesExceptions}) {
- $functionSig .= ", GError **error";
- }
-
- push(@hBody, "WEBKIT_API $returnType\n$functionName($functionSig);\n");
- push(@hBody, "\n");
-
- push(@cBody, "$returnType\n$functionName($functionSig)\n{\n");
- push(@cBody, "#if ${conditionalString}\n") if $conditionalString;
-
- if ($returnType ne "void") {
- # TODO: return proper default result
- push(@cBody, " g_return_val_if_fail(self, 0);\n");
- } else {
- push(@cBody, " g_return_if_fail(self);\n");
- }
-
- push(@cBody, " WebCore::JSMainThreadNullState state;\n");
-
- # The WebKit::core implementations check for NULL already; no need to
- # duplicate effort.
- push(@cBody, " WebCore::${interfaceName} * item = WebKit::core(self);\n");
-
- foreach my $param (@{$function->parameters}) {
- my $paramName = decamelize($param->name);
- my $paramIDLType = $param->type;
- my $paramTypeIsPrimitive = $codeGenerator->IsPrimitiveType($paramIDLType);
- my $paramIsGDOMType = IsGDOMClassType($paramIDLType);
- if (!$paramTypeIsPrimitive) {
- if ($returnType ne "void") {
- # TODO: return proper default result
- # FIXME: Temporary hack for generating a proper implementation
- # of the webkit_dom_document_evaluate function (Bug-ID: 42115)
- if (!(($functionName eq "webkit_dom_document_evaluate") && ($paramIDLType eq "XPathResult"))) {
- push(@cBody, " g_return_val_if_fail($paramName, 0);\n");
- }
- } else {
- push(@cBody, " g_return_if_fail($paramName);\n");
- }
- }
- }
-
- $returnParamName = "";
- foreach my $param (@{$function->parameters}) {
- my $paramIDLType = $param->type;
- my $paramName = decamelize($param->name);
-
- my $paramIsGDOMType = IsGDOMClassType($paramIDLType);
- if ($paramIDLType eq "DOMString") {
- push(@cBody, " WTF::String converted_${paramName} = WTF::String::fromUTF8($paramName);\n");
- } elsif ($paramIDLType eq "CompareHow") {
- push(@cBody, " WebCore::Range::CompareHow converted_${paramName} = static_cast<WebCore::Range::CompareHow>($paramName);\n");
- } elsif ($paramIsGDOMType) {
- push(@cBody, " WebCore::${paramIDLType} * converted_${paramName} = NULL;\n");
- push(@cBody, " if (${paramName} != NULL) {\n");
- push(@cBody, " converted_${paramName} = WebKit::core($paramName);\n");
-
- if ($returnType ne "void") {
- # TODO: return proper default result
- push(@cBody, " g_return_val_if_fail(converted_${paramName}, 0);\n");
- } else {
- push(@cBody, " g_return_if_fail(converted_${paramName});\n");
- }
-
- push(@cBody, " }\n");
- }
- $returnParamName = "converted_".$paramName if $param->extendedAttributes->{"Return"};
- }
-
- my $assign = "";
- my $assignPre = "";
- my $assignPost = "";
-
- # We need to special-case these Node methods because their C++
- # signature is different from what we'd expect given their IDL
- # description; see Node.h.
- my $functionHasCustomReturn = $functionName eq "webkit_dom_node_append_child" ||
- $functionName eq "webkit_dom_node_insert_before" ||
- $functionName eq "webkit_dom_node_replace_child" ||
- $functionName eq "webkit_dom_node_remove_child";
-
- if ($returnType ne "void" && !$functionHasCustomReturn) {
- if ($returnValueIsGDOMType) {
- $assign = "PassRefPtr<WebCore::${functionSigType}> g_res = ";
- $assignPre = "WTF::getPtr(";
- $assignPost = ")";
- } else {
- $assign = "${returnType} res = ";
- }
- }
- my $exceptions = "";
- if (@{$function->raisesExceptions}) {
- push(@cBody, " WebCore::ExceptionCode ec = 0;\n");
- if (${callImplParams} ne "") {
- $exceptions = ", ec";
- } else {
- $exceptions = "ec";
- }
- }
-
- if ($functionHasCustomReturn) {
- my $customNodeAppendChild = << "EOF";
- bool ok = item->${functionSigName}(${callImplParams}${exceptions});
- if (ok)
- {
- ${returnType} res = WebKit::kit($returnParamName);
- return res;
- }
-EOF
- push(@cBody, $customNodeAppendChild);
-
- if(@{$function->raisesExceptions}) {
- my $exceptionHandling = << "EOF";
-
- WebCore::ExceptionCodeDescription ecdesc;
- WebCore::getExceptionCodeDescription(ec, ecdesc);
- g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), ecdesc.code, ecdesc.name);
-EOF
- push(@cBody, $exceptionHandling);
- }
- push(@cBody, "return NULL;");
- push(@cBody, "}\n\n");
- return;
- } elsif ($functionSigType eq "DOMString") {
- my $getterContentHead;
- if ($prefix) {
- my $getterExpressionPrefix = $codeGenerator->GetterExpressionPrefix(\%implIncludes, $interfaceName, $function);
- $getterContentHead = "${assign}convertToUTF8String(item->$getterExpressionPrefix${exceptions}));\n";
- } else {
- $getterContentHead = "${assign}convertToUTF8String(item->${functionSigName}(${callImplParams}${exceptions}));\n";
- }
- push(@cBody, " ${getterContentHead}");
- } else {
- my $contentHead;
- if ($prefix eq "get_") {
- my $getterExpressionPrefix = $codeGenerator->GetterExpressionPrefix(\%implIncludes, $interfaceName, $function);
- $contentHead = "${assign}${assignPre}item->$getterExpressionPrefix${callImplParams}${exceptions}${assignPost});\n";
- } elsif ($prefix eq "set_") {
- my $setterExpressionPrefix = $codeGenerator->SetterExpressionPrefix(\%implIncludes, $interfaceName, $function);
- $contentHead = "${assign}${assignPre}item->$setterExpressionPrefix${callImplParams}${exceptions}${assignPost});\n";
- } else {
- $contentHead = "${assign}${assignPre}item->${functionSigName}(${callImplParams}${exceptions}${assignPost});\n";
- }
- push(@cBody, " ${contentHead}");
-
- if(@{$function->raisesExceptions}) {
- my $exceptionHandling = << "EOF";
- if (ec) {
- WebCore::ExceptionCodeDescription ecdesc;
- WebCore::getExceptionCodeDescription(ec, ecdesc);
- g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), ecdesc.code, ecdesc.name);
- }
-EOF
- push(@cBody, $exceptionHandling);
- }
- }
-
- if ($returnType ne "void" && !$functionHasCustomReturn) {
- if ($functionSigType ne "DOMObject") {
- if ($returnValueIsGDOMType) {
- push(@cBody, " ${returnType} res = WebKit::kit(g_res.get());\n");
- }
- }
- if ($functionSigType eq "DOMObject") {
- push(@cBody, " return NULL; /* TODO: return canvas object */\n");
- } else {
- push(@cBody, " return res;\n");
- }
- }
-
- if ($conditionalString) {
- if ($returnType ne "void") {
- push(@cBody, "#else\n");
- if ($codeGenerator->IsNonPointerType($functionSigType)) {
- push(@cBody, " return static_cast<${returnType}>(0);\n");
- } else {
- push(@cBody, " return NULL;\n");
- }
- }
- push(@cBody, "#endif /* ${conditionalString} */\n") if $conditionalString;
- }
-
- push(@cBody, "}\n\n");
-}
-
-sub ClassHasFunction {
- my ($class, $name) = @_;
-
- foreach my $function (@{$class->functions}) {
- if ($function->signature->name eq $name) {
- return 1;
- }
- }
-
- return 0;
-}
-
-sub GenerateFunctions {
- my ($object, $interfaceName, $dataNode) = @_;
-
- foreach my $function (@{$dataNode->functions}) {
- $object->GenerateFunction($interfaceName, $function, "");
- }
-
- TOP:
- foreach my $attribute (@{$dataNode->attributes}) {
- if (SkipAttribute($attribute) ||
- $attribute->signature->type eq "EventListener" ||
- $attribute->signature->type eq "MediaQueryListListener") {
- next TOP;
- }
-
- if ($attribute->signature->name eq "type"
- # This will conflict with the get_type() function we define to return a GType
- # according to GObject conventions. Skip this for now.
- || $attribute->signature->name eq "URL" # TODO: handle this
- ) {
- next TOP;
- }
-
- my $attrNameUpper = $codeGenerator->WK_ucfirst($attribute->signature->name);
- my $getname = "get${attrNameUpper}";
- my $setname = "set${attrNameUpper}";
- if (ClassHasFunction($dataNode, $getname) || ClassHasFunction($dataNode, $setname)) {
- # Very occasionally an IDL file defines getter/setter functions for one of its
- # attributes; in this case we don't need to autogenerate the getter/setter.
- next TOP;
- }
-
- # Generate an attribute getter. For an attribute "foo", this is a function named
- # "get_foo" which calls a DOM class method named foo().
- my $function = new domFunction();
- $function->signature($attribute->signature);
- $function->raisesExceptions($attribute->getterExceptions);
- $object->GenerateFunction($interfaceName, $function, "get_");
-
- if ($attribute->type =~ /^readonly/) {
- next TOP;
- }
-
- # Generate an attribute setter. For an attribute, "foo", this is a function named
- # "set_foo" which calls a DOM class method named setFoo().
- $function = new domFunction();
-
- $function->signature(new domSignature());
- $function->signature->name($attribute->signature->name);
- $function->signature->type($attribute->signature->type);
- $function->signature->extendedAttributes($attribute->signature->extendedAttributes);
-
- my $param = new domSignature();
- $param->name("value");
- $param->type($attribute->signature->type);
- my %attributes = ();
- $param->extendedAttributes(attributes);
- my $arrayRef = $function->parameters;
- push(@$arrayRef, $param);
-
- $function->raisesExceptions($attribute->setterExceptions);
-
- $object->GenerateFunction($interfaceName, $function, "set_");
- }
-}
-
-sub GenerateCFile {
- my ($object, $interfaceName, $parentClassName, $parentGObjType, $dataNode) = @_;
-
- if ($dataNode->extendedAttributes->{"EventTarget"}) {
- $object->GenerateEventTargetIface($dataNode);
- }
-
- my $implContent = "";
-
- my $clsCaps = uc(FixUpDecamelizedName(decamelize($interfaceName)));
- my $lowerCaseIfaceName = "webkit_dom_" . FixUpDecamelizedName(decamelize($interfaceName));
-
- $implContent = << "EOF";
-${defineTypeMacro}(${className}, ${lowerCaseIfaceName}, ${parentGObjType}${defineTypeInterfaceImplementation}
-
-namespace WebKit {
-
-WebCore::${interfaceName}* core(${className}* request)
-{
- g_return_val_if_fail(request, 0);
-
- WebCore::${interfaceName}* coreObject = static_cast<WebCore::${interfaceName}*>(WEBKIT_DOM_OBJECT(request)->coreObject);
- g_return_val_if_fail(coreObject, 0);
-
- return coreObject;
-}
-
-} // namespace WebKit
-EOF
-
- push(@cBodyPriv, $implContent);
- $object->GenerateProperties($interfaceName, $dataNode);
- $object->GenerateFunctions($interfaceName, $dataNode);
-
- my $wrapMethod = << "EOF";
-namespace WebKit {
-${className}* wrap${interfaceName}(WebCore::${interfaceName}* coreObject)
-{
- g_return_val_if_fail(coreObject, 0);
-
- /* We call ref() rather than using a C++ smart pointer because we can't store a C++ object
- * in a C-allocated GObject structure. See the finalize() code for the
- * matching deref().
- */
- coreObject->ref();
-
- return WEBKIT_DOM_${clsCaps}(g_object_new(WEBKIT_TYPE_DOM_${clsCaps},
- "core-object", coreObject, NULL));
-}
-} // namespace WebKit
-EOF
- push(@cBodyPriv, $wrapMethod);
-}
-
-sub GenerateEndHeader {
- my ($object) = @_;
-
- #Header guard
- my $guard = $className . "_h";
-
- push(@hBody, "G_END_DECLS\n\n");
- push(@hPrefixGuardEnd, "#endif /* $guard */\n");
-}
-
-sub GeneratePrivateHeader {
- my $object = shift;
- my $dataNode = shift;
-
- my $interfaceName = $dataNode->name;
- my $filename = "$outputDir/" . $className . "Private.h";
- my $guard = uc(decamelize($className)) . "_PRIVATE_H";
- my $parentClassName = GetParentClassName($dataNode);
- my $hasLegacyParent = $dataNode->extendedAttributes->{"LegacyParent"};
- my $hasRealParent = @{$dataNode->parents} > 0;
- my $hasParent = $hasLegacyParent || $hasRealParent;
-
- open(PRIVHEADER, ">$filename") or die "Couldn't open file $filename for writing";
-
- print PRIVHEADER split("\r", $licenceTemplate);
- print PRIVHEADER "\n";
-
- my $text = << "EOF";
-#ifndef $guard
-#define $guard
-
-#include <glib-object.h>
-#include <webkit/${parentClassName}.h>
-#include "${interfaceName}.h"
-EOF
-
- print PRIVHEADER $text;
-
- print PRIVHEADER map { "#include \"$_\"\n" } sort keys(%hdrPropIncludes);
- print PRIVHEADER "\n" if keys(%hdrPropIncludes);
-
- $text = << "EOF";
-namespace WebKit {
- ${className} *
- wrap${interfaceName}(WebCore::${interfaceName} *coreObject);
-
- WebCore::${interfaceName} *
- core(${className} *request);
-
-EOF
-
- print PRIVHEADER $text;
-
- if ($className ne "WebKitDOMNode") {
- $text = << "EOF";
- ${className}*
- kit(WebCore::${interfaceName}* node);
-
-EOF
- print PRIVHEADER $text;
- }
-
- $text = << "EOF";
-} // namespace WebKit
-
-#endif /* ${guard} */
-EOF
- print PRIVHEADER $text;
-
- close(PRIVHEADER);
-}
-
-sub UsesManualKitImplementation {
- my $type = shift;
-
- return 1 if $type eq "Node" or $type eq "Element" or $type eq "Event";
- return 0;
-}
-
-sub GenerateEventTargetIface {
- my $object = shift;
- my $dataNode = shift;
-
- my $interfaceName = $dataNode->name;
- my $decamelize = FixUpDecamelizedName(decamelize($interfaceName));
-
- $implIncludes{"WebKitDOMEventTarget.h"} = 1;
- $implIncludes{"WebKitDOMEventPrivate.h"} = 1;
-
- my $impl = << "EOF";
-static void webkit_dom_${decamelize}_dispatch_event(WebKitDOMEventTarget* target, WebKitDOMEvent* event, GError** error)
-{
- WebCore::Event* coreEvent = WebKit::core(event);
- WebCore::${interfaceName}* coreTarget = static_cast<WebCore::${interfaceName}*>(WEBKIT_DOM_OBJECT(target)->coreObject);
-
- WebCore::ExceptionCode ec = 0;
- coreTarget->dispatchEvent(coreEvent, ec);
- if (ec) {
- WebCore::ExceptionCodeDescription description;
- WebCore::getExceptionCodeDescription(ec, description);
- g_set_error_literal(error, g_quark_from_string("WEBKIT_DOM"), description.code, description.name);
- }
-}
-
-static void webkit_dom_event_target_init(WebKitDOMEventTargetIface* iface)
-{
- iface->dispatch_event = webkit_dom_${decamelize}_dispatch_event;
-}
-
-EOF
-
- push(@cBody, $impl);
-
- $defineTypeMacro = "G_DEFINE_TYPE_WITH_CODE";
- $defineTypeInterfaceImplementation = ", G_IMPLEMENT_INTERFACE(WEBKIT_TYPE_DOM_EVENT_TARGET, webkit_dom_event_target_init))";
-}
-
-sub Generate {
- my ($object, $dataNode) = @_;
-
- my $hasLegacyParent = $dataNode->extendedAttributes->{"LegacyParent"};
- my $hasRealParent = @{$dataNode->parents} > 0;
- my $hasParent = $hasLegacyParent || $hasRealParent;
- my $parentClassName = GetParentClassName($dataNode);
- my $parentGObjType = GetParentGObjType($dataNode);
- my $interfaceName = $dataNode->name;
-
- # Add the guard if the 'Conditional' extended attribute exists
- my $conditionalString = GenerateConditionalString($dataNode);
- push(@conditionGuardStart, "#if ${conditionalString}\n\n") if $conditionalString;
- push(@conditionGuardEnd, "#endif /* ${conditionalString} */\n") if $conditionalString;
-
- # Add the default impl header template
- @cPrefix = split("\r", $licenceTemplate);
- push(@cPrefix, "\n");
-
- $implIncludes{"webkitmarshal.h"} = 1;
- $implIncludes{"webkitprivate.h"} = 1;
- $implIncludes{"DOMObjectCache.h"} = 1;
- $implIncludes{"WebKitDOMBinding.h"} = 1;
- $implIncludes{"gobject/ConvertToUTF8String.h"} = 1;
- $implIncludes{"webkit/$className.h"} = 1;
- $implIncludes{"webkit/${className}Private.h"} = 1;
- $implIncludes{"${interfaceName}.h"} = 1;
- $implIncludes{"JSMainThreadExecState.h"} = 1;
- $implIncludes{"ExceptionCode.h"} = 1;
-
- $hdrIncludes{"webkit/${parentClassName}.h"} = 1;
-
- if (!UsesManualKitImplementation($interfaceName)) {
- my $converter = << "EOF";
-namespace WebKit {
-
-${className}* kit(WebCore::$interfaceName* obj)
-{
- g_return_val_if_fail(obj, 0);
-
- if (gpointer ret = DOMObjectCache::get(obj))
- return static_cast<${className}*>(ret);
-
- return static_cast<${className}*>(DOMObjectCache::put(obj, WebKit::wrap${interfaceName}(obj)));
-}
-
-} // namespace WebKit //
-
-EOF
- push(@cBody, $converter);
- }
-
- $object->GenerateHeader($interfaceName, $parentClassName);
- $object->GenerateCFile($interfaceName, $parentClassName, $parentGObjType, $dataNode);
- $object->GenerateEndHeader();
- $object->GeneratePrivateHeader($dataNode);
-
-}
-
-# Internal helper
-sub WriteData {
- my ($object, $name) = @_;
-
- # Write public header.
- my $hdrFName = "$outputDir/" . $name . ".h";
- open(HEADER, ">$hdrFName") or die "Couldn't open file $hdrFName";
-
- print HEADER @hPrefix;
- print HEADER @hPrefixGuard;
- print HEADER "#include \"webkit/webkitdomdefines.h\"\n";
- print HEADER "#include <glib-object.h>\n";
- print HEADER "#include <webkit/webkitdefines.h>\n";
- print HEADER map { "#include \"$_\"\n" } sort keys(%hdrIncludes);
- print HEADER "\n" if keys(%hdrIncludes);
- print HEADER "\n";
- print HEADER @hBodyPre;
- print HEADER @hBody;
- print HEADER @hPrefixGuardEnd;
-
- close(HEADER);
-
- # Write the implementation sources
- my $implFileName = "$outputDir/" . $name . ".cpp";
- open(IMPL, ">$implFileName") or die "Couldn't open file $implFileName";
-
- print IMPL @cPrefix;
- print IMPL "#include <glib-object.h>\n";
- print IMPL "#include \"config.h\"\n\n";
- print IMPL @conditionGuardStart;
- print IMPL "#include <wtf/GetPtr.h>\n";
- print IMPL "#include <wtf/RefPtr.h>\n";
- print IMPL map { "#include \"$_\"\n" } sort keys(%implIncludes);
- print IMPL "\n" if keys(%implIncludes);
- print IMPL @cBody;
-
- print IMPL "\n";
- print IMPL @cBodyPriv;
- print IMPL @conditionGuardEnd;
-
- close(IMPL);
-
- %implIncludes = ();
- %hdrIncludes = ();
- @hPrefix = ();
- @hBody = ();
-
- @cPrefix = ();
- @cBody = ();
- @cBodyPriv = ();
-}
-
-sub GenerateInterface {
- my ($object, $dataNode, $defines) = @_;
- my $name = $dataNode->name;
-
- # Set up some global variables
- $className = GetClassName($dataNode->name);
- $object->Generate($dataNode);
-
- # Write changes
- my $fname = "WebKitDOM_" . $name;
- $fname =~ s/_//g;
- $object->WriteData($fname);
-}