File: structured-cloning-error-stack-optional.sub.window.js

package info (click to toggle)
firefox-esr 78.15.0esr-1~deb11u1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 3,301,156 kB
  • sloc: cpp: 5,665,905; javascript: 4,798,386; ansic: 2,878,233; python: 977,004; asm: 270,347; xml: 181,456; java: 111,756; sh: 72,926; makefile: 21,819; perl: 13,380; cs: 4,725; yacc: 4,565; objc: 3,026; pascal: 1,787; lex: 1,720; ada: 1,681; exp: 505; php: 436; lisp: 260; awk: 152; ruby: 103; csh: 80; sed: 53; sql: 45
file content (85 lines) | stat: -rw-r--r-- 2,136 bytes parent folder | download | duplicates (8)
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// META: script=/common/utils.js

// .stack properties on errors are unspecified, but are present in most
// browsers, most of the time. https://github.com/tc39/proposal-error-stacks/ tracks standardizing them.
// Tests will pass automatically if the .stack property isn't present.

stackTests(() => {
  return new Error('some message');
}, 'page-created Error');

stackTests(() => {
  return new DOMException('InvalidStateError', 'some message');
}, 'page-created DOMException');

stackTests(() => {
  try {
    Object.defineProperty();
  } catch (e) {
    return e;
  }
}, 'JS-engine-created TypeError');

stackTests(() => {
  try {
    HTMLParagraphElement.prototype.align;
  } catch (e) {
    return e;
  }
}, 'web API-created TypeError');

stackTests(() => {
  try {
    document.createElement('');
  } catch (e) {
    return e;
  }
}, 'web API-created DOMException');

function stackTests(errorFactory, description) {
  async_test(t => {
    const error = errorFactory();
    const originalStack = error.stack;

    if (!originalStack) {
      t.done();
      return;
    }

    const worker = new Worker('resources/echo-worker.js');
    worker.onmessage = t.step_func_done(e => {
      assert_equals(e.data.stack, originalStack);
    });

    worker.postMessage(error);
  }, description + ' (worker)');

  async_test(t => {
    const thisTestId = token();

    const error = errorFactory();
    const originalStack = error.stack;

    if (!originalStack) {
      t.done();
      return;
    }

    const iframe = document.createElement('iframe');
    window.addEventListener('message', t.step_func(e => {
      if (e.data.testId === thisTestId) {
        assert_equals(e.data.error.stack, originalStack);
        t.done();
      }
    }));

    iframe.onload = t.step_func(() => {
      iframe.contentWindow.postMessage({ error, testId: thisTestId }, "*");
    });

    const crossSiteEchoIFrame = new URL('resources/echo-iframe.html', location.href);
    crossSiteEchoIFrame.hostname = '{{hosts[alt][www1]}}';
    iframe.src = crossSiteEchoIFrame;
    document.body.append(iframe);
  }, description + ' (cross-site iframe)');
}