Пример #1
0
        public async Task JavascriptBindingMultipleObjects()
        {
            const string script = @"
                (async function()
                {
                    await CefSharp.BindObjectAsync('first');
                    await CefSharp.BindObjectAsync('first', 'second');
                })();";

            var objectNames = new List <string>();
            var boundObj    = new AsyncBoundObject();

            using (var browser = new ChromiumWebBrowser("https://www.google.com"))
            {
                browser.JavascriptObjectRepository.ResolveObject += (s, e) =>
                {
                    objectNames.Add(e.ObjectName);
#if NETCOREAPP
                    e.ObjectRepository.Register(e.ObjectName, boundObj);
#else
                    e.ObjectRepository.Register(e.ObjectName, boundObj, isAsync: true);
#endif
                };

                await browser.LoadPageAsync();

                browser.GetMainFrame().ExecuteJavaScriptAsync(script);

                await Task.Delay(2000);

                Assert.Equal(new[] { "first", "second" }, objectNames);
            }
        }
Пример #2
0
        public async Task CrossSiteNavigationJavascriptBinding()
        {
            const string script = @"
                (async function()
                {
                    await CefSharp.BindObjectAsync('bound');
                    bound.echo('test');
                })();";

            var boundObj = new AsyncBoundObject();

            var browser = new ChromiumWebBrowser("https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/url");

            browser.JavascriptObjectRepository.Register("bound", boundObj, true);

            await browser.LoadPageAsync();

            browser.GetMainFrame().ExecuteJavaScriptAsync(script);

            await Task.Delay(2000);

            Assert.True(boundObj.MethodCalled);

            boundObj.MethodCalled = false;

            browser.Load("https://www.google.com");
            await browser.LoadPageAsync();

            browser.GetMainFrame().ExecuteJavaScriptAsync(script);
            await Task.Delay(2000);

            Assert.True(boundObj.MethodCalled);
        }
        public async Task StopConcurrentMethodRunnerQueueWhenMethodRunning()
        {
            var boundObject = new AsyncBoundObject();

            var objectRepository = new JavascriptObjectRepository();

            objectRepository.NameConverter = null;
#if NETCOREAPP
            objectRepository.Register("testObject", boundObject, BindingOptions.DefaultBinder);
#else
            objectRepository.Register("testObject", boundObject, true, BindingOptions.DefaultBinder);
#endif
            var methodInvocation = new MethodInvocation(1, 1, 1, nameof(boundObject.AsyncWaitTwoSeconds), 1);
            methodInvocation.Parameters.Add("Echo Me!");
            var methodRunnerQueue = new ConcurrentMethodRunnerQueue(objectRepository);

            methodRunnerQueue.Enqueue(methodInvocation);

            //Wait a litle for the queue to start processing our Method call
            await Task.Delay(500);

            var ex = Record.Exception(() => methodRunnerQueue.Dispose());

            Assert.Null(ex);
        }
        public void ValidateAsyncTaskMethodOutput()
        {
            const string expectedResult = "Echo Me!";
            var          boundObject    = new AsyncBoundObject();

            var objectRepository = new JavascriptObjectRepository();

            objectRepository.Register("testObject", boundObject, true, new BindingOptions {
                CamelCaseJavascriptNames = false
            });
            var methodInvocation = new MethodInvocation(1, 1, 1, nameof(boundObject.AsyncWaitTwoSeconds), 1);

            methodInvocation.Parameters.Add(expectedResult);
            var methodRunnerQueue = new ConcurrentMethodRunnerQueue(objectRepository);
            var manualResetEvent  = new ManualResetEvent(false);

            var actualResult = "";

            methodRunnerQueue.MethodInvocationComplete += (sender, args) =>
            {
                methodRunnerQueue.Stop();

                actualResult = args.Result.Result.ToString();

                manualResetEvent.Set();
            };

            methodRunnerQueue.Start();
            methodRunnerQueue.Enqueue(methodInvocation);

            manualResetEvent.WaitOne(3000);

            Assert.Equal(expectedResult, actualResult);
        }
        public async Task ValidateAsyncTaskMethodOutput()
        {
            const string expectedResult = "Echo Me!";
            var          boundObject    = new AsyncBoundObject();

            var objectRepository = new JavascriptObjectRepository();

            objectRepository.NameConverter = null;
#if NETCOREAPP
            objectRepository.Register("testObject", boundObject, BindingOptions.DefaultBinder);
#else
            objectRepository.Register("testObject", boundObject, true, BindingOptions.DefaultBinder);
#endif
            var methodInvocation = new MethodInvocation(1, 1, 1, nameof(boundObject.AsyncWaitTwoSeconds), 1);
            methodInvocation.Parameters.Add(expectedResult);
            var methodRunnerQueue = new ConcurrentMethodRunnerQueue(objectRepository);
            var manualResetEvent  = new AsyncManualResetEvent();
            var cancellationToken = new CancellationTokenSource();

            cancellationToken.CancelAfter(5000);

            var actualResult = "";

            methodRunnerQueue.MethodInvocationComplete += (sender, args) =>
            {
                actualResult = args.Result.Result.ToString();

                manualResetEvent.Set();
            };

            methodRunnerQueue.Enqueue(methodInvocation);

            await manualResetEvent.WaitAsync(cancellationToken.Token);

            Assert.Equal(expectedResult, actualResult);

            methodRunnerQueue.Dispose();
        }
        public async Task StopConcurrentMethodRunnerQueueWhenMethodRunning()
        {
            var boundObject = new AsyncBoundObject();

            var objectRepository = new JavascriptObjectRepository();

            objectRepository.Register("testObject", boundObject, true, new BindingOptions {
                CamelCaseJavascriptNames = false
            });
            var methodInvocation = new MethodInvocation(1, 1, 1, nameof(boundObject.AsyncWaitTwoSeconds), 1);

            methodInvocation.Parameters.Add("Echo Me!");
            var methodRunnerQueue = new ConcurrentMethodRunnerQueue(objectRepository);

            methodRunnerQueue.Start();
            methodRunnerQueue.Enqueue(methodInvocation);

            //Wait a litle for the queue to start processing our Method call
            await Task.Delay(500);

            var ex = Record.Exception(() => methodRunnerQueue.Stop());

            Assert.Null(ex);
        }