210 lines
8.9 KiB
HTML
210 lines
8.9 KiB
HTML
<!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>
|