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);
        }
Пример #3
0
        T IExomiaWebBrowser.AddUiCallback <T>(string name, T item)
        {
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item));
            }
            lock (_namedServices)
            {
                if (_namedServices.TryGetValue(name, out object service))
                {
                    if (service is IDisposable disposable)
                    {
                        disposable.Dispose();
                    }
                    JavascriptObjectRepository.UnRegister(name);

                    // ReSharper disable once HeapView.PossibleBoxingAllocation
                    _namedServices[name] = item;
                }
                else
                {
                    // ReSharper disable once HeapView.PossibleBoxingAllocation
                    _namedServices.Add(name, item);
                }
                return(item);
            }
        }
        public void CanRegisterJavascriptObjectPropertyBindWhenNamespaceIsNull()
        {
            IJavascriptObjectRepositoryInternal javascriptObjectRepository = new JavascriptObjectRepository();
            var name = nameof(NoNamespaceClass);

            BindingOptions bindingOptions = new BindingOptions()
            {
                Binder = BindingOptions.DefaultBinder.Binder,
                PropertyInterceptor = new PropertyInterceptorLogger()
            };
            javascriptObjectRepository.Register(name, new NoNamespaceClass(), false, bindingOptions);
            Assert.True(javascriptObjectRepository.IsBound(name));

            var boundObjects = javascriptObjectRepository.GetObjects(new List<string> { name });
            Assert.Single(boundObjects);

            object getResult, setResult = 100;
            string exception;
            NoNamespaceClass noNamespaceClass = new NoNamespaceClass();
            bool retValue = javascriptObjectRepository.TrySetProperty(boundObjects[0].Id, "year", setResult, out exception);
            Assert.True(retValue);

            retValue = javascriptObjectRepository.TryGetProperty(boundObjects[0].Id, "year", out getResult, out exception);
            Assert.True(retValue);
            Assert.Equal(100, Convert.ToInt32(getResult));
        }
Пример #5
0
 void IExomiaWebBrowser.SetJsUiStore(IJsUiStore?jsUiStore)
 {
     lock (_services)
     {
         if (_services.TryGetValue(typeof(IJsUiStore), out object service))
         {
             if (service is IDisposable disposable)
             {
                 disposable.Dispose();
             }
             JavascriptObjectRepository.UnRegister(EX_UI_STORE);
             if (jsUiStore != null)
             {
                 _services[typeof(IJsUiStore)] = jsUiStore;
             }
         }
         else
         {
             if (jsUiStore != null)
             {
                 _services.Add(typeof(IJsUiStore), jsUiStore);
             }
         }
     }
 }
        public BrowserProcessService()
        {
            var context = OperationContext.Current;

            host = (BrowserProcessServiceHost)context.Host;

            javascriptObjectRepository = host.JavascriptObjectRepository;
        }
        public void CanRegisterJavascriptObjectBindWhenNamespaceIsNull()
        {
            var javascriptObjectRepository = new JavascriptObjectRepository();
            var name = nameof(NoNamespaceClass);

            javascriptObjectRepository.Register(name, new NoNamespaceClass(), false, new BindingOptions()
            {
            });
            Assert.True(javascriptObjectRepository.IsBound(name));

            var result = ((IJavascriptObjectRepositoryInternal)javascriptObjectRepository).TryCallMethod(1, "getExampleString", new object[0]);

            Assert.True(result.Success);
            Assert.Equal("ok", result.ReturnValue.ToString());
        }
        public void CanRegisterJavascriptObjectBindWhenNamespaceIsNull()
        {
            IJavascriptObjectRepositoryInternal javascriptObjectRepository = new JavascriptObjectRepository();
            var name = nameof(NoNamespaceClass);
#if NETCOREAPP
            javascriptObjectRepository.Register(name, new NoNamespaceClass(), new BindingOptions());
#else
            javascriptObjectRepository.Register(name, new NoNamespaceClass(), false, new BindingOptions());
#endif
            Assert.True(javascriptObjectRepository.IsBound(name));

            var boundObjects = javascriptObjectRepository.GetObjects(new List<string> { name });
            Assert.Single(boundObjects);

            var result = javascriptObjectRepository.TryCallMethod(boundObjects[0].Id, "getExampleString", new object[0]);
            Assert.True(result.Success);
            Assert.Equal("ok", result.ReturnValue.ToString());
        }
Пример #9
0
        public Browser(Texture2D texture, string address)
            : base(address, new BrowserSettings()
        {
            DefaultEncoding = "UTF-8"
        })
        {
            m_Texture = texture;
            Size      = new Size(texture.Description.Width, texture.Description.Height);
            RenderHandler.Dispose();
            RenderHandler = new RenderHandler(this, m_Lock);
            var options = new BindingOptions()
            {
                CamelCaseJavascriptNames = false
            };

            JavascriptObjectRepository.Register("VRCX", VRCX.Instance, true, options);
            JavascriptObjectRepository.Register("VRCXStorage", VRCXStorage.Instance, false, options);
            JavascriptObjectRepository.Register("SQLite", SQLite.Instance, true, options);
        }
Пример #10
0
        public BrowserProcessServiceHost(JavascriptObjectRepository javascriptObjectRepository, int parentProcessId, int browserId, IJavascriptCallbackFactory callbackFactory)
            : base(typeof(BrowserProcessService), new Uri[0])
        {
            JavascriptObjectRepository = javascriptObjectRepository;

            var serviceName = RenderprocessClientFactory.GetServiceName(parentProcessId, browserId);

            Description.ApplyServiceBehavior(() => new ServiceDebugBehavior(), p => p.IncludeExceptionDetailInFaults = true);

            var binding = CreateBinding();

            var endPoint = AddServiceEndpoint(
                typeof(IBrowserProcess),
                binding,
                new Uri(serviceName)
                );

            endPoint.Contract.ProtectionLevel = ProtectionLevel.None;
            endPoint.Behaviors.Add(new JavascriptCallbackEndpointBehavior(callbackFactory));
        }
Пример #11
0
        public void DisposeQueueThenEnqueueMethodInvocation()
        {
            var methodInvocation = new MethodInvocation(1, 1, 1, "Testing", 1);

            methodInvocation.Parameters.Add("Echo Me!");

            var objectRepository = new JavascriptObjectRepository
            {
                NameConverter = null
            };

            var methodRunnerQueue = new MethodRunnerQueue(objectRepository);

            //Dispose
            methodRunnerQueue.Dispose();

            //Enqueue
            var ex = Record.Exception(() => methodRunnerQueue.Enqueue(methodInvocation));

            //Ensure no exception thrown
            Assert.Null(ex);
        }
        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);
        }
Пример #14
0
        IUiActionHandler IExomiaWebBrowser.CreateJsUiActions()
        {
            lock (_services)
            {
                UiActions uiActions = new UiActions();
                if (_services.TryGetValue(typeof(IUiActionHandler), out object service))
                {
                    if (service is IDisposable disposable)
                    {
                        disposable.Dispose();
                    }
                    JavascriptObjectRepository.UnRegister(EX_UI);
                    _services[typeof(IUiActionHandler)] = uiActions;
                    _services[typeof(IJsUiActions)]     = uiActions;
                }
                else
                {
                    _services.Add(typeof(IUiActionHandler), uiActions);
                    _services.Add(typeof(IJsUiActions), uiActions);
                }

                return(uiActions);
            }
        }
Пример #15
0
 protected override void OnClosed()
 {
     base.OnClosed();
     JavascriptObjectRepository = null;
 }