tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

content-visibility-auto-relevancy-updates.html (3552B)


      1 <!doctype html>
      2 <meta charset="utf-8">
      3 <title>Content Visibility: relevancy updates</title>
      4 <link rel="author" title="Frédéric Wang" href="mailto:fwang@igalia.com">
      5 <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility">
      6 <link rel="help" href="https://drafts.csswg.org/css-contain/#relevant-to-the-user">
      7 <link rel="help" href="https://drafts.csswg.org/css-contain/#cv-notes">
      8 <meta name="assert" content="Verify relevancy is properly updated for content-visibility: auto elements.">
      9 
     10 <script src="/resources/testharness.js"></script>
     11 <script src="/resources/testharnessreport.js"></script>
     12 
     13 <style>
     14  #spacer {
     15    height: 300vh;
     16  }
     17  #contentVisibilityAuto {
     18    content-visibility: auto;
     19    border: solid;
     20  }
     21 </style>
     22 <div>
     23  <div id="log"></div>
     24  <div tabindex="1" id="spacer"></div>
     25  <div tabindex="2" id="contentVisibilityAuto">
     26    <span>Hello, World!</span>
     27  </div>
     28 </div>
     29 
     30 <script>
     31 function tick() {
     32  return new Promise(r => {
     33    requestAnimationFrame(() => requestAnimationFrame(r));
     34  });
     35 }
     36 
     37 function contentVisibilityAutoElementIsRelevant() {
     38  // A content-visibility: auto element that is not relevant skips its contents,
     39  // which do not contribute to the result of innerText.
     40  return contentVisibilityAuto.innerText.length > 0;
     41 }
     42 
     43 function clearRelevancyReasons() {
     44  window.scrollTo(0, 0);
     45  spacer.focus({preventScroll: true});
     46  window.getSelection().empty();
     47 }
     48 
     49 promise_test(async function(t) {
     50  // Wait for page load.
     51  await new Promise(resolve => { window.addEventListener("load", resolve); });
     52 
     53  // Register cleanup method to reset relevancy.
     54  t.add_cleanup(clearRelevancyReasons);
     55 
     56  // Element should initially not be relevant.
     57  await tick();
     58  assert_false(contentVisibilityAutoElementIsRelevant(), "initial relevancy");
     59 
     60  // Make element close to the viewport.
     61  contentVisibilityAuto.firstElementChild.scrollIntoView();
     62  await tick();
     63  assert_true(contentVisibilityAutoElementIsRelevant(), "close to viewport");
     64 
     65  // Scroll away from the element again.
     66  window.scrollTo(0, 0);
     67  await tick();
     68  assert_false(contentVisibilityAutoElementIsRelevant(), "far from viewport");
     69 }, "Relevancy updated after changing proximity to the viewport.");
     70 
     71 promise_test(async function(t) {
     72  // Register cleanup method to reset relevancy.
     73  t.add_cleanup(clearRelevancyReasons);
     74 
     75  // Element should initially not be relevant.
     76  await tick();
     77  assert_false(contentVisibilityAutoElementIsRelevant(), "initial relevancy");
     78 
     79  // Focus the element.
     80  contentVisibilityAuto.focus({preventScroll: true});
     81  await tick();
     82  assert_true(contentVisibilityAutoElementIsRelevant(), "focused");
     83 
     84  // Unfocus the element again.
     85  spacer.focus({preventScroll: true});
     86  await tick();
     87  assert_false(contentVisibilityAutoElementIsRelevant(), "unfocused");
     88 }, "Relevancy updated after being focused/unfocused.");
     89 
     90 promise_test(async function(t) {
     91  // Register cleanup method to reset relevancy.
     92  t.add_cleanup(clearRelevancyReasons);
     93 
     94  // Element should initially not be relevant.
     95  await tick();
     96  assert_false(contentVisibilityAutoElementIsRelevant(), "initial relevancy");
     97 
     98  // Select the contents of the element.
     99  window.getSelection().selectAllChildren(contentVisibilityAuto);
    100  await tick();
    101  assert_true(contentVisibilityAutoElementIsRelevant(), "selected");
    102 
    103  // Unselect the contents of the element.
    104  window.getSelection().empty();
    105  await tick();
    106  assert_false(contentVisibilityAutoElementIsRelevant(), "unselected");
    107 }, "Relevancy updated after being selected/unselected.");
    108 
    109 </script>