예제 #1
0
        public async Task Timing_Repeat()
        {
            await DispatcherHelpers.RunOnDispatcherAsync(ReactChoreographer.Initialize);

            var ids       = new List <int>();
            var repeat    = 10;
            var interval  = 200;
            var countdown = new CountdownEvent(repeat);
            var context   = CreateReactContext(new MockInvocationHandler((name, args) =>
            {
                Assert.AreEqual(name, nameof(JSTimers.callTimers));
                ids.AddRange((IList <int>)args[0]);
                if (countdown.CurrentCount > 0)
                {
                    var t = ThreadPool.RunAsync(_ => countdown.Signal());
                }
            }));

            var timing = new Timing(context);

            timing.Initialize();
            await DispatcherHelpers.RunOnDispatcherAsync(context.OnResume);

            var id  = 42;
            var now = DateTimeOffset.Now.ToUnixTimeMilliseconds();

            timing.createTimer(id, interval, now, true);

            Assert.IsTrue(countdown.Wait(interval * repeat * 2));

            timing.deleteTimer(id);

            Assert.AreEqual(42, ids.Distinct().SingleOrDefault());
            Assert.IsTrue(ids.Count >= repeat);

            await DispatcherHelpers.CallOnDispatcherAsync(context.DisposeAsync);

            await DispatcherHelpers.RunOnDispatcherAsync(ReactChoreographer.Dispose);
        }
예제 #2
0
        public async Task Timing_Zero_Repeat()
        {
            var ids       = new List <int>();
            var countdown = new CountdownEvent(60);
            var context   = CreateReactContext(new MockInvocationHandler((name, args) =>
            {
                Assert.AreEqual(name, nameof(JSTimersExecution.callTimers));
                ids.AddRange((IList <int>)args[0]);
                countdown.Signal();
            }));

            var timing = new Timing(context);

            timing.Initialize();
            await DispatcherHelpers.RunOnDispatcherAsync(context.OnResume);

            // Callback is called directly
            timing.createTimer(42, 0, DateTimeOffset.Now.ToUnixTimeMilliseconds(), true);
            countdown.Wait();
            timing.deleteTimer(42);

            await DispatcherHelpers.RunOnDispatcherAsync(context.Dispose);
        }
예제 #3
0
        public async Task Timing_Zero_NoRepeat()
        {
            var ids        = new List <int>();
            var waitHandle = new AutoResetEvent(false);
            var context    = CreateReactContext(new MockInvocationHandler((name, args) =>
            {
                Assert.AreEqual(name, nameof(JSTimersExecution.callTimers));
                ids.AddRange((IList <int>)args[0]);
                waitHandle.Set();
            }));

            var timing = new Timing(context);

            timing.Initialize();
            await DispatcherHelpers.RunOnDispatcherAsync(context.OnResume);

            // Callback is called directly
            timing.createTimer(42, 0, DateTimeOffset.Now.ToUnixTimeMilliseconds(), false);

            Assert.IsTrue(new[] { 42 }.SequenceEqual(ids));

            await DispatcherHelpers.RunOnDispatcherAsync(context.Dispose);
        }
예제 #4
0
        public async Task UIManagerModule_getConstantsForViewManager()
        {
            await DispatcherHelpers.RunOnDispatcherAsync(ReactChoreographer.Initialize);

            var context      = new ReactContext();
            var viewManagers = new List <IViewManager> {
                new TestViewManager()
            };
            var uiImplementationProvider = new UIImplementationProvider();

            using (var actionQueue = new ActionQueue(ex => { }))
            {
                var module = await DispatcherHelpers.CallOnDispatcherAsync(() => new UIManagerModule(context, viewManagers, uiImplementationProvider, actionQueue, UIManagerModuleOptions.LazyViewManagers));

                var constants = module.getConstantsForViewManager("Test");
                Assert.AreEqual(42, constants.GetMap("directEventTypes").GetValue("otherSelectionChange").Value <int>());
                Assert.AreEqual(42, constants.GetMap("directEventTypes").GetMap("topSelectionChange").GetValue("registrationName").Value <int>());
                Assert.AreEqual(42, constants.GetMap("directEventTypes").GetMap("topLoadingStart").GetValue("foo").Value <int>());
                Assert.AreEqual(42, constants.GetMap("directEventTypes").GetValue("topLoadingError").Value <int>());
            }

            await DispatcherHelpers.RunOnDispatcherAsync(ReactChoreographer.Dispose);
        }
예제 #5
0
        public async Task UIManagerModule_Constants_ViewManager_LazyConstants()
        {
            await DispatcherHelpers.RunOnDispatcherAsync(ReactChoreographer.Initialize);

            var context      = new ReactContext();
            var viewManagers = new List <IViewManager> {
                new TestViewManager()
            };
            var uiImplementationProvider = new UIImplementationProvider();

            using (var actionQueue = new ActionQueue(ex => { }))
            {
                var module = await DispatcherHelpers.CallOnDispatcherAsync(() => new UIManagerModule(context, viewManagers, uiImplementationProvider, actionQueue, UIManagerModuleOptions.LazyViewManagers));

                var obj = ((INativeModule)module).Constants.GetValue("ViewManagerNames");
                var viewManagerNames = obj as JArray;
                Assert.IsNotNull(viewManagerNames);
                Assert.AreEqual(1, viewManagerNames.Count());
                Assert.AreEqual("Test", viewManagerNames.Single().Value <string>());
            }

            await DispatcherHelpers.RunOnDispatcherAsync(ReactChoreographer.Dispose);
        }
