|  | <!DOCTYPE html> | 
|  | <title>Verify that WorkletAnimation is correctly created</title> | 
|  | <link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/"> | 
|  |  | 
|  | <script src="/resources/testharness.js"></script> | 
|  | <script src="/resources/testharnessreport.js"></script> | 
|  | <script src="/web-animations/testcommon.js"></script> | 
|  | <script src="common.js"></script> | 
|  |  | 
|  | <style> | 
|  | .scroller { | 
|  | height: 100px; | 
|  | width: 100px; | 
|  | overflow: scroll; | 
|  | } | 
|  | .content { | 
|  | height: 500px; | 
|  | width: 500px; | 
|  | } | 
|  | </style> | 
|  |  | 
|  | <script> | 
|  | function CreateKeyframeEffect(element) { | 
|  | return new KeyframeEffect( | 
|  | element, | 
|  | [ | 
|  | { transform: 'translateY(0%)' }, | 
|  | { transform: 'translateY(100%)' } | 
|  | ], | 
|  | { duration: 3000, fill: 'forwards' } | 
|  | ); | 
|  | } | 
|  | </script> | 
|  | <script id="simple_animate" type="text/worklet"> | 
|  | registerAnimator("test-animator", class { | 
|  | animate(currentTime, effect) {} | 
|  | }); | 
|  | </script> | 
|  |  | 
|  | <div id='element'></div> | 
|  | <div id='element2'></div> | 
|  | <div class='scroller'> | 
|  | <div class='content'></div> | 
|  | </div> | 
|  |  | 
|  | <script> | 
|  | promise_test(async t => { | 
|  | await runInAnimationWorklet(document.getElementById('simple_animate').textContent); | 
|  | let effect = CreateKeyframeEffect(document.querySelector('#element')); | 
|  | let workletAnimation = new WorkletAnimation('test-animator', effect); | 
|  | assert_equals(workletAnimation.playState, 'idle'); | 
|  | assert_equals(workletAnimation.timeline, document.timeline); | 
|  | }, 'WorkletAnimation creation without timeline should use default documentation timeline'); | 
|  |  | 
|  | promise_test(async t => { | 
|  | await runInAnimationWorklet(document.getElementById('simple_animate').textContent); | 
|  | let effect = CreateKeyframeEffect(document.querySelector('#element')); | 
|  | let workletAnimation = new WorkletAnimation('test-animator', effect); | 
|  | assert_equals(workletAnimation.playState, 'idle'); | 
|  | }, 'WorkletAnimation creation with timeline should work'); | 
|  |  | 
|  | promise_test(async t => { | 
|  | await runInAnimationWorklet(document.getElementById('simple_animate').textContent); | 
|  | let iframe = document.createElement('iframe'); | 
|  | iframe.src = 'resources/iframe.html'; | 
|  | document.body.appendChild(iframe); | 
|  |  | 
|  | await waitForAnimationFrameWithCondition(_ => { | 
|  | return iframe.contentDocument.getElementById('iframe_box') != null; | 
|  | }); | 
|  | let iframe_document = iframe.contentDocument; | 
|  | let effect = CreateKeyframeEffect(iframe_document.getElementById('iframe_box')); | 
|  |  | 
|  | let animation_with_main_frame_timeline = | 
|  | new WorkletAnimation('test-animator', effect, document.timeline); | 
|  | assert_equals(animation_with_main_frame_timeline.timeline, document.timeline); | 
|  |  | 
|  | let animation_with_iframe_timeline = | 
|  | new WorkletAnimation('test-animator', effect, iframe_document.timeline); | 
|  | assert_equals(animation_with_iframe_timeline.timeline, iframe_document.timeline); | 
|  |  | 
|  | let animation_with_default_timeline = new WorkletAnimation('test-animator', effect); | 
|  | // The spec says that the default timeline is taken from 'the Document that is | 
|  | // associated with the window that is the current global object'. In this case | 
|  | // that is the main document's timeline, not the iframe (despite the target | 
|  | // being in the iframe). | 
|  | assert_equals(animation_with_default_timeline.timeline, document.timeline); | 
|  |  | 
|  | iframe.remove(); | 
|  | }, 'WorkletAnimation creation should choose the correct timeline based on the current global object'); | 
|  |  | 
|  | promise_test(async t => { | 
|  | await runInAnimationWorklet(document.getElementById('simple_animate').textContent); | 
|  | let effect = CreateKeyframeEffect(document.querySelector('#element')); | 
|  | let options = { my_param: 'foo', my_other_param: true }; | 
|  | let workletAnimation = new WorkletAnimation( | 
|  | 'test-animator', effect, document.timeline, options); | 
|  | assert_equals(workletAnimation.playState, 'idle'); | 
|  | }, 'WorkletAnimation creation with timeline and options should work'); | 
|  |  | 
|  | promise_test(async t => { | 
|  | await runInAnimationWorklet(document.getElementById('simple_animate').textContent); | 
|  | let effect = CreateKeyframeEffect(document.querySelector('#element')); | 
|  | let scroller = document.querySelector('.scroller'); | 
|  | let scrollTimeline = new ScrollTimeline( | 
|  | { scrollSource: scroller, orientation: 'inline' }); | 
|  | let workletAnimation = new WorkletAnimation( | 
|  | 'test-animator', effect, scrollTimeline); | 
|  | assert_equals(workletAnimation.playState, 'idle'); | 
|  | }, 'ScrollTimeline is a valid timeline for a WorkletAnimation'); | 
|  |  | 
|  | promise_test(async t => { | 
|  | await runInAnimationWorklet(document.getElementById('simple_animate').textContent); | 
|  | let constructorFunc = function() { new WorkletAnimation( | 
|  | 'test-animator', []); }; | 
|  | assert_throws_dom('NotSupportedError', constructorFunc); | 
|  | }, 'If there are no effects specified, object construction should fail'); | 
|  |  | 
|  | promise_test(async t => { | 
|  | await runInAnimationWorklet(document.getElementById('simple_animate').textContent); | 
|  | let effect = CreateKeyframeEffect(document.querySelector('#element')); | 
|  |  | 
|  | let otherDoc = document.implementation.createHTMLDocument(); | 
|  | let otherElement = otherDoc.createElement('div'); | 
|  | otherDoc.body.appendChild(otherElement); | 
|  | let otherEffect = CreateKeyframeEffect(otherElement); | 
|  |  | 
|  | let workletAnimation = new WorkletAnimation( | 
|  | 'test-animator', [ effect, otherEffect ]); | 
|  | assert_equals(workletAnimation.playState, 'idle'); | 
|  | }, 'Creating animation with effects from different documents is allowed'); | 
|  |  | 
|  | promise_test(async t => { | 
|  | await runInAnimationWorklet(document.getElementById('simple_animate').textContent); | 
|  | let effect = CreateKeyframeEffect(document.querySelector('#element')); | 
|  | let constructorFunc = function() { | 
|  | new WorkletAnimation('unregistered-animator', effect); | 
|  | }; | 
|  | assert_throws_dom('InvalidStateError', constructorFunc); | 
|  | }, 'Constructing worklet animation for unregisested animator should throw'); | 
|  | </script> |