Proxy.handler-getPrototypeOf.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. load("test-common.js");
  2. try {
  3. const child = {};
  4. const childProto = { foo: "bar" };
  5. Object.setPrototypeOf(child, childProto);
  6. assert(child.foo === "bar");
  7. Object.getPrototypeOf(new Proxy(child, { getPrototypeOf: null }));
  8. Object.getPrototypeOf(new Proxy(child, { getPrototypeOf: undefined }));
  9. let o = {};
  10. let p = new Proxy(o, {
  11. getPrototypeOf(target) {
  12. assert(target === o);
  13. return null;
  14. }
  15. });
  16. Object.getPrototypeOf(p);
  17. p = new Proxy(o, {
  18. getPrototypeOf(target) {
  19. if (target.foo)
  20. return { bar: 1 };
  21. return { bar: 2 };
  22. },
  23. });
  24. assert(Object.getPrototypeOf(p).bar === 2);
  25. o.foo = 20
  26. assert(Object.getPrototypeOf(p).bar === 1);
  27. // Invariants
  28. assertThrowsError(() => {
  29. Object.getPrototypeOf(new Proxy(child, { getPrototypeOf: 1 }));
  30. }, {
  31. error: TypeError,
  32. message: "Proxy handler's getPrototypeOf trap wasn't undefined, null, or callable",
  33. });
  34. assertThrowsError(() => {
  35. Object.getPrototypeOf(new Proxy(child, { getPrototypeOf() { return 1; } }));
  36. }, {
  37. error: TypeError,
  38. message: "Proxy handler's getPrototypeOf trap violates invariant: must return an object or null",
  39. });
  40. p = new Proxy(child, {
  41. getPrototypeOf(target) {
  42. assert(target === child);
  43. return { baz: "qux" };
  44. },
  45. });
  46. assert(Object.getPrototypeOf(p).baz === "qux");
  47. Object.preventExtensions(child);
  48. p = new Proxy(child, {
  49. getPrototypeOf(target) {
  50. assert(target === child);
  51. return childProto;
  52. }
  53. });
  54. assert(Object.getPrototypeOf(p).foo === "bar");
  55. p = new Proxy(child, {
  56. getPrototypeOf(target) {
  57. assert(target === child);
  58. return { baz: "qux" };
  59. }
  60. });
  61. assertThrowsError(() => {
  62. Object.getPrototypeOf(p);
  63. }, {
  64. error: TypeError,
  65. message: "Proxy handler's getPrototypeOf trap violates invariant: cannot return a different prototype object for a non-extensible target"
  66. });
  67. console.log("PASS");
  68. } catch (e) {
  69. console.log("FAIL: " + e);
  70. }