File: test_onGarbageCollection-04.js

package info (click to toggle)
firefox 147.0.3-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,683,320 kB
  • sloc: cpp: 7,607,359; javascript: 6,533,295; ansic: 3,775,223; python: 1,415,500; xml: 634,561; asm: 438,949; java: 186,241; sh: 62,752; makefile: 18,079; objc: 13,092; perl: 12,808; yacc: 4,583; cs: 3,846; pascal: 3,448; lex: 1,720; ruby: 1,003; php: 436; lisp: 258; awk: 247; sql: 66; sed: 54; csh: 10; exp: 6
file content (72 lines) | stat: -rw-r--r-- 1,992 bytes parent folder | download | duplicates (25)
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
// Test that the onGarbageCollection reentrancy guard is on a per Debugger
// basis. That is if our first Debugger is observing our second Debugger's
// compartment, and this second Debugger triggers a GC inside its
// onGarbageCollection hook, the first Debugger's onGarbageCollection hook is
// still called.
//
// This is the scenario we are setting up: top level debugging the `debuggeree`
// global, which is debugging the `debuggee` global. Then, we trigger the
// following events:
//
//     debuggee gc
//         |
//         V
//     debuggeree's onGarbageCollection
//         |
//         V
//     debuggeree gc
//         |
//         V
//     top level onGarbageCollection
//
// Note that the top level's onGarbageCollection hook should be fired, at the
// same time that we are preventing reentrancy into debuggeree's
// onGarbageCollection hook.

Services.prefs.setBoolPref("security.allow_eval_with_system_principal", true);
registerCleanupFunction(() => {
  Services.prefs.clearUserPref("security.allow_eval_with_system_principal");
});

function run_test() {
  do_test_pending();

  const debuggeree = newGlobal();
  const debuggee = debuggeree.debuggee = newGlobal();

  debuggeree.eval(
    `
    var dbg = new Debugger(this.debuggee);
    var fired = 0;
    dbg.memory.onGarbageCollection = _ => {
      fired++;
      gc(this);
    };
    `
  );

  const dbg = new Debugger(debuggeree);
  let fired = 0;
  dbg.memory.onGarbageCollection = _ => {
    fired++;
  };

  debuggee.eval(`gc(this)`);

  // Let first onGarbageCollection runnable get run.
  executeSoon(() => {

    // Let second onGarbageCollection runnable get run.
    executeSoon(() => {

      // Even though we request GC'ing a single zone, we can't rely on that
      // behavior and both zones could have been scheduled for gc for both
      // gc(this) calls.
      ok(debuggeree.fired >= 1);
      ok(fired >= 1);

      debuggeree.dbg.removeAllDebuggees();
      do_test_finished();
    });
  });
}