| OLD | NEW |
| (Empty) | |
| 1 <!DOCTYPE html> |
| 2 <meta charset="utf-8"> |
| 3 <title>Legacy platform objects</title> |
| 4 <link rel="help" href="https://heycam.github.io/webidl/#es-legacy-platform-objec
ts"> |
| 5 <script src="/resources/testharness.js"></script> |
| 6 <script src="/resources/testharnessreport.js"></script> |
| 7 <script> |
| 8 function assert_prop_desc_equals(object, property_key, expected) { |
| 9 let actual = Object.getOwnPropertyDescriptor(object, property_key); |
| 10 if (expected === undefined) { |
| 11 assert_equals( |
| 12 actual, undefined, |
| 13 "(assert_prop_desc_equals: no property descriptor expected)"); |
| 14 return; |
| 15 } |
| 16 for (p in actual) { |
| 17 assert_true( |
| 18 expected.hasOwnProperty(p), |
| 19 "(assert_prop_desc_equals: property '" + p + "' is not expected)"); |
| 20 assert_equals( |
| 21 actual[p], expected[p], |
| 22 "(assert_prop_desc_equals: property '" + p + "')"); |
| 23 } |
| 24 for (p in expected) { |
| 25 assert_true( |
| 26 actual.hasOwnProperty(p), |
| 27 "(assert_prop_desc_equals: expected property '" + p + "' missing)"); |
| 28 } |
| 29 } |
| 30 |
| 31 // https://heycam.github.io/webidl/#legacy-platform-object-defineownproperty |
| 32 // 3.9.3. [[DefineOwnProperty]] |
| 33 |
| 34 test(function() { |
| 35 let span = document.createElement("span"); |
| 36 span.className = "foo"; |
| 37 // DOMTokenList supports an indexed property getter but not a setter. |
| 38 let domTokenList = span.classList; |
| 39 // Confirm the test settings. |
| 40 assert_equals(domTokenList.length, 1); |
| 41 assert_prop_desc_equals(domTokenList, "0", |
| 42 {value: "foo", writable: false, enumerable: true, |
| 43 configurable: true}); |
| 44 assert_prop_desc_equals(domTokenList, "1", undefined); |
| 45 // Actual test |
| 46 assert_throws(new TypeError(), () => |
| 47 Object.defineProperty(domTokenList, "0", {value: true, writable: true})); |
| 48 assert_throws(new TypeError(), () => |
| 49 Object.defineProperty(domTokenList, "1", {value: true, writable: true})); |
| 50 assert_throws(new TypeError(), () => |
| 51 Object.defineProperty(domTokenList, "0", {get: () => {}})); |
| 52 assert_throws(new TypeError(), () => |
| 53 Object.defineProperty(domTokenList, "0", {set: () => {}})); |
| 54 assert_throws(new TypeError(), () => |
| 55 Object.defineProperty(domTokenList, "1", {get: () => {}})); |
| 56 assert_throws(new TypeError(), () => |
| 57 Object.defineProperty(domTokenList, "1", {set: () => {}})); |
| 58 assert_equals(domTokenList[0], "foo"); |
| 59 assert_equals(domTokenList[1], undefined); |
| 60 domTokenList[0] = "bar"; |
| 61 domTokenList[1] = "bar"; |
| 62 assert_equals(domTokenList[0], "foo"); |
| 63 assert_equals(domTokenList[1], undefined); |
| 64 assert_throws(new TypeError(), () => { |
| 65 "use strict"; |
| 66 domTokenList[0] = "bar"; |
| 67 }); |
| 68 assert_throws(new TypeError(), () => { |
| 69 "use strict"; |
| 70 domTokenList[1] = "bar"; |
| 71 }); |
| 72 // Nothing must change after all. |
| 73 assert_equals(domTokenList.length, 1); |
| 74 assert_prop_desc_equals(domTokenList, "0", |
| 75 {value: "foo", writable: false, enumerable: true, |
| 76 configurable: true}); |
| 77 assert_prop_desc_equals(domTokenList, "1", undefined); |
| 78 }, "Test [[DefineOwnProperty]] with no indexed property setter support."); |
| 79 |
| 80 test(function() { |
| 81 // HTMLSelectElement supports an indexed property setter. |
| 82 let select = document.createElement("select"); |
| 83 let option0 = document.createElement("option"); |
| 84 let option1 = document.createElement("option"); |
| 85 // Confirm the test settings. |
| 86 assert_equals(select.length, 0); |
| 87 assert_prop_desc_equals(select, "0", undefined); |
| 88 // Try to define an accessor property with non supported property index. |
| 89 assert_throws(new TypeError(), () => |
| 90 Object.defineProperty(select, "0", {get: () => {}})); |
| 91 assert_throws(new TypeError(), () => |
| 92 Object.defineProperty(select, "0", {set: () => {}})); |
| 93 assert_prop_desc_equals(select, "0", undefined); |
| 94 // writable, enumerable, configurable will be ignored. |
| 95 Object.defineProperty(select, "0", {value: option0, writable: false, |
| 96 enumerable: false, configurable: false}); |
| 97 assert_prop_desc_equals(select, "0", |
| 98 {value: option0, writable: true, enumerable: true, |
| 99 configurable: true}); |
| 100 select[1] = option1; |
| 101 assert_prop_desc_equals(select, "1", |
| 102 {value: option1, writable: true, enumerable: true, |
| 103 configurable: true}); |
| 104 // Try to define an accessor property with a supported property index. |
| 105 assert_throws(new TypeError(), () => |
| 106 Object.defineProperty(select, "0", {get: () => {}})); |
| 107 assert_throws(new TypeError(), () => |
| 108 Object.defineProperty(select, "0", {set: () => {}})); |
| 109 assert_prop_desc_equals(select, "0", |
| 110 {value: option0, writable: true, enumerable: true, |
| 111 configurable: true}); |
| 112 }, "Test [[DefineOwnProperty]] with indexed property setter support."); |
| 113 </script> |
| OLD | NEW |