[Web Animations] Update the API to allow the "auto" composite value
authorgraouts@webkit.org <graouts@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 6 Nov 2018 11:15:43 +0000 (11:15 +0000)
committergraouts@webkit.org <graouts@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 6 Nov 2018 11:15:43 +0000 (11:15 +0000)
https://bugs.webkit.org/show_bug.cgi?id=191300
<rdar://problem/45838373>

Reviewed by Dean Jackson.

The Web Animations API has been changed such that the various "composite" properties are no longer optional and instead
allow an "auto" value in their enumeration.

* CMakeLists.txt:
* DerivedSources.make:
* Sources.txt:
* WebCore.xcodeproj/project.pbxproj:
* animation/CompositeOperationOrAuto.h: Copied from Source/WebCore/animation/KeyframeEffect.idl.
* animation/CompositeOperationOrAuto.idl: Copied from Source/WebCore/animation/KeyframeEffect.idl.
* animation/KeyframeEffect.cpp:
(WebCore::processKeyframeLikeObject):
(WebCore::processIterableKeyframes):
(WebCore::processPropertyIndexedKeyframes):
(WebCore::KeyframeEffect::getKeyframes):
* animation/KeyframeEffect.h:
* animation/KeyframeEffect.idl:

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

Source/WebCore/CMakeLists.txt
Source/WebCore/ChangeLog
Source/WebCore/DerivedSources.make
Source/WebCore/Sources.txt
Source/WebCore/WebCore.xcodeproj/project.pbxproj
Source/WebCore/animation/CompositeOperationOrAuto.h [new file with mode: 0644]
Source/WebCore/animation/CompositeOperationOrAuto.idl [new file with mode: 0644]
Source/WebCore/animation/KeyframeEffect.cpp
Source/WebCore/animation/KeyframeEffect.h
Source/WebCore/animation/KeyframeEffect.idl

index c778f7f..3f1bfc5 100644 (file)
@@ -489,6 +489,7 @@ set(WebCore_NON_SVG_IDL_FILES
     animation/CSSAnimation.idl
     animation/CSSTransition.idl
     animation/CompositeOperation.idl
+    animation/CompositeOperationOrAuto.idl
     animation/ComputedEffectTiming.idl
     animation/DocumentTimeline.idl
     animation/DocumentTimelineOptions.idl
index 1c2e185..d8a4713 100644 (file)
@@ -1,5 +1,30 @@
 2018-11-06  Antoine Quint  <graouts@apple.com>
 
+        [Web Animations] Update the API to allow the "auto" composite value
+        https://bugs.webkit.org/show_bug.cgi?id=191300
+        <rdar://problem/45838373>
+
+        Reviewed by Dean Jackson.
+
+        The Web Animations API has been changed such that the various "composite" properties are no longer optional and instead
+        allow an "auto" value in their enumeration.
+
+        * CMakeLists.txt:
+        * DerivedSources.make:
+        * Sources.txt:
+        * WebCore.xcodeproj/project.pbxproj:
+        * animation/CompositeOperationOrAuto.h: Copied from Source/WebCore/animation/KeyframeEffect.idl.
+        * animation/CompositeOperationOrAuto.idl: Copied from Source/WebCore/animation/KeyframeEffect.idl.
+        * animation/KeyframeEffect.cpp:
+        (WebCore::processKeyframeLikeObject):
+        (WebCore::processIterableKeyframes):
+        (WebCore::processPropertyIndexedKeyframes):
+        (WebCore::KeyframeEffect::getKeyframes):
+        * animation/KeyframeEffect.h:
+        * animation/KeyframeEffect.idl:
+
+2018-11-06  Antoine Quint  <graouts@apple.com>
+
         [Web Animations] Update the API to implement Animation.updatePlaybackRate()
         https://bugs.webkit.org/show_bug.cgi?id=186510
         <rdar://problem/41000641>
index dfff3a2..255cd3a 100644 (file)
@@ -403,6 +403,7 @@ JS_BINDING_IDLS = \
     $(WebCore)/animation/AnimationPlaybackEventInit.idl \
     $(WebCore)/animation/AnimationTimeline.idl \
     $(WebCore)/animation/CompositeOperation.idl \
+    $(WebCore)/animation/CompositeOperationOrAuto.idl \
     $(WebCore)/animation/ComputedEffectTiming.idl \
     $(WebCore)/animation/CSSAnimation.idl \
     $(WebCore)/animation/CSSTransition.idl \
index d2e6cb2..3601aed 100644 (file)
@@ -2534,6 +2534,7 @@ JSCommandLineAPIHost.cpp
 JSComment.cpp
 JSCompositionEvent.cpp
 JSCompositeOperation.cpp
+JSCompositeOperationOrAuto.cpp
 JSComputedEffectTiming.cpp
 JSConvolverNode.cpp
 JSCoordinates.cpp
index 7078c13..1c24f14 100644 (file)
                71025EDE1F99F1EC004A250C /* JSAnimationTimeline.h in Headers */ = {isa = PBXBuildFile; fileRef = 71025ED91F99F1A7004A250C /* JSAnimationTimeline.h */; };
                71025EE01F99F1EC004A250C /* JSDocumentTimeline.h in Headers */ = {isa = PBXBuildFile; fileRef = 71025EDC1F99F1A8004A250C /* JSDocumentTimeline.h */; };
                71025EE21F99F1EC004A250C /* JSWebAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 71025ED81F99F1A6004A250C /* JSWebAnimation.h */; };
