<!doctype html> <meta charset=utf-8> <title>Web Animations API: DocumentTimeline tests</title> <script src="../testcommon.js"></script> <iframe src="data:text/html;charset=utf-8," width="10" height="10" id="iframe"></iframe> <iframe src="data:text/html;charset=utf-8,%3Chtml%20style%3D%22display%3Anone%22%3E%3C%2Fhtml%3E" width="10" height="10" id="hidden-iframe"></iframe> <script> 'use strict'; test(function() { assert_equals(document.timeline, document.timeline, 'document.timeline returns the same object every time'); var iframe = document.getElementById('iframe'); assert_not_equals(document.timeline, iframe.contentDocument.timeline, 'document.timeline returns a different object for each document'); assert_not_equals(iframe.contentDocument.timeline, null, 'document.timeline on an iframe is not null'); }, 'document.timeline identity tests', { help: 'http://dev.w3.org/fxtf/web-animations/#the-document-timeline', assert: [ 'Each document has a timeline called the document timeline' ], author: 'Brian Birtles' }); async_test(function(t) { assert_true(document.timeline.currentTime > 0, 'document.timeline.currentTime is positive'); // document.timeline.currentTime should be set even before document // load fires. We expect this code to be run before document load and hence // the above assertion is sufficient. // If the following assertion fails, this test needs to be redesigned. assert_true(document.readyState !== 'complete', 'Test is running prior to document load'); // Test that the document timeline's current time is measured from // navigationStart. // // We can't just compare document.timeline.currentTime to // window.performance.now() because currentTime is only updated on a sample // so we use requestAnimationFrame instead. window.requestAnimationFrame(t.step_func(function(rafTime) { assert_equals(document.timeline.currentTime, rafTime, 'document.timeline.currentTime matches' + ' requestAnimationFrame time'); t.done(); })); }, 'document.timeline.currentTime value tests', { help: [ 'http://dev.w3.org/fxtf/web-animations/#the-global-clock', 'http://dev.w3.org/fxtf/web-animations/#the-document-timeline' ], assert: [ 'The global clock is a source of monotonically increasing time values', 'The time values of the document timeline are calculated as a fixed' + ' offset from the global clock', 'the zero time corresponds to the navigationStart moment', 'the time value of each document timeline must be equal to the time ' + 'passed to animation frame request callbacks for that browsing context' ], author: 'Brian Birtles' }); async_test(function(t) { var valueAtStart = document.timeline.currentTime; var timeAtStart = window.performance.now(); while (window.performance.now() - timeAtStart < 100) { // Wait 100ms } assert_equals(document.timeline.currentTime, valueAtStart, 'document.timeline.currentTime does not change within a script block'); window.requestAnimationFrame(t.step_func(function() { assert_true(document.timeline.currentTime > valueAtStart, 'document.timeline.currentTime increases between script blocks'); t.done(); })); }, 'document.timeline.currentTime liveness tests', { help: 'http://dev.w3.org/fxtf/web-animations/#script-execution-and-live-updates-to-the-model', assert: [ 'The value returned by the currentTime attribute of a' + ' document timeline will not change within a script block' ], author: 'Brian Birtles' }); test(function() { var hiddenIFrame = document.getElementById('hidden-iframe'); assert_equals(typeof hiddenIFrame.contentDocument.timeline.currentTime, 'number', 'currentTime of an initially hidden subframe\'s timeline is a number'); assert_true(hiddenIFrame.contentDocument.timeline.currentTime >= 0, 'currentTime of an initially hidden subframe\'s timeline is >= 0'); }, 'document.timeline.currentTime hidden subframe test'); async_test(function(t) { var hiddenIFrame = document.getElementById('hidden-iframe'); // Don't run the test until after the iframe has completed loading or else the // contentDocument may change. var testToRunOnLoad = t.step_func(function() { // Remove display:none hiddenIFrame.style.display = 'block'; window.getComputedStyle(hiddenIFrame).display; window.requestAnimationFrame(t.step_func(function() { assert_true(hiddenIFrame.contentDocument.timeline.currentTime > 0, 'document.timeline.currentTime is positive after removing' + ' display:none'); var previousValue = hiddenIFrame.contentDocument.timeline.currentTime; // Re-introduce display:none hiddenIFrame.style.display = 'none'; window.getComputedStyle(hiddenIFrame).display; window.requestAnimationFrame(t.step_func(function() { assert_true( hiddenIFrame.contentDocument.timeline.currentTime >= previousValue, 'document.timeline.currentTime does not go backwards after' + ' re-setting display:none'); t.done(); })); })); }); if (hiddenIFrame.contentDocument.readyState === 'complete') { testToRunOnLoad(); } else { hiddenIFrame.addEventListener("load", testToRunOnLoad); } }, 'document.timeline.currentTime hidden subframe dynamic test'); done(); </script>