DefineOwnProperty.html (7776B)
1 <!DOCTYPE html> 2 <meta charset="utf-8"> 3 <title>Legacy platform objects [[DefineOwnProperty]] method</title> 4 <link rel="help" href="https://webidl.spec.whatwg.org/#legacy-platform-object-defineownproperty"> 5 <script src="/resources/testharness.js"></script> 6 <script src="/resources/testharnessreport.js"></script> 7 <script src="./helper.js"></script> 8 <script> 9 10 test(function() { 11 let span = document.createElement("span"); 12 span.className = "foo"; 13 // DOMTokenList supports an indexed property getter but not a setter. 14 let domTokenList = span.classList; 15 // Confirm the test settings. 16 assert_equals(domTokenList.length, 1); 17 assert_prop_desc_equals(domTokenList, "0", 18 {value: "foo", writable: false, enumerable: true, 19 configurable: true}); 20 assert_prop_desc_equals(domTokenList, "1", undefined); 21 // Actual test 22 assert_throws_js(TypeError, () => 23 Object.defineProperty(domTokenList, "0", {value: true, writable: true})); 24 assert_throws_js(TypeError, () => 25 Object.defineProperty(domTokenList, "1", {value: true, writable: true})); 26 assert_throws_js(TypeError, () => 27 Object.defineProperty(domTokenList, "0", {get: () => {}})); 28 assert_throws_js(TypeError, () => 29 Object.defineProperty(domTokenList, "0", {set: () => {}})); 30 assert_throws_js(TypeError, () => 31 Object.defineProperty(domTokenList, "1", {get: () => {}})); 32 assert_throws_js(TypeError, () => 33 Object.defineProperty(domTokenList, "1", {set: () => {}})); 34 assert_equals(domTokenList[0], "foo"); 35 assert_equals(domTokenList[1], undefined); 36 domTokenList[0] = "bar"; 37 domTokenList[1] = "bar"; 38 assert_equals(domTokenList[0], "foo"); 39 assert_equals(domTokenList[1], undefined); 40 assert_throws_js(TypeError, () => { 41 "use strict"; 42 domTokenList[0] = "bar"; 43 }); 44 assert_throws_js(TypeError, () => { 45 "use strict"; 46 domTokenList[1] = "bar"; 47 }); 48 // Nothing must change after all. 49 assert_equals(domTokenList.length, 1); 50 assert_prop_desc_equals(domTokenList, "0", 51 {value: "foo", writable: false, enumerable: true, 52 configurable: true}); 53 assert_prop_desc_equals(domTokenList, "1", undefined); 54 }, "Test [[DefineOwnProperty]] with no indexed property setter support."); 55 56 test(function() { 57 // HTMLSelectElement supports an indexed property setter. 58 let select = document.createElement("select"); 59 let option0 = document.createElement("option"); 60 let option1 = document.createElement("option"); 61 // Confirm the test settings. 62 assert_equals(select.length, 0); 63 assert_prop_desc_equals(select, "0", undefined); 64 // Try to define an accessor property with non supported property index. 65 assert_throws_js(TypeError, () => 66 Object.defineProperty(select, "0", {get: () => {}})); 67 assert_throws_js(TypeError, () => 68 Object.defineProperty(select, "0", {set: () => {}})); 69 assert_prop_desc_equals(select, "0", undefined); 70 // writable, enumerable, configurable will be ignored. 71 Object.defineProperty(select, "0", {value: option0, writable: false, 72 enumerable: false, configurable: false}); 73 assert_prop_desc_equals(select, "0", 74 {value: option0, writable: true, enumerable: true, 75 configurable: true}); 76 select[1] = option1; 77 assert_prop_desc_equals(select, "1", 78 {value: option1, writable: true, enumerable: true, 79 configurable: true}); 80 // Try to define an accessor property with a supported property index. 81 assert_throws_js(TypeError, () => 82 Object.defineProperty(select, "0", {get: () => {}})); 83 assert_throws_js(TypeError, () => 84 Object.defineProperty(select, "0", {set: () => {}})); 85 assert_prop_desc_equals(select, "0", 86 {value: option0, writable: true, enumerable: true, 87 configurable: true}); 88 }, "Test [[DefineOwnProperty]] with indexed property setter support."); 89 90 test(function() { 91 let dataList = document.createElement("datalist"); 92 let option0 = document.createElement("option"); 93 option0.id = "foo"; 94 dataList.append(option0); 95 // HTMLCollection supports a named property getter but not a setter. 96 let htmlCollection = dataList.options; 97 // Confirm the test settings. 98 assert_equals(htmlCollection.length, 1); 99 // HTMLCollection is marked LegacyUnenumerableNamedProperties so enumerable 100 // is false. 101 assert_prop_desc_equals(htmlCollection, "foo", 102 {value: option0, writable: false, enumerable: false, 103 configurable: true}); 104 assert_prop_desc_equals(htmlCollection, "bar", undefined); 105 // Actual test 106 assert_throws_js(TypeError, () => 107 Object.defineProperty(htmlCollection, "foo", 108 {value: true, writable: true})); 109 assert_throws_js(TypeError, () => 110 Object.defineProperty(htmlCollection, "foo", {get: () => {}})); 111 assert_throws_js(TypeError, () => 112 Object.defineProperty(htmlCollection, "foo", {set: () => {}})); 113 let option1 = document.createElement("option"); 114 option1.id = "bar"; 115 Object.defineProperty(htmlCollection, "bar", 116 {value: option1, writable: true}); 117 assert_equals(htmlCollection["foo"], option0); 118 assert_equals(htmlCollection["bar"], option1); 119 htmlCollection["foo"] = document.documentElement; 120 htmlCollection["baz"] = document.documentElement; 121 assert_equals(htmlCollection["foo"], option0); 122 assert_equals(htmlCollection["baz"], document.documentElement); 123 assert_throws_js(TypeError, () => { 124 "use strict"; 125 htmlCollection["foo"] = document.documentElement; 126 }); 127 // Nothing must change after all for supported property names. 128 assert_prop_desc_equals(htmlCollection, "foo", 129 {value: option0, writable: false, enumerable: false, 130 configurable: true}); 131 }, "Test [[DefineOwnProperty]] with no named property setter support."); 132 133 test(function() { 134 let element = document.createElement("div"); 135 // DOMStringMap supports a named property setter. 136 let domStringMap = element.dataset; 137 // Confirm the test settings. 138 assert_prop_desc_equals(domStringMap, "foo", undefined); 139 // Try to define an accessor property with non supported property name. 140 assert_throws_js(TypeError, () => 141 Object.defineProperty(domStringMap, "foo", {get: () => {}})); 142 assert_throws_js(TypeError, () => 143 Object.defineProperty(domStringMap, "foo", {set: () => {}})); 144 assert_prop_desc_equals(domStringMap, "foo", undefined); 145 // writable, enumerable, configurable will be ignored. 146 Object.defineProperty(domStringMap, "foo", 147 {value: "foo content", writable: false, 148 enumerable: false, configurable: false}); 149 assert_prop_desc_equals(domStringMap, "foo", 150 {value: "foo content", writable: true, 151 enumerable: true, configurable: true}); 152 domStringMap["bar"] = "bar content"; 153 assert_prop_desc_equals(domStringMap, "bar", 154 {value: "bar content", writable: true, 155 enumerable: true, configurable: true}); 156 // Try to define an accessor property with a supported property name. 157 assert_throws_js(TypeError, () => 158 Object.defineProperty(domStringMap, "foo", {get: () => {}})); 159 assert_throws_js(TypeError, () => 160 Object.defineProperty(domStringMap, "foo", {set: () => {}})); 161 assert_prop_desc_equals(domStringMap, "foo", 162 {value: "foo content", writable: true, 163 enumerable: true, configurable: true}); 164 }, "Test [[DefineOwnProperty]] with named property setter support."); 165 </script>