view-transition-waituntil-finished-promise.html (3412B)
1 <!DOCTYPE html> 2 <meta charset="utf-8"> 3 <title>View Transition: waitUntil delays the finished promise</title> 4 <link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/"> 5 <link rel="author" href="mailto:vmpstr@chromium.org"> 6 7 <script src="/resources/testharness.js"></script> 8 <script src="/resources/testharnessreport.js"></script> 9 10 <style> 11 #target { 12 width: 100px; 13 height: 100px; 14 view-transition-name: target; 15 } 16 ::view-transition-group(*) { 17 animation-duration: 1ms; 18 } 19 </style> 20 21 <div id=target></div> 22 23 <script> 24 promise_test(async t => { 25 assert_implements(document.startViewTransition, "View Transitions are not supported"); 26 assert_implements(ViewTransition.prototype.waitUntil, "ViewTransition.waitUntil is not available"); 27 28 let waitUntilPromiseResolve; 29 const waitUntilPromise = new Promise(resolve => { 30 waitUntilPromiseResolve = resolve; 31 }); 32 33 const transition = document.startViewTransition(() => {}); 34 transition.waitUntil(waitUntilPromise); 35 36 let finished = false; 37 transition.finished.then(() => { 38 finished = true; 39 }); 40 41 // Wait for longer than the animation duration. 42 await new Promise(resolve => t.step_timeout(resolve, 100)); 43 44 assert_false(finished, "transition.finished should not resolve before waitUntil promise"); 45 46 waitUntilPromiseResolve(); 47 await transition.finished; 48 49 assert_true(finished, "transition.finished should resolve after waitUntil promise"); 50 }, "View transition finished promise is delayed by waitUntil"); 51 52 promise_test(async t => { 53 assert_implements(document.startViewTransition, "View Transitions are not supported"); 54 55 let resolve1, resolve2; 56 const promise1 = new Promise(r => resolve1 = r); 57 const promise2 = new Promise(r => resolve2 = r); 58 59 const transition = document.startViewTransition(() => {}); 60 transition.waitUntil(promise1); 61 transition.waitUntil(promise2); 62 63 let finished = false; 64 transition.finished.then(() => finished = true); 65 66 // Wait for longer than the animation duration. 67 await new Promise(resolve => t.step_timeout(resolve, 100)); 68 assert_false(finished, "transition.finished should not resolve before first promise"); 69 70 resolve1(); 71 // Wait a bit to ensure the promise resolution propagates. 72 await new Promise(resolve => t.step_timeout(resolve, 10)); 73 assert_false(finished, "transition.finished should not resolve after first promise but before second"); 74 75 resolve2(); 76 await transition.finished; 77 assert_true(finished, "transition.finished should resolve after both promises"); 78 }, "View transition finished promise is delayed by multiple waitUntil calls"); 79 80 promise_test(async t => { 81 assert_implements(document.startViewTransition, "View Transitions are not supported"); 82 83 let reject1; 84 const promise1 = new Promise((_, r) => reject1 = r); 85 86 const transition = document.startViewTransition(() => {}); 87 transition.waitUntil(promise1); 88 89 let finished = false; 90 transition.finished.then(() => finished = true); 91 92 // Wait for longer than the animation duration. 93 await new Promise(resolve => t.step_timeout(resolve, 100)); 94 assert_false(finished, "transition.finished should not resolve before rejected promise"); 95 96 reject1(new DOMException("test", "AbortError")); 97 await transition.finished; 98 assert_true(finished, "transition.finished should resolve after rejected promise"); 99 }, "View transition finished promise is delayed by a rejecting waitUntil promise"); 100 </script>