tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>