| <!DOCTYPE html> |
| <html> |
| <head> |
| <script src="/js-test-resources/js-test.js"></script> |
| </head> |
| <body> |
| <script> |
| description("Validate the properties of a detached Window object."); |
| jsTestIsAsync = true; |
| |
| function validateWindow(_w) |
| { |
| w = _w; |
| |
| try { |
| shouldBeTrue("!!w.location"); |
| if (w.location) { |
| shouldBeEqualToString("w.location.href", "about:blank"); |
| shouldBeEqualToString("w.location.protocol", "about:"); |
| shouldBeEqualToString("w.location.host", ""); |
| shouldBeEqualToString("w.location.hostname", ""); |
| shouldBeEqualToString("w.location.port", ""); |
| shouldBeEqualToString("w.location.pathname", "blank"); |
| shouldBeEqualToString("w.location.search", ""); |
| shouldBeEqualToString("w.location.hash", ""); |
| shouldBeEqualToString("w.location.origin", "null"); |
| shouldNotThrow("w.location.assign('')"); |
| shouldNotThrow("w.location.replace('')"); |
| shouldNotThrow("w.location.reload('')"); |
| } |
| } catch (e) { |
| debug(e); |
| } |
| |
| try { |
| shouldBeTrue("!!w.screen"); |
| if (w.screen) { |
| shouldBe("w.screen.height", "0"); |
| shouldBe("w.screen.width", "0"); |
| shouldBe("w.screen.colorDepth", "0"); |
| shouldBe("w.screen.pixelDepth", "0"); |
| shouldBe("w.screen.availLeft", "0"); |
| shouldBe("w.screen.availTop", "0"); |
| shouldBe("w.screen.availHeight", "0"); |
| shouldBe("w.screen.availWidth", "0"); |
| } |
| } catch (e) { |
| debug(e); |
| } |
| |
| try { |
| shouldBeTrue("!!w.history"); |
| if (w.history) { |
| shouldBe("w.history.length", "0"); |
| shouldBeNull("w.history.state"); |
| shouldNotThrow("w.history.back()"); |
| shouldNotThrow("w.history.forward()"); |
| shouldNotThrow("w.history.go(-1)"); |
| shouldNotThrow("w.history.pushState({}, null)"); |
| shouldNotThrow("w.history.replaceState({}, null)"); |
| } |
| } catch (e) { |
| debug(e); |
| } |
| |
| try { |
| shouldBeTrue("!!w.crypto"); |
| } catch (e) { |
| debug(e); |
| } |
| |
| let bars = ['locationbar', 'menubar', 'personalbar', 'scrollbars', 'statusbar', 'toolbar']; |
| for (let bar of bars) { |
| try { |
| shouldBeTrue("!!w." + bar); |
| if (w[bar]) { |
| shouldBeFalse("w." + bar + ".visible"); |
| } |
| } catch (e) { |
| debug(e); |
| } |
| } |
| |
| try { |
| shouldBeTrue("!!w.applicationCache"); |
| if (w.applicationCache) { |
| shouldBe("w.applicationCache.status", "ApplicationCache.UNCACHED"); |
| shouldThrowErrorName("w.applicationCache.update()", "InvalidStateError"); |
| shouldThrowErrorName("w.applicationCache.swapCache()", "InvalidStateError"); |
| shouldNotThrow("w.applicationCache.abort()"); |
| } |
| } catch (e) { |
| debug(e); |
| } |
| |
| try { |
| shouldBeTrue("!!w.visualViewport"); |
| if (w.visualViewport) { |
| shouldBe("w.visualViewport.offsetLeft", "0"); |
| shouldBe("w.visualViewport.offsetTop", "0"); |
| shouldBe("w.visualViewport.pageLeft", "0"); |
| shouldBe("w.visualViewport.pageTop", "0"); |
| shouldBe("w.visualViewport.width", "0"); |
| shouldBe("w.visualViewport.height", "0"); |
| shouldBe("w.visualViewport.scale", "1"); |
| } |
| } catch (e) { |
| debug(e); |
| } |
| |
| try { |
| shouldBeTrue("!!w.styleMedia"); |
| if (w.styleMedia) { |
| shouldBeEqualToString("w.styleMedia.type", ""); |
| shouldBeFalse("w.styleMedia.matchMedium('foo')"); |
| } |
| } catch (e) { |
| debug(e); |
| } |
| |
| try { |
| shouldBeTrue("!!w.navigator"); |
| if (w.navigator) { |
| shouldBeEqualToString("w.navigator.appCodeName", "Mozilla"); |
| shouldBeEqualToString("w.navigator.appName", "Netscape"); |
| shouldBeEqualToString("w.navigator.appVersion", ""); |
| shouldBeFalse("w.navigator.cookieEnabled"); |
| shouldBeFalse("w.navigator.javaEnabled()"); |
| shouldBeEqualToString("w.navigator.product", "Gecko"); |
| shouldBeEqualToString("w.navigator.userAgent", ""); |
| shouldBe("w.navigator.plugins.length", "0"); |
| shouldBe("w.navigator.mimeTypes.length", "0"); |
| shouldBeTrue("!!w.navigator.geolocation"); |
| } |
| } catch (e) { |
| debug(e); |
| } |
| |
| try { |
| shouldBeTrue("!!w.performance"); |
| } catch (e) { |
| debug(e); |
| } |
| |
| try { |
| shouldBeUndefined("w.foo"); |
| shouldBeUndefined("w.location.foo"); |
| } catch (e) { |
| debug(e); |
| } |
| } |
| |
| onload = function() { |
| let f = document.createElement("iframe"); |
| document.body.appendChild(f); |
| let w = f.contentWindow; |
| f.remove(); |
| f = null; |
| debug("* Before GC"); |
| validateWindow(w); |
| gc(); |
| setTimeout(() => { |
| gc(); |
| debug(""); |
| debug("* After GC"); |
| validateWindow(w); |
| finishJSTest(); |
| }, 0); |
| } |
| </script> |
| </body> |
| </html> |