<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>
<script>
description("This test checks to ensure that window.localStorage and window.sessionStorage are not rendered unusable by setting a key with the same name as a storage function such that the function is hidden.");

if (window.testRunner)
    testRunner.dumpAsText();

function doWedgeThySelf(storage) {
    storage.setItem("clear", "almost");
    storage.setItem("key", "too");
    storage.setItem("getItem", "funny");
    storage.setItem("removeItem", "to");
    storage.setItem("length", "be");
    storage.setItem("setItem", "true");
}

function testStorage(storageString) {
    storage = eval(storageString);
    storage.clear();
    doWedgeThySelf(storage);
    shouldBeEqualToString("storage.getItem('clear')", "almost");
    shouldBeEqualToString("storage.getItem('key')", "too");
    shouldBeEqualToString("storage.getItem('getItem')", "funny");
    shouldBeEqualToString("storage.getItem('removeItem')", "to");
    shouldBeEqualToString("storage.getItem('length')", "be");
    shouldBeEqualToString("storage.getItem('setItem')", "true");
        
    // Test to see if an exception is thrown for any of the built in
    // functions.
    storage.setItem("test", "123");
    storage.key(0);
    storage.getItem("test");
    storage.removeItem("test");
    storage.clear();
    if (storage.length != 0)
        throw name + ": length wedged";
}


function runTest()
{
    testStorage(window.sessionStorage);
    testStorage(window.localStorage);
}

try {
    runTest();
} catch (e) {
    testFailed("Caught an exception!");
}

</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
