| 
									
										
										
										
											2020-06-03 14:34:52 -07:00
										 |  |  | load("test-common.js"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try { | 
					
						
							|  |  |  |     let p = new Proxy({}, { preventExtensions: null }); | 
					
						
							|  |  |  |     assert(Object.preventExtensions(p) === p); | 
					
						
							|  |  |  |     p = new Proxy({}, { preventExtensions: undefined }); | 
					
						
							|  |  |  |     assert(Object.preventExtensions(p) === p); | 
					
						
							|  |  |  |     p = new Proxy({}, {}); | 
					
						
							|  |  |  |     assert(Object.preventExtensions(p) == p); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let o = {}; | 
					
						
							|  |  |  |     p = new Proxy(o, { | 
					
						
							|  |  |  |         preventExtensions(target) { | 
					
						
							|  |  |  |             assert(target === o); | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Object.preventExtensions(o); | 
					
						
							|  |  |  |     Object.preventExtensions(p); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Invariants
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     p = new Proxy({}, { | 
					
						
							|  |  |  |         preventExtensions() { | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |     assertThrowsError(() => { | 
					
						
							|  |  |  |         Object.preventExtensions(p); | 
					
						
							|  |  |  |     }, { | 
					
						
							|  |  |  |         error: TypeError, | 
					
						
							| 
									
										
										
										
											2020-06-09 22:48:01 -07:00
										 |  |  |         message: "Object's [[PreventExtensions]] method returned false", | 
					
						
							| 
									
										
										
										
											2020-06-03 14:34:52 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     o = {}; | 
					
						
							|  |  |  |     p = new Proxy(o, { | 
					
						
							|  |  |  |         preventExtensions() { | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |     assertThrowsError(() => { | 
					
						
							|  |  |  |         Object.preventExtensions(p); | 
					
						
							|  |  |  |     }, { | 
					
						
							|  |  |  |         error: TypeError, | 
					
						
							|  |  |  |         message: "Proxy handler's preventExtensions trap violates invariant: cannot return true if the target object is extensible" | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Object.preventExtensions(o); | 
					
						
							|  |  |  |     assert(Object.preventExtensions(p) === p); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     console.log("PASS"); | 
					
						
							|  |  |  | } catch (e) { | 
					
						
							|  |  |  |     console.log("FAIL: " + e); | 
					
						
							|  |  |  | } |