File: position-try-fallbacks-003.html

package info (click to toggle)
thunderbird 1%3A143.0.1-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 4,703,968 kB
  • sloc: cpp: 7,770,492; javascript: 5,943,842; ansic: 3,918,754; python: 1,418,263; xml: 653,354; asm: 474,045; java: 183,079; sh: 111,238; makefile: 20,410; perl: 14,359; objc: 13,059; yacc: 4,583; pascal: 3,405; lex: 1,720; ruby: 999; exp: 762; sql: 715; awk: 580; php: 436; lisp: 430; sed: 69; csh: 10
file content (136 lines) | stat: -rw-r--r-- 4,329 bytes parent folder | download | duplicates (8)
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
<!DOCTYPE html>
<title>position-try-fallbacks:flip-block, only switch fallback if the current option doesn't fit</title>
<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
<link rel="help" href="https://drafts.csswg.org/css-anchor-position/#position-try-fallbacks">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/test-common.js"></script>
<style>
  #anchor {
    anchor-name: --a;
    margin-top: 200px;
    margin-left: 100px;
    width: 150px;
    height: 50px;
    background: blue;
  }
  #anchored1 {
    position: absolute;
    position-anchor: --a;
    position-area: top left;
    position-try-fallbacks: flip-block;
    width: 100px;
    height: 100px;
    background: hotpink;
  }
  #anchored2 {
    position: absolute;
    position-anchor: --a;
    position-area: top right;
    position-try-fallbacks: flip-block;
    width: 100px;
    height: 450px;
    background: yellow;
  }
</style>

<div id="scroller" style="position:relative; overflow-y:scroll; width:400px; height:400px;">
  <div id="anchor"></div>
  <div style="height:1000px;"></div>
  <div id="anchored1"></div>
  <div id="anchored2"></div>
</div>

<script>
  async function redisplay() {
    anchored1.style.display = "none";
    anchored2.style.display = "none";
    await waitUntilNextAnimationFrame();
    await waitUntilNextAnimationFrame();
    anchored1.style.display = "block";
    anchored2.style.display = "block";
    await waitUntilNextAnimationFrame();
    await waitUntilNextAnimationFrame();
  }

  promise_test(async () => {
    await waitUntilNextAnimationFrame();
    await waitUntilNextAnimationFrame();
    // Both options fits. Pick the first one.
    assert_equals(anchored1.offsetTop, 100);
    // None of the options for #anchor2 fits. Use the first one.
    assert_equals(anchored2.offsetTop, -250);
  }, 'initial position');

  promise_test(async () => {
    scroller.scrollTop = 100;
    await waitUntilNextAnimationFrame();
    await waitUntilNextAnimationFrame();
    assert_equals(anchored1.offsetTop, 100);
    assert_equals(anchored2.offsetTop, -250);
  }, 'scroll to 100');

  promise_test(async () => {
    scroller.scrollTop = 101;
    await waitUntilNextAnimationFrame();
    await waitUntilNextAnimationFrame();
    // The first option for #anchored1 no longer fits. Move to the second one,
    // which fits.
    assert_equals(anchored1.offsetTop, 250);
    // None of the options for #anchor2 fits. Keep using the first one.
    assert_equals(anchored2.offsetTop, -250);
  }, 'scroll to 101');

  promise_test(async () => {
    scroller.scrollTop = 100;
    await waitUntilNextAnimationFrame();
    await waitUntilNextAnimationFrame();
    // The first option fits again, but stay at the second option, since that
    // one too still fits.
    assert_equals(anchored1.offsetTop, 250);

    assert_equals(anchored2.offsetTop, -250);
  }, 'scroll back to 100');

  promise_test(async () => {
    await redisplay();
    // Redisplaying the anchored element should go through the options over
    // again, which means that the first options will be chosen.
    assert_equals(anchored1.offsetTop, 100);
    assert_equals(anchored2.offsetTop, -250);
  }, 'redisplay at 100');

  promise_test(async () => {
    scroller.scrollTop = 299;
    await waitUntilNextAnimationFrame();
    await waitUntilNextAnimationFrame();
    // The first option no longer fits. Move to the second one, which fits.
    assert_equals(anchored1.offsetTop, 250);

    assert_equals(anchored2.offsetTop, -250);
  }, 'scroll to 299');


  promise_test(async () => {
    scroller.scrollTop = 300;
    await waitUntilNextAnimationFrame();
    await waitUntilNextAnimationFrame();
    assert_equals(anchored1.offsetTop, 250);

    // The second option now fits.
    assert_equals(anchored2.offsetTop, 250);
  }, 'scroll to 300');

  promise_test(async () => {
    scroller.scrollTop = 0;
    await waitUntilNextAnimationFrame();
    await waitUntilNextAnimationFrame();

    // The second option still fits.
    assert_equals(anchored1.offsetTop, 250);

    // The second option no longer fits, but neither does the first one. Stay at
    // the second one.
    assert_equals(anchored2.offsetTop, 250);
  }, 'scroll back to 0');
</script>