blob: 3316bf5316f96d097522b149ee1596bc89d3b755 [file] [log] [blame]
<!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>