+               7111243E216FA71100EB7B67 /* CompositeOperationOrAuto.h in Headers */ = {isa = PBXBuildFile; fileRef = 7111243B216FA6E000EB7B67 /* CompositeOperationOrAuto.h */; settings = {ATTRIBUTES = (Private, ); }; };
+               71112441216FA7CD00EB7B67 /* JSCompositeOperationOrAuto.h in Headers */ = {isa = PBXBuildFile; fileRef = 71112440216FA7BE00EB7B67 /* JSCompositeOperationOrAuto.h */; settings = {ATTRIBUTES = (Private, ); }; };
                7116E2CC1FED75DC00C06FDE /* ComputedEffectTiming.h in Headers */ = {isa = PBXBuildFile; fileRef = 7116E2CB1FED75D100C06FDE /* ComputedEffectTiming.h */; settings = {ATTRIBUTES = (Private, ); }; };
                7116E2CF1FED765B00C06FDE /* JSComputedEffectTiming.h in Headers */ = {isa = PBXBuildFile; fileRef = 7116E2CE1FED765200C06FDE /* JSComputedEffectTiming.h */; settings = {ATTRIBUTES = (Private, ); }; };
                7117445914BC34EC00EE5FC8 /* SVGTextMetricsBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 7117445714BC34E200EE5FC8 /* SVGTextMetricsBuilder.h */; };
                71025EDC1F99F1A8004A250C /* JSDocumentTimeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDocumentTimeline.h; sourceTree = "<group>"; };
                710FA74B1DEE576D004C715E /* controls-bar.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "controls-bar.js"; sourceTree = "<group>"; };
                710FA74C1DEE577E004C715E /* controls-visibility-support.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "controls-visibility-support.js"; sourceTree = "<group>"; };
+               7111243B216FA6E000EB7B67 /* CompositeOperationOrAuto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CompositeOperationOrAuto.h; sourceTree = "<group>"; };
+               7111243D216FA6E000EB7B67 /* CompositeOperationOrAuto.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CompositeOperationOrAuto.idl; sourceTree = "<group>"; };
+               7111243F216FA7BE00EB7B67 /* JSCompositeOperationOrAuto.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSCompositeOperationOrAuto.cpp; sourceTree = "<group>"; };
+               71112440216FA7BE00EB7B67 /* JSCompositeOperationOrAuto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSCompositeOperationOrAuto.h; sourceTree = "<group>"; };
                7116E2C91FED75D000C06FDE /* ComputedEffectTiming.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ComputedEffectTiming.idl; sourceTree = "<group>"; };
                7116E2CB1FED75D100C06FDE /* ComputedEffectTiming.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ComputedEffectTiming.h; sourceTree = "<group>"; };
                7116E2CD1FED765200C06FDE /* JSComputedEffectTiming.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSComputedEffectTiming.cpp; sourceTree = "<group>"; };
                                71025ED91F99F1A7004A250C /* JSAnimationTimeline.h */,
                                71247E2B1FEA5F63008C08CE /* JSCompositeOperation.cpp */,
                                71247E2E1FEA5F66008C08CE /* JSCompositeOperation.h */,
+                               7111243F216FA7BE00EB7B67 /* JSCompositeOperationOrAuto.cpp */,
+                               71112440216FA7BE00EB7B67 /* JSCompositeOperationOrAuto.h */,
                                7116E2CD1FED765200C06FDE /* JSComputedEffectTiming.cpp */,
                                7116E2CE1FED765200C06FDE /* JSComputedEffectTiming.h */,
                                71B28424203CEC0B0036AA5D /* JSCSSAnimation.cpp */,
                                71025EC91F99F096004A250C /* AnimationTimeline.idl */,
                                71247E351FEA5F81008C08CE /* CompositeOperation.h */,
                                71247E361FEA5F81008C08CE /* CompositeOperation.idl */,
