Index: third_party/WebKit/LayoutTests/imported/wpt/web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument.html |
diff --git a/third_party/WebKit/LayoutTests/imported/wpt/web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument.html b/third_party/WebKit/LayoutTests/imported/wpt/web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument.html |
index d0ee1bdeab223b8a515a9ce49c7ccce071dcd58c..d16831281886244953dc5288c3205ca5ce70f2c7 100644 |
--- a/third_party/WebKit/LayoutTests/imported/wpt/web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument.html |
+++ b/third_party/WebKit/LayoutTests/imported/wpt/web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument.html |
@@ -5,6 +5,7 @@ |
<script src="/resources/testharness.js"></script> |
<script src="/resources/testharnessreport.js"></script> |
<script src="../../testcommon.js"></script> |
+<script src="../../resources/keyframe-utils.js"></script> |
<body> |
<div id="log"></div> |
<div id="target"></div> |
@@ -79,7 +80,246 @@ gNonAnimatableProps.forEach(function(prop) { |
+ ' a keyframe sequence'); |
}); |
-// FIXME: Test that non-enumerable properties are not accessed |
+// Test equivalent forms of property indexed and sequenced keyframe syntax |
+ |
+function assertEquivalentKeyframeSyntax(keyframesA, keyframesB) { |
+ var processedKeyframesA = new KeyframeEffectReadOnly(null, keyframesA).getKeyframes(); |
+ var processedKeyframesB = new KeyframeEffectReadOnly(null, keyframesB).getKeyframes(); |
+ assert_frame_lists_equal(processedKeyframesA, processedKeyframesB); |
+} |
+ |
+var gEquivalentSyntaxTests = [ |
+ { |
+ description: 'two properties with one value', |
+ indexedKeyframes: { |
+ left: '100px', |
+ opacity: ['1'], |
+ }, |
+ sequencedKeyframes: [ |
+ {left: '100px', opacity: '1'}, |
+ ], |
+ }, |
+ { |
+ description: 'two properties with three values', |
+ indexedKeyframes: { |
+ left: ['10px', '100px', '150px'], |
+ opacity: ['1', '0', '1'], |
+ }, |
+ sequencedKeyframes: [ |
+ {left: '10px', opacity: '1'}, |
+ {left: '100px', opacity: '0'}, |
+ {left: '150px', opacity: '1'}, |
+ ], |
+ }, |
+ { |
+ description: 'two properties with different numbers of values', |
+ indexedKeyframes: { |
+ left: ['0px', '100px', '200px'], |
+ opacity: ['0', '1'] |
+ }, |
+ sequencedKeyframes: [ |
+ {left: '0px', opacity: '0'}, |
+ {left: '100px'}, |
+ {left: '200px', opacity: '1'}, |
+ ], |
+ }, |
+ { |
+ description: 'same offset applied to all keyframes', |
+ indexedKeyframes: { |
+ left: ['0px', '100px'], |
+ offset: 0.5, |
+ }, |
+ sequencedKeyframes: [ |
+ {left: '0px', offset: 0.5}, |
+ {left: '100px', offset: 0.5}, |
+ ], |
+ }, |
+ { |
+ description: 'same easing applied to all keyframes', |
+ indexedKeyframes: { |
+ left: ['10px', '100px', '150px'], |
+ opacity: ['1', '0', '1'], |
+ easing: 'ease', |
+ }, |
+ sequencedKeyframes: [ |
+ {left: '10px', opacity: '1', easing: 'ease'}, |
+ {left: '100px', opacity: '0', easing: 'ease'}, |
+ {left: '150px', opacity: '1', easing: 'ease'}, |
+ ], |
+ }, |
+ { |
+ description: 'same composite applied to all keyframes', |
+ indexedKeyframes: { |
+ left: ['0px', '100px'], |
+ composite: 'add', |
+ }, |
+ sequencedKeyframes: [ |
+ {left: '0px', composite: 'add'}, |
+ {left: '100px', composite: 'add'}, |
+ ], |
+ }, |
+]; |
+ |
+gEquivalentSyntaxTests.forEach(function({description, indexedKeyframes, sequencedKeyframes}) { |
+ test(function(t) { |
+ assertEquivalentKeyframeSyntax(indexedKeyframes, sequencedKeyframes); |
+ }, 'Equivalent property indexed and sequenced keyframes: ' + description); |
+}); |
+ |
+// Test handling of custom iterable objects. |
+ |
+function createIterable(iterations) { |
+ return { |
+ [Symbol.iterator]() { |
+ var i = 0; |
+ return { |
+ next() { |
+ return iterations[i++]; |
+ }, |
+ }; |
+ }, |
+ }; |
+} |
+ |
+test(() => { |
+ var effect = new KeyframeEffect(null, createIterable([ |
+ {done: false, value: {left: '100px'}}, |
+ {done: false, value: {left: '300px'}}, |
+ {done: false, value: {left: '200px'}}, |
+ {done: true}, |
+ ])); |
+ assert_frame_lists_equal(effect.getKeyframes(), [ |
+ {offset: null, computedOffset: 0, easing: 'linear', left: '100px'}, |
+ {offset: null, computedOffset: 0.5, easing: 'linear', left: '300px'}, |
+ {offset: null, computedOffset: 1, easing: 'linear', left: '200px'}, |
+ ]); |
+}, 'Custom iterator with basic keyframes.'); |
+ |
+test(() => { |
+ var keyframes = createIterable([ |
+ {done: false, value: {left: '100px'}}, |
+ {done: false, value: {left: '300px'}}, |
+ {done: false, value: {left: '200px'}}, |
+ {done: true}, |
+ ]); |
+ keyframes.easing = 'ease-in-out'; |
+ keyframes.offset = '0.1'; |
+ var effect = new KeyframeEffect(null, keyframes); |
+ assert_frame_lists_equal(effect.getKeyframes(), [ |
+ {offset: null, computedOffset: 0, easing: 'linear', left: '100px'}, |
+ {offset: null, computedOffset: 0.5, easing: 'linear', left: '300px'}, |
+ {offset: null, computedOffset: 1, easing: 'linear', left: '200px'}, |
+ ]); |
+}, 'easing and offset are ignored on iterable objects.'); |
+ |
+test(() => { |
+ var effect = new KeyframeEffect(null, createIterable([ |
+ {done: false, value: {left: '100px', top: '200px'}}, |
+ {done: false, value: {left: '300px'}}, |
+ {done: false, value: {left: '200px', top: '100px'}}, |
+ {done: true}, |
+ ])); |
+ assert_frame_lists_equal(effect.getKeyframes(), [ |
+ {offset: null, computedOffset: 0, easing: 'linear', left: '100px', top: '200px'}, |
+ {offset: null, computedOffset: 0.5, easing: 'linear', left: '300px'}, |
+ {offset: null, computedOffset: 1, easing: 'linear', left: '200px', top: '100px'}, |
+ ]); |
+}, 'Custom iterator with multiple properties specified.'); |
+ |
+test(() => { |
+ var effect = new KeyframeEffect(null, createIterable([ |
+ {done: false, value: {left: '100px'}}, |
+ {done: false, value: {left: '250px', offset: 0.75}}, |
+ {done: false, value: {left: '200px'}}, |
+ {done: true}, |
+ ])); |
+ assert_frame_lists_equal(effect.getKeyframes(), [ |
+ {offset: null, computedOffset: 0, easing: 'linear', left: '100px'}, |
+ {offset: 0.75, computedOffset: 0.75, easing: 'linear', left: '250px'}, |
+ {offset: null, computedOffset: 1, easing: 'linear', left: '200px'}, |
+ ]); |
+}, 'Custom iterator with offset specified.'); |
+ |
+test(() => { |
+ assert_throws({name: 'TypeError'}, function() { |
+ new KeyframeEffect(null, createIterable([ |
+ {done: false, value: {left: '100px'}}, |
+ {done: false, value: 1234}, |
+ {done: false, value: {left: '200px'}}, |
+ {done: true}, |
+ ])); |
+ }); |
+}, 'Custom iterator with non object keyframe should throw.'); |
+ |
+test(() => { |
+ var effect = new KeyframeEffect(null, createIterable([ |
+ {done: false, value: {left: ['100px', '200px']}}, |
+ {done: true}, |
+ ])); |
+ assert_frame_lists_equal(effect.getKeyframes(), [ |
+ {offset: null, computedOffset: 1, easing: 'linear', left: '100px,200px'} |
+ ]); |
+}, 'Custom iterator with value list in keyframe should give bizarre string representation of list.'); |
+ |
+test(function(t) { |
+ var keyframe = {}; |
+ Object.defineProperty(keyframe, 'width', {value: '200px'}); |
+ Object.defineProperty(keyframe, 'height', { |
+ value: '100px', |
+ enumerable: true}); |
+ assert_equals(keyframe.width, '200px', 'width of keyframe is readable'); |
+ assert_equals(keyframe.height, '100px', 'height of keyframe is readable'); |
+ var anim = createDiv(t).animate([keyframe, {height: '200px'}], 1); |
+ assert_frame_lists_equal(anim.effect.getKeyframes(), [ |
+ {offset: null, computedOffset: 0, easing: 'linear', height: '100px'}, |
+ {offset: null, computedOffset: 1, easing: 'linear', height: '200px'}, |
+ ]); |
+}, 'Only enumerable properties on keyframes are considered'); |
+ |
+test(function(t) { |
+ var KeyframeParent = function() { this.width = '100px'; }; |
+ KeyframeParent.prototype = { height: '100px' }; |
+ var Keyframe = function() { this.top = '100px'; }; |
+ Keyframe.prototype = Object.create(KeyframeParent.prototype); |
+ Object.defineProperty(Keyframe.prototype, 'left', { |
+ value: '100px', |
+ enumerable: 'true'}); |
+ var keyframe = new Keyframe(); |
+ var anim = createDiv(t).animate([keyframe, {top: '200px'}], 1); |
+ assert_frame_lists_equal(anim.effect.getKeyframes(), [ |
+ {offset: null, computedOffset: 0, easing: 'linear', top: '100px'}, |
+ {offset: null, computedOffset: 1, easing: 'linear', top: '200px'}, |
+ ]); |
+}, 'Only properties defined directly on keyframes are considered'); |
+ |
+test(function(t) { |
+ var keyframes = {}; |
+ Object.defineProperty(keyframes, 'width', ['100px', '200px']); |
+ Object.defineProperty(keyframes, 'height', { |
+ value: ['100px', '200px'], |
+ enumerable: true}); |
+ var anim = createDiv(t).animate(keyframes, 1); |
+ assert_frame_lists_equal(anim.effect.getKeyframes(), [ |
+ {offset: null, computedOffset: 0, easing: 'linear', height: '100px'}, |
+ {offset: null, computedOffset: 1, easing: 'linear', height: '200px'}, |
+ ]); |
+}, 'Only enumerable properties on property indexed keyframes are considered'); |
+ |
+test(function(t) { |
+ var KeyframesParent = function() { this.width = '100px'; }; |
+ KeyframesParent.prototype = { height: '100px' }; |
+ var Keyframes = function() { this.top = ['100px', '200px']; }; |
+ Keyframes.prototype = Object.create(KeyframesParent.prototype); |
+ Object.defineProperty(Keyframes.prototype, 'left', { |
+ value: ['100px', '200px'], |
+ enumerable: 'true'}); |
+ var keyframes = new Keyframes(); |
+ var anim = createDiv(t).animate(keyframes, 1); |
+ assert_frame_lists_equal(anim.effect.getKeyframes(), [ |
+ {offset: null, computedOffset: 0, easing: 'linear', top: '100px'}, |
+ {offset: null, computedOffset: 1, easing: 'linear', top: '200px'}, |
+ ]); |
+}, 'Only properties defined directly on property indexed keyframes are considered'); |
// FIXME: Test that properties are accessed in ascending order by Unicode |
// codepoint |