[Web IDL] Add support for 'any' type in dictionaries
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 6 Aug 2016 02:33:08 +0000 (02:33 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 6 Aug 2016 02:33:08 +0000 (02:33 +0000)
https://bugs.webkit.org/show_bug.cgi?id=160511

Reviewed by Sam Weinig.

Add support for 'any' type in dictionaries. It will pass the value as
a JSValue to the implementation. If the member is not present, it will
pass jsUndefined() to the implementation.

Having 'any' support in dictionaries is a convenient workaround for
types we don't support yet (e.g. union types).

No new tests, updated bindings tests.

* bindings/js/JSDOMConvert.h:
(WebCore::Converter<JSC::JSValue>::convert):
* bindings/scripts/test/JS/JSTestObj.cpp:
(WebCore::convert<TestObj::Dictionary>):
* bindings/scripts/test/TestObj.idl:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@204216 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/bindings/js/JSDOMConvert.h
Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp
Source/WebCore/bindings/scripts/test/TestObj.idl

index e0f0681..c663127 100644 (file)
@@ -1,5 +1,27 @@
 2016-08-05  Chris Dumez  <cdumez@apple.com>
 
+        [Web IDL] Add support for 'any' type in dictionaries
+        https://bugs.webkit.org/show_bug.cgi?id=160511
+
+        Reviewed by Sam Weinig.
+
+        Add support for 'any' type in dictionaries. It will pass the value as
+        a JSValue to the implementation. If the member is not present, it will
+        pass jsUndefined() to the implementation.
+
+        Having 'any' support in dictionaries is a convenient workaround for
+        types we don't support yet (e.g. union types).
+
+        No new tests, updated bindings tests.
+
+        * bindings/js/JSDOMConvert.h:
+        (WebCore::Converter<JSC::JSValue>::convert):
+        * bindings/scripts/test/JS/JSTestObj.cpp:
+        (WebCore::convert<TestObj::Dictionary>):
+        * bindings/scripts/test/TestObj.idl:
+
+2016-08-05  Chris Dumez  <cdumez@apple.com>
+
         [Web IDL] Add support for USVString type
         https://bugs.webkit.org/show_bug.cgi?id=160608
 
index bd0cdbf..f2d1f9d 100644 (file)
@@ -129,6 +129,14 @@ template<> struct Converter<String> : DefaultConverter<String> {
     }
 };
 
+template<> struct Converter<JSC::JSValue> : DefaultConverter<JSC::JSValue> {
+    using OptionalValue = JSC::JSValue; // Use jsUndefined() to mean an optional value was not present.
+    static JSC::JSValue convert(JSC::ExecState&, JSC::JSValue value)
+    {
+        return value;
+    }
+};
+
 template<typename T> struct Converter<Vector<T>> : DefaultConverter<Vector<T>> {
     static Vector<T> convert(JSC::ExecState& state, JSC::JSValue value)
     {
index d57f9be..7c1975f 100644 (file)
@@ -924,6 +924,7 @@ sub GenerateDefaultValue
         $value = $className . "::" . $enumerationValueName;
     }
     $value = "nullptr" if $value eq "null";
+    $value = "jsUndefined()" if $value eq "undefined";
 
     return $value;
 }
@@ -978,6 +979,7 @@ sub GenerateDictionaryImplementationContent
                 $defaultValues = "";
                 last;
             }
+            $member->default("undefined") if $member->type eq "any"; # Use undefined as default value for member of type 'any'.
             $defaultValues .= $comma . (defined $member->default ? GenerateDefaultValue($interface, $member) : "{ }");
             $comma = ", ";
         }
