コード例 #1
0
ファイル: CircuitHost.cs プロジェクト: y8x/AspNetCore
        public async Task DispatchEvent(string eventDescriptorJson, string eventArgs)
        {
            RendererRegistryEventDispatcher.BrowserEventDescriptor eventDescriptor = null;
            try
            {
                AssertInitialized();
                eventDescriptor = ParseEventDescriptor(eventDescriptorJson);
                if (eventDescriptor == null)
                {
                    return;
                }


                await Renderer.Dispatcher.InvokeAsync(() =>
                {
                    SetCurrentCircuitHost(this);
                    return(RendererRegistryEventDispatcher.DispatchEvent(eventDescriptor, eventArgs));
                });
            }
            catch (Exception ex)
            {
                Log.DispatchEventFailedToDispatchEvent(_logger, eventDescriptor != null ? eventDescriptor.EventHandlerId.ToString() : null, ex);
                UnhandledException?.Invoke(this, new UnhandledExceptionEventArgs(ex, isTerminating: false));
            }
        }
コード例 #2
0
        public async Task ClickAsync(HubConnection connection)
        {
            if (!Events.TryGetValue("click", out var clickEventDescriptor))
            {
                throw new InvalidOperationException("Element does not have a click event.");
            }

            var mouseEventArgs = new UIMouseEventArgs()
            {
                Type   = clickEventDescriptor.EventName,
                Detail = 1
            };
            var browserDescriptor = new RendererRegistryEventDispatcher.BrowserEventDescriptor()
            {
                BrowserRendererId = 0,
                EventHandlerId    = clickEventDescriptor.EventId,
                EventArgsType     = "mouse",
            };
            var serializedJson = JsonSerializer.Serialize(mouseEventArgs, new JsonSerializerOptions()
            {
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase
            });
            var argsObject       = new object[] { browserDescriptor, serializedJson };
            var callId           = "0";
            var assemblyName     = "Microsoft.AspNetCore.Components.Web";
            var methodIdentifier = "DispatchEvent";
            var dotNetObjectId   = 0;
            var clickArgs        = JsonSerializer.Serialize(argsObject, new JsonSerializerOptions()
            {
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase
            });
            await connection.InvokeAsync("BeginInvokeDotNetFromJS", callId, assemblyName, methodIdentifier, dotNetObjectId, clickArgs);
        }
コード例 #3
0
        public async Task DispatchingEventsWithInvalidUIEventArgs()
        {
            // Arrange
            var(interopCalls, dotNetCompletions, batches) = ConfigureClient();
            await GoToTestComponent(batches);

            var sink      = _serverFixture.Host.Services.GetRequiredService <TestSink>();
            var logEvents = new List <(LogLevel logLevel, string)>();

            sink.MessageLogged += (wc) => logEvents.Add((wc.LogLevel, wc.EventId.Name));

            // Act
            var browserDescriptor = new RendererRegistryEventDispatcher.BrowserEventDescriptor()
            {
                BrowserRendererId = 0,
                EventHandlerId    = 6,
                EventArgsType     = "mouse",
            };

            await Client.HubConnection.InvokeAsync(
                "DispatchBrowserEvent",
                JsonSerializer.Serialize(browserDescriptor, TestJsonSerializerOptionsProvider.Options),
                "{Invalid:{\"payload}");

            Assert.Contains(
                (LogLevel.Debug, "DispatchEventFailedToDispatchEvent"),
                logEvents);

            await ValidateClientKeepsWorking(Client, batches);
        }
コード例 #4
0
        internal Task SelectAsync(HubConnection connection, string value)
        {
            if (!Events.TryGetValue("change", out var changeEventDescriptor))
            {
                throw new InvalidOperationException("Element does not have a change event.");
            }

            var sleectEventArgs = new UIChangeEventArgs()
            {
                Type  = changeEventDescriptor.EventName,
                Value = value
            };

            var browserDescriptor = new RendererRegistryEventDispatcher.BrowserEventDescriptor()
            {
                BrowserRendererId = 0,
                EventHandlerId    = changeEventDescriptor.EventId,
                EventArgsType     = "change",
                EventFieldInfo    = new EventFieldInfo
                {
                    ComponentId = 0,
                    FieldValue  = value
                }
            };

            return(DispatchEventCore(connection, Serialize(browserDescriptor), Serialize(sleectEventArgs)));
        }
