summaryrefslogtreecommitdiffstats
path: root/js/xpconnect/tests/mochitest/test_weakRefs_cross_compartment.html
blob: 87e509b535875a63d0d276eb0e3f1e6aa5bec6ee (plain)
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
<!DOCTYPE HTML>
<html>
  <head>
    <meta charset="utf-8">
    <title>Test WeakRef works when target is in different compartment in the browser</title>
    <script src="/tests/SimpleTest/SimpleTest.js"></script>
    <script type="application/javascript">
      function go() {
        SimpleTest.waitForExplicitFinish();

        let Cu = SpecialPowers.Cu;
        let isSameCompartment = Cu.getJSTestingFunctions().isSameCompartment;

        // Open a new window, which will be from different compartment.
        let win = window.open();
        is(isSameCompartment(win, window), false,
           "Test for opeing a window from a different compartment.");

        let wr1, wr2, wr3;
        {
          let obj = {};

          // WeakRef and target are both from different compartment.
          wr1 = new win.WeakRef(new win.Object());

          // WeakRef is same compartment, but target isn't.
          wr2 = new WeakRef(new win.Object());

          // WeakRef is in different compartment, but target is.
          wr3 = new win.WeakRef(obj);

          obj = null;
        }

        // WeakRef should keep the target in the current task.
        isnot(wr1.deref(), undefined, "wr1.deref() should return its target.");
        isnot(wr2.deref(), undefined, "wr2.deref() should return its target.");
        isnot(wr3.deref(), undefined, "we3.deref() should return its target.");

        // Weakref should keep the target until the end of current Job, that
        // includes microtask(Promise).
        Promise.resolve().then(() => {
          isnot(wr1.deref(), undefined,
                "wr1.deref() should return its target in promise");
          isnot(wr2.deref(), undefined,
                "wr2.deref() should return its target in promise");
          isnot(wr3.deref(), undefined,
                "wr3.deref() should return its target in promise");
        });

        // setTimeout will launch a new job and call ClearKeptObjects().
        setTimeout(() => {
          // Call gc() forcibly to clear the target of wr.
          SpecialPowers.DOMWindowUtils.garbageCollect();

          is(wr1.deref(), undefined, "wr1.deref() should return undefined in the new job.");
          is(wr2.deref(), undefined, "wr2.deref() should return undefined in the new job.");
          is(wr3.deref(), undefined, "wr3.deref() should return undefined in the new job.");

          win.close();
          SimpleTest.finish();
        }, 0);
      }

    </script>
  </head>
  <body onload="go()"></body>
</html>