| <script> | |
| function noop(x) { | |
| } | |
| function doGC() { | |
| if (window.GCController) { | |
| // GC twice to make sure everything is cleaned up. | |
| for (var i = 0; i < 2; i++) { | |
| window.GCController.collect(); | |
| } | |
| } | |
| } | |
| function runtest() { | |
| if (window.testRunner) | |
| testRunner.dumpAsText(); | |
| var output = document.getElementById("output"); | |
| output.innerHTML = ""; | |
| // Test that objects are deleted after their JS references are released. | |
| var countOrig = plug.testObjectCount; | |
| o1 = plug.testCreateTestObject(); | |
| o2 = plug.testCreateTestObject(); | |
| o3 = plug.testCreateTestObject(); | |
| var countAfterCreate = plug.testObjectCount; | |
| o1 = o2 = o3 = null; | |
| doGC(); | |
| var countAfterGC = plug.testObjectCount; | |
| output.innerHTML += "--- num test objects:<br>"; | |
| output.innerHTML += "countAfterCreate == countOrig + 3? " | |
| + ((countAfterCreate == countOrig + 3) ? "PASS" : "FAIL") | |
| + "<br>"; | |
| output.innerHTML += "countOrig == countAfterGC? " | |
| + ((countOrig == countAfterGC) ? "PASS" : "FAIL") | |
| + "<br>"; | |
| output.innerHTML += "<br>"; | |
| // Test that the object refcount returns to normal after JS references | |
| // are released. | |
| var testObj = plug.testObject; | |
| var refOrig = testObj.refCount; | |
| var o1 = plug.testObject; | |
| var o2 = plug.testObject; | |
| var o3 = plug.testObject; | |
| var refAfterGet = testObj.refCount; | |
| o1 = o2 = o3 = null; | |
| doGC(); | |
| var refAfterGetGC = testObj.refCount; | |
| // Test that calling NPN_Invoke with our object as a parameter returns | |
| // our refcount to normal (may require a GC). | |
| plug.testPassTestObject("noop", testObj); | |
| plug.testPassTestObject("noop", testObj); | |
| plug.testPassTestObject("noop", testObj); | |
| doGC(); | |
| var refAfterPass = testObj.refCount; | |
| output.innerHTML += "--- refcount on plug.testObject:<br>"; | |
| output.innerHTML += "originally: " + refOrig + "<br>"; | |
| output.innerHTML += "after GC: " + refAfterGetGC + "<br>"; | |
| output.innerHTML += "after passing: " + refAfterPass + "<br>"; | |
| var success = (countAfterGC == countOrig) && (refAfterPass == refOrig); | |
| output.innerHTML += (success ? "SUCCESS" : "FAILURE"); | |
| } | |
| </script> | |
| <body onload="runtest()"> | |
| Test that we can get an NPObject returned through a method on | |
| an NPAPI Object.<P> | |
| Prints "SUCCESS" on success, "FAILURE" on failure. | |
| <embed name="plug" type="application/x-webkit-test-netscape"> | |
| <div id=output>FAILURE</div> | |
| </body> | |