start-skip-start.html (2436B)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1"> 6 <title>Test start skip and then start on a view transition</title> 7 <link rel="help" href="https://www.w3.org/TR/css-view-transitions-1/"> 8 </head> 9 10 <script src="/resources/testharness.js"></script> 11 <script src="/resources/testharnessreport.js"></script> 12 13 <style> 14 :root { 15 view-transition-name: none; 16 } 17 #target { 18 width: 100px; 19 height: 100px; 20 background: blue; 21 contain: paint; 22 view-transition-name: target; 23 } 24 #target.update-1 { 25 height: 150px; 26 } 27 #target.update-2 { 28 height: 200px; 29 } 30 </style> 31 32 <body> 33 <div id="target"></div> 34 </body> 35 <script> 36 promise_test(async t => { 37 let rejected_promise_tally = 0; 38 const target = document.getElementById("target"); 39 assert_implements(document.startViewTransition, 40 "Missing document.startViewTransition"); 41 42 const verifyAbortedTransition = (promise) => { 43 return promise.then( 44 () => { assert_not_reached('transition aborted') }, 45 (reason) => { 46 assert_true(reason instanceof DOMException); 47 assert_equals(reason.code, DOMException.ABORT_ERR); 48 rejected_promise_tally++; 49 }); 50 }; 51 52 const vt1 = document.startViewTransition(() => { 53 target.className = 'update-1'; 54 }); 55 56 vt1.skipTransition(); 57 const vt2 = document.startViewTransition(() => { 58 assert_equals(target.className, 'update-1'); 59 target.className = 'update-2'; 60 }); 61 62 vt2.skipTransition(); 63 const vt3 = document.startViewTransition(() => { 64 assert_equals(target.className, 'update-2'); 65 }); 66 67 await verifyAbortedTransition(vt1.ready); 68 await verifyAbortedTransition(vt2.ready); 69 await vt3.ready; 70 71 assert_equals(rejected_promise_tally, 2, 72 'first 2 transitions were skipped'); 73 const sizeTransformAnimations = document.getAnimations().filter(a => { 74 return 'height' in a.effect.getKeyframes()[0]; 75 }); 76 assert_equals(sizeTransformAnimations.length, 1); 77 const startingHeight = 78 sizeTransformAnimations[0].effect.getKeyframes()[0].height; 79 80 assert_equals(startingHeight, '200px', 81 'Height change applied before capture'); 82 83 }, 'Synchronously starting a view transition blocks on DOM callback for ' + 84 'previously skipped transitions'); 85 86 </script> 87 </html>