tor-browser

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

gif-visibility-hidden-image-no-infinite-refresh.html (2486B)


      1 <!doctype html>
      2 <script src=/resources/testharness.js></script>
      3 <script src=/resources/testharnessreport.js></script>
      4 <title>Test that a visibility: hidden image doesn't keep the refresh driver running</title>
      5 <body>
      6 <script>
      7 const wu = SpecialPowers.wrap(window).windowUtils;
      8 async function assertVsyncDisabled(msg) {
      9  await new Promise(resolve => {
     10    function check() {
     11      if (wu.refreshDriverHasPendingTick) {
     12        requestIdleCallback(check, {timeout:300});
     13      } else {
     14        resolve();
     15      }
     16    }
     17    check();
     18  });
     19  assert_false(wu.refreshDriverHasPendingTick, msg);
     20 }
     21 
     22 async function assertVsyncEnabled(t, msg) {
     23  // Should be enough to guarantee there's a paint some of the time at least... We can't quite just await rAF since that trivially triggers the refresh driver machinery.
     24  await new Promise(r => t.step_timeout(r, 100));
     25  assert_true(wu.refreshDriverHasPendingTick, msg);
     26 }
     27 
     28 async function addImage() {
     29  let image = new Image();
     30  // Make extra sure that we've painted and decoded the image.
     31  await new Promise(r => {
     32    image.addEventListener("load", r, { once: true });
     33    image.src = "animated.gif";
     34    document.body.appendChild(image);
     35  });
     36  await image.decode();
     37  await new Promise(r => {
     38    requestAnimationFrame(() => requestAnimationFrame(r));
     39    assert_true(wu.refreshDriverHasPendingTick, "Should have a pending tick after rAF");
     40  });
     41  return image;
     42 }
     43 
     44 promise_test(async function(t) {
     45  let image = await addImage();
     46  await assertVsyncEnabled(t, "Vsync should be enabled when an animated image is visible");
     47 
     48  image.style.visibility = "hidden";
     49  await assertVsyncDisabled("Vsync should be disabled when image is hidden");
     50 
     51  image.style.visibility = "";
     52  await assertVsyncEnabled(t, "Vsync should be enabled when image becomes visible again");
     53 
     54  image.style.visibility = "hidden";
     55  await assertVsyncDisabled("Vsync should be enabled when image becomes hidden again");
     56 
     57  let secondImage = await addImage();
     58  await assertVsyncEnabled(t, "Vsync should be enabled when another image with the same request becomes visible");
     59 
     60  secondImage.style.visibility = "hidden";
     61  await assertVsyncDisabled("Vsync should be enabled when second image becomes hidden");
     62 
     63  secondImage.style.visibility = "";
     64  await assertVsyncEnabled(t, "Vsync should be enabled when the second image is dynamically shown");
     65 
     66  secondImage.remove();
     67  await assertVsyncDisabled("Vsync should be disabled when visible image is removed");
     68 });
     69 </script>