+                               7111243B216FA6E000EB7B67 /* CompositeOperationOrAuto.h */,
+                               7111243D216FA6E000EB7B67 /* CompositeOperationOrAuto.idl */,
                                7116E2CB1FED75D100C06FDE /* ComputedEffectTiming.h */,
                                7116E2C91FED75D000C06FDE /* ComputedEffectTiming.idl */,
                                71C29E2E203CE76B008F36D2 /* CSSAnimation.cpp */,
                                2DAF343D1EA7E0F100382CD3 /* ConstantPropertyMap.h in Headers */,
                                A818721C0977D3C0005826D9 /* ContainerNode.h in Headers */,
                                E1A1470811102B1500EEC0F3 /* ContainerNodeAlgorithms.h in Headers */,
+                               71112441216FA7CD00EB7B67 /* JSCompositeOperationOrAuto.h in Headers */,
                                BC5EB9810E82072500B25965 /* ContentData.h in Headers */,
                                51B45D211AB8D1E200117CD2 /* ContentExtension.h in Headers */,
                                5CDFA6C81AA4F2DA00EA8746 /* ContentExtensionActions.h in Headers */,
                                7C8E34BE1E4A33B00054CE23 /* JSDOMConvertObject.h in Headers */,
                                E323CFFA1E5AF6AF00F0B4A0 /* JSDOMConvertPromise.h in Headers */,
                                7C8E34BF1E4A33B00054CE23 /* JSDOMConvertRecord.h in Headers */,
+                               7111243E216FA71100EB7B67 /* CompositeOperationOrAuto.h in Headers */,
                                7C1F5D591F22FF7300A8874F /* JSDOMConvertScheduledAction.h in Headers */,
                                7C8E34C01E4A33B00054CE23 /* JSDOMConvertSequences.h in Headers */,
                                7C8E34C11E4A33B00054CE23 /* JSDOMConvertSerializedScriptValue.h in Headers */,
diff --git a/Source/WebCore/animation/CompositeOperationOrAuto.h b/Source/WebCore/animation/CompositeOperationOrAuto.h
new file mode 100644 (file)
index 0000000..a27de4e
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2018 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+namespace WebCore {
+
+enum class CompositeOperationOrAuto { Replace, Add, Accumulate, Auto };
+
+} // namespace WebCore
diff --git a/Source/WebCore/animation/CompositeOperationOrAuto.idl b/Source/WebCore/animation/CompositeOperationOrAuto.idl
new file mode 100644 (file)
index 0000000..939e6eb
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2018 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+enum CompositeOperationOrAuto { "replace", "add", "accumulate", "auto" };
index 34069f5..11c878a 100644 (file)
@@ -40,6 +40,7 @@
 #include "FrameView.h"
 #include "GeometryUtilities.h"
 #include "JSCompositeOperation.h"
+#include "JSCompositeOperationOrAuto.h"
 #include "JSKeyframeEffect.h"
 #include "RenderBox.h"
 #include "RenderBoxModelObject.h"
@@ -166,17 +167,17 @@ static inline ExceptionOr<KeyframeEffect::KeyframeLikeObject> processKeyframeLik
     //    If allow lists is true, use the following dictionary type:
     //
     //    dictionary BasePropertyIndexedKeyframe {
-    //        (double? or sequence<double?>)                         offset = [];
-    //        (DOMString or sequence<DOMString>)                     easing = [];
-    //        (CompositeOperation? or sequence<CompositeOperation?>) composite = [];
+    //        (double? or sequence<double?>)                                   offset = [];
+    //        (DOMString or sequence<DOMString>)                               easing = [];
+    //        (CompositeOperationOrAuto or sequence<CompositeOperationOrAuto>) composite = [];
     //    };
     //
     //    Otherwise, use the following dictionary type:
     //
     //    dictionary BaseKeyframe {
-    //        double?             offset = null;
-    //        DOMString           easing = "linear";
-    //        CompositeOperation? composite = null;
+    //        double?                  offset = null;
+    //        DOMString                easing = "linear";
+    //        CompositeOperationOrAuto composite = "auto";
     //    };
     //
     //    Store the result of this procedure as keyframe output.
@@ -190,10 +191,7 @@ static inline ExceptionOr<KeyframeEffect::KeyframeLikeObject> processKeyframeLik
         else
             baseProperties.offset = nullptr;
         baseProperties.easing = baseKeyframe.easing;