예제 #6
0
        public async Task EventDispatcher_NonCoalesced()
        {
            await DispatcherHelpers.RunOnDispatcherAsync(ReactChoreographer.Initialize);

            var waitDispatched = new AutoResetEvent(false);
            var executor       = new MockJavaScriptExecutor
            {
                OnCallFunctionReturnFlushedQueue = (p0, p1, p2) =>
                {
                    waitDispatched.Set();
                    return(EmptyResponse);
                },
                OnFlushQueue = () => EmptyResponse,
                OnInvokeCallbackAndReturnFlushedQueue = (_, __) => EmptyResponse
            };

            var context = await CreateContextAsync(executor);

            var dispatcher = new EventDispatcher(context);
            await DispatcherHelpers.RunOnDispatcherAsync(dispatcher.OnResume);

            var e1 = new NonCoalescedEvent(42, "Foo");
            var e2 = new NonCoalescedEvent(42, "Foo");

            using (BlockJavaScriptThread(context))
            {
                dispatcher.DispatchEvent(e1);
                dispatcher.DispatchEvent(e2);
            }

            Assert.IsTrue(waitDispatched.WaitOne());
            Assert.IsTrue(waitDispatched.WaitOne());

            await DispatcherHelpers.CallOnDispatcherAsync(context.DisposeAsync);

            await DispatcherHelpers.RunOnDispatcherAsync(ReactChoreographer.Dispose);
        }
예제 #7
0
        public async Task EventDispatcher_DispatchedAfterSuspend_ThenResume()
        {
            await DispatcherHelpers.RunOnDispatcherAsync(ReactChoreographer.Initialize);

            var waitDispatched = new AutoResetEvent(false);
            var executor       = new MockJavaScriptExecutor
            {
                OnCallFunctionReturnFlushedQueue = (p0, p1, p2) =>
                {
                    waitDispatched.Set();
                    return(EmptyResponse);
                },
                OnFlushQueue = () => EmptyResponse,
                OnInvokeCallbackAndReturnFlushedQueue = (_, __) => EmptyResponse
            };

            var context = await CreateContextAsync(executor);

            var dispatcher = new EventDispatcher(context);
            await DispatcherHelpers.RunOnDispatcherAsync(dispatcher.OnResume);

            var testEvent = new MockEvent(42, "Foo");

            await DispatcherHelpers.RunOnDispatcherAsync(dispatcher.OnSuspend);

            dispatcher.DispatchEvent(testEvent);

            Assert.IsFalse(waitDispatched.WaitOne(500));

            await DispatcherHelpers.RunOnDispatcherAsync(dispatcher.OnResume);

            Assert.IsTrue(waitDispatched.WaitOne());

            await DispatcherHelpers.CallOnDispatcherAsync(context.DisposeAsync);

            await DispatcherHelpers.RunOnDispatcherAsync(ReactChoreographer.Dispose);
        }
예제 #8
0
        public void UpdateImage(Image image, Uri uri)
        {
            ImageRequest request = ImageRequestBuilder
                                   .NewBuilderWithSource(uri)
                                   .SetProgressiveRenderingEnabled(true)
                                   .Build();

            var dataSource     = _imagePipeline.FetchDecodedImage(request, null);
            var dataSubscriber = new BaseDataSubscriberImpl <CloseableReference <CloseableImage> >(
                async bitmapDataSource =>
            {
                if (bitmapDataSource != null)
                {
                    var reference = bitmapDataSource.GetResult();

                    try
                    {
                        SoftwareBitmap bitmap = ((CloseableBitmap)reference.Get()).UnderlyingBitmap;

                        await DispatcherHelpers.RunOnDispatcherAsync(() =>
                        {
                            var writeableBitmap = new WriteableBitmap(bitmap.PixelWidth, bitmap.PixelHeight);
                            bitmap.CopyToBuffer(writeableBitmap.PixelBuffer);
                            image.Source = writeableBitmap;
                        })
                        .ConfigureAwait(false);
                    }
                    finally
                    {
                        CloseableReference <CloseableImage> .CloseSafely(reference);
                    }
                }
            },
                _ => { });

            dataSource.Subscribe(dataSubscriber, CallerThreadExecutor.Instance);
        }
