summaryrefslogtreecommitdiffstats
path: root/dom/animation/test/document-timeline/test_document-timeline.html
blob: 92a709e2f65a63cea7982ee3fc425d6c3ce2edf5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<!doctype html>
<meta charset=utf-8>
<title>Web Animations API: DocumentTimeline tests</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../testcommon.js"></script>
<iframe srcdoc='<html><meta charset=utf-8></html>' width="10" height="10" id="iframe"></iframe>
<iframe srcdoc='<html style="display:none"><meta charset=utf-8></html>' width="10" height="10" id="hidden-iframe"></iframe>
<div id="log"></div>
<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) {
  const { AppConstants } = SpecialPowers.ChromeUtils.import(
    "resource://gre/modules/AppConstants.jsm"
  );

  if (AppConstants.platform == "android") {
    // Skip this test case on Android since it frequently fails on the
    // environments. See bug 1761900.
    t.done();
  }

  assert_greater_than_equal(document.timeline.currentTime, 0,
    'document.timeline.currentTime is positive or zero');
  // 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';
    getComputedStyle(hiddenIFrame).display;

    window.requestAnimationFrame(t.step_func(function() {
      assert_greater_than(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';
      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');

</script>