<!DOCTYPE html>
<html>
<head>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../../resources/gc.js"></script>
</head>
<body>
<iframe id="subframe" src="about:blank"></iframe>
<script>
var testNavigatorOnLoad = async_test("Accessing a navigator object that just got removed does not crash.")
var testNavigatorLater = async_test("Accessing a navigator object that got removed some time before does not crash.")
// Reference to the removed navigator object.
var oldNav = null;
function test() {
// Keep a reference of the navigator and remove the frame.
oldNav = window.frames[0].navigator;
var frame = document.getElementById("subframe");
frame.parentNode.removeChild(frame);
if (window.GCController)
window.GCController.collect();
// Check once immediately.
testNavigatorOnLoad.step(function() {
check_navigator();
});
testNavigatorOnLoad.done();
gc();
// Check one more time later, when the frame is likely to be destroyed.
setTimeout(function() {
testNavigatorLater.step(function() {
check_navigator();
});
testNavigatorLater.done();
}, 200);
}
function check_navigator() {
for (p in oldNav) {
if (typeof oldNav[p] == 'function') {
try {
var v = oldNav[p]();
assert_true(true, "navigator."+p+"() is OK");
} catch(err) {
// Some function call will asserts, the assert shouldn't make the test fail.
assert_true(true, "navigator."+p+"() threw err "+err);
}
} else {
var v = oldNav[p];
assert_true(true, "navigator."+p+" is OK");
}
}
}
window.addEventListener('load', test);
</script>
</body>
</html>