[Web Animations] Support overlapping keyframes
authorgraouts@webkit.org <graouts@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 9 Jul 2018 23:48:52 +0000 (23:48 +0000)
committergraouts@webkit.org <graouts@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 9 Jul 2018 23:48:52 +0000 (23:48 +0000)
https://bugs.webkit.org/show_bug.cgi?id=187481
<rdar://problem/41988674>

Reviewed by Dean Jackson.

LayoutTests/imported/w3c:

Mark 20 new WPT progressions and 2 different failures.

* web-platform-tests/web-animations/animation-model/keyframe-effects/effect-value-overlapping-keyframes-expected.txt:
* web-platform-tests/web-animations/interfaces/Animatable/animate-expected.txt:
* web-platform-tests/web-animations/interfaces/KeyframeEffect/constructor-expected.txt:
* web-platform-tests/web-animations/interfaces/KeyframeEffect/setKeyframes-expected.txt:

Source/WebCore:

We now support parsing of multiple keyframes for the same offset.

* animation/KeyframeEffectReadOnly.cpp:
(WebCore::computeMissingKeyframeOffsets): Keyframes with a null offset that don't yet have a non-zero
computed offset are keyframes with an offset that needs to be computed.
(WebCore::KeyframeEffectReadOnly::processKeyframes): Only file an exception if an offset is found that
is lower than a previously-parsed one, allowing offsets with the same value.
* rendering/style/KeyframeList.cpp:
(WebCore::KeyframeList::insert): Remove the assertion that prevented an offset to be found more than once.

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

LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/web-animations/animation-model/keyframe-effects/effect-value-overlapping-keyframes-expected.txt
LayoutTests/imported/w3c/web-platform-tests/web-animations/interfaces/Animatable/animate-expected.txt
LayoutTests/imported/w3c/web-platform-tests/web-animations/interfaces/KeyframeEffect/constructor-expected.txt
LayoutTests/imported/w3c/web-platform-tests/web-animations/interfaces/KeyframeEffect/setKeyframes-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/animation/KeyframeEffectReadOnly.cpp
Source/WebCore/rendering/style/KeyframeList.cpp

index 2fd4f4d..6bd0bb7 100644 (file)
@@ -1,3 +1,18 @@
+2018-07-09  Antoine Quint  <graouts@apple.com>
+
+        [Web Animations] Support overlapping keyframes
+        https://bugs.webkit.org/show_bug.cgi?id=187481
+        <rdar://problem/41988674>
+
+        Reviewed by Dean Jackson.
+
+        Mark 20 new WPT progressions and 2 different failures.
+
+        * web-platform-tests/web-animations/animation-model/keyframe-effects/effect-value-overlapping-keyframes-expected.txt:
+        * web-platform-tests/web-animations/interfaces/Animatable/animate-expected.txt:
+        * web-platform-tests/web-animations/interfaces/KeyframeEffect/constructor-expected.txt:
+        * web-platform-tests/web-animations/interfaces/KeyframeEffect/setKeyframes-expected.txt:
+
 2018-07-09  Youenn Fablet  <youenn@apple.com>
 
         StringView operator==(char*) should check the length of the string
index fc2cf74..5513793 100644 (file)
@@ -1,4 +1,4 @@
 
-FAIL Overlapping keyframes at 0 and 1 use the appropriate value when the progress is outside the range [0, 1] Type error
-FAIL Overlapping keyframes between 0 and 1 use the appropriate value on each side of the overlap point Type error
+FAIL Overlapping keyframes at 0 and 1 use the appropriate value when the progress is outside the range [0, 1] assert_equals: When progress is zero the last keyframe with offset 0 should be used expected "0.2" but got "0.20000000298023224"
+FAIL Overlapping keyframes between 0 and 1 use the appropriate value on each side of the overlap point assert_equals: Before the overlap point, the first keyframe from the overlap point should be used as interval endpoint expected "0.15" but got "0.15000000596046448"
 
