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>