File: promise-resolution-order.html

package info (click to toggle)
thunderbird 1%3A140.4.0esr-1~deb13u1
  • links: PTS, VCS
  • area: main
  • in suites: trixie-proposed-updates
  • size: 4,609,412 kB
  • sloc: cpp: 7,672,442; javascript: 5,901,613; ansic: 3,898,954; python: 1,413,343; xml: 653,997; asm: 462,286; java: 180,927; sh: 113,489; makefile: 20,460; perl: 14,288; objc: 13,059; yacc: 4,583; pascal: 3,352; lex: 1,720; ruby: 1,222; exp: 762; sql: 715; awk: 580; php: 436; lisp: 430; sed: 70; csh: 10
file content (70 lines) | stat: -rw-r--r-- 2,025 bytes parent folder | download | duplicates (19)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<!DOCTYPE html>
<meta charset="utf-8">
<title>Promise rejection ordering</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<link rel="help" href="https://html.spec.whatwg.org/multipage/webappapis.html#perform-a-microtask-checkpoint">
<body>
<p>A microtask checkpoint should notify about rejected promises. After
<a
href="https://html.spec.whatwg.org/multipage/webappapis.html#clean-up-after-running-script">cleaning
up after running script</a> involves running a microtask checkpoint. So the order of unhandledrejection
should occur before error2.
</p>

<script>
'use strict';
setup({ allow_uncaught_exception: true });

async_test(function(t) {
  const events = [];
  addEventListener('unhandledrejection', t.step_func(() => {
    events.push('unhandledrejection');
  }));

  function insertInvalidScript(id) {
    // Inserting <script> with an empty source schedules dispatching an 'error' event on
    // the dom manipulation task source.
    let script = document.createElement('script');
    script.setAttribute('src', '   ');
    script.addEventListener('error', t.step_func(() => {
      events.push(`error${id}`);

      // This will be the end of the test. Verify the results are correct.
      if (id == 2) {
        assert_array_equals(
          events,
          [
            'raf1',
            'resolve1',
            'raf2',
            'resolve2',
            'error1',
            'unhandledrejection',
            'error2'
          ]
        );
        t.done();
      }
    }));
    document.body.append(script);
  }

  requestAnimationFrame(t.step_func(() => {
    events.push('raf1');
    Promise.reject();
    Promise.resolve(0).then(t.step_func(() => {
      events.push('resolve1');
    }));
    insertInvalidScript(1);
  }));

  requestAnimationFrame(t.step_func(() => {
    events.push('raf2');
    Promise.resolve(0).then(t.step_func(() => {
      events.push('resolve2');
    }));
    insertInvalidScript(2);
  }));
});
</script>