| 12
 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
 148
 
 | <!DOCTYPE html>
<meta charset="utf-8">
<title>ScrollTimeline current time algorithm - interaction with writing modes</title>
<link rel="help" href="https://wicg.github.io/scroll-animations/#current-time-algorithm">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/web-animations/testcommon.js"></script>
<script src="./testcommon.js"></script>
<body></body>
<script>
'use strict';
promise_test(async t => {
  const scrollerOverrides = new Map([['direction', 'rtl']]);
  const scroller = setupScrollTimelineTest(scrollerOverrides);
  const verticalScrollRange = scroller.scrollHeight - scroller.clientHeight;
  const horizontalScrollRange = scroller.scrollWidth - scroller.clientWidth;
  const blockScrollTimeline = new ScrollTimeline(
      {source: scroller, axis: 'block'});
  const inlineScrollTimeline = new ScrollTimeline(
      {source: scroller, axis: 'inline'});
  const horizontalScrollTimeline = new ScrollTimeline(
      {source: scroller, axis: 'x'});
  const verticalScrollTimeline = new ScrollTimeline(
      {source: scroller, axis: 'y'});
  // Unscrolled, all timelines should read a current time of 0 even though the
  // X-axis will have started at the right hand side for rtl.
  assert_percents_equal(blockScrollTimeline.currentTime, 0,
                        'Unscrolled block timeline');
  assert_percents_equal(inlineScrollTimeline.currentTime, 0,
                        'Unscrolled inline timeline');
  assert_percents_equal(horizontalScrollTimeline.currentTime, 0,
                        'Unscrolled horizontal timeline');
  assert_percents_equal(verticalScrollTimeline.currentTime, 0,
                        'Unscrolled vertical timeline');
  // The offset in the inline/horizontal direction should be inverted. The
  // block/vertical direction should be unaffected.
  scroller.scrollTop = 0.1 * verticalScrollRange;
  scroller.scrollLeft = -0.8 * horizontalScrollRange;
  // Wait for new animation frame  which allows the timeline to compute new
  // current time.
  await waitForNextFrame();
  assert_percents_equal(blockScrollTimeline.currentTime, 10,
                        'Scrolled block timeline');
  assert_percents_equal(inlineScrollTimeline.currentTime, 80,
                        'Scrolled inline timeline');
  assert_percents_equal(horizontalScrollTimeline.currentTime, 80,
                        'Scrolled horizontal timeline');
  assert_percents_equal(verticalScrollTimeline.currentTime, 10,
                        'Scrolled vertical timeline');
}, 'currentTime handles direction: rtl correctly');
promise_test(async t => {
  const scrollerOverrides = new Map([['writing-mode', 'vertical-rl']]);
  const scroller = setupScrollTimelineTest(scrollerOverrides);
  const verticalScrollRange = scroller.scrollHeight - scroller.clientHeight;
  const horizontalScrollRange = scroller.scrollWidth - scroller.clientWidth;
  const blockScrollTimeline = new ScrollTimeline(
      {source: scroller, axis: 'block'});
  const inlineScrollTimeline = new ScrollTimeline(
      {source: scroller, axis: 'inline'});
  const horizontalScrollTimeline = new ScrollTimeline(
      {source: scroller, axis: 'x'});
  const verticalScrollTimeline = new ScrollTimeline(
      {source: scroller, axis: 'y'});
  // Unscrolled, all timelines should read a current time of 0 even though the
  // X-axis will have started at the right hand side for vertical-rl.
  assert_percents_equal(blockScrollTimeline.currentTime, 0,
                        'Unscrolled block timeline');
  assert_percents_equal(inlineScrollTimeline.currentTime, 0,
                        'Unscrolled inline timeline');
  assert_percents_equal(horizontalScrollTimeline.currentTime, 0,
                        'Unscrolled horizontal timeline');
  assert_percents_equal(verticalScrollTimeline.currentTime, 0,
                        'Unscrolled vertical timeline');
  // For vertical-rl, the X-axis starts on the right-hand-side and is the block
  // axis. The Y-axis is normal but is the inline axis. For the
  // horizontal/vertical cases, horizontal starts on the right-hand-side and
  // vertical is normal.
  scroller.scrollTop = 0.1 * verticalScrollRange;
  scroller.scrollLeft = -0.8 * horizontalScrollRange;
  // Wait for new animation frame  which allows the timeline to compute new
  // current time.
  await waitForNextFrame();
  assert_percents_equal(blockScrollTimeline.currentTime, 80,
                        'Scrolled block timeline');
  assert_percents_equal(inlineScrollTimeline.currentTime, 10,
                        'Scrolled inline timeline');
  assert_percents_equal(horizontalScrollTimeline.currentTime, 80,
                        'Scrolled horizontal timeline');
  assert_percents_equal(verticalScrollTimeline.currentTime, 10,
                        'Scrolled vertical timeline');
}, 'currentTime handles writing-mode: vertical-rl correctly');
promise_test(async t => {
  const scrollerOverrides = new Map([['writing-mode', 'vertical-lr']]);
  const scroller = setupScrollTimelineTest(scrollerOverrides);
  const verticalScrollRange = scroller.scrollHeight - scroller.clientHeight;
  const horizontalScrollRange = scroller.scrollWidth - scroller.clientWidth;
  const blockScrollTimeline = new ScrollTimeline(
      {source: scroller, axis: 'block'});
  const inlineScrollTimeline = new ScrollTimeline(
      {source: scroller, axis: 'inline'});
  const horizontalScrollTimeline = new ScrollTimeline(
      {source: scroller, axis: 'x'});
  const verticalScrollTimeline = new ScrollTimeline(
      {source: scroller, axis: 'y'});
  // Unscrolled, all timelines should read a current time of 0.
  assert_percents_equal(blockScrollTimeline.currentTime, 0,
                        'Unscrolled block timeline');
  assert_percents_equal(inlineScrollTimeline.currentTime, 0,
                        'Unscrolled inline timeline');
  assert_percents_equal(horizontalScrollTimeline.currentTime, 0,
                        'Unscrolled horizontal timeline');
  assert_percents_equal(verticalScrollTimeline.currentTime, 0,
                        'Unscrolled vertical timeline');
  // For vertical-lr, both axes start at their 'normal' positions but the X-axis
  // is the block direction and the Y-axis is the inline direction. This does
  // not affect horizontal/vertical.
  scroller.scrollTop = 0.1 * verticalScrollRange;
  scroller.scrollLeft = 0.2 * horizontalScrollRange;
  // Wait for new animation frame  which allows the timeline to compute new
  // current time.
  await waitForNextFrame();
  assert_percents_equal(blockScrollTimeline.currentTime, 20,
                        'Scrolled block timeline');
  assert_percents_equal(inlineScrollTimeline.currentTime, 10,
                        'Scrolled inline timeline');
  assert_percents_equal(horizontalScrollTimeline.currentTime, 20,
                        'Scrolled horizontal timeline');
  assert_percents_equal(verticalScrollTimeline.currentTime, 10,
                        'Scrolled vertical timeline');
}, 'currentTime handles writing-mode: vertical-lr correctly');
</script>
 |