Ejemplo n.º 1
0
        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);
            });
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
            });
        }
Ejemplo n.º 4
0
        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"));
        }
Ejemplo n.º 5
0
        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));
            });
        }
Ejemplo n.º 6
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);
        }
Ejemplo n.º 7
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);
        }
Ejemplo n.º 8
0
        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);
            });
        }