Пример #1
0
        public async Task ReactInstance_Initialize_Dispose()
        {
            var mre    = new ManualResetEvent(false);
            var module = new TestNativeModule
            {
                OnInitialized = () => mre.Set(),
            };

            var reactContext = new ReactContext();
            var registry     = new NativeModuleRegistry.Builder(reactContext)
                               .Add(module)
                               .Build();

            var executor = new MockJavaScriptExecutor
            {
                OnCallFunctionReturnFlushedQueue = (_, __, ___) => JValue.CreateNull(),
                OnFlushQueue = () => JValue.CreateNull(),
                OnInvokeCallbackAndReturnFlushedQueue = (_, __) => JValue.CreateNull()
            };
            var builder = new ReactInstance.Builder()
            {
                QueueConfiguration        = TestReactQueueConfiguration.Create(_ => { }),
                Registry                  = registry,
                JavaScriptExecutorFactory = () => executor,
                BundleLoader              = JavaScriptBundleLoader.CreateFileLoader("ms-appx:///Resources/test.js"),
            };

            var instance = await DispatcherHelpers.CallOnDispatcherAsync(() => builder.Build());

            reactContext.InitializeWithInstance(instance);
            await DispatcherHelpers.CallOnDispatcherAsync(async() => await instance.InitializeAsync());

            var caught = false;
            await DispatcherHelpers.CallOnDispatcherAsync(async() =>
            {
                try
                {
                    await instance.InitializeAsync();
                }
                catch (InvalidOperationException)
                {
                    caught = true;
                }
            });

            Assert.IsTrue(caught);
            mre.WaitOne();
            Assert.AreEqual(1, module.InitializeCalls);

            await DispatcherHelpers.CallOnDispatcherAsync(instance.DisposeAsync);

            Assert.AreEqual(1, module.OnReactInstanceDisposeCalls);

            // Dispose is idempotent
            await DispatcherHelpers.CallOnDispatcherAsync(instance.DisposeAsync);

            Assert.AreEqual(1, module.OnReactInstanceDisposeCalls);

            Assert.IsTrue(instance.IsDisposed);
        }
Пример #2
0
        private ReactContext CreateReactContext(IInvocationHandler handler)
        {
            var eventEmitter = new RCTDeviceEventEmitter();

            eventEmitter.InvocationHandler = handler;
            var reactInstance = new TestReactInstance(eventEmitter);
            var reactContext  = new ReactContext();

            reactContext.InitializeWithInstance(reactInstance);
            return(reactContext);
        }
        private static async Task <ReactContext> CreateContextAsync(IJavaScriptExecutor executor)
        {
            var reactInstance = await DispatcherHelpers.CallOnDispatcherAsync(() => CreateReactInstance(executor));

            await InitializeReactInstanceAsync(reactInstance);

            var context = new ReactContext();

            context.InitializeWithInstance(reactInstance);
            return(context);
        }
        private static NetworkingModule CreateNetworkingModule(IHttpClient httpClient, IInvocationHandler handler)
        {
            var context = new ReactContext();

            var eventEmitter = new RCTDeviceEventEmitter();

            eventEmitter.InvocationHandler = handler;

            var reactInstance = new TestReactInstance(eventEmitter);

            context.InitializeWithInstance(reactInstance);
            return(new NetworkingModule(httpClient, context));
        }
Пример #5
0
        private static ReactContext CreateReactContext(IInvocationHandler handler)
        {
            var context  = new ReactContext();
            var jsTimers = new JSTimersExecution
            {
                InvocationHandler = handler,
            };

            var reactInstance = new TestReactInstance(jsTimers);

            context.InitializeWithInstance(reactInstance);
            return(context);
        }
Пример #6
0
        private static async Task <ReactContext> CreateContextAsync(IJavaScriptExecutor executor)
        {
            var context = new ReactContext();

            var reactInstance = await DispatcherHelpers.CallOnDispatcherAsync(async() =>
            {
                var instance = CreateReactInstance(context, executor);
                context.InitializeWithInstance(instance);
                instance.Initialize();
                await instance.InitializeBridgeAsync(CancellationToken.None);
                return(instance);
            });

            return(context);
        }
