|  | <!doctype html> | 
|  | <meta charset=utf-8> | 
|  | <title>CSSTransition.startTime</title> | 
|  | <!-- TODO: Add a more specific link for this once it is specified. --> | 
|  | <link rel="help" href="https://drafts.csswg.org/css-transitions-2/#csstransition"> | 
|  | <script src="/resources/testharness.js"></script> | 
|  | <script src="/resources/testharnessreport.js"></script> | 
|  | <script src="support/helper.js"></script> | 
|  | <div id="log"></div> | 
|  | <script> | 
|  |  | 
|  | 'use strict'; | 
|  |  | 
|  | test(t => { | 
|  | const div = addDiv(t, { | 
|  | style: 'margin-left: 100px; transition: margin-left 100s linear 100s', | 
|  | }); | 
|  | getComputedStyle(div).marginLeft; | 
|  | div.style.marginLeft = '200px'; | 
|  | const animation = div.getAnimations()[0]; | 
|  |  | 
|  | assert_equals(animation.startTime, null, 'startTime is unresolved'); | 
|  | }, 'The start time of a newly-created transition is unresolved'); | 
|  |  | 
|  | promise_test(async t => { | 
|  | const div = addDiv(t); | 
|  |  | 
|  | div.style.left = '0px'; | 
|  | div.style.top = '0px'; | 
|  | getComputedStyle(div).transitionProperty; | 
|  |  | 
|  | div.style.transition = 'all 100s'; | 
|  | div.style.left = '100px'; | 
|  | div.style.top = '100px'; | 
|  |  | 
|  | let animations = div.getAnimations(); | 
|  | assert_equals(animations.length, 2); | 
|  | await waitForAllAnimations(animations); | 
|  |  | 
|  | assert_equals(animations[0].startTime, animations[1].startTime, | 
|  | 'CSS transitions started together have the same start time'); | 
|  |  | 
|  | await waitForAnimationFrames(1); | 
|  |  | 
|  | div.style.backgroundColor = 'green'; | 
|  |  | 
|  | animations = div.getAnimations(); | 
|  | assert_equals(animations.length, 3); | 
|  | await waitForAllAnimations(animations); | 
|  |  | 
|  | assert_less_than(animations[1].startTime, animations[2].startTime, | 
|  | 'A CSS transition added in a later frame has a later start time'); | 
|  | }, 'The start time of transitions is based on when they are generated'); | 
|  |  | 
|  | test(t => { | 
|  | const div = addDiv(t, { | 
|  | style: 'margin-left: 100px; transition: margin-left 100s linear 100s', | 
|  | }); | 
|  | getComputedStyle(div).marginLeft; | 
|  | div.style.marginLeft = '200px'; | 
|  | const animation = div.getAnimations()[0]; | 
|  |  | 
|  | const timelineTime = animation.timeline.currentTime; | 
|  | animation.startTime = timelineTime; | 
|  |  | 
|  | assert_times_equal( | 
|  | animation.startTime, | 
|  | timelineTime, | 
|  | 'Check setting of startTime actually works' | 
|  | ); | 
|  | }, 'The start time of a transition can be set'); | 
|  |  | 
|  | promise_test(async t => { | 
|  | const div = addDiv(t, { | 
|  | style: 'margin-left: 100px; transition: margin-left 100s linear 100s', | 
|  | }); | 
|  | getComputedStyle(div).marginLeft; | 
|  | div.style.marginLeft = '200px'; | 
|  | const animation = div.getAnimations()[0]; | 
|  |  | 
|  | await animation.ready; | 
|  |  | 
|  | const timelineTime = animation.timeline.currentTime; | 
|  | const marginLeft = () => parseFloat(getComputedStyle(div).marginLeft); | 
|  |  | 
|  | animation.startTime = timelineTime - 100 * MS_PER_SEC; | 
|  | assert_equals(marginLeft(), 100); | 
|  |  | 
|  | animation.startTime = timelineTime - 150 * MS_PER_SEC; | 
|  | assert_equals(marginLeft(), 150); | 
|  | }, 'The start time can be set to seek a transition'); | 
|  |  | 
|  | promise_test(async t => { | 
|  | const div = addDiv(t, { | 
|  | style: 'margin-left: 100px; transition: margin-left 100s linear 100s', | 
|  | }); | 
|  | const eventWatcher = new EventWatcher(t, div, [ | 
|  | 'transitionstart', | 
|  | 'transitionend', | 
|  | ]); | 
|  | getComputedStyle(div).marginLeft; | 
|  | div.style.marginLeft = '200px'; | 
|  | const animation = div.getAnimations()[0]; | 
|  |  | 
|  | await animation.ready; | 
|  |  | 
|  | const timelineTime = animation.timeline.currentTime; | 
|  |  | 
|  | animation.startTime = timelineTime - 100 * MS_PER_SEC; | 
|  | await frameTimeout( | 
|  | eventWatcher.wait_for('transitionstart'), | 
|  | 2, | 
|  | 'transitionstart' | 
|  | ); | 
|  |  | 
|  | animation.startTime = timelineTime - 200 * MS_PER_SEC; | 
|  | await frameTimeout( | 
|  | eventWatcher.wait_for('transitionend'), | 
|  | 2, | 
|  | 'transitionend' | 
|  | ); | 
|  | }, 'Seeking a transition using start time dispatches transition events'); | 
|  |  | 
|  | </script> |