File: nav2-test-timing-persistent.html

package info (click to toggle)
thunderbird 1%3A140.4.0esr-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,609,432 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 (116 lines) | stat: -rw-r--r-- 4,202 bytes parent folder | download | duplicates (10)
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<!DOCTYPE HTML>
<html>

<head>
  <meta charset=utf-8>
  <title>PerformanceNavigationTiming timing remains after iframe removed</title>
  <script src="/resources/testharness.js"></script>
  <script src="/resources/testharnessreport.js"></script>
  <script src="/common/get-host-info.sub.js"></script>
</head>

<body>
  <script>
    const start_page = "/navigation-timing/resources/blank_page_green.html";
    const end_page = "/navigation-timing/resources/blank_page_yellow.html";
    const host_info = get_host_info();

    const same_origin_redirect_chain = () => {
      let url = host_info["ORIGIN"];
      url += "/common/redirect.py";
      url += "?location=";
      url += host_info["ORIGIN"];
      url += end_page;
      return url;
    };

    const timingAttributes = [
      'domComplete',
      'domContentLoadedEventEnd',
      'domContentLoadedEventStart',
      'domInteractive',
      //'criticalCHRestart' is not supported in iframe.
      'unloadEventStart',
      'unloadEventEnd',
      'loadEventStart',
      'loadEventEnd',
      'redirectCount',
      'redirectStart',
      'redirectEnd',
      'fetchStart',
      'responseEnd',
    ];

    function verify_timing(pnt, description) {
      for (const att of timingAttributes) {
        assert_greater_than(pnt[att], 0, `${description} ${att}`);
      }
    }

    promise_test(async function (t) {
      const iframe = document.createElement("iframe");
      document.body.appendChild(iframe);

      // Navigate from one location to another, then redirect. As a result, the tested fields contain non-zero values.
      await new Promise(resolve => {
        iframe.onload = function () {
          step_timeout(() => { iframe.contentWindow.location.href = same_origin_redirect_chain(); }, 10);
          iframe.onload = resolve;
        }
        iframe.src = start_page;
      });

      await new Promise(resolve => {
        const entries = iframe.contentWindow.performance.getEntriesByType("navigation");
        assert_equals(entries.length, 1, "Only one navigation time entry");
        const pnt = entries[0];
        assert_equals(pnt.name, iframe.contentWindow.location.toString(), "navigation name matches the window.location");
        assert_true(pnt.name.endsWith("blank_page_yellow.html"), "navigation name is blank_page_yellow.html");
        verify_timing(pnt, "timing values should be positive numbers:")
        iframe.remove();
        verify_timing(pnt, "timing values should remain positive numbers after iframe is removed:")
        resolve();
      })
    }, "iframe navigation times are persistent after the iframe is removed. Part 1.");

    function getOutOfLoadEventHandler(t) {
      return new Promise(resolve => t.step_timeout(resolve, 0));
    }

    function waitForLoad(obj) {
      return new Promise(resolve => {
        obj.addEventListener("load", resolve, { once: true });
      });
    }

    // 'type' entry should be persistent.
    promise_test(async function (t) {
      const iframe = document.createElement("iframe");
      document.body.appendChild(iframe);

      iframe.src = start_page;
      await waitForLoad(iframe);
      await getOutOfLoadEventHandler(t);
      iframe.contentWindow.location.href = end_page;
      await waitForLoad(iframe);

      iframe.contentWindow.history.back();
      await waitForLoad(iframe);

      await new Promise(resolve => {
        const entries = iframe.contentWindow.performance.getEntriesByType("navigation");
        assert_equals(entries.length, 1, "Only one navigation time entry");
        const pnt = entries[0];
        assert_equals(pnt.name, iframe.contentWindow.location.toString(), "navigation name matches the window.location");
        assert_true(pnt.name.endsWith("blank_page_green.html"), "navigation name is blank_page_green.html");
        assert_equals(pnt.type, "back_forward", "type should be back_forward after going back to history");
        iframe.remove();
        assert_equals(pnt.type, "back_forward", "type should remain back_forward after iframe is removed");
        resolve();
      })
    }, "iframe navigation times are persistent after the iframe is removed Part 2.");

  </script>
</body>

</html>