コード例 #5
0
        public async Task DispatchingEventThroughJSInterop()
        {
            // Arrange
            var(interopCalls, dotNetCompletions, batches) = ConfigureClient();
            await GoToTestComponent(batches);

            var sink      = _serverFixture.Host.Services.GetRequiredService <TestSink>();
            var logEvents = new List <(LogLevel logLevel, string eventIdName)>();

            sink.MessageLogged += (wc) => logEvents.Add((wc.LogLevel, wc.EventId.Name));

            // Act
            var mouseEventArgs = new UIMouseEventArgs()
            {
                Type   = "click",
                Detail = 1
            };
            var browserDescriptor = new RendererRegistryEventDispatcher.BrowserEventDescriptor()
            {
                BrowserRendererId = 0,
                EventHandlerId    = 1,
                EventArgsType     = "mouse",
            };

            var serializerOptions = new JsonSerializerOptions()
            {
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase
            };
            var uiArgs = JsonSerializer.Serialize(mouseEventArgs, serializerOptions);

            await Assert.ThrowsAsync <TaskCanceledException>(() => Client.InvokeDotNetMethod(
                                                                 0,
                                                                 "Microsoft.AspNetCore.Components.Web",
                                                                 "DispatchEvent",
                                                                 null,
                                                                 JsonSerializer.Serialize(new object[] { browserDescriptor, uiArgs }, serializerOptions)));

            Assert.Contains(
                (LogLevel.Debug, "DispatchEventThroughJSInterop"),
                logEvents);

            await ValidateClientKeepsWorking(Client, batches);
        }
コード例 #6
0
        public async Task DispatchingEventsWithInvalidEventHandlerId()
        {
            // Arrange
            var(interopCalls, dotNetCompletions, batches) = ConfigureClient();
            await GoToTestComponent(batches);

            var sink      = _serverFixture.Host.Services.GetRequiredService <TestSink>();
            var logEvents = new List <(LogLevel logLevel, string eventIdName, Exception exception)>();

            sink.MessageLogged += (wc) => logEvents.Add((wc.LogLevel, wc.EventId.Name, wc.Exception));

            // Act
            var mouseEventArgs = new UIMouseEventArgs()
            {
                Type   = "click",
                Detail = 1
            };
            var browserDescriptor = new RendererRegistryEventDispatcher.BrowserEventDescriptor()
            {
                BrowserRendererId = 0,
                EventHandlerId    = 1,
                EventArgsType     = "mouse",
            };

            await Client.HubConnection.InvokeAsync(
                "DispatchBrowserEvent",
                JsonSerializer.Serialize(browserDescriptor, new JsonSerializerOptions()
            {
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase
            }),
                JsonSerializer.Serialize(mouseEventArgs, new JsonSerializerOptions()
            {
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase
            }));

            Assert.Contains(
                logEvents,
                e => e.eventIdName == "DispatchEventFailedToDispatchEvent" && e.logLevel == LogLevel.Debug &&
                e.exception is ArgumentException ae && ae.Message.Contains("There is no event handler with ID -1"));

            await ValidateClientKeepsWorking(Client, batches);
        }
コード例 #7
0
        public Task ClickAsync(HubConnection connection)
        {
            if (!Events.TryGetValue("click", out var clickEventDescriptor))
            {
                throw new InvalidOperationException("Element does not have a click event.");
            }

            var mouseEventArgs = new UIMouseEventArgs()
            {
                Type   = clickEventDescriptor.EventName,
                Detail = 1
            };
            var browserDescriptor = new RendererRegistryEventDispatcher.BrowserEventDescriptor()
            {
                BrowserRendererId = 0,
                EventHandlerId    = clickEventDescriptor.EventId,
                EventArgsType     = "mouse",
            };

            return(DispatchEventCore(connection, Serialize(browserDescriptor), Serialize(mouseEventArgs)));
        }