Proxy.handler-defineProperty.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. load("test-common.js");
  2. try {
  3. let p = new Proxy({}, { defineProperty: null });
  4. assert(Object.defineProperty(p, "foo", {}) === p);
  5. p = new Proxy({}, { defineProperty: undefined });
  6. assert(Object.defineProperty(p, "foo", {}) === p);
  7. p = new Proxy({}, {});
  8. assert(Object.defineProperty(p, "foo", {}) == p);
  9. let o = {};
  10. p = new Proxy(o, {
  11. defineProperty(target, name, descriptor) {
  12. assert(target === o);
  13. assert(name === "foo");
  14. assert(descriptor.configurable === true);
  15. assert(descriptor.enumerable === undefined);
  16. assert(descriptor.writable === true);
  17. assert(descriptor.value === 10);
  18. assert(descriptor.get === undefined);
  19. assert(descriptor.set === undefined);
  20. return true;
  21. },
  22. });
  23. Object.defineProperty(p, "foo", { configurable: true, writable: true, value: 10 });
  24. p = new Proxy(o, {
  25. defineProperty(target, name, descriptor) {
  26. if (target[name] === undefined)
  27. Object.defineProperty(target, name, descriptor);
  28. return true;
  29. },
  30. });
  31. Object.defineProperty(p, "foo", { value: 10, enumerable: true, configurable: false, writable: true });
  32. let d = Object.getOwnPropertyDescriptor(p, "foo");
  33. assert(d.enumerable === true);
  34. assert(d.configurable === false);
  35. assert(d.writable === true);
  36. assert(d.value === 10);
  37. assert(d.get === undefined);
  38. assert(d.set === undefined);
  39. Object.defineProperty(p, "foo", { value: 20, enumerable: true, configurable: false, writable: true });
  40. d = Object.getOwnPropertyDescriptor(p, "foo");
  41. assert(d.enumerable === true);
  42. assert(d.configurable === false);
  43. assert(d.writable === true);
  44. assert(d.value === 10);
  45. assert(d.get === undefined);
  46. assert(d.set === undefined);
  47. // Invariants
  48. p = new Proxy({}, {
  49. defineProperty() { return false; }
  50. });
  51. assertThrowsError(() => {
  52. Object.defineProperty(p, "foo", {});
  53. }, {
  54. error: TypeError,
  55. message: "Object's [[DefineProperty]] method returned false",
  56. });
  57. o = {};
  58. Object.preventExtensions(o);
  59. p = new Proxy(o, {
  60. defineProperty() {
  61. return true;
  62. }
  63. });
  64. assertThrowsError(() => {
  65. Object.defineProperty(p, "foo", {});
  66. }, {
  67. error: TypeError,
  68. message: "Proxy handler's defineProperty trap violates invariant: a property cannot be reported as being defined if the property does not exist on the target and the target is non-extensible",
  69. });
  70. o = {};
  71. Object.defineProperty(o, "foo", { value: 10, configurable: true });
  72. p = new Proxy(o, {
  73. defineProperty() {
  74. return true;
  75. },
  76. });
  77. assertThrowsError(() => {
  78. Object.defineProperty(p, "bar", { value: 6, configurable: false });
  79. }, {
  80. error: TypeError,
  81. message: "Proxy handler's defineProperty trap violates invariant: a property cannot be defined as non-configurable if it does not already exist on the target object",
  82. });
  83. assertThrowsError(() => {
  84. Object.defineProperty(p, "foo", { value: 6, configurable: false });
  85. }, {
  86. error: TypeError,
  87. message: "Proxy handler's defineProperty trap violates invariant: a property cannot be defined as non-configurable if it already exists on the target object as a configurable property",
  88. });
  89. console.log("PASS");
  90. } catch (e) {
  91. console.log("FAIL: " + e);
  92. }