<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function clearStorages() {
    sessionStorage.clear();
    localStorage.clear();
}

function triggerActions(storage) {
    storage.setItem("foo", "value1");
    storage.setItem("x", "xvalue");
    storage.setItem("foo", "value2");
    storage.removeItem("foo");
    storage.clear();
}

function test()
{
    function testStorageEvents(storageObject, callback) {
        let count = 0;
        storageObject.addEventListener(WI.DOMStorageObject.Event.ItemAdded, (event) => {
            count++;

            if (count === 1) {
                InspectorTest.pass("WI.DOMStorageObject.Event.ItemAdded");
                InspectorTest.expectThat(event.data.key === "foo", "Should add key 'foo'.");
                InspectorTest.expectThat(event.data.value === "value1", "Should have value 'value1'.");
                return;
            }

            if (count === 2) {
                InspectorTest.pass("WI.DOMStorageObject.Event.ItemAdded");
                InspectorTest.expectThat(event.data.key === "x", "Should add key 'x'.");
                InspectorTest.expectThat(event.data.value === "xvalue", "Should have value 'xvalue'.");
                return;
            }

            InspectorTest.fail("Unexpected WI.DOMStorageObject.Event.ItemAdded");
        });

        storageObject.awaitEvent(WI.DOMStorageObject.Event.ItemRemoved)
        .then((event) => {
            InspectorTest.pass("WI.DOMStorageObject.Event.ItemRemoved");
            InspectorTest.expectThat(event.data.key === "foo", "Should remove key 'x'.");
        });

        storageObject.awaitEvent(WI.DOMStorageObject.Event.ItemUpdated)
        .then((event) => {
            InspectorTest.pass("WI.DOMStorageObject.Event.ItemUpdated");
            InspectorTest.expectThat(event.data.key === "foo", "Should update key 'x'.");
            InspectorTest.expectThat(event.data.oldValue === "value1", "Should have oldValue 'value1'.");
            InspectorTest.expectThat(event.data.value === "value2", "Should have new value 'value2'.");
        });

        storageObject.awaitEvent(WI.DOMStorageObject.Event.ItemsCleared)
        .then((event) => {
            InspectorTest.pass("WI.DOMStorageObject.Event.ItemsCleared");
            storageObject.removeEventListener(WI.DOMStorageObject.Event.ItemAdded, null, null);
            callback();
        });
    }

    let suite = InspectorTest.createAsyncSuite("DOMStorage.Events");

    suite.addTestCase({
        name: "TestSessionStorage",
        description: "Test backend generated DOMStorage added, removed, updated, and cleared events for sessionStorage.",
        test(resolve, reject) {
            InspectorTest.evaluateInPage("triggerActions(sessionStorage)");
            let sessionStorage = WI.domStorageManager.domStorageObjects.find((x) => !x.isLocalStorage());
            InspectorTest.expectThat(sessionStorage, "Should have a DOMStorageObject for sessionStorage.");
            testStorageEvents(sessionStorage, resolve);
        }
    });

    suite.addTestCase({
        name: "TestLocalStorage",
        description: "Test backend generated DOMStorage added, removed, updated, and cleared events for localStorage.",
        test(resolve, reject) {
            InspectorTest.evaluateInPage("triggerActions(localStorage)");
            let localStorage = WI.domStorageManager.domStorageObjects.find((x) => x.isLocalStorage());
            InspectorTest.expectThat(localStorage, "Should have a DOMStorageObject for localStorage.");
            testStorageEvents(localStorage, resolve);
        }
    });

    InspectorTest.evaluateInPage("clearStorages()", () => {
        suite.runTestCasesAndFinish();
    });
}
</script>
</head>
<body onload="runTest()">
<p>Test for the DOMStorage events.</p>
</body>
</html>