index 362e7b8..695963e 100644 (file)
@@ -54,9 +54,9 @@ PASS Element.animate() accepts a two property keyframe sequence where one proper
 PASS Element.animate() accepts a one property two keyframe sequence that needs to stringify its values 
 PASS Element.animate() accepts a keyframe sequence with a CSS variable reference 
 PASS Element.animate() accepts a keyframe sequence with a CSS variable reference in a shorthand property 
-FAIL Element.animate() accepts a keyframe sequence with duplicate values for a given interior offset Type error
-FAIL Element.animate() accepts a keyframe sequence with duplicate values for offsets 0 and 1 Type error
-FAIL Element.animate() accepts a two property four keyframe sequence Type error
+PASS Element.animate() accepts a keyframe sequence with duplicate values for a given interior offset 
+PASS Element.animate() accepts a keyframe sequence with duplicate values for offsets 0 and 1 
+PASS Element.animate() accepts a two property four keyframe sequence 
 PASS Element.animate() accepts a single keyframe sequence with omitted offset 
 PASS Element.animate() accepts a single keyframe sequence with null offset 
 PASS Element.animate() accepts a single keyframe sequence with string offset 
@@ -64,8 +64,8 @@ PASS Element.animate() accepts a one property keyframe sequence with some omitte
 PASS Element.animate() accepts a one property keyframe sequence with some null offsets 
 PASS Element.animate() accepts a two property keyframe sequence with some omitted offsets 
 PASS Element.animate() accepts a one property keyframe sequence with all omitted offsets 
-FAIL Element.animate() accepts a keyframe sequence with different easing values, but the same easing value for a given offset Type error
-FAIL Element.animate() accepts a keyframe sequence with different composite values, but the same composite value for a given offset Type error
+PASS Element.animate() accepts a keyframe sequence with different easing values, but the same easing value for a given offset 
+PASS Element.animate() accepts a keyframe sequence with different composite values, but the same composite value for a given offset 
 PASS Element.animate() does not accept keyframes with an out-of-bounded positive offset 
 PASS Element.animate() does not accept keyframes with an out-of-bounded negative offset 
 PASS Element.animate() does not accept property-indexed keyframes not loosely sorted by offset 
index e67c844..a2d78eb 100644 (file)
@@ -99,12 +99,12 @@ PASS A KeyframeEffectReadOnly can be constructed with a keyframe sequence with a
 PASS A KeyframeEffectReadOnly constructed with a keyframe sequence with a CSS variable reference roundtrips 
 PASS A KeyframeEffectReadOnly can be constructed with a keyframe sequence with a CSS variable reference in a shorthand property 
 PASS A KeyframeEffectReadOnly constructed with a keyframe sequence with a CSS variable reference in a shorthand property roundtrips 
-FAIL A KeyframeEffectReadOnly can be constructed with a keyframe sequence with duplicate values for a given interior offset Type error
-FAIL A KeyframeEffectReadOnly constructed with a keyframe sequence with duplicate values for a given interior offset roundtrips Type error
-FAIL A KeyframeEffectReadOnly can be constructed with a keyframe sequence with duplicate values for offsets 0 and 1 Type error
-FAIL A KeyframeEffectReadOnly constructed with a keyframe sequence with duplicate values for offsets 0 and 1 roundtrips Type error
-FAIL A KeyframeEffectReadOnly can be constructed with a two property four keyframe sequence Type error
-FAIL A KeyframeEffectReadOnly constructed with a two property four keyframe sequence roundtrips Type error
+PASS A KeyframeEffectReadOnly can be constructed with a keyframe sequence with duplicate values for a given interior offset 
+PASS A KeyframeEffectReadOnly constructed with a keyframe sequence with duplicate values for a given interior offset roundtrips 
+PASS A KeyframeEffectReadOnly can be constructed with a keyframe sequence with duplicate values for offsets 0 and 1 
+PASS A KeyframeEffectReadOnly constructed with a keyframe sequence with duplicate values for offsets 0 and 1 roundtrips 
+PASS A KeyframeEffectReadOnly can be constructed with a two property four keyframe sequence 
+PASS A KeyframeEffectReadOnly constructed with a two property four keyframe sequence roundtrips 
 PASS A KeyframeEffectReadOnly can be constructed with a single keyframe sequence with omitted offset 
 PASS A KeyframeEffectReadOnly constructed with a single keyframe sequence with omitted offset roundtrips 
 PASS A KeyframeEffectReadOnly can be constructed with a single keyframe sequence with null offset 
