Bug 1915045 Ensure decode tasks are scheduled on BufferingState::Enter() r=media...
[gecko.git] / js / xpconnect / tests / unit / test_tearoffs.js
blob18b07d1da15928a4a77327f1fcf09ff3060e4a11
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 function TestInterfaceAll() {}
6 TestInterfaceAll.prototype = {
7   QueryInterface: ChromeUtils.generateQI(["nsIXPCTestInterfaceA",
8                                           "nsIXPCTestInterfaceB",
9                                           "nsIXPCTestInterfaceC"]),
11   /* nsIXPCTestInterfaceA / nsIXPCTestInterfaceB */
12   name: "TestInterfaceAllDefaultName",
14   /* nsIXPCTestInterfaceC */
15   someInteger: 42
18 function newWrappedJS() {
19   return xpcWrap(new TestInterfaceAll());
22 function run_test() {
23   // Shortcut the interfaces we're using.
24   var ifs = {
25     a: Ci['nsIXPCTestInterfaceA'],
26     b: Ci['nsIXPCTestInterfaceB'],
27     c: Ci['nsIXPCTestInterfaceC']
28   };
30   // Run through the logic a few times.
31   for (let i = 0; i < 2; ++i)
32     play_with_tearoffs(ifs);
35 function play_with_tearoffs(ifs) {
37   // Allocate a bunch of objects, QI-ed to B.
38   var instances = [];
39   for (var i = 0; i < 300; ++i)
40     instances.push(newWrappedJS().QueryInterface(ifs.b));
42   // Nothing to collect.
43   gc();
45   // QI them to A.
46   instances.forEach(function(v, i, a) { v.QueryInterface(ifs.a); });
48   // QI them to C.
49   instances.forEach(function(v, i, a) { v.QueryInterface(ifs.c); });
51   // Check
52   Assert.ok('name' in instances[10], 'Have the prop from A/B');
53   Assert.ok('someInteger' in instances[10], 'Have the prop from C');
55   // Grab tearoff reflections for a and b.
56   var aTearOffs = instances.map(function(v, i, a) { return v.nsIXPCTestInterfaceA; } );
57   var bTearOffs = instances.map(function(v, i, a) { return v.nsIXPCTestInterfaceB; } );
59   // Check
60   Assert.ok('name' in aTearOffs[1], 'Have the prop from A');
61   Assert.ok(!('someInteger' in aTearOffs[1]), 'Dont have the prop from C');
63   // Nothing to collect.
64   gc();
66   // Null out every even instance pointer.
67   for (var i = 0; i < instances.length; ++i)
68     if (i % 2 == 0)
69         instances[i] = null;
71   // Nothing to collect, since we still have the A and B tearoff reflections.
72   gc();
74   // Null out A tearoff reflections that are a multiple of 3.
75   for (var i = 0; i < aTearOffs.length; ++i)
76     if (i % 3 == 0)
77         aTearOffs[i] = null;
79   // Nothing to collect, since we still have the B tearoff reflections.
80   gc();
82   // Null out B tearoff reflections that are a multiple of 5.
83   for (var i = 0; i < bTearOffs.length; ++i)
84     if (i % 5 == 0)
85         bTearOffs[i] = null;
87   // This should collect every 30th object (indices that are multiples of 2, 3, and 5).
88   gc();
90   // Kill the b tearoffs entirely.
91   bTearOffs = 0;
93   // Collect more.
94   gc();
96   // Get C tearoffs.
97   var cTearOffs = instances.map(function(v, i, a) { return v ? v.nsIXPCTestInterfaceC : null; } );
99   // Check.
100   Assert.ok(!('name' in cTearOffs[1]), 'Dont have the prop from A');
101   Assert.ok('someInteger' in cTearOffs[1], 'have the prop from C');
103   // Null out the a tearoffs.
104   aTearOffs = null;
106   // Collect all even indices.
107   gc();
109   // Collect all indices.
110   instances = null;
111   gc();
113   // Give ourselves a pat on the back. :-)
114   Assert.ok(true, "Got all the way through without crashing!");