You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Throw TypeError if [[DefineOwnProperty]] returns false (#6868)
According to es spec Object.defineProperty should throw if internal [[DefineOwnProperty]] returns false-ish.
This happens specifically if the defineProperty proxy trap returns false (See #6505).
Changes
Throw TypeError in JavascriptObject::EntryDefineProperty if DefineOwnPropertyHelper returns false-ish
Changed content of JSERR_ProxyHandlerReturnedFalse
Routed PropertyOperationFlags through the call stack
Fixes#6505
RT_ERROR_MSG(JSERR_InvalidGloFuncDecl, 5679, "The global property %s is not configurable, writable, nor enumerable, therefore cannot be declared as a function", "", kjstTypeError, 0)
Copy file name to clipboardExpand all lines: test/Bugs/misc_bugs.js
+22-4Lines changed: 22 additions & 4 deletions
Original file line number
Diff line number
Diff line change
@@ -189,10 +189,28 @@ var tests = [
189
189
{
190
190
name: "Strict Mode : throw type error when the handler returns falsy value",
191
191
body: function(){
192
-
assert.throws(()=>{"use strict";letp1=newProxy({},{set(){}});p1.foo=1;},TypeError,"returning undefined on set handler is return false which will throw type error","Proxy set handler returned false");
193
-
assert.throws(()=>{"use strict";letp1=newProxy({},{deleteProperty(){}});deletep1.foo;},TypeError,"returning undefined on deleteProperty handler is return false which will throw type error","Proxy deleteProperty handler returned false");
194
-
assert.throws(()=>{"use strict";letp1=newProxy({},{set(){returnfalse;}});p1.foo=1;},TypeError,"set handler is returning false which will throw type error","Proxy set handler returned false");
195
-
assert.throws(()=>{"use strict";letp1=newProxy({},{deleteProperty(){returnfalse;}});deletep1.foo;},TypeError,"deleteProperty handler is returning false which will throw type error","Proxy deleteProperty handler returned false");
192
+
assert.throws(()=>{"use strict";letp1=newProxy({},{set(){}});p1.foo=1;},TypeError,"returning undefined on set handler is return false which will throw type error","Proxy 'set' handler returned falsish for property 'foo'");
193
+
assert.throws(()=>{"use strict";letp1=newProxy({},{deleteProperty(){}});deletep1.foo;},TypeError,"returning undefined on deleteProperty handler is return false which will throw type error","Proxy 'deleteProperty' handler returned falsish for property 'foo'");
194
+
assert.throws(()=>{"use strict";letp1=newProxy({},{set(){returnfalse;}});p1.foo=1;},TypeError,"set handler is returning false which will throw type error","Proxy 'set' handler returned falsish for property 'foo'");
195
+
assert.throws(()=>{"use strict";letp1=newProxy({},{deleteProperty(){returnfalse;}});deletep1.foo;},TypeError,"deleteProperty handler is returning false which will throw type error","Proxy 'deleteProperty' handler returned falsish for property 'foo'");
196
+
197
+
constproxy=newProxy({},{
198
+
defineProperty(){
199
+
returnfalse;
200
+
}
201
+
});
202
+
assert.doesNotThrow(()=>{
203
+
proxy.a={};
204
+
},"Set property in NON-strict mode does NOT throw if trap returns falsy");
205
+
assert.throws(()=>{
206
+
"use strict";
207
+
proxy.b={};
208
+
},TypeError,"Set property in strict mode does DOES throw if trap returns falsy");
209
+
assert.throws(()=>{
210
+
Object.defineProperty(proxy,"c",{
211
+
value: {}
212
+
});
213
+
},TypeError,"Calling 'Object.defineProperty' throws if trap returns falsy");
0 commit comments