| description("This test checks whether orphaned workers exit under various conditions"); |
| |
| // We create a large number of Workers and expect the GC to keep up and |
| // reclaim a reasonable number of them in a timely manner so that the user |
| // experience is not impacted. |
| // |
| // For this test, "a timely manner" means that we have an expectation that |
| // before the test times out, we expect that no more than |
| // maxRemainingOrphanedWorkers of the numberOfWorkers we created will survive |
| // the GC. |
| // |
| // We use maxRemainingOrphanedWorkers as an approximation of the tolerable |
| // amount of garbage in the system that won't impact the user experience. |
| |
| var numberOfWorkers = 100; |
| var maxRemainingOrphanedWorkers = 10; |
| var workers = [ ]; |
| var numberOfCreatedWorkers = 0; |
| |
| if (window.testRunner) { |
| testRunner.dumpAsText(); |
| testRunner.waitUntilDone(); |
| waitUntilWorkerThreadsExit(runTests); |
| } else { |
| debug("NOTE: This test relies on functionality in DumpRenderTree to detect when workers have exited - test results will be incorrect when run in a browser."); |
| runTests(); |
| } |
| |
| function orphanAllWorkers(callback) |
| { |
| var i; |
| for (i = 0; i < numberOfWorkers; i++) { |
| workers[i].onmessage = 0; |
| workers[i] = 0; |
| } |
| workers = [ ]; |
| waitUntilThreadCountDoesNotExceed(callback, maxRemainingOrphanedWorkers); |
| } |
| |
| // Contains tests for dedicated-worker-specific lifecycle functionality. |
| function runTests() |
| { |
| var i; |
| for (i = 0; i < numberOfWorkers; i++) { |
| var worker = createWorker(); |
| workers[i] = worker; |
| |
| worker.postMessage("ping"); |
| worker.onmessage = function(event) { |
| if (internals.workerThreadCount == numberOfWorkers) { |
| testPassed("Orphaned worker thread created."); |
| orphanAllWorkers(orphanedWorkerExited); |
| } |
| } |
| } |
| } |
| |
| function orphanedWorkerExited() |
| { |
| testPassed("Orphaned worker thread exited."); |
| |
| var i; |
| for (i = 0; i < numberOfWorkers; i++) { |
| var worker = createWorker(); |
| workers[i] = worker; |
| |
| worker.postMessage("ping"); |
| worker.onmessage = function(event) { |
| // Send a message that starts up an async operation, to make sure the thread exits when it completes. |
| // FIXME: Disabled for now - re-enable when bug 28702 is fixed. |
| // worker.postMessage("eval setTimeout('', 10)"); |
| |
| if (internals.workerThreadCount >= numberOfWorkers) { |
| testPassed("Orphaned timeout worker thread created."); |
| orphanAllWorkers(orphanedTimeoutWorkerExited); |
| } |
| } |
| } |
| } |
| |
| function orphanedTimeoutWorkerExited() |
| { |
| testPassed("Orphaned timeout worker thread exited."); |
| done(); |
| } |