tor-browser

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

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>