index a61e46f..4e2f388 100644 (file)
@@ -454,7 +454,7 @@ template<> inline const char* expectedEnumerationValues<TestObj::Confidence>()
 template<> TestObj::Dictionary convert<TestObj::Dictionary>(ExecState& state, JSValue value)
 {
     if (value.isUndefinedOrNull())
-        return { { }, TestObj::EnumType::EnumValue1, TestObj::EnumType::EmptyString, "defaultString", { }, false, { }, { }, { }, { }, 0, 0, { }, { }, 0, 0, { }, { }, { }, 0, { }, 0, { }, 0, { }, 0, { }, 0, nullptr };
+        return { { }, TestObj::EnumType::EnumValue1, TestObj::EnumType::EmptyString, "defaultString", { }, false, { }, { }, { }, { }, 0, 0, { }, { }, 0, 0, { }, { }, { }, 0, { }, 0, { }, 0, { }, 0, { }, 0, nullptr, jsUndefined() };
     auto* object = value.getObject();
     if (UNLIKELY(!object || object->type() == RegExpObjectType)) {
         throwTypeError(&state);
@@ -545,7 +545,10 @@ template<> TestObj::Dictionary convert<TestObj::Dictionary>(ExecState& state, JS
     if (UNLIKELY(state.hadException()))
         return { };
     auto* nullableNode = convertWrapperType<Node, JSNode>(state, object->get(&state, Identifier::fromString(&state, "nullableNode")), IsNullable::Yes);
-    return { WTFMove(enumerationValueWithoutDefault), WTFMove(enumerationValueWithDefault), WTFMove(enumerationValueWithEmptyStringDefault), WTFMove(stringWithDefault), WTFMove(stringWithoutDefault), WTFMove(booleanWithDefault), WTFMove(booleanWithoutDefault), WTFMove(sequenceOfStrings), WTFMove(restrictedDouble), WTFMove(unrestrictedDouble), WTFMove(restrictedDoubleWithDefault), WTFMove(unrestrictedDoubleWithDefault), WTFMove(restrictedFloat), WTFMove(unrestrictedFloat), WTFMove(restrictedFloatWithDefault), WTFMove(unrestrictedFloatWithDefault), WTFMove(smallIntegerClamped), WTFMove(smallIntegerWithDefault), WTFMove(smallUnsignedIntegerEnforcedRange), WTFMove(smallUnsignedIntegerWithDefault), WTFMove(integer), WTFMove(integerWithDefault), WTFMove(unsignedInteger), WTFMove(unsignedIntegerWithDefault), WTFMove(largeInteger), WTFMove(largeIntegerWithDefault), WTFMove(unsignedLargeInteger), WTFMove(unsignedLargeIntegerWithDefault), WTFMove(nullableNode) };
+    if (UNLIKELY(state.hadException()))
+        return { };
+    auto anyValue = convertOptional<JSC::JSValue>(state, object->get(&state, Identifier::fromString(&state, "anyValue")), jsUndefined());
+    return { WTFMove(enumerationValueWithoutDefault), WTFMove(enumerationValueWithDefault), WTFMove(enumerationValueWithEmptyStringDefault), WTFMove(stringWithDefault), WTFMove(stringWithoutDefault), WTFMove(booleanWithDefault), WTFMove(booleanWithoutDefault), WTFMove(sequenceOfStrings), WTFMove(restrictedDouble), WTFMove(unrestrictedDouble), WTFMove(restrictedDoubleWithDefault), WTFMove(unrestrictedDoubleWithDefault), WTFMove(restrictedFloat), WTFMove(unrestrictedFloat), WTFMove(restrictedFloatWithDefault), WTFMove(unrestrictedFloatWithDefault), WTFMove(smallIntegerClamped), WTFMove(smallIntegerWithDefault), WTFMove(smallUnsignedIntegerEnforcedRange), WTFMove(smallUnsignedIntegerWithDefault), WTFMove(integer), WTFMove(integerWithDefault), WTFMove(unsignedInteger), WTFMove(unsignedIntegerWithDefault), WTFMove(largeInteger), WTFMove(largeIntegerWithDefault), WTFMove(unsignedLargeInteger), WTFMove(unsignedLargeIntegerWithDefault), WTFMove(nullableNode), WTFMove(anyValue) };
 }
 
 template<> TestObj::DictionaryThatShouldNotTolerateNull convert<TestObj::DictionaryThatShouldNotTolerateNull>(ExecState& state, JSValue value)
index 4a0bc25..7190cb5 100644 (file)
@@ -431,6 +431,7 @@ dictionary TestDictionary {
     unsigned long long unsignedLargeInteger;
     unsigned long long unsignedLargeIntegerWithDefault = 0;
     Node? nullableNode = null;
+    any anyValue;
 };
 
 dictionary TestDictionaryThatShouldNotTolerateNull {