| 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
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 
 | <!DOCTYPE html>
<meta charset="utf-8">
<title>content-visibility and layout containment</title>
<link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility">
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1765615">
<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/rendering-utils.js"></script>
<meta name="assert" content="content-visibility: auto and elements skipping their content change the used value of the contain property to turn on layout containment.">
<style>
  /* Selectors for content-visibility */
  #spacer_for_far_to_viewport {
      height: 300vh;
  }
  .content_visibility {
      /* Dynamic modification of content-visibility may change whether style
         containment is applied, which in turn may cause drastic invalidations
         (e.g. rebuilding counters). Make the test more robust by forcing
         style containment to always apply. */
      contain: style;
  }
  #visible .content_visibility {
      content-visibility: visible;
  }
  #hidden .content_visibility {
      content-visibility: hidden;
  }
  #auto_far .content_visibility {
      content-visibility: auto;
  }
  #auto_close .content_visibility {
      content-visibility: auto;
  }
  #visible_to_hidden .content_visibility {
      content-visibility: visible;
  }
  #hidden_to_visible .content_visibility {
      content-visibility: hidden;
  }
  #visible_to_auto .content_visibility {
      content-visibility: visible;
  }
  #auto_to_visible .content_visibility {
      content-visibility: auto;
  }
  /* Selectors for testing baseline */
  .flex {
      display: inline-flex;
      align-items: baseline;
  }
  .rect {
      background: black;
      width: 50px;
      height: 100px;
  }
</style>
<body>
  <div id="log"></div>
  <div id="visible">
    <div class="flex">
      <div class="rect"></div>
      <div class="content_visibility rect">X</div>
    </div>
  </div>
  <div id="hidden">
    <div class="flex">
      <div class="rect"></div>
      <div class="content_visibility rect">X</div>
    </div>
  </div>
  <div id="auto_close">
    <div class="flex">
      <div class="rect"></div>
      <div class="content_visibility rect">X</div>
    </div>
  </div>
  <div id="visible_to_hidden">
    <div class="flex">
      <div class="rect"></div>
      <div class="content_visibility rect">X</div>
    </div>
  </div>
  <div id="hidden_to_visible">
    <div class="flex">
      <div class="rect"></div>
      <div class="content_visibility rect">X</div>
    </div>
  </div>
  <div id="visible_to_auto">
    <div class="flex">
      <div class="rect"></div>
      <div class="content_visibility rect">X</div>
    </div>
  </div>
  <div id="auto_to_visible">
    <div class="flex">
      <div class="rect"></div>
      <div class="content_visibility rect">X</div>
    </div>
  </div>
  <div id="spacer_for_far_to_viewport"></div>
  <div id="auto_far">
    <div class="flex">
      <div class="rect"></div>
      <div class="content_visibility rect">X</div>
    </div>
  </div>
  <script>
    function layoutContainmentApplied(id) {
        let container = document.getElementById(id);
        let content_visibility = container.getElementsByClassName("content_visibility")[0];
        // To verify layout containment, we test baseline suppression.
        // See contain-layout-dynamic-001.html for more details.
        let item1 = content_visibility;
        let item2 = item1.previousElementSibling;
        return Math.abs(item1.getBoundingClientRect().top - item2.getBoundingClientRect().top) <= 1;
    }
    function setContentVisibility(id, value) {
        let container = document.getElementById(id);
        let content_visibility = container.getElementsByClassName("content_visibility")[0];
        content_visibility.style.contentVisibility = value;
    }
    promise_test(async () => {
        await document.fonts.ready;
        assert_false(layoutContainmentApplied("visible"));
    }, "content-visibility: visible");
    promise_test(async () => {
        await document.fonts.ready;
        assert_true(layoutContainmentApplied("hidden"));
    }, "content-visibility: hidden");
    promise_test(async () => {
        await document.fonts.ready;
        await waitForAtLeastOneFrame();
        assert_true(layoutContainmentApplied("auto_far"));
    }, "content-visibility: auto (far from viewport)");
    promise_test(async () => {
        await document.fonts.ready;
        await waitForAtLeastOneFrame();
        assert_true(layoutContainmentApplied("auto_close"));
    }, "content-visibility: auto (close from viewport)");
    promise_test(async () => {
        await document.fonts.ready;
        setContentVisibility("visible_to_hidden", "hidden");
        assert_true(layoutContainmentApplied("visible_to_hidden"));
    }, "switching content-visibility from visible to hidden");
    promise_test(async () => {
        await document.fonts.ready;
        setContentVisibility("hidden_to_visible", "visible");
        assert_false(layoutContainmentApplied("hidden_to_visible"));
    }, "switching content-visibility from hidden to visible");
    promise_test(async () => {
        await document.fonts.ready;
        setContentVisibility("visible_to_auto", "auto");
        await waitForAtLeastOneFrame();
        assert_true(layoutContainmentApplied("visible_to_auto"));
    }, "switching content-visibility from visible to auto");
    promise_test(async () => {
        await document.fonts.ready;
        setContentVisibility("auto_to_visible", "visible");
        assert_false(layoutContainmentApplied("auto_to_visible"));
    }, "switching content-visibility from auto to visible");
  </script>
</body>
 |