pseudo-rendering-invalidation.html (3263B)
1 <!DOCTYPE html> 2 <html class=reftest-wait> 3 <title>View transitions: invalidating VT pseudo elements renders correctly</title> 4 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/"> 5 <link rel="author" href="mailto:bokan@chromium.org"> 6 <link rel="match" href="pseudo-rendering-invalidation-ref.html"> 7 <meta name="fuzzy" content="maxDifference=0-20; totalPixels=0-300"> 8 9 <script src="/common/reftest-wait.js"></script> 10 <style> 11 :root { 12 view-transition-name: none; 13 background-color: red; 14 } 15 16 div { 17 position: absolute; 18 left: 0px; 19 top: 600px; 20 width: 100px; 21 height: 100px; 22 23 display: flex; 24 justify-content: center; 25 flex-direction: column; 26 align-items: center; 27 28 background: darkseagreen; 29 } 30 31 ::view-transition-group(*), 32 ::view-transition-image-pair(*), 33 ::view-transition-old(*), 34 ::view-transition-new(*) { 35 animation-play-state: paused; 36 } 37 38 ::view-transition { 39 background-color: limegreen; 40 } 41 42 ::view-transition-new(new) { 43 animation: none; 44 opacity: 1; 45 } 46 ::view-transition-old(new) { 47 animation: none; 48 opacity: 0; 49 } 50 51 ::view-transition-new(old) { 52 animation: none; 53 opacity: 0; 54 } 55 ::view-transition-old(old) { 56 animation: none; 57 opacity: 1; 58 } 59 60 .invalidateRoot::view-transition { 61 /* Making view-transition `display: none` will abort the transition. Changing 62 it to position: static (at least in Chrome) will cause it to rebuild its 63 layout tree. */ 64 position: static; 65 } 66 67 .invalidateGroup::view-transition-group(group) { 68 display: none; 69 } 70 71 .invalidateImagePair::view-transition-image-pair(imagepair) { 72 display: none; 73 } 74 75 .invalidateNew::view-transition-new(new) { 76 display: none; 77 } 78 79 .invalidateOld::view-transition-old(old) { 80 display: none; 81 } 82 83 </style> 84 85 <div style="left: 0px; top: 100px; view-transition-name:group;">Group</div> 86 <div style="left: 150px; top: 100px; view-transition-name:imagepair;">Image-Pair</div> 87 <div style="left: 0px; top: 250px; view-transition-name:old;">Old</div> 88 <div style="left: 150px; top: 250px; view-transition-name:new;">New</div> 89 90 <script> 91 failIfNot(document.startViewTransition, "Missing document.startViewTransition"); 92 93 async function rAF() { 94 return new Promise(resolve => requestAnimationFrame(resolve)); 95 } 96 97 async function performInvalidations() { 98 await rAF(); 99 await rAF(); 100 101 const docClassList = document.documentElement.classList; 102 const classNames = [ 103 'invalidateRoot', // Invalidates ::view-transition 104 'invalidateGroup', // Invalidates ::view-transition-group 105 'invalidateImagePair', // Invalidates ::view-transition-image-pair 106 'invalidateOld', // Invalidates ::view-transition-old 107 'invalidateNew' // Invalidates ::view-transition-new 108 ]; 109 110 for (let className of classNames) { 111 document.documentElement.classList.add(className); 112 await rAF(); 113 document.documentElement.classList.remove(className); 114 await rAF(); 115 } 116 } 117 118 // This test ensures each of the view-transition pseudos is able to be 119 // individually recreated after becoming display: none. 120 async function runTest() { 121 let transition = document.startViewTransition(); 122 await transition.ready; 123 await performInvalidations(); 124 takeScreenshot(); 125 } 126 127 onload = () => requestAnimationFrame(() => requestAnimationFrame(runTest)); 128 </script>