diff --git a/Jint.Tests/Runtime/ProxyTests.cs b/Jint.Tests/Runtime/ProxyTests.cs index eb6b5fc3a..19b3d26b9 100644 --- a/Jint.Tests/Runtime/ProxyTests.cs +++ b/Jint.Tests/Runtime/ProxyTests.cs @@ -23,6 +23,24 @@ public void ProxyCanBeRevokedWithoutContext() "); } + [Fact] + public void GetTrapIsCalledForPropertyNamedRevoke() + { + Assert.Equal("trapped", _engine.Evaluate("new Proxy({}, { get: () => 'trapped' }).revoke").AsString()); + } + + [Fact] + public void AccessingPropertyOnRevokedProxyThrowsTypeError() + { + _engine.Execute(@" + var revocable = Proxy.revocable({ foo: 1 }, { get: () => 'trapped' }); + var proxy = revocable.proxy; + revocable.revoke(); + "); + var ex = Assert.Throws(() => _engine.Evaluate("proxy.foo")); + AssertJsTypeError(_engine, ex, "Cannot perform 'foo' on a proxy that has been revoked"); + } + [Fact] public void ProxyToStringUseTarget() { diff --git a/Jint/Native/JsProxy.cs b/Jint/Native/JsProxy.cs index 011810c2a..14b0f22fa 100644 --- a/Jint/Native/JsProxy.cs +++ b/Jint/Native/JsProxy.cs @@ -24,7 +24,6 @@ internal sealed class JsProxy : ObjectInstance, IConstructor, ICallable private static readonly JsString TrapOwnKeys = new JsString("ownKeys"); private static readonly JsString TrapConstruct = new JsString("construct"); - private static readonly JsString KeyFunctionRevoke = new JsString("revoke"); private static readonly JsString KeyIsArray = new JsString("isArray"); public JsProxy( @@ -129,7 +128,7 @@ public override JsValue Get(JsValue property, JsValue receiver) AssertTargetNotRevoked(property); var target = _target; - if (KeyFunctionRevoke.Equals(property) || !TryCallHandler(TrapGet, [target, TypeConverter.ToPropertyKey(property), receiver], out var result)) + if (!TryCallHandler(TrapGet, [target, TypeConverter.ToPropertyKey(property), receiver], out var result)) { return target.Get(property, receiver); }