chromium/third_party/blink/web_tests/fast/dom/Window/get-set-properties.html

<p>This page tests getting and setting window properties and functions.</p>
<pre id="console"></pre>

<script>
function log(s)
{
    document.getElementById("console").appendChild(document.createTextNode(s + "\n"));
}

function shouldBe(a, b)
{
    var evalA, evalB;
    try {
        evalA = eval(a);
        evalB = eval(b);
    } catch(e) {
        evalA = e;
    }

    var message = (evalA === evalB)
                    ? "PASS: " + a + " should be '" + evalB + "' and is."
                    : "*** FAIL: " + a + " should be '" + evalB + "' but instead is " + evalA + ". ***";
    log(message);
}

function shouldBeTrue(a)
{
    shouldBe(a, "true");
}

function shouldBeFalse(b)
{
    shouldBe(b, "false");
}

function canGet(keyPath)
{
    try {
        return eval("window." + keyPath) !== undefined;
    } catch(e) {
        return false;
    }
}

window.marker = { "foo": "bar", toString: function(){ return "window.marker.toString()"; } };
window.callableMarker = function() { return "window.callableMarker.toString()"; };

function canSet(keyPath)
{
    var valuePath = "window.marker";

    try {
        eval("window." + keyPath + " = " + valuePath);
        return eval("window." + keyPath) === eval("window." + valuePath);
    } catch(e) {
        return false;
    }
}

function canSetWithTypeConversion(keyPath)
{
    var valuePath = "window.marker";

    try {
        eval("window." + keyPath + " = " + valuePath);
        return eval("window." + keyPath) == eval("window." + valuePath);
    } catch(e) {
        return false;
    }
}

function canSetWithCallable(keyPath)
{
    var valuePath = "window.callableMarker";

    try {
        eval("window." + keyPath + " = " + valuePath);
        return eval("window." + keyPath) === eval("window." + valuePath);
    } catch(e) {
        return false;
    }
}

var windowReadWriteProperties = [
    "Attr",
    "CDATASection",
    "CSSRule",
    "CSSStyleDeclaration",
    "CharacterData",
    "Comment",
    "DOMException",
    "DOMImplementation",
    "DOMParser",
    "Document",
    "DocumentFragment",
    "DocumentType",
    "Element",
    "EvalError",
    "Event",
    "HTMLAnchorElement",
    "HTMLAreaElement",
    "HTMLBRElement",
    "HTMLBaseElement",
    "HTMLBodyElement",
    "HTMLButtonElement",
    "HTMLCanvasElement",
    "HTMLDListElement",
    "HTMLDirectoryElement",
    "HTMLDivElement",
    "HTMLDocument",
    "HTMLElement",
    "HTMLFieldSetElement",
    "HTMLFontElement",
    "HTMLFormElement",
    "HTMLFrameElement",
    "HTMLFrameSetElement",
    "HTMLHRElement",
    "HTMLHeadElement",
    "HTMLHeadingElement",
    "HTMLHtmlElement",
    "HTMLIFrameElement",
    "HTMLImageElement",
    "HTMLInputElement",
    "HTMLIsIndexElement",
    "HTMLLIElement",
    "HTMLLabelElement",
    "HTMLLegendElement",
    "HTMLLinkElement",
    "HTMLMapElement",
    "HTMLMarqueeElement",
    "HTMLMenuElement",
    "HTMLMetaElement",
    "HTMLModElement",
    "HTMLOListElement",
    "HTMLOptGroupElement",
    "HTMLOptionElement",
    "HTMLParagraphElement",
    "HTMLParamElement",
    "HTMLPreElement",
    "HTMLQuoteElement",
    "HTMLScriptElement",
    "HTMLSelectElement",
    "HTMLStyleElement",
    "HTMLTableCaptionElement",
    "HTMLTableCellElement",
    "HTMLTableColElement",
    "HTMLTableElement",
    "HTMLTableRowElement",
    "HTMLTableSectionElement",
    "HTMLTextAreaElement",
    "HTMLTitleElement",
    "HTMLUListElement",
    "Image",
    "MutationEvent",
    "Node",
    "NodeFilter",
    "Option",
    "ProcessingInstruction",
    "Range",
    "RangeError",
    "ReferenceError",
    "SyntaxError",
    "Text",
    "TypeError",
    "URIError",
    "XMLDocument",
    "XMLHttpRequest",
    "XMLSerializer",
    "XPathEvaluator",
    "XPathResult",
    "XSLTProcessor",
    "addEventListener",
    "alert",
    "atob",
    "btoa",
    "captureEvents",
    "clearInterval",
    "clearTimeout",
    "clientInformation",
    "console",
    "devicePixelRatio",
    "event",
    "frames",
    "innerHeight",
    "innerWidth",
    "length",
    "locationbar",
    "menubar",
    "offscreenBuffering",
    "opener",
    "outerHeight",
    "outerWidth",
    "pageXOffset",
    "pageYOffset",
    "parent",
    "personalbar",
    "screen",
    "screenLeft",
    "screenTop",
    "screenX",
    "screenY",
    "scrollX",
    "scrollY",
    "scrollbars",
    "self",
    "statusbar",
    "toolbar"
];