Пример #7
0
        private static ReactContext CreateReactContext(IInvocationHandler handler)
        {
            var context = new ReactContext();

            var ids            = new List <int>();
            var appStateModule = new AppStateModule(context);

            appStateModule.Initialize();

            var eventEmitter = new RCTDeviceEventEmitter
            {
                InvocationHandler = handler,
            };

            var reactInstance = new TestReactInstance(appStateModule, eventEmitter);

            context.InitializeWithInstance(reactInstance);

            return(context);
        }
Пример #8
0
        public async Task ReactInstance_GetModules()
        {
            var module       = new TestNativeModule();
            var reactContext = new ReactContext();

            var registry = new NativeModuleRegistry.Builder(reactContext)
                           .Add(module)
                           .Build();

            var executor = new MockJavaScriptExecutor
            {
                OnCallFunctionReturnFlushedQueue = (_, __, ___) => JValue.CreateNull(),
                OnFlushQueue = () => JValue.CreateNull(),
                OnInvokeCallbackAndReturnFlushedQueue = (_, __) => JValue.CreateNull()
            };

            var builder = new ReactInstance.Builder()
            {
                QueueConfiguration        = TestReactQueueConfiguration.Create(_ => { }),
                Registry                  = registry,
                JavaScriptExecutorFactory = () => executor,
                BundleLoader              = JavaScriptBundleLoader.CreateFileLoader("ms-appx:///Resources/test.js"),
            };

            var instance = await DispatcherHelpers.CallOnDispatcherAsync(() => builder.Build());

            reactContext.InitializeWithInstance(instance);

            var actualModule = instance.GetNativeModule <TestNativeModule>();

            Assert.AreSame(module, actualModule);

            var firstJSModule  = instance.GetJavaScriptModule <TestJavaScriptModule>();
            var secondJSModule = instance.GetJavaScriptModule <TestJavaScriptModule>();

            Assert.AreSame(firstJSModule, secondJSModule);

            await DispatcherHelpers.CallOnDispatcherAsync(instance.DisposeAsync);
        }
        private async Task <ReactContext> CreateReactContextCoreAsync(
            Func <IJavaScriptExecutor> jsExecutorFactory,
            JavaScriptBundleLoader jsBundleLoader,
            CancellationToken token)
        {
            Tracer.Write(ReactConstants.Tag, "Creating React context.");

            _sourceUrl = jsBundleLoader.SourceUrl;

            var reactContext = new ReactContext();

            if (_useDeveloperSupport)
            {
                reactContext.NativeModuleCallExceptionHandler =
                    _nativeModuleCallExceptionHandler ?? _devSupportManager.HandleException;
            }

            var nativeRegistryBuilder = new NativeModuleRegistry.Builder(reactContext);

            using (Tracer.Trace(Tracer.TRACE_TAG_REACT_BRIDGE, "createAndProcessCoreModulesPackage").Start())
            {
                var coreModulesPackage = new CoreModulesPackage(
                    this,
                    InvokeDefaultOnBackPressed,
                    _uiImplementationProvider);

                ProcessPackage(coreModulesPackage, reactContext, nativeRegistryBuilder);
            }

            foreach (var reactPackage in _packages)
            {
                using (Tracer.Trace(Tracer.TRACE_TAG_REACT_BRIDGE, "createAndProcessCustomReactPackage").Start())
                {
                    ProcessPackage(reactPackage, reactContext, nativeRegistryBuilder);
                }
            }

            var nativeModuleRegistry = default(NativeModuleRegistry);

            using (Tracer.Trace(Tracer.TRACE_TAG_REACT_BRIDGE, "buildNativeModuleRegistry").Start())
            {
                nativeModuleRegistry = nativeRegistryBuilder.Build();
            }

            var queueConfiguration   = ReactQueueConfigurationFactory.Default.Create(reactContext.HandleException);
            var reactInstanceBuilder = new ReactInstance.Builder
            {
                QueueConfiguration        = queueConfiguration,
                JavaScriptExecutorFactory = jsExecutorFactory,
                Registry     = nativeModuleRegistry,
                BundleLoader = jsBundleLoader,
            };

            var reactInstance = default(ReactInstance);

            using (Tracer.Trace(Tracer.TRACE_TAG_REACT_BRIDGE, "createReactInstance").Start())
            {
                reactInstance = reactInstanceBuilder.Build();
            }

            // TODO: add bridge idle debug listener

            reactContext.InitializeWithInstance(reactInstance);

            reactInstance.Initialize();

            using (Tracer.Trace(Tracer.TRACE_TAG_REACT_BRIDGE, "RunJavaScriptBundle").Start())
            {
                await reactInstance.InitializeBridgeAsync(token).ConfigureAwait(false);
            }

            return(reactContext);
        }
        private async Task<ReactContext> CreateReactContextAsync(
            Func<IJavaScriptExecutor> jsExecutorFactory,
            JavaScriptBundleLoader jsBundleLoader)
        {
            Tracer.Write(ReactConstants.Tag, "Creating React context.");

            _sourceUrl = jsBundleLoader.SourceUrl;

            var nativeRegistryBuilder = new NativeModuleRegistry.Builder();
            var jsModulesBuilder = new JavaScriptModuleRegistry.Builder();

            var reactContext = new ReactContext();
            if (_useDeveloperSupport)
            {
                reactContext.NativeModuleCallExceptionHandler = _devSupportManager.HandleException;
            }

            using (Tracer.Trace(Tracer.TRACE_TAG_REACT_BRIDGE, "createAndProcessCoreModulesPackage").Start())
            {
                var coreModulesPackage =
                    new CoreModulesPackage(this, InvokeDefaultOnBackPressed, _uiImplementationProvider);

                ProcessPackage(coreModulesPackage, reactContext, nativeRegistryBuilder, jsModulesBuilder);
            }

            foreach (var reactPackage in _packages)
            {
                using (Tracer.Trace(Tracer.TRACE_TAG_REACT_BRIDGE, "createAndProcessCustomReactPackage").Start())
                {
                    ProcessPackage(reactPackage, reactContext, nativeRegistryBuilder, jsModulesBuilder);
                }
            }

            var nativeModuleRegistry = default(NativeModuleRegistry);
            using (Tracer.Trace(Tracer.TRACE_TAG_REACT_BRIDGE, "buildNativeModuleRegistry").Start())
            {
                nativeModuleRegistry = nativeRegistryBuilder.Build();
            }

            var exceptionHandler = _nativeModuleCallExceptionHandler ?? _devSupportManager.HandleException;
            var reactInstanceBuilder = new ReactInstance.Builder
            {
                QueueConfigurationSpec = ReactQueueConfigurationSpec.Default,
                JavaScriptExecutorFactory = jsExecutorFactory,
                Registry = nativeModuleRegistry,
                JavaScriptModuleRegistry = jsModulesBuilder.Build(),
                BundleLoader = jsBundleLoader,
                NativeModuleCallExceptionHandler = exceptionHandler,
            };

            var reactInstance = default(ReactInstance);
            using (Tracer.Trace(Tracer.TRACE_TAG_REACT_BRIDGE, "createReactInstance").Start())
            {
                reactInstance = reactInstanceBuilder.Build();
            }

            // TODO: add bridge idle debug listener

            reactContext.InitializeWithInstance(reactInstance);

            reactInstance.Initialize();

            using (Tracer.Trace(Tracer.TRACE_TAG_REACT_BRIDGE, "RunJavaScriptBundle").Start())
            {
                await reactInstance.InitializeBridgeAsync().ConfigureAwait(false);
            }

            return reactContext;
        }