| <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> |
| |