| <!doctype html> | |
| <meta charset=utf-8> | |
| <title>Properties of the window object</title> | |
| <link rel="author" title="Ms2ger" href="mailto:Ms2ger@gmail.com"> | |
| <link rel="help" href="http://ecma-international.org/ecma-262/5.1/#sec-15.1"> | |
| <link rel="help" href="https://heycam.github.io/webidl/#interface-prototype-object"> | |
| <link rel="help" href="https://heycam.github.io/webidl/#es-attributes"> | |
| <link rel="help" href="https://heycam.github.io/webidl/#es-operations"> | |
| <link rel="help" href="https://dom.spec.whatwg.org/#eventtarget"> | |
| <link rel="help" href="https://html.spec.whatwg.org/multipage/#window"> | |
| <link rel="help" href="https://html.spec.whatwg.org/multipage/#windowtimers"> | |
| <link rel="help" href="https://html.spec.whatwg.org/multipage/#windowbase64"> | |
| <link rel="help" href="https://html.spec.whatwg.org/multipage/#windowsessionstorage"> | |
| <link rel="help" href="https://html.spec.whatwg.org/multipage/#windowlocalstorage"> | |
| <link rel="help" href="https://dvcs.w3.org/hg/editing/raw-file/tip/editing.html#dom-window-getselection"> | |
| <link rel="help" href="http://dev.w3.org/csswg/cssom/#widl-def-Window"> | |
| <link rel="help" href="http://dev.w3.org/csswg/cssom-view/#widl-def-Window"> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <div id=log></div> | |
| <script> | |
| function assert_data_propdesc(pd, Writable, Enumerable, Configurable) { | |
| assert_equals(typeof pd, "object"); | |
| assert_equals(pd.writable, Writable); | |
| assert_equals(pd.enumerable, Enumerable); | |
| assert_equals(pd.configurable, Configurable); | |
| } | |
| function assert_accessor_propdesc(pd, hasSetter, Enumerable, Configurable) { | |
| assert_equals(typeof pd, "object"); | |
| assert_equals(typeof pd.get, "function"); | |
| assert_true("set" in pd, | |
| "Should always have a setter property on the property descriptor"); | |
| assert_equals(typeof pd.set, hasSetter ? "function" : "undefined"); | |
| assert_equals(pd.enumerable, Enumerable); | |
| assert_equals(pd.configurable, Configurable); | |
| } | |
| var unforgeableAttributes = [ | |
| "window", | |
| "document", | |
| "location", | |
| "top" | |
| ]; | |
| var replaceableAttributes = [ | |
| "self", | |
| "locationbar", | |
| "menubar", | |
| "personalbar", | |
| "scrollbars", | |
| "statusbar", | |
| "toolbar", | |
| "frames", | |
| "parent", | |
| "external", | |
| "length", | |
| // CSSOM-View | |
| "screen", | |
| "scrollX", | |
| "scrollY", | |
| "pageXOffset", | |
| "pageYOffset", | |
| "innerWidth", | |
| "innerHeight", | |
| "screenX", | |
| "screenY", | |
| "outerWidth", | |
| "outerHeight", | |
| "devicePixelRatio", | |
| ]; | |
| var methods = [ | |
| "close", | |
| "stop", | |
| "focus", | |
| "blur", | |
| "open", | |
| "alert", | |
| "confirm", | |
| "prompt", | |
| "print", | |
| // See below: "showModalDialog", | |
| "postMessage", | |
| // WindowBase64 | |
| "btoa", | |
| "atob", | |
| // WindowTimers | |
| "setTimeout", | |
| "clearTimeout", | |
| "setInterval", | |
| "clearInterval", | |
| // HTML Editing APIs | |
| "getSelection", | |
| // CSSOM | |
| "getComputedStyle", | |
| // CSSOM-View | |
| "matchMedia", | |
| "scroll", | |
| "scrollTo", | |
| "scrollBy" | |
| ]; | |
| // We would like to remove showModalDialog from the platform, | |
| // see <https://www.w3.org/Bugs/Public/show_bug.cgi?id=26437>. | |
| if ("showModalDialog" in window) { | |
| methods.push("showModalDialog"); | |
| } | |
| var readonlyAttributes = [ | |
| "history", | |
| "frameElement", | |
| "navigator", | |
| "applicationCache", | |
| // WindowSessionStorage | |
| "sessionStorage", | |
| // WindowLocalStorage | |
| "localStorage", | |
| ]; | |
| var writableAttributes = [ | |
| "name", | |
| "status", | |
| "opener", | |
| "onabort", | |
| "onafterprint", | |
| "onbeforeprint", | |
| "onbeforeunload", | |
| "onblur", | |
| "oncancel", | |
| "oncanplay", | |
| "oncanplaythrough", | |
| "onchange", | |
| "onclick", | |
| "onclose", | |
| "oncontextmenu", | |
| "oncuechange", | |
| "ondblclick", | |
| "ondrag", | |
| "ondragend", | |
| "ondragenter", | |
| "ondragleave", | |
| "ondragover", | |
| "ondragstart", | |
| "ondrop", | |
| "ondurationchange", | |
| "onemptied", | |
| "onended", | |
| "onerror", | |
| "onfocus", | |
| "onhashchange", | |
| "oninput", | |
| "oninvalid", | |
| "onkeydown", | |
| "onkeypress", | |
| "onkeyup", | |
| "onload", | |
| "onloadeddata", | |
| "onloadedmetadata", | |
| "onloadstart", | |
| "onmessage", | |
| "onmousedown", | |
| "onmousemove", | |
| "onmouseout", | |
| "onmouseover", | |
| "onmouseup", | |
| "onmousewheel", | |
| "onoffline", | |
| "ononline", | |
| "onpause", | |
| "onplay", | |
| "onplaying", | |
| "onpagehide", | |
| "onpageshow", | |
| "onpopstate", | |
| "onprogress", | |
| "onratechange", | |
| "onreset", | |
| "onresize", | |
| "onscroll", | |
| "onseeked", | |
| "onseeking", | |
| "onselect", | |
| "onshow", | |
| "onstalled", | |
| "onstorage", | |
| "onsubmit", | |
| "onsuspend", | |
| "ontimeupdate", | |
| "onunload", | |
| "onvolumechange", | |
| "onwaiting" | |
| ]; | |
| test(function() { | |
| // 15.1.1 Value Properties of the Global Object | |
| ["NaN", "Infinity", "undefined"].forEach(function(id) { | |
| test(function() { | |
| assert_true(id in window, id + " in window"); | |
| assert_data_propdesc(Object.getOwnPropertyDescriptor(window, id), | |
| false, false, false); | |
| }, "Value Property: " + id); | |
| }); | |
| }, "Value Properties of the Global Object"); | |
| test(function() { | |
| // 15.1.2 Function Properties of the Global Object | |
| ["eval", "parseInt", "parseFloat", "isNaN", "isFinite"].forEach(function(id) { | |
| test(function() { | |
| assert_true(id in window, id + " in window"); | |
| assert_data_propdesc(Object.getOwnPropertyDescriptor(window, id), | |
| true, false, true); | |
| }, "Function Property: " + id); | |
| }); | |
| }, "Function Properties of the Global Object"); | |
| test(function() { | |
| // 15.1.3 URI Handling Function Properties | |
| ["decodeURI", "decodeURIComponent", "encodeURI", "encodeURIComponent"].forEach(function(id) { | |
| test(function() { | |
| assert_true(id in window, id + " in window"); | |
| assert_data_propdesc(Object.getOwnPropertyDescriptor(window, id), | |
| true, false, true); | |
| }, "URI Handling Function Property: " + id); | |
| }); | |
| }, "URI Handling Function Properties"); | |
| test(function() { | |
| // 15.1.4 Constructor Properties of the Global Object | |
| ["Object", "Function", "Array", "String", "Boolean", "Number", "Date", | |
| "RegExp", "Error", "EvalError", "RangeError", "ReferenceError", | |
| "SyntaxError", "TypeError", "URIError"].forEach(function(id) { | |
| test(function() { | |
| assert_true(id in window, id + " in window"); | |
| assert_data_propdesc(Object.getOwnPropertyDescriptor(window, id), | |
| true, false, true); | |
| }, "Constructor Property: " + id); | |
| }); | |
| }, "Constructor Properties of the Global Object"); | |
| test(function() { | |
| // 15.1.5 Other Properties of the Global Object | |
| ["Math", "JSON"].forEach(function(id) { | |
| test(function() { | |
| assert_true(id in window, id + " in window"); | |
| assert_data_propdesc(Object.getOwnPropertyDescriptor(window, id), | |
| true, false, true); | |
| }, "Other Property: " + id); | |
| }); | |
| }, "Other Properties of the Global Object"); | |
| test(function() { | |
| // EventTarget interface | |
| ["addEventListener", "removeEventListener", "dispatchEvent"].forEach(function(id) { | |
| test(function() { | |
| var EventTargetProto = EventTarget.prototype; | |
| assert_true(id in window, id + " in window"); | |
| assert_equals(window[id], EventTargetProto[id]); | |
| assert_data_propdesc(Object.getOwnPropertyDescriptor(EventTargetProto, id), | |
| true, true, true); | |
| assert_equals(Object.getOwnPropertyDescriptor(window, id), undefined); | |
| }, "EventTarget method: " + id); | |
| }); | |
| }, "EventTarget interface"); | |
| test(function() { | |
| // Window interface | |
| methods.forEach(function(id) { | |
| test(function() { | |
| var WindowProto = Window.prototype; | |
| assert_true(id in window, id + " in window"); | |
| assert_false(id in WindowProto, id + " in Window.prototype"); | |
| assert_data_propdesc(Object.getOwnPropertyDescriptor(window, id), | |
| true, true, true); | |
| }, "Window method: " + id); | |
| }); | |
| readonlyAttributes.forEach(function(id) { | |
| test(function() { | |
| var WindowProto = Window.prototype; | |
| assert_true(id in window, id + " in window"); | |
| assert_false(id in WindowProto, id + " in Window.prototype"); | |
| assert_accessor_propdesc(Object.getOwnPropertyDescriptor(window, id), | |
| false, true, true); | |
| }, "Window readonly attribute: " + id); | |
| }); | |
| writableAttributes.forEach(function(id) { | |
| test(function() { | |
| var WindowProto = Window.prototype; | |
| assert_true(id in window, id + " in window"); | |
| assert_false(id in WindowProto, id + " in Window.prototype"); | |
| assert_accessor_propdesc(Object.getOwnPropertyDescriptor(window, id), | |
| true, true, true); | |
| }, "Window attribute: " + id); | |
| }); | |
| unforgeableAttributes.forEach(function(id) { | |
| test(function() { | |
| var WindowProto = Window.prototype; | |
| assert_true(id in window, id + " in window"); | |
| assert_false(id in WindowProto, id + " in Window.prototype"); | |
| // location has a [PutForwards] extended attribute. | |
| assert_accessor_propdesc(Object.getOwnPropertyDescriptor(window, id), | |
| id === "location", true, false); | |
| }, "Window unforgeable attribute: " + id); | |
| }); | |
| replaceableAttributes.forEach(function(id) { | |
| test(function() { | |
| var WindowProto = Window.prototype; | |
| assert_true(id in window, id + " in window"); | |
| assert_false(id in WindowProto, id + " in Window.prototype"); | |
| assert_accessor_propdesc(Object.getOwnPropertyDescriptor(window, id), | |
| true, true, true); | |
| }, "Window replaceable attribute: " + id); | |
| }); | |
| }, "Window interface"); | |
| test(function() { | |
| assert_equals(window.constructor, Window); | |
| assert_false(window.hasOwnProperty("constructor"), "window.constructor should not be an own property."); | |
| assert_data_propdesc(Object.getOwnPropertyDescriptor(Window.prototype, "constructor"), | |
| true, false, true); | |
| }, "constructor"); | |
| </script> |