@@ -119,10 +119,10 @@ PASS A KeyframeEffectReadOnly can be constructed with a two property keyframe se
 PASS A KeyframeEffectReadOnly constructed with a two property keyframe sequence with some omitted offsets roundtrips 
 PASS A KeyframeEffectReadOnly can be constructed with a one property keyframe sequence with all omitted offsets 
 PASS A KeyframeEffectReadOnly constructed with a one property keyframe sequence with all omitted offsets roundtrips 
-FAIL A KeyframeEffectReadOnly can be constructed with a keyframe sequence with different easing values, but the same easing value for a given offset Type error
-FAIL A KeyframeEffectReadOnly constructed with a keyframe sequence with different easing values, but the same easing value for a given offset roundtrips Type error
-FAIL A KeyframeEffectReadOnly can be constructed with a keyframe sequence with different composite values, but the same composite value for a given offset Type error
-FAIL A KeyframeEffectReadOnly constructed with a keyframe sequence with different composite values, but the same composite value for a given offset roundtrips Type error
+PASS A KeyframeEffectReadOnly can be constructed with a keyframe sequence with different easing values, but the same easing value for a given offset 
+PASS A KeyframeEffectReadOnly constructed with a keyframe sequence with different easing values, but the same easing value for a given offset roundtrips 
+PASS A KeyframeEffectReadOnly can be constructed with a keyframe sequence with different composite values, but the same composite value for a given offset 
+PASS A KeyframeEffectReadOnly constructed with a keyframe sequence with different composite values, but the same composite value for a given offset roundtrips 
 PASS KeyframeEffectReadOnly constructor throws with keyframes with an out-of-bounded positive offset 
 PASS KeyframeEffectReadOnly constructor throws with keyframes with an out-of-bounded negative offset 
 PASS KeyframeEffectReadOnly constructor throws with property-indexed keyframes not loosely sorted by offset 
index 97b53c1..92cb9be 100644 (file)
@@ -47,9 +47,9 @@ PASS Keyframes can be replaced with a two property keyframe sequence where one p
 PASS Keyframes can be replaced with a one property two keyframe sequence that needs to stringify its values 
 PASS Keyframes can be replaced with a keyframe sequence with a CSS variable reference 
 PASS Keyframes can be replaced with a keyframe sequence with a CSS variable reference in a shorthand property 
-FAIL Keyframes can be replaced with a keyframe sequence with duplicate values for a given interior offset Type error
-FAIL Keyframes can be replaced with a keyframe sequence with duplicate values for offsets 0 and 1 Type error
-FAIL Keyframes can be replaced with a two property four keyframe sequence Type error
+PASS Keyframes can be replaced with a keyframe sequence with duplicate values for a given interior offset 
+PASS Keyframes can be replaced with a keyframe sequence with duplicate values for offsets 0 and 1 
+PASS Keyframes can be replaced with a two property four keyframe sequence 
 PASS Keyframes can be replaced with a single keyframe sequence with omitted offset 
 PASS Keyframes can be replaced with a single keyframe sequence with null offset 
 PASS Keyframes can be replaced with a single keyframe sequence with string offset 
