diff --git a/src/AngleSharp.Js.Tests/OperatorsTests.cs b/src/AngleSharp.Js.Tests/OperatorsTests.cs new file mode 100644 index 0000000..ada2f53 --- /dev/null +++ b/src/AngleSharp.Js.Tests/OperatorsTests.cs @@ -0,0 +1,47 @@ +namespace AngleSharp.Js.Tests +{ + using NUnit.Framework; + using System.Threading.Tasks; + + [TestFixture] + public class OperatorsTests + { + [Test] + public async Task InOperatorExistingAttribute() + { + + var result = await "'action' in document.createElement('form')".EvalScriptAsync(); + Assert.AreEqual("True", result); + } + + [Test] + public async Task InOperatorNonExistingAttribute() + { + + var result = await "'action' in document.createElement('div')".EvalScriptAsync(); + Assert.AreEqual("False", result); + } + + [Test] + public async Task InOperatorInputWithinForm() + { + var result = await "'input1' in new DOMParser().parseFromString(`
`, 'text/html').body.firstChild".EvalScriptAsync(); + Assert.AreEqual("True", result); + } + + [Test] + public async Task InOperatorInputWithinDiv() + { + var result = await "'input1' in new DOMParser().parseFromString(``, 'text/html').body.firstChild".EvalScriptAsync(); + Assert.AreEqual("False", result); + } + + [Test] + public async Task InOperator_Issue104() + { + var result = await "'somethingThatDoesntExist' in document.createElement('form')".EvalScriptAsync(); + Assert.AreEqual("False", result); + } + + } +} diff --git a/src/AngleSharp.Js/Proxies/DomPrototypeInstance.cs b/src/AngleSharp.Js/Proxies/DomPrototypeInstance.cs index 1967c15..a6d2fd1 100644 --- a/src/AngleSharp.Js/Proxies/DomPrototypeInstance.cs +++ b/src/AngleSharp.Js/Proxies/DomPrototypeInstance.cs @@ -70,7 +70,15 @@ public Boolean TryGetFromIndex(Object value, String index, out PropertyDescripto if (_stringIndexer != null && !HasProperty(index)) { var args = new Object[] { index }; - var prop = _stringIndexer.GetMethod.Invoke(value, args).ToJsValue(_instance); + var valueAtIndex = _stringIndexer.GetMethod.Invoke(value, args); + + if (valueAtIndex == null) + { + result = PropertyDescriptor.Undefined; + return false; + } + + var prop = valueAtIndex.ToJsValue(_instance); result = new PropertyDescriptor(prop, false, false, false); return true; }