This tests that the navigator object of a deleted frame is disconnected properly. Accessing fields or methods shouldn't crash the browser. 
 Check Navigator
navigator.activeVRDisplays is OK
navigator.appCodeName is OK
navigator.appName is OK
navigator.appVersion is OK
navigator.cookieEnabled is OK
navigator.getStorageUpdates() is OK
navigator.getVRDisplays() is OK
navigator.javaEnabled() is OK
navigator.language is OK
navigator.languages is OK
navigator.mediaCapabilities is OK
navigator.mimeTypes is OK
navigator.onLine is OK
navigator.platform is OK
navigator.plugins is OK
navigator.product is OK
navigator.productSub is OK
navigator.requestMediaKeySystemAccess() is OK
navigator.sendBeacon() threw err TypeError: Not enough arguments
navigator.serviceWorker is OK
navigator.userAgent is OK
navigator.vendor is OK
navigator.vendorSub is OK
navigator.webdriver is OK
navigator.activeVRDisplays is OK
navigator.appCodeName is OK
navigator.appName is OK
navigator.appVersion is OK
navigator.cookieEnabled is OK
navigator.getStorageUpdates() is OK
navigator.getVRDisplays() is OK
navigator.javaEnabled() is OK
navigator.language is OK
navigator.languages is OK
navigator.mediaCapabilities is OK
navigator.mimeTypes is OK
navigator.onLine is OK
navigator.platform is OK
navigator.plugins is OK
navigator.product is OK
navigator.productSub is OK
navigator.requestMediaKeySystemAccess() is OK
navigator.sendBeacon() threw err TypeError: Not enough arguments
navigator.serviceWorker is OK
navigator.userAgent is OK
navigator.vendor is OK
navigator.vendorSub is OK
navigator.webdriver is OK

