function assert(b) { if (!b) throw new Error("Bad assertion"); } { let target = {}; let error = null; let handler = { get preventExtensions() { error = new Error; throw error; } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { let threw = false; try { Reflect.preventExtensions(proxy); } catch(e) { assert(e === error); threw = true; } assert(threw); } } { let target = {}; let error = null; let handler = { preventExtensions: function() { error = new Error; throw error; } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { let threw = false; try { Reflect.preventExtensions(proxy); } catch(e) { assert(e === error); threw = true; } assert(threw); } } { let error = null; let target = new Proxy({}, { preventExtensions: function() { error = new Error; throw error; } }); let handler = { preventExtensions: function(theTarget) { return Reflect.preventExtensions(theTarget); } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { let threw = false; try { Reflect.preventExtensions(proxy); } catch(e) { assert(e === error); threw = true; } assert(threw); } } { let target = {}; let handler = { preventExtensions: 45 }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { let threw = false; try { Reflect.preventExtensions(proxy); } catch(e) { assert(e.toString() === "TypeError: 'preventExtensions' property of a Proxy's handler should be callable"); threw = true; } assert(threw); } } { let target = {}; let handler = { preventExtensions: null }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { let result = Reflect.preventExtensions(proxy); assert(result); assert(!Reflect.isExtensible(target)); } } { let target = {}; let handler = { preventExtensions: undefined }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { let result = Reflect.preventExtensions(proxy); assert(result); assert(!Reflect.isExtensible(target)); } } { let target = {}; let handler = { preventExtensions: function(theTarget) { return true; } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { let threw = false; try { Reflect.preventExtensions(proxy); } catch(e) { assert(e.toString() === "TypeError: Proxy's 'preventExtensions' trap returned true even though its target is extensible. It should have returned false"); threw = true; } assert(threw); } } { let target = {}; let called = false; let handler = { preventExtensions: function(theTarget) { assert(theTarget === target); called = true; return Reflect.preventExtensions(theTarget); } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { let result = Reflect.preventExtensions(proxy); assert(result); assert(called); called = false; } } { let target = {}; let called = false; let handler = { preventExtensions: function(theTarget) { assert(theTarget === target); called = true; return false; } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { let result = Reflect.preventExtensions(proxy); assert(!result); assert(called); called = false; } } { let target = {}; let called = false; let handler = { preventExtensions: function(theTarget) { assert(theTarget === target); called = true; return Reflect.preventExtensions(theTarget); } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { let result = Reflect.preventExtensions(proxy); assert(result); assert(called); called = false; assert(!Reflect.isExtensible(proxy)); assert(!Reflect.isExtensible(target)); assert(!Object.isExtensible(target)); assert(Object.isFrozen(target)); assert(Object.isSealed(target)); } } { for (let i = 0; i < 500; i++) { let target = {}; let called = false; let handler = { preventExtensions: function(theTarget) { assert(theTarget === target); called = true; return Reflect.preventExtensions(theTarget); } }; let proxy = new Proxy(target, handler); let result = Reflect.preventExtensions(proxy); assert(result); assert(called); called = false; assert(!Reflect.isExtensible(proxy)); assert(!Reflect.isExtensible(target)); assert(!Object.isExtensible(target)); assert(Object.isFrozen(target)); assert(Object.isSealed(target)); } } { for (let i = 0; i < 500; i++) { let target = {}; let called = false; let handler = { preventExtensions: function(theTarget) { assert(theTarget === target); called = true; return Object.preventExtensions(theTarget); } }; let proxy = new Proxy(target, handler); let result = Reflect.preventExtensions(proxy); assert(result); assert(called); called = false; assert(!Reflect.isExtensible(proxy)); assert(!Reflect.isExtensible(target)); assert(!Object.isExtensible(target)); assert(Object.isFrozen(target)); assert(Object.isSealed(target)); } }