var windowReadOnlyProperties = [
    "closed",
    "document",
    "history",
    "navigator",
    "window",
    "top"
];

var windowReadWriteStringProperties = [
    "name",
    "status"
];

var windowFunctions = [
    "blur",
    "close",
    "confirm",
    "find",
    "focus",
    "getComputedStyle",
    "getSelection",
    "moveBy",
    "moveTo",
    "open",
    "print",
    "prompt",
    "releaseEvents",
    "removeEventListener",
    "resizeBy",
    "resizeTo",
    "scroll",
    "scrollBy",
    "scrollTo",
    "setInterval",
    "setTimeout",
    "stop"
];

var windowEventHandlers = [
    "onabort",
    "onbeforeunload",
    "onblur",
    "onchange",
    "onclick",
    "ondblclick",
    "onerror",
    "onfocus",
    "onkeydown",
    "onkeypress",
    "onkeyup",
    "onload",
    "onmousedown",
    "onmousemove",
    "onmouseout",
    "onmouseover",
    "onmouseup",
    "onmousewheel",
    "onreset",
    "onresize",
    "onscroll",
    "onsearch",
    "onselect",
    "onsubmit",
    "onunload"
];

window.onload = function()
{
    if (window.testRunner)
        testRunner.dumpAsText();

    log("\n----- tests for getting/setting read-write properties -----\n");

    for (var i = 0; i < windowReadWriteProperties.length; i++) {
        var property = windowReadWriteProperties[i];
        shouldBeTrue("canGet('" + property + "')");
        shouldBeTrue("canSet('" + property + "')");
    }

    log("\n----- tests for getting/setting readonly properties -----\n");

    for (var i = 0; i < windowReadOnlyProperties.length; i++) {
        var property = windowReadOnlyProperties[i];
        shouldBeTrue("canGet('" + property + "')");
        shouldBeFalse("canSet('" + property + "')");
    }

    log("\n----- tests for getting/setting string properties -----\n");
    for (var i = 0; i < windowReadWriteStringProperties.length; i++) {
        var property = windowReadWriteStringProperties[i];
        shouldBeTrue("canGet('" + property + "')");
        shouldBeTrue("canSetWithTypeConversion('" + property + "')");

    }

    log("\n----- tests for getting/setting functions -----\n");

    for (var i = 0; i < windowFunctions.length; i++) {
        var property = windowFunctions[i];
        shouldBeTrue("canGet('" + property + "')");
        shouldBeTrue("canSet('" + property + "')");
    }

    log("\n----- tests for getting/setting event handlers -----\n");

    for (var i = 0; i < windowEventHandlers.length; i++) {
        var property = windowEventHandlers[i];
        shouldBeTrue("canGet('" + property + "')");
        shouldBeTrue("canSetWithCallable('" + property + "')");
    }
}
</script>