@@ -57,8 +57,8 @@ PASS Keyframes can be replaced with a one property keyframe sequence with some o
 PASS Keyframes can be replaced with a one property keyframe sequence with some null offsets 
 PASS Keyframes can be replaced with a two property keyframe sequence with some omitted offsets 
 PASS Keyframes can be replaced with a one property keyframe sequence with all omitted offsets 
-FAIL Keyframes can be replaced with a keyframe sequence with different easing values, but the same easing value for a given offset Type error
-FAIL Keyframes can be replaced with a keyframe sequence with different composite values, but the same composite value for a given offset Type error
+PASS Keyframes can be replaced with a keyframe sequence with different easing values, but the same easing value for a given offset 
+PASS Keyframes can be replaced with a keyframe sequence with different composite values, but the same composite value for a given offset 
 PASS KeyframeEffect constructor throws with keyframes with an out-of-bounded positive offset 
 PASS KeyframeEffect constructor throws with keyframes with an out-of-bounded negative offset 
 PASS KeyframeEffect constructor throws with property-indexed keyframes not loosely sorted by offset 
index a91dad3..59c775f 100644 (file)
@@ -1,3 +1,21 @@
+2018-07-09  Antoine Quint  <graouts@apple.com>
+
+        [Web Animations] Support overlapping keyframes
+        https://bugs.webkit.org/show_bug.cgi?id=187481
+        <rdar://problem/41988674>
+
+        Reviewed by Dean Jackson.
+
+        We now support parsing of multiple keyframes for the same offset.
+
+        * animation/KeyframeEffectReadOnly.cpp:
+        (WebCore::computeMissingKeyframeOffsets): Keyframes with a null offset that don't yet have a non-zero
+        computed offset are keyframes with an offset that needs to be computed.
+        (WebCore::KeyframeEffectReadOnly::processKeyframes): Only file an exception if an offset is found that
+        is lower than a previously-parsed one, allowing offsets with the same value.
+        * rendering/style/KeyframeList.cpp:
+        (WebCore::KeyframeList::insert): Remove the assertion that prevented an offset to be found more than once.
+
 2018-07-09  Youenn Fablet  <youenn@apple.com>
 
         StringView operator==(char*) should check the length of the string
index aac126a..f94f321 100644 (file)
@@ -138,7 +138,9 @@ static inline void computeMissingKeyframeOffsets(Vector<KeyframeEffectReadOnly::
     size_t indexOfLastKeyframeWithNonNullOffset = 0;
     for (size_t i = 1; i < keyframes.size(); ++i) {
         auto& keyframe = keyframes[i];
-        if (!keyframe.computedOffset)
+        // Keyframes with a null offset that don't yet have a non-zero computed offset are keyframes
+        // with an offset that needs to be computed.
+        if (!keyframe.offset && !keyframe.computedOffset)
             continue;
         if (indexOfLastKeyframeWithNonNullOffset != i - 1) {
             double lastNonNullOffset = keyframes[indexOfLastKeyframeWithNonNullOffset].computedOffset;
@@ -631,7 +633,7 @@ ExceptionOr<void> KeyframeEffectReadOnly::processKeyframes(ExecState& state, Str
         if (!keyframe.offset)
             continue;
         auto offset = keyframe.offset.value();
-        if (offset <= lastNonNullOffset || offset < 0 || offset > 1)
+        if (offset < lastNonNullOffset || offset < 0 || offset > 1)
             return Exception { TypeError };
         lastNonNullOffset = offset;
     }
index 3533e1d..59d0d77 100644 (file)
@@ -59,11 +59,6 @@ void KeyframeList::insert(KeyframeValue&& keyframe)
     bool inserted = false;
     size_t i = 0;
     for (; i < m_keyframes.size(); ++i) {
-        if (m_keyframes[i].key() == keyframe.key()) {
-            ASSERT_NOT_REACHED();
-            break;
-        }
-
         if (m_keyframes[i].key() > keyframe.key()) {
             // insert before
             m_keyframes.insert(i, WTFMove(keyframe));