예제 #9
0
        public async Task Timing_ManyTimers()
        {
            await DispatcherHelpers.RunOnDispatcherAsync(ReactChoreographer.Initialize);

            var count     = 1000;
            var ids       = new List <int>(count);
            var countdown = new CountdownEvent(count);
            var context   = CreateReactContext(new MockInvocationHandler((name, args) =>
            {
                Assert.AreEqual(name, nameof(JSTimers.callTimers));
                var currentIds = (IList <int>)args[0];
                ids.AddRange(currentIds);
                for (var i = 0; i < currentIds.Count; ++i)
                {
                    countdown.Signal();
                }
            }));

            var timing = new Timing(context);

            timing.Initialize();
            await DispatcherHelpers.RunOnDispatcherAsync(context.OnResume);

            var now = DateTimeOffset.Now.ToUnixTimeMilliseconds();

            for (var i = 0; i < count; ++i)
            {
                timing.createTimer(i, i, now, false);
            }

            Assert.IsTrue(countdown.Wait(count * 2));

            await DispatcherHelpers.CallOnDispatcherAsync(context.DisposeAsync);

            await DispatcherHelpers.RunOnDispatcherAsync(ReactChoreographer.Dispose);
        }
예제 #10
0
        public async Task ReactInstance_GetModules()
        {
            var module = new TestNativeModule();

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

            var jsRegistry = new JavaScriptModuleRegistry.Builder()
                             .Add <TestJavaScriptModule>()
                             .Build();

            var executor = new MockJavaScriptExecutor((p0, p1, p2) => JValue.CreateNull());
            var builder  = new ReactInstance.Builder()
            {
                QueueConfigurationSpec = ReactQueueConfigurationSpec.Default,
                Registry = registry,
                JavaScriptModuleRegistry  = jsRegistry,
                JavaScriptExecutorFactory = () => executor,
                BundleLoader = JavaScriptBundleLoader.CreateFileLoader("ms-appx:///Resources/test.js"),
                NativeModuleCallExceptionHandler = _ => { }
            };

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

            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.RunOnDispatcherAsync(instance.Dispose);
        }
예제 #11
0
        /// <summary>
        /// Fetches the encoded BitmapImage.
        /// </summary>
        /// <param name="uri">The image uri.</param>
        /// <param name="token">The cancellation token.</param>
        /// <returns>The encoded BitmapImage.</returns>
        /// <exception cref="IOException">
        /// If the image uri can't be found.
        /// </exception>
        public Task <BitmapImage> FetchEncodedBitmapImageAsync(
            Uri uri,
            CancellationToken token = default(CancellationToken))
        {
            var taskCompletionSource = new TaskCompletionSource <BitmapImage>();
            var dataSource           = FetchEncodedImage(ImageRequest.FromUri(uri), null);
            var dataSubscriber       = new BaseDataSubscriberImpl <CloseableReference <IPooledByteBuffer> >(
                async response =>
            {
                CloseableReference <IPooledByteBuffer> reference = response.GetResult();
                if (reference != null)
                {
                    //----------------------------------------------------------------------
                    // Phong Cao: InMemoryRandomAccessStream can't write anything < 16KB.
                    // http://stackoverflow.com/questions/25928408/inmemoryrandomaccessstream-incorrect-behavior
                    //----------------------------------------------------------------------
                    IPooledByteBuffer inputStream = reference.Get();
                    int supportedSize             = Math.Max(16 * ByteConstants.KB, inputStream.Size);

                    // Allocate temp buffer for stream convert
                    byte[] bytesArray = default(byte[]);
                    CloseableReference <byte[]> bytesArrayRef = default(CloseableReference <byte[]>);

                    try
                    {
                        bytesArrayRef = _flexByteArrayPool.Get(supportedSize);
                        bytesArray    = bytesArrayRef.Get();
                    }
                    catch (Exception)
                    {
                        // Allocates the byte array since the pool couldn't provide one
                        bytesArray = new byte[supportedSize];
                    }

                    try
                    {
                        inputStream.Read(0, bytesArray, 0, inputStream.Size);
                        await DispatcherHelpers.RunOnDispatcherAsync(async() =>
                        {
                            using (var outStream = new InMemoryRandomAccessStream())
                                using (var writeStream = outStream.AsStreamForWrite())
                                {
                                    await writeStream.WriteAsync(bytesArray, 0, supportedSize);
                                    outStream.Seek(0);
                                    BitmapImage bitmapImage = new BitmapImage();
                                    await bitmapImage.SetSourceAsync(outStream).AsTask().ConfigureAwait(false);
                                    taskCompletionSource.SetResult(bitmapImage);
                                }
                        })
                        .ConfigureAwait(false);
                    }
                    catch (Exception e)
                    {
                        taskCompletionSource.SetException(e);
                    }
                    finally
                    {
                        CloseableReference <IPooledByteBuffer> .CloseSafely(reference);
                        CloseableReference <byte[]> .CloseSafely(bytesArrayRef);
                    }
                }
                else
                {
                    taskCompletionSource.SetResult(null);
                }
            },
                response =>
            {
                taskCompletionSource.SetException(response.GetFailureCause());
            });

            dataSource.Subscribe(dataSubscriber, _handleResultExecutor);
            token.Register(() =>
            {
                dataSource.Close();
                taskCompletionSource.TrySetCanceled();
            });

            return(taskCompletionSource.Task);
        }