blob: 0eb4d7942c544f3c4f58ef44aa2142420196eff9 [file] [log] [blame]
<head>
<script src="../resources/js-test-pre.js"></script>
</head>
<script>
function noop(x) {
}
function doGC() {
// GC twice to make sure everything is cleaned up.
for (var i = 0; i < 2; i++) {
gc();
}
}
var countOrig;
var countAfterCreate;
var countAfterGC;
var testObj;
var refOrig;
var refAfterGet;
var refAfterGetGC;
var refBeforePass;
var refAfterPass;
var refAfterPassAndGC;
function runtest() {
if (window.testRunner)
testRunner.dumpAsText();
// Test that objects are deleted after their JS references are released.
countOrig = plug.testObjectCount;
let x;
for (let i = 0; i < 50; ++i)
x = plug.testCreateTestObject();
countAfterCreate = plug.testObjectCount;
x = null;
doGC();
countAfterGC = plug.testObjectCount;
shouldBe('countAfterCreate === countOrig + 50', 'true');
shouldBe('countAfterGC < countAfterCreate', 'true');
// Test that the object refcount returns to normal after JS references
// are released.
testObj = plug.testObject;
refOrig = testObj.refCount;
for (let i = 0; i < 50; ++i)
plug.testObject;
refAfterGet = testObj.refCount;
doGC();
refAfterGetGC = testObj.refCount;
shouldBe('refAfterGet === refOrig + 50', 'true');
shouldBe('refAfterGetGC < refAfterGet', 'true');
// Test that calling NPN_Invoke with our object as a parameter returns
// our refcount to normal (may require a GC).
refBeforePass = testObj.refCount;
for (let i = 0; i < 50; ++i)
plug.testPassTestObject("noop", testObj);
refAfterPass = testObj.refCount;
doGC();
refAfterPassAndGC = testObj.refCount;
shouldBe('refAfterPass === refBeforePass + 50', 'true');
shouldBe('refAfterPassAndGC < refAfterPass', 'true');
}
</script>
<body onload="runtest()">
Test that we can get an NPObject returned through a method on
an NPAPI Object.<P>
<embed name="plug" type="application/x-webkit-test-netscape">
</body>