public async Task WebViewDisposeDoesNotBlockWhenHasPendingJSCalls() { await Run(async() => { const string DotNetObject = "DotNetObject"; var taskCompletionSourceFunction = new TaskCompletionSource <bool>(TaskCreationOptions.RunContinuationsAsynchronously); var taskCompletionSourceDispose = new TaskCompletionSource <bool>(TaskCreationOptions.RunContinuationsAsynchronously); Func <int> functionToCall = () => { TargetView.Dispose(); var disposeRan = taskCompletionSourceDispose.Task.IsCompleted; taskCompletionSourceFunction.SetResult(disposeRan); return(1); }; TargetView.RegisterJavascriptObject(DotNetObject, functionToCall); await Load($"<html><script>function test() {{ {DotNetObject}.invoke(); while(true); return 1; }}</script><body></body></html>"); TargetView.Disposed += () => taskCompletionSourceDispose.SetResult(true); var result = await TargetView.EvaluateScriptFunction <int>("test"); Assert.AreEqual(0, result, "Script evaluation should be cancelled and default value returned"); var disposed = await taskCompletionSourceFunction.Task; Assert.IsFalse(disposed, "Dispose should have been scheduled"); disposed = await taskCompletionSourceDispose.Task; Assert.IsTrue(disposed); }); }
public void WebViewDisposeDoesNotBlockWhenHasPendingJSCalls() { const string DotNetObject = "DotNetObject"; var functionCalled = false; var disposeCalled = false; Func <int> functionToCall = () => { functionCalled = true; TargetView.Dispose(); Assert.IsFalse(disposeCalled); // dispose should have been scheduled return(1); }; TargetView.RegisterJavascriptObject(DotNetObject, functionToCall, executeCallsInUI: true); LoadAndWaitReady($"<html><script>function test() {{ {DotNetObject}.invoke(); return 1; }}</script><body></body></html>"); TargetView.Disposed += () => disposeCalled = true; var result = TargetView.EvaluateScriptFunction <int>("test"); WaitFor(() => functionCalled, DefaultTimeout); WaitFor(() => disposeCalled, DefaultTimeout); Assert.IsTrue(disposeCalled); }
public async Task WebViewDisposeDoesNotBlockWhenHasPendingJSCalls() { await Run(async() => { const string DotNetObject = "DotNetObject"; var taskCompletionSourceFunction = new TaskCompletionSource <bool>(); var taskCompletionSourceDispose = new TaskCompletionSource <bool>(); Func <int> functionToCall = () => { TargetView.Dispose(); var disposeRan = taskCompletionSourceDispose.Task.IsCompleted; taskCompletionSourceFunction.SetResult(disposeRan); return(1); }; TargetView.RegisterJavascriptObject(DotNetObject, functionToCall, executeCallsInUI: true); await Load($"<html><script>function test() {{ {DotNetObject}.invoke(); return 1; }}</script><body></body></html>"); TargetView.Disposed += () => taskCompletionSourceDispose.SetResult(true); TargetView.EvaluateScriptFunction <int>("test"); var disposed = await taskCompletionSourceFunction.Task; Assert.IsFalse(disposed, "Dispose should have been scheduled"); disposed = await taskCompletionSourceDispose.Task; Assert.IsTrue(disposed); }); }
public void EvaluationErrorsContainsEvaluatedJavascript() { var exception = Assert.Throws <JavascriptException>(() => TargetView.EvaluateScriptFunction <int>("Math.min", "123", "(function() { throw new Error() })()")); var stack = exception.StackTrace.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); Assert.Greater(stack.Length, 1); Assert.True(stack.ElementAt(0).StartsWith(" at Math.min in eval")); Assert.IsFalse(stack.ElementAt(0).Contains("123")); }
public async Task EvaluationErrorsContainsEvaluatedJavascript() { await Run(() => { var exception = Assert.Throws <JavascriptException>(() => TargetView.EvaluateScriptFunction <int>("Math.min", "123", "(function() { throw new Error() })()")); var stack = exception.StackTrace.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); Assert.Greater(stack.Length, 1); StringAssert.StartsWith(" at Math.min in eval", stack.ElementAt(0)); StringAssert.DoesNotContain("123", stack.ElementAt(0)); }); }
public void JsEvaluationReturnsDefaultValuesAfterWebViewDispose() { var disposeCalled = false; LoadAndWaitReady("<html><script>function test() { return 1; }</script><body></body></html>"); TargetView.Disposed += () => disposeCalled = true; TargetView.Dispose(); WaitFor(() => disposeCalled, DefaultTimeout); var result = TargetView.EvaluateScriptFunction <int>("test"); Assert.IsTrue(disposeCalled); Assert.AreEqual(result, 0); }
public void RegisteredJsObjectMethodExecutesInDispatcherThreadWithoutBlocking() { const string DotNetObject = "DotNetObject"; bool functionCalled = false; Func <int> functionToCall = () => { TargetView.EvaluateScript <int>("1+1"); functionCalled = true; return(1); }; TargetView.RegisterJavascriptObject(DotNetObject, functionToCall, executeCallsInUI: true); LoadAndWaitReady("<html><script>function test() { DotNetObject.invoke(); return 1; }</script><body></body></html>"); var result = TargetView.EvaluateScriptFunction <int>("test"); WaitFor(() => functionCalled, DefaultTimeout); Assert.AreEqual(1, result); }
public async Task JsEvaluationReturnsDefaultValuesAfterWebViewDispose() { await Run(async() => { var taskCompletionSource = new TaskCompletionSource <bool>(); await Load("<html><script>function test() { return 1; }</script><body></body></html>"); TargetView.Disposed += () => { taskCompletionSource.SetResult(true); }; TargetView.Dispose(); var disposeCalled = await taskCompletionSource.Task; var result = await TargetView.EvaluateScriptFunction <int>("test"); Assert.IsTrue(disposeCalled); Assert.AreEqual(result, 0); }); }
public async Task RegisteredJsObjectMethodExecutesInDispatcherThreadWithoutBlocking() { await Run(async() => { const string DotNetObject = "DotNetObject"; var taskCompletionSource = new TaskCompletionSource <bool>(); Func <int> functionToCall = () => { TargetView.EvaluateScript <int>("1+1"); taskCompletionSource.SetResult(true); return(1); }; TargetView.RegisterJavascriptObject(DotNetObject, functionToCall, executeCallsInUI: true); await Load("<html><script>function test() { DotNetObject.invoke(); return 1; }</script><body></body></html>"); var result = await TargetView.EvaluateScriptFunction <int>("test"); await taskCompletionSource.Task; Assert.AreEqual(1, result); }); }