-        if (baseKeyframe.composite)
-            baseProperties.composite = baseKeyframe.composite.value();
-        else
-            baseProperties.composite = nullptr;
+        baseProperties.composite = baseKeyframe.composite;
     }
     RETURN_IF_EXCEPTION(scope, Exception { TypeError });
 
@@ -298,11 +296,9 @@ static inline ExceptionOr<void> processIterableKeyframes(ExecState& state, Stron
         keyframeOutput.easing = WTF::get<String>(keyframeLikeObject.baseProperties.easing);
 
         // When calling processKeyframeLikeObject() with the "allow lists" flag set to false, the only composite
-        // alternatives we should expect are CompositeOperation and nullptr.
-        if (WTF::holds_alternative<CompositeOperation>(keyframeLikeObject.baseProperties.composite))
-            keyframeOutput.composite = WTF::get<CompositeOperation>(keyframeLikeObject.baseProperties.composite);
-        else
-            ASSERT(WTF::holds_alternative<std::nullptr_t>(keyframeLikeObject.baseProperties.composite));
+        // alternatives we should expect is CompositeOperationAuto.
+        ASSERT(WTF::holds_alternative<CompositeOperationOrAuto>(keyframeLikeObject.baseProperties.composite));
+        keyframeOutput.composite = WTF::get<CompositeOperationOrAuto>(keyframeLikeObject.baseProperties.composite);
 
         for (auto& propertyAndValue : keyframeLikeObject.propertiesAndValues) {
             auto cssPropertyId = propertyAndValue.property;
@@ -437,27 +433,27 @@ static inline ExceptionOr<void> processPropertyIndexedKeyframes(ExecState& state
         parsedKeyframes[i].easing = easings[i];
 
     // 12. If the “composite” member of the property-indexed keyframe is not an empty sequence:
-    Vector<std::optional<CompositeOperation>> compositeModes;
-    if (WTF::holds_alternative<Vector<std::optional<CompositeOperation>>>(propertyIndexedKeyframe.baseProperties.composite))
-        compositeModes = WTF::get<Vector<std::optional<CompositeOperation>>>(propertyIndexedKeyframe.baseProperties.composite);
-    else if (WTF::holds_alternative<CompositeOperation>(propertyIndexedKeyframe.baseProperties.composite))
-        compositeModes.append(WTF::get<CompositeOperation>(propertyIndexedKeyframe.baseProperties.composite));
-    else if (WTF::holds_alternative<std::nullptr_t>(propertyIndexedKeyframe.baseProperties.composite))
-        compositeModes.append(std::nullopt);
+    Vector<CompositeOperationOrAuto> compositeModes;
+    if (WTF::holds_alternative<Vector<CompositeOperationOrAuto>>(propertyIndexedKeyframe.baseProperties.composite))
+        compositeModes = WTF::get<Vector<CompositeOperationOrAuto>>(propertyIndexedKeyframe.baseProperties.composite);
+    else if (WTF::holds_alternative<CompositeOperationOrAuto>(propertyIndexedKeyframe.baseProperties.composite))
+        compositeModes.append(WTF::get<CompositeOperationOrAuto>(propertyIndexedKeyframe.baseProperties.composite));
     if (!compositeModes.isEmpty()) {
-        // 1. Let composite modes be a sequence of composite operations assigned from the “composite” member of property-indexed keyframe. If that member is a single composite
-        //    operation, let composite modes be a sequence of length one, with the value of the “composite” as its single item.
-        // 2. As with easings, if composite modes has fewer items than property keyframes, repeat the elements in composite modes successively starting from the beginning of
-        //    the list until composite modes has as many items as property keyframes.
+        // 1. Let composite modes be a sequence of CompositeOperationOrAuto values assigned from the “composite” member of property-indexed keyframe. If that member is a single
+        //    CompositeOperationOrAuto value operation, let composite modes be a sequence of length one, with the value of the “composite” as its single item.
+        // 2. As with easings, if composite modes has fewer items than processed keyframes, repeat the elements in composite modes successively starting from the beginning of
+        //    the list until composite modes has as many items as processed keyframes.
         if (compositeModes.size() < parsedKeyframes.size()) {
             size_t initialNumberOfCompositeModes = compositeModes.size();
             for (i = initialNumberOfCompositeModes; i < parsedKeyframes.size(); ++i)
                 compositeModes.append(compositeModes[i % initialNumberOfCompositeModes]);
         }
-        // 3. Assign each value in composite modes to the keyframe-specific composite operation on the keyframe with the corresponding position in property keyframes until
-        //    the end of property keyframes is reached.
-        for (size_t i = 0; i < compositeModes.size() && i < parsedKeyframes.size(); ++i)
-            parsedKeyframes[i].composite = compositeModes[i];
+        // 3. Assign each value in composite modes that is not auto to the keyframe-specific composite operation on the keyframe with the corresponding position in processed
+        //    keyframes until the end of processed keyframes is reached.
+        for (size_t i = 0; i < compositeModes.size() && i < parsedKeyframes.size(); ++i) {
+            if (compositeModes[i] != CompositeOperationOrAuto::Auto)
+                parsedKeyframes[i].composite = compositeModes[i];
+        }
     }
 
     return { };
@@ -577,10 +573,10 @@ Vector<Strong<JSObject>> KeyframeEffect::getKeyframes(ExecState& state)
             // 1. Initialize a dictionary object, output keyframe, using the following definition:
             //
             // dictionary BaseComputedKeyframe {
-            //      double?             offset = null;
-            //      double              computedOffset;
-            //      DOMString           easing = "linear";
-            //      CompositeOperation? composite = null;
+            //      double?                  offset = null;
+            //      double                   computedOffset;
+            //      DOMString                easing = "linear";
+            //      CompositeOperationOrAuto composite = "auto";
             // };
 
             auto& keyframe = m_blendingKeyframes[i];
@@ -622,10 +618,10 @@ Vector<Strong<JSObject>> KeyframeEffect::getKeyframes(ExecState& state)
             // 1. Initialize a dictionary object, output keyframe, using the following definition:
             //
             // dictionary BaseComputedKeyframe {
-            //      double?             offset = null;
-            //      double              computedOffset;
-            //      DOMString           easing = "linear";
-            //      CompositeOperation? composite = null;
+            //      double?                  offset = null;
+            //      double                   computedOffset;
+            //      DOMString                easing = "linear";
+            //      CompositeOperationOrAuto composite = "auto";
             // };
 
             auto& parsedKeyframe = m_parsedKeyframes[i];
index 8912453..e973e6f 100644 (file)
@@ -28,6 +28,7 @@
 #include "AnimationEffect.h"
 #include "CSSPropertyBlendingClient.h"
 #include "CompositeOperation.h"
+#include "CompositeOperationOrAuto.h"
 #include "EffectTiming.h"
 #include "Element.h"
 #include "IterationCompositeOperation.h"
@@ -55,13 +56,13 @@ public:
     struct BasePropertyIndexedKeyframe {
         Variant<std::nullptr_t, Vector<std::optional<double>>, double> offset = Vector<std::optional<double>>();
         Variant<Vector<String>, String> easing = Vector<String>();
-        Variant<std::nullptr_t, Vector<std::optional<CompositeOperation>>, CompositeOperation> composite = Vector<std::optional<CompositeOperation>>();
+        Variant<Vector<CompositeOperationOrAuto>, CompositeOperationOrAuto> composite = Vector<CompositeOperationOrAuto>();
     };
 
     struct BaseKeyframe {
         std::optional<double> offset;
         String easing { "linear" };
-        std::optional<CompositeOperation> composite;
+        CompositeOperationOrAuto composite { CompositeOperationOrAuto::Auto };
     };
 
     struct PropertyAndValues {
@@ -77,7 +78,7 @@ public:
     struct ParsedKeyframe {
         std::optional<double> offset;
         double computedOffset;
-        std::optional<CompositeOperation> composite;
+        CompositeOperationOrAuto composite { CompositeOperationOrAuto::Auto };
         String easing;
         RefPtr<TimingFunction> timingFunction;
         Ref<MutableStyleProperties> style;
@@ -93,7 +94,7 @@ public:
         std::optional<double> offset;
         double computedOffset;
         String easing { "linear" };
-        std::optional<CompositeOperation> composite;
+        CompositeOperationOrAuto composite { CompositeOperationOrAuto::Auto };
     };
 
     Element* target() const { return m_target.get(); }
index d86e29d..7b232a5 100644 (file)
 dictionary BasePropertyIndexedKeyframe {
     (sequence<double?> or double?) offset = [];
     (sequence<DOMString> or DOMString) easing = [];
-    (sequence<CompositeOperation?> or CompositeOperation?) composite = [];
+    (sequence<CompositeOperationOrAuto> or CompositeOperationOrAuto) composite = [];
 };
 
 dictionary BaseKeyframe {
     double? offset = null;
     DOMString easing = "linear";
-    CompositeOperation? composite = null;
+    CompositeOperationOrAuto composite = "auto";
 };
 
 [
@@ -57,5 +57,5 @@ dictionary BaseKeyframe {
      double? offset = null;
      double computedOffset;
      DOMString easing = "linear";
-     CompositeOperation? composite = null;
+     CompositeOperationOrAuto composite = "auto";
 };