<!DOCTYPE html>
<html>
<head>
    <script src="../../resources/testharness.js"></script>
    <script src="../../resources/testharnessreport.js"></script>
</head>
<body>
<script>
    // To test a named property setter with [OverrideBuiltins] specified, we use DOMStringMap via element.dataset.
    test(() => {
        let element = document.createElement("div");
        element.dataset["a"] = "value1";
        element.dataset["b"] = "value2";
        
        Object.defineProperty(element.dataset, "c", { value: "value3" });
        assert_equals(element.dataset["c"], "value3");
        assert_equals(element.getAttribute("data-c"), "value3")
    }, "Test that the setting a non-existing named property with Object.defineProperty creates the property ([OverrideBuiltins] specified).");

    test(() => {
        let element = document.createElement("div");
        element.dataset[1] = "value1";
        element.dataset[2] = "value2";
        
        Object.defineProperty(element.dataset, 3, { value: "value3" });
        assert_equals(element.dataset[3], "value3");
        assert_equals(element.getAttribute("data-3"), "value3")
    }, "Test that the setting a non-existing indexed property with Object.defineProperty creates the property ([OverrideBuiltins] specified).");

    test(() => {
        let element = document.createElement("div");
        element.dataset["a"] = "value1";
        element.dataset["b"] = "value2";
        
        Object.defineProperty(element.dataset, "a", { value: "value3" });
        assert_equals(element.dataset["a"], "value3");
        assert_equals(element.getAttribute("data-a"), "value3")
    }, "Test that the setting an existing named property with Object.defineProperty replaces the value ([OverrideBuiltins] specified).");

    test(() => {
        let element = document.createElement("div");
        element.dataset[1] = "value1";
        element.dataset[2] = "value2";
        
        Object.defineProperty(element.dataset, 1, { value: "value3" });
        assert_equals(element.dataset[1], "value3");
        assert_equals(element.getAttribute("data-1"), "value3")
    }, "Test that the setting an existing indexed property with Object.defineProperty replaces the value ([OverrideBuiltins] specified).");

    test(() => {
        let element = document.createElement("div");
        element.dataset["a"] = "value1";
        element.dataset["b"] = "value2";
        
        assert_throws("SyntaxError", () => {
            Object.defineProperty(element.dataset, "-invalid", { value: "value3" });            
        });
        assert_not_equals(element.dataset["-invalid"], 'value3');
        assert_not_equals(element.getAttribute("data--invalid"), "value3")
    }, "Test that the setting a non-existing but invalid named property with Object.defineProperty throws ([OverrideBuiltins] specified).");

    test(() => {
        let element = document.createElement("div");
        element.dataset["a"] = "value1";
        element.dataset["b"] = "value2";
        
        assert_equals(element.dataset["c"], undefined);
        Object.defineProperty(element.dataset, "c", { 
            get: function() { return 1; },
            set: function(newValue) { }
        });
        assert_equals(element.dataset["c"], undefined);
    }, "Test that the setting a non-data descriptor property with Object.defineProperty does not set anything ([OverrideBuiltins] specified).");

    test((t) => {
        t.add_cleanup(() => {
          delete DOMStringMap.prototype["c"];
        });
    
        let element = document.createElement("div");
    
        DOMStringMap.prototype["c"] = 'prototype-value';
        Object.defineProperty(element.dataset, "c", { value: "map-value" });
        
        assert_equals(element.dataset["c"], "map-value");
        assert_equals(element.getAttribute("data-c"), "map-value")
        assert_equals(DOMStringMap.prototype["c"], "prototype-value")
    }, "Test that the setting a named property with Object.defineProperty that shadows an existing prototype value still creates the item ([OverrideBuiltins] specified).");


    // To test a named property setter without [OverrideBuiltins] specified, we use Storage via window.sessionStorage.
    test((t) => {
        t.add_cleanup(() => {
          window.sessionStorage.clear();
        });
        
        window.sessionStorage.clear();
        assert_equals(window.sessionStorage.length, 0);
    
        window.sessionStorage["a"] = "value1";
        window.sessionStorage["b"] = "value2";
        
        Object.defineProperty(window.sessionStorage, "c", { value: "value3" });
        assert_equals(window.sessionStorage["c"], "value3");
        assert_equals(window.sessionStorage.getItem("c"), "value3")
    }, "Test that the setting a non-existing named property with Object.defineProperty creates the property ([OverrideBuiltins] not specified).");

    test((t) => {
        t.add_cleanup(() => {
          window.sessionStorage.clear();
        });
        
        window.sessionStorage.clear();
        assert_equals(window.sessionStorage.length, 0);
    
        window.sessionStorage["a"] = "value1";
        window.sessionStorage["b"] = "value2";
            
        Object.defineProperty(window.sessionStorage, 3, { value: "value3" });
        assert_equals(window.sessionStorage[3], "value3");
        assert_equals(window.sessionStorage.getItem("3"), "value3")
    }, "Test that the setting a non-existing indexed property with Object.defineProperty creates the property ([OverrideBuiltins] not specified).");

    test((t) => {
        t.add_cleanup(() => {
          window.sessionStorage.clear();
        });
        
        window.sessionStorage.clear();
        assert_equals(window.sessionStorage.length, 0);
    
        window.sessionStorage["a"] = "value1";
        window.sessionStorage["b"] = "value2";
        
        Object.defineProperty(window.sessionStorage, "a", { value: "value3" });
        assert_equals(window.sessionStorage["a"], "value3");
        assert_equals(window.sessionStorage.getItem("a"), "value3")
    }, "Test that the setting an existing named property with Object.defineProperty replaces the value ([OverrideBuiltins] not specified).");

    test((t) => {
        t.add_cleanup(() => {
          window.sessionStorage.clear();
        });
        
        window.sessionStorage.clear();
        assert_equals(window.sessionStorage.length, 0);
    
        window.sessionStorage["a"] = "value1";
        window.sessionStorage["b"] = "value2";
            
        Object.defineProperty(window.sessionStorage, 1, { value: "value3" });
        assert_equals(window.sessionStorage[1], "value3");
        assert_equals(window.sessionStorage.getItem("1"), "value3")
    }, "Test that the setting an existing indexed property with Object.defineProperty replaces the value ([OverrideBuiltins] not specified).");

    test((t) => {
        t.add_cleanup(() => {
          window.sessionStorage.clear();
        });
        
        window.sessionStorage.clear();
        assert_equals(window.sessionStorage.length, 0);
    
        window.sessionStorage["a"] = "value1";
        window.sessionStorage["b"] = "value2";
        
        assert_equals(window.sessionStorage["c"], undefined);
        Object.defineProperty(window.sessionStorage, "c", { 
            get: function() { return 1; },
            set: function(newValue) { }
        });
        assert_equals(window.sessionStorage["c"], undefined);
    }, "Test that the setting a non-data descriptor property with Object.defineProperty does not set anything ([OverrideBuiltins] not specified).");

    test((t) => {
        t.add_cleanup(() => {
            window.sessionStorage.clear();
            delete Storage.prototype["c"];
        });
        
        Storage.prototype["c"] = 'prototype-value';
        Object.defineProperty(window.sessionStorage, "c", { value: "map-value" });
        
        assert_equals(window.sessionStorage["c"], "prototype-value");
        assert_equals(window.sessionStorage.getItem("c"), "map-value")
        assert_equals(Storage.prototype["c"], "prototype-value")
    }, "Test that the setting a named property with Object.defineProperty that shadows an existing prototype value still creates the item ([OverrideBuiltins] not specified).");


    test((t) => {
        t.add_cleanup(() => {
          window.sessionStorage.clear();
        });
        
        window.sessionStorage.clear();
        assert_equals(window.sessionStorage.length, 0);
    
        window.sessionStorage["a"] = "value1";
        window.sessionStorage["b"] = "value2";

        let currentLength = window.sessionStorage.length;
        
        Object.defineProperty(window.sessionStorage, "length", { value: "value3" });
        assert_equals(window.sessionStorage['length'], currentLength + 1);
        assert_equals(window.sessionStorage.getItem("length"), "value3")
    }, "Test that the trying to set a named property, matching a builtin property name, with Object.defineProperty does nothing ([OverrideBuiltins] not specified).");
</script>
</body>
</html>
