| Index: webkit/port/bindings/scripts/CodeGeneratorV8.pm
|
| ===================================================================
|
| --- webkit/port/bindings/scripts/CodeGeneratorV8.pm (revision 2436)
|
| +++ webkit/port/bindings/scripts/CodeGeneratorV8.pm (working copy)
|
| @@ -38,6 +38,8 @@
|
| my @implContentDecls = ();
|
| my %implIncludes = ();
|
|
|
| +my @allParents = ();
|
| +
|
| # Default .h template
|
| my $headerTemplate = << "EOF";
|
| /*
|
| @@ -310,7 +312,36 @@
|
| return $result;
|
| }
|
|
|
| +sub IsNodeSubType
|
| +{
|
| + my $dataNode = shift;
|
| + return 1 if ($dataNode->name eq "Node");
|
| + foreach (@allParents) {
|
| + my $parent = $codeGenerator->StripModule($_);
|
| + return 1 if $parent eq "Node";
|
| + }
|
| + return 0;
|
| +}
|
|
|
| +sub HolderToNative
|
| +{
|
| + my $dataNode = shift;
|
| + my $implClassName = shift;
|
| + my $classIndex = shift;
|
| +
|
| + if (IsNodeSubType($dataNode)) {
|
| + push(@implContentDecls, <<END);
|
| + $implClassName* imp = V8Proxy::DOMWrapperToNode<$implClassName>(holder);
|
| +END
|
| +
|
| + } else {
|
| + push(@implContentDecls, <<END);
|
| + $implClassName* imp = V8Proxy::ToNativeObject<$implClassName>(V8ClassIndex::$classIndex, holder);
|
| +END
|
| +
|
| + }
|
| +}
|
| +
|
| sub GenerateDomainSafeFunctionGetter
|
| {
|
| my $function = shift;
|
| @@ -342,8 +373,11 @@
|
|
|
| return private_template->GetFunction();
|
| }
|
| +END
|
|
|
| - $implClassName* imp = V8Proxy::FastToNativeObject<$implClassName>(V8ClassIndex::$classIndex, holder);
|
| + HolderToNative($dataNode, $implClassName, $classIndex);
|
| +
|
| + push(@implContentDecls, <<END);
|
| if (!V8Proxy::IsFromSameOrigin(imp->frame(), false)) {
|
| static v8::Persistent<v8::FunctionTemplate> shared_template =
|
| v8::Persistent<v8::FunctionTemplate>::New($newTemplateString);
|
| @@ -354,7 +388,6 @@
|
| }
|
| }
|
|
|
| -
|
| END
|
| }
|
|
|
| @@ -382,6 +415,7 @@
|
| sub GenerateNormalAttrGetter
|
| {
|
| my $attribute = shift;
|
| + my $dataNode = shift;
|
| my $classIndex = shift;
|
| my $implClassName = shift;
|
|
|
| @@ -435,7 +469,7 @@
|
|
|
| if ($isPodType) {
|
| push(@implContentDecls, <<END);
|
| - V8SVGPODTypeWrapper<$implClassName>* imp_wrapper = V8Proxy::FastToNativeObject<V8SVGPODTypeWrapper<$implClassName> >(V8ClassIndex::$classIndex, info.Holder());
|
| + V8SVGPODTypeWrapper<$implClassName>* imp_wrapper = V8Proxy::ToNativeObject<V8SVGPODTypeWrapper<$implClassName> >(V8ClassIndex::$classIndex, info.Holder());
|
| $implClassName imp_instance = *imp_wrapper;
|
| END
|
| if ($getterStringUsesImp) {
|
| @@ -449,12 +483,13 @@
|
| push(@implContentDecls, <<END);
|
| v8::Handle<v8::Object> holder = V8Proxy::LookupDOMWrapper(V8ClassIndex::$classIndex, info.This());
|
| if (holder.IsEmpty()) return v8::Undefined();
|
| -
|
| - $implClassName* imp = V8Proxy::FastToNativeObject<$implClassName>(V8ClassIndex::$classIndex, holder);
|
| END
|
| -
|
| + HolderToNative($dataNode, $implClassName, $classIndex);
|
| } else {
|
| - push(@implContentDecls, " $implClassName* imp = V8Proxy::FastToNativeObject<$implClassName>(V8ClassIndex::$classIndex, info.Holder());\n");
|
| + push(@implContentDecls, <<END);
|
| + v8::Handle<v8::Object> holder = info.Holder();
|
| +END
|
| + HolderToNative($dataNode, $implClassName, $classIndex);
|
| }
|
|
|
| # Generate security checks if necessary
|
| @@ -563,6 +598,7 @@
|
| sub GenerateNormalAttrSetter
|
| {
|
| my $attribute = shift;
|
| + my $dataNode = shift;
|
| my $classIndex = shift;
|
| my $implClassName = shift;
|
|
|
| @@ -581,7 +617,7 @@
|
| if ($isPodType) {
|
| $implClassName = GetNativeType($implClassName);
|
| $implIncludes{"V8SVGPODTypeWrapper.h"} = 1;
|
| - push(@implContentDecls, " V8SVGPODTypeWrapper<$implClassName>* wrapper = V8Proxy::FastToNativeObject<V8SVGPODTypeWrapper<$implClassName> >(V8ClassIndex::$classIndex, info.Holder());\n");
|
| + push(@implContentDecls, " V8SVGPODTypeWrapper<$implClassName>* wrapper = V8Proxy::ToNativeObject<V8SVGPODTypeWrapper<$implClassName> >(V8ClassIndex::$classIndex, info.Holder());\n");
|
| push(@implContentDecls, " $implClassName imp_instance = *wrapper;\n");
|
| push(@implContentDecls, " $implClassName* imp = &imp_instance;\n");
|
|
|
| @@ -590,12 +626,13 @@
|
| push(@implContentDecls, <<END);
|
| v8::Handle<v8::Object> holder = V8Proxy::LookupDOMWrapper(V8ClassIndex::$classIndex, info.This());
|
| if (holder.IsEmpty()) return v8::Undefined();
|
| -
|
| - $implClassName* imp = V8Proxy::FastToNativeObject<$implClassName>(V8ClassIndex::$classIndex, holder);
|
| END
|
| -
|
| + HolderToNative($dataNode, $implClassName, $classIndex);
|
| } else {
|
| - push(@implContentDecls, " $implClassName* imp = V8Proxy::FastToNativeObject<$implClassName>(V8ClassIndex::$classIndex, info.Holder());\n");
|
| + push(@implContentDecls, <<END);
|
| + v8::Handle<v8::Object> holder = info.Holder();
|
| +END
|
| + HolderToNative($dataNode, $implClassName, $classIndex);
|
| }
|
|
|
| my $nativeType = GetNativeTypeFromSignature($attribute->signature, 0);
|
| @@ -697,11 +734,14 @@
|
|
|
| if ($codeGenerator->IsPodType($implClassName)) {
|
| my $nativeClassName = GetNativeType($implClassName);
|
| - push(@implContentDecls, " V8SVGPODTypeWrapper<$nativeClassName>* imp_wrapper = V8Proxy::FastToNativeObject<V8SVGPODTypeWrapper<$nativeClassName> >(V8ClassIndex::$classIndex, args.Holder());\n");
|
| + push(@implContentDecls, " V8SVGPODTypeWrapper<$nativeClassName>* imp_wrapper = V8Proxy::ToNativeObject<V8SVGPODTypeWrapper<$nativeClassName> >(V8ClassIndex::$classIndex, args.Holder());\n");
|
| push(@implContentDecls, " $nativeClassName imp_instance = *imp_wrapper;\n");
|
| push(@implContentDecls, " $nativeClassName* imp = &imp_instance;\n");
|
| } else {
|
| - push(@implContentDecls, " $implClassName* imp = V8Proxy::FastToNativeObject<$implClassName>(V8ClassIndex::$classIndex, args.Holder());\n");
|
| + push(@implContentDecls, <<END);
|
| + v8::Handle<v8::Value> holder = args.Holder();
|
| +END
|
| + HolderToNative($dataNode, $implClassName, $classIndex);
|
| }
|
|
|
| # Check domain security if needed
|
| @@ -781,6 +821,8 @@
|
| my $hasLegacyParent = $dataNode->extendedAttributes->{"LegacyParent"};
|
| my $conditional = $dataNode->extendedAttributes->{"Conditional"};
|
|
|
| + @allParents = $codeGenerator->FindParentsRecursively($dataNode);
|
| +
|
| # - Add default header template
|
| @implContentHeader = split("\r", $headerTemplate);
|
|
|
| @@ -829,14 +871,14 @@
|
| }
|
|
|
| # Generate the accessor.
|
| - GenerateNormalAttrGetter($attribute, $classIndex, $implClassName);
|
| + GenerateNormalAttrGetter($attribute, $dataNode, $classIndex, $implClassName);
|
| if ($attribute->signature->extendedAttributes->{"CustomSetter"}) {
|
| $implIncludes{"v8_custom.h"} = 1;
|
| } elsif ($attribute->signature->extendedAttributes->{"Replaceable"}) {
|
| $interfaceName eq "DOMWindow" || die "Replaceable attribute can only be used in DOMWindow interface!";
|
| # GenerateReplaceableAttrSetter($implClassName);
|
| } elsif ($attribute->type !~ /^readonly/) {
|
| - GenerateNormalAttrSetter($attribute, $classIndex, $implClassName);
|
| + GenerateNormalAttrSetter($attribute, $dataNode, $classIndex, $implClassName);
|
| }
|
| }
|
|
|
| @@ -1223,7 +1265,7 @@
|
| }
|
| $result .= $indent . "if (success)\n";
|
| $result .= $indent . " " .
|
| - "return V8Proxy::ToV8Object(V8ClassIndex::NODE, $nodeToReturn);\n";
|
| + "return V8Proxy::NodeToV8Object($nodeToReturn);\n";
|
| $result .= $indent . "return v8::Null();\n";
|
| return $result;
|
| } elsif ($returnType eq "void") {
|
| @@ -1250,11 +1292,11 @@
|
|
|
| # If the return type is a POD type, separate out the wrapper generation
|
| if ($returnsListItemPodType) {
|
| - $result .= $indent . "V8SVGPODTypeWrapperCreatorForList<" . $nativeReturnType . ">* wrapper = new ";
|
| + $result .= $indent . "V8SVGPODTypeWrapper<" . $nativeReturnType . ">* wrapper = new ";
|
| $result .= "V8SVGPODTypeWrapperCreatorForList<" . $nativeReturnType . ">($return, imp->associatedAttributeName());\n";
|
| $return = "wrapper";
|
| } elsif ($returnsPodType) {
|
| - $result .= $indent . "V8SVGPODTypeWrapperCreatorReadOnly<" . $nativeReturnType . ">* wrapper = ";
|
| + $result .= $indent . "V8SVGPODTypeWrapper<" . $nativeReturnType . ">* wrapper = ";
|
| $result .= GenerateReadOnlyPodTypeWrapper($returnType, $return) . ";\n";
|
| $return = "wrapper";
|
| }
|
| @@ -1514,7 +1556,7 @@
|
| $implIncludes{"V8Node.h"} = 1;
|
|
|
| # EventTarget is not in DOM hierarchy, but all Nodes are EventTarget.
|
| - return "V8Node::HasInstance($value) ? V8Proxy::FastToNativeObject<EventTargetNode>(V8ClassIndex::NODE, $value) : 0";
|
| + return "V8Node::HasInstance($value) ? V8Proxy::DOMWrapperToNode<EventTargetNode>($value) : 0";
|
| }
|
|
|
| AddIncludesForType($type);
|
| @@ -1525,7 +1567,7 @@
|
|
|
| # Perform type checks on the parameter, if it is expected Node type,
|
| # return NULL.
|
| - return "V8${type}::HasInstance($value) ? V8Proxy::FastToNativeObject<${type}>(V8ClassIndex::NODE, $value) : 0";
|
| + return "V8${type}::HasInstance($value) ? V8Proxy::DOMWrapperToNode<${type}>($value) : 0";
|
|
|
| } else {
|
| # TODO: Temporary to avoid Window name conflict.
|
| @@ -1546,7 +1588,7 @@
|
|
|
| # Perform type checks on the parameter, if it is expected Node type,
|
| # return NULL.
|
| - return "V8${type}::HasInstance($value) ? V8Proxy::FastToNativeObject<${implClassName}>(V8ClassIndex::${classIndex}, $value) : 0";
|
| + return "V8${type}::HasInstance($value) ? V8Proxy::ToNativeObject<${implClassName}>(V8ClassIndex::${classIndex}, $value) : 0";
|
| }
|
| }
|
|
|
| @@ -1633,7 +1675,6 @@
|
| return !($non_wrapper_types{$type});
|
| }
|
|
|
| -
|
| sub IsDOMNodeType
|
| {
|
| my $type = shift;
|
| @@ -1701,7 +1742,7 @@
|
|
|
| # special case for non-DOM node interfaces
|
| if (IsDOMNodeType($type)) {
|
| - return "V8Proxy::ToV8Object(V8ClassIndex::NODE, $value)";
|
| + return "V8Proxy::NodeToV8Object($value)";
|
| }
|
|
|
| if ($type eq "EventTarget" or $type eq "SVGElementInstance") {
|
|
|