Chromium Code Reviews| Index: Source/bindings/scripts/CodeGeneratorV8.pm |
| diff --git a/Source/bindings/scripts/CodeGeneratorV8.pm b/Source/bindings/scripts/CodeGeneratorV8.pm |
| index 2cf402511932ae937a5765e4f3873c619feef350..2d95af19fdbc9382123508e80f79c746c26be88b 100644 |
| --- a/Source/bindings/scripts/CodeGeneratorV8.pm |
| +++ b/Source/bindings/scripts/CodeGeneratorV8.pm |
| @@ -698,7 +698,7 @@ sub GenerateHeaderNamedAndIndexedPropertyAccessors |
| { |
| my $interface = shift; |
| my $interfaceName = $interface->name; |
| - my $hasCustomIndexedGetter = $interface->extendedAttributes->{"IndexedGetter"} || $interface->extendedAttributes->{"CustomGetOwnPropertySlot"}; |
| + my $hasCustomIndexedGetter = $interface->extendedAttributes->{"IndexedGetter"} || $interface->extendedAttributes->{"CustomIndexedGetter"}; |
| my $hasCustomIndexedSetter = $interface->extendedAttributes->{"CustomIndexedSetter"} && !$interface->extendedAttributes->{"NumericIndexedGetter"}; |
| my $hasCustomNamedGetter = $interface->extendedAttributes->{"NamedGetter"} || $interface->extendedAttributes->{"CustomNamedGetter"} || $interface->extendedAttributes->{"CustomGetOwnPropertySlot"}; |
| my $hasCustomNamedSetter = $interface->extendedAttributes->{"CustomNamedSetter"}; |
| @@ -2610,7 +2610,7 @@ END |
| push(@implContent, "#endif // ${conditionalString}\n") if $conditionalString; |
| } |
| -sub GenerateImplementationIndexer |
| +sub GenerateImplementationIndexedProperty |
| { |
| my $interface = shift; |
| my $indexer = shift; |
| @@ -2618,30 +2618,31 @@ sub GenerateImplementationIndexer |
| my $v8InterfaceName = "V8$interfaceName"; |
| # FIXME: Figure out what NumericIndexedGetter is really supposed to do. Right now, it's only set on WebGL-related files. |
| - my $hasCustomSetter = $interface->extendedAttributes->{"CustomIndexedSetter"} && !$interface->extendedAttributes->{"NumericIndexedGetter"}; |
| - my $hasGetter = $interface->extendedAttributes->{"IndexedGetter"} || $interface->extendedAttributes->{"CustomGetOwnPropertySlot"}; |
| + my $hasCustomIndexedSetter = $interface->extendedAttributes->{"CustomIndexedSetter"} && !$interface->extendedAttributes->{"NumericIndexedGetter"}; |
| + my $hasIndexedGetter = $interface->extendedAttributes->{"IndexedGetter"} || $interface->extendedAttributes->{"CustomIndexedGetter"}; |
| # FIXME: Investigate and remove this nastinesss. In V8, named property handling and indexer handling are apparently decoupled, |
| # which means that object[X] where X is a number doesn't reach named property indexer. So we need to provide |
| # simplistic, mirrored indexer handling in addition to named property handling. |
| my $isSpecialCase = exists $indexerSpecialCases{$interfaceName}; |
| if ($isSpecialCase) { |
| - $hasGetter = 1; |
| + $hasIndexedGetter = 1; |
| if ($interface->extendedAttributes->{"CustomNamedSetter"}) { |
| - $hasCustomSetter = 1; |
| + $hasCustomIndexedSetter = 1; |
| } |
| } |
| + # FIXME: Remove the special cases. Interfaces that have indexedPropertyGetter should have indexedPropertyEnumerator. |
| my $hasEnumerator = !$isSpecialCase && $codeGenerator->InheritsInterface($interface, "Node"); |
| # FIXME: Find a way to not have to special-case HTMLOptionsCollection. |
| if ($interfaceName eq "HTMLOptionsCollection") { |
| $hasEnumerator = 1; |
| - $hasGetter = 1; |
| + $hasIndexedGetter = 1; |
| } |
| - if (!$hasGetter) { |
| - return; |
| + if (!$hasIndexedGetter) { |
| + return ""; |
| } |
| AddToImplIncludes("V8Collection.h"); |
| @@ -2652,32 +2653,8 @@ sub GenerateImplementationIndexer |
| my $indexerType = $indexer ? $indexer->type : 0; |
| - # FIXME: Remove this once toV8 helper methods are implemented (see https://bugs.webkit.org/show_bug.cgi?id=32563). |
| - if ($interfaceName eq "WebKitCSSKeyframesRule") { |
| - $indexerType = "WebKitCSSKeyframeRule"; |
| - } |
| - |
| - if ($indexerType && !$hasCustomSetter) { |
| - if ($indexerType eq "DOMString") { |
| - my $conversion = $indexer->extendedAttributes->{"TreatReturnedNullStringAs"}; |
| - if ($conversion && $conversion eq "Null") { |
| - push(@implContent, <<END); |
| - setCollectionStringOrUndefinedIndexedGetter<${interfaceName}>(desc); |
| -END |
| - } else { |
| - push(@implContent, <<END); |
| - setCollectionStringIndexedGetter<${interfaceName}>(desc); |
| -END |
| - } |
| - } else { |
| - push(@implContent, <<END); |
| - setCollectionIndexedGetter<${interfaceName}, ${indexerType}>(desc); |
| -END |
| - # Include the header for this indexer type, because setCollectionIndexedGetter() requires toV8() for this type. |
| - AddToImplIncludes("V8${indexerType}.h"); |
| - } |
| - |
| - return; |
| + if ($indexerType && !$hasCustomIndexedSetter) { |
| + $hasEnumerator = 1; |
| } |
| my $hasDeleter = $interface->extendedAttributes->{"CustomDeleteProperty"}; |
| @@ -2691,13 +2668,53 @@ END |
| $setOn = "Prototype"; |
| $hasDeleter = 0; |
| } |
| + # FIXME: Implement V8DataTransferItemList::indexedPropertyDeleter |
| + if ($interfaceName eq "DataTransferItemList") { |
| + $hasDeleter = 0; |
| + } |
| push(@implContent, " desc->${setOn}Template()->SetIndexedPropertyHandler(${v8InterfaceName}::indexedPropertyGetter"); |
| - push(@implContent, $hasCustomSetter ? ", ${v8InterfaceName}::indexedPropertySetter" : ", 0"); |
| + push(@implContent, $hasCustomIndexedSetter ? ", ${v8InterfaceName}::indexedPropertySetter" : ", 0"); |
| push(@implContent, ", 0"); # IndexedPropertyQuery -- not being used at the moment. |
| push(@implContent, $hasDeleter ? ", ${v8InterfaceName}::indexedPropertyDeleter" : ", 0"); |
| push(@implContent, ", nodeCollectionIndexedPropertyEnumerator<${interfaceName}>") if $hasEnumerator; |
| push(@implContent, ");\n"); |
| + |
| + if($interface->extendedAttributes->{"IndexedGetter"}) { |
| + # FIXME: add item() method to WebKitCSSKeyframesRule.idl or remove [IndexedGetter] from WebKitCSSKeyframesRule.idl |
| + # Currently indexer type is hard coded because it can not be obtained from IDL. |
| + if ($interfaceName eq "WebKitCSSKeyframesRule") { |
| + $indexerType = "WebKitCSSKeyframeRule"; |
| + } |
| + my $jsValue = ""; |
| + my $elementType = GetNativeType($indexerType); |
|
haraken
2013/04/17 10:29:52
$elementType => $nativeType
|
| + my $isNull = ""; |
| + |
| + if ($indexerType eq "DOMString") { |
|
haraken
2013/04/17 10:29:52
Shall we use $codeGenerator->IsRefPtrType($indexer
|
| + $isNull = "element.isNull()"; |
| + $jsValue = NativeToJSValue($indexer, "element", "info.Holder()", "info.GetIsolate()"); |
| + } else { |
| + $isNull = "!element"; |
| + if ($interfaceName eq "WebKitCSSKeyframesRule") { |
| + $jsValue = "toV8(element.release(), info.Holder(), info.GetIsolate())"; |
| + } else { |
| + $jsValue = NativeToJSValue($indexer, "element.release()", "info.Holder()", "info.GetIsolate()"); |
| + } |
| + } |
| + |
| + return <<END; |
| +v8::Handle<v8::Value> ${v8InterfaceName}::indexedPropertyGetter(uint32_t index, const v8::AccessorInfo& info) |
| +{ |
| + ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder())); |
| + ${interfaceName}* collection = toNative(info.Holder()); |
| + $elementType element = collection->item(index); |
| + if ($isNull) |
| + return v8Undefined(); |
| + return $jsValue; |
| +} |
| +END |
| + } |
| + return ""; |
| } |
| sub GenerateImplementationNamedPropertyGetter |
| @@ -3225,7 +3242,7 @@ END |
| push(@implContent, "\n#endif // ${conditionalString}\n") if $conditionalString; |
| } |
| - GenerateImplementationIndexer($interface, $indexer); |
| + my $indexPropertyGetterCode = GenerateImplementationIndexedProperty($interface, $indexer); |
| GenerateImplementationNamedPropertyGetter($interface, $namedPropertyGetter); |
| GenerateImplementationCustomCall($interface); |
| GenerateImplementationMasqueradesAsUndefined($interface); |
| @@ -3314,6 +3331,8 @@ bool ${v8InterfaceName}::HasInstanceInAnyWorld(v8::Handle<v8::Value> value, v8:: |
| END |
| + push(@implContent, $indexPropertyGetterCode); |
| + |
| if (@enabledPerContextAttributes) { |
| push(@implContent, <<END); |
| void ${v8InterfaceName}::installPerContextProperties(v8::Handle<v8::Object> instance, ${nativeType}* impl, v8::Isolate* isolate) |