<!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>
