Proxy.handler-getOwnPropertyDescriptor.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. load("test-common.js");
  2. try {
  3. assert(Object.getOwnPropertyDescriptor(new Proxy({}, { getOwnPropertyDescriptor: null }), "a") === undefined);
  4. assert(Object.getOwnPropertyDescriptor(new Proxy({}, { getOwnPropertyDescriptor: undefined }), "a") === undefined);
  5. assert(Object.getOwnPropertyDescriptor(new Proxy({}, {}), "a") === undefined);
  6. let o = {};
  7. let p = new Proxy(o, {
  8. getOwnPropertyDescriptor(target, property) {
  9. assert(target === o);
  10. assert(property === "foo");
  11. }
  12. });
  13. Object.getOwnPropertyDescriptor(p, "foo");
  14. o = { foo: "bar" };
  15. Object.defineProperty(o, "baz", { value: "qux", enumerable: false, configurable: true, writable: false });
  16. p = new Proxy(o, {
  17. getOwnPropertyDescriptor(target, property) {
  18. if (property === "baz")
  19. return Object.getOwnPropertyDescriptor(target, "baz");
  20. return { value: target[property], enumerable: false, configurable: true, writable: true };
  21. }
  22. });
  23. let d = Object.getOwnPropertyDescriptor(p, "baz");
  24. assert(d.configurable === true);
  25. assert(d.enumerable === false);
  26. assert(d.writable === false);
  27. assert(d.value === "qux");
  28. assert(d.get === undefined);
  29. assert(d.set === undefined);
  30. d = Object.getOwnPropertyDescriptor(p, "foo");
  31. assert(d.configurable === true);
  32. assert(d.enumerable === false);
  33. assert(d.writable === true);
  34. assert(d.value === "bar");
  35. assert(d.get === undefined);
  36. assert(d.set === undefined);
  37. // Invariants
  38. assertThrowsError(() => {
  39. Object.getOwnPropertyDescriptor(new Proxy({}, {
  40. getOwnPropertyDescriptor: 1
  41. }));
  42. }, {
  43. error: TypeError,
  44. message: "Proxy handler's getOwnPropertyDescriptor trap wasn't undefined, null, or callable",
  45. });
  46. assertThrowsError(() => {
  47. Object.getOwnPropertyDescriptor(new Proxy({}, {
  48. getOwnPropertyDescriptor() {
  49. return 1;
  50. },
  51. }));
  52. }, {
  53. error: TypeError,
  54. message: "Proxy handler's getOwnPropertyDescriptor trap violates invariant: must return an object or undefined",
  55. });
  56. o = {};
  57. Object.defineProperty(o, "foo", { value: 10, configurable: false });
  58. p = new Proxy(o, {
  59. getOwnPropertyDescriptor() {
  60. return undefined;
  61. },
  62. });
  63. assert(Object.getOwnPropertyDescriptor(p, "bar") === undefined);
  64. assertThrowsError(() => {
  65. Object.getOwnPropertyDescriptor(p, "foo");
  66. }, {
  67. error: TypeError,
  68. message: "Proxy handler's getOwnPropertyDescriptor trap violates invariant: cannot return undefined for a property on the target which is a non-configurable property",
  69. });
  70. Object.defineProperty(o, "baz", { value: 20, configurable: true, writable: true, enumerable: true });
  71. Object.preventExtensions(o);
  72. assertThrowsError(() => {
  73. Object.getOwnPropertyDescriptor(p, "baz");
  74. }, {
  75. error: TypeError,
  76. message: "Proxy handler's getOwnPropertyDescriptor trap violates invariant: cannot report a property as being undefined if it exists as an own property of the target and the target is non-extensible",
  77. });
  78. o = {};
  79. Object.defineProperty(o, "v1", { value: 10, configurable: false });
  80. Object.defineProperty(o, "v2", { value: 10, configurable: false, enumerable: true });
  81. Object.defineProperty(o, "v3", { configurable: false, get() { return 1; } });
  82. Object.defineProperty(o, "v4", { value: 10, configurable: false, writable: false, enumerable: true });
  83. assertThrowsError(() => {
  84. Object.getOwnPropertyDescriptor(new Proxy(o, {
  85. getOwnPropertyDescriptor() {
  86. return { configurable: true };
  87. },
  88. }), "v1");
  89. }, {
  90. error: TypeError,
  91. message: "Proxy handler's getOwnPropertyDescriptor trap violates invariant: invalid property descriptor for existing property on the target",
  92. });
  93. assertThrowsError(() => {
  94. Object.getOwnPropertyDescriptor(new Proxy(o, {
  95. getOwnPropertyDescriptor() {
  96. return { enumerable: false };
  97. },
  98. }), "v2");
  99. }, {
  100. error: TypeError,
  101. message: "Proxy handler's getOwnPropertyDescriptor trap violates invariant: invalid property descriptor for existing property on the target",
  102. });
  103. assertThrowsError(() => {
  104. Object.getOwnPropertyDescriptor(new Proxy(o, {
  105. getOwnPropertyDescriptor() {
  106. return { value: 10 };
  107. },
  108. }), "v3");
  109. }, {
  110. error: TypeError,
  111. message: "Proxy handler's getOwnPropertyDescriptor trap violates invariant: invalid property descriptor for existing property on the target",
  112. });
  113. assertThrowsError(() => {
  114. Object.getOwnPropertyDescriptor(new Proxy(o, {
  115. getOwnPropertyDescriptor() {
  116. return { value: 10, writable: true };
  117. },
  118. }), "v4");
  119. }, {
  120. error: TypeError,
  121. message: "Proxy handler's getOwnPropertyDescriptor trap violates invariant: invalid property descriptor for existing property on the target",
  122. });
  123. o = {};
  124. Object.defineProperty(o, "v", { configurable: true });
  125. assertThrowsError(() => {
  126. Object.getOwnPropertyDescriptor(new Proxy(o, {
  127. getOwnPropertyDescriptor() {
  128. return { configurable: false };
  129. },
  130. }), "v");
  131. }, {
  132. error: TypeError,
  133. message: "Proxy handler's getOwnPropertyDescriptor trap violates invariant: cannot report target's property as non-configurable if the property does not exist, or if it is configurable",
  134. });
  135. console.log("PASS");
  136. } catch (e) {
  137. console.log("FAIL: " + e);
  138. }