public void Read_Works()
        {
            // Arrange
            var args = new DragEventArgs
            {
                AltKey       = true,
                Button       = 72,
                Buttons      = 61,
                ClientX      = 3.1,
                ClientY      = 4.2,
                CtrlKey      = false,
                DataTransfer = new()
                {
                    DropEffect    = "effect1",
                    EffectAllowed = "allowed1",
                    Files         = new[] { "File1", "File2" },
                    Items         = new[]
                    {
                        new DataTransferItem
                        {
                            Kind = "kind1",
                            Type = "type1,"
                        },
                        new DataTransferItem
                        {
                            Kind = "kind7",
                            Type = "type6,"
                        },
                    },
                    Types = new[] { "type1", "type2", "type3" },
                },
                Detail   = 7,
                MetaKey  = false,
                OffsetX  = 8.2,
                OffsetY  = 7.1,
                PageX    = 5.6,
                PageY    = 7.8,
                ScreenX  = 0.1,
                ScreenY  = 4.4,
                ShiftKey = true,
            };
            var jsonElement = GetJsonElement(args);

            // Act
            var result = DragEventArgsReader.Read(jsonElement);

            // Assert
            MouseEventArgsReaderTest.AssertEqual(args, result);
            AssertEqual(args.DataTransfer, result.DataTransfer);
        }
示例#2
0
        private static bool TryDeserializeStandardWebEventArgs(
            string eventName,
            JsonElement eventArgsJson,
            [NotNullWhen(true)] out EventArgs?eventArgs)
        {
            // For back-compatibility, we recognize the built-in list of web event names and hard-code
            // rules about the deserialization type for their eventargs. This makes it possible to declare
            // an event handler as receiving EventArgs, and have it actually receive a subclass at runtime
            // depending on the event that was raised.
            //
            // The following list should remain in sync with EventArgsFactory.ts.

            switch (eventName)
            {
            case "input":
            case "change":
                // Special case for ChangeEventArgs because its value type can be one of
                // several types, and System.Text.Json doesn't pick types dynamically
                eventArgs = ChangeEventArgsReader.Read(eventArgsJson);
                return(true);

            case "copy":
            case "cut":
            case "paste":
                eventArgs = ClipboardEventArgsReader.Read(eventArgsJson);
                return(true);

            case "drag":
            case "dragend":
            case "dragenter":
            case "dragleave":
            case "dragover":
            case "dragstart":
            case "drop":
                eventArgs = DragEventArgsReader.Read(eventArgsJson);
                return(true);

            case "focus":
            case "blur":
            case "focusin":
            case "focusout":
                eventArgs = FocusEventArgsReader.Read(eventArgsJson);
                return(true);

            case "keydown":
            case "keyup":
            case "keypress":
                eventArgs = KeyboardEventArgsReader.Read(eventArgsJson);
                return(true);

            case "contextmenu":
            case "click":
            case "mouseover":
            case "mouseout":
            case "mousemove":
            case "mousedown":
            case "mouseup":
            case "dblclick":
                eventArgs = MouseEventArgsReader.Read(eventArgsJson);
                return(true);

            case "error":
                eventArgs = ErrorEventArgsReader.Read(eventArgsJson);
                return(true);

            case "loadstart":
            case "timeout":
            case "abort":
            case "load":
            case "loadend":
            case "progress":
                eventArgs = ProgressEventArgsReader.Read(eventArgsJson);
                return(true);

            case "touchcancel":
            case "touchend":
            case "touchmove":
            case "touchenter":
            case "touchleave":
            case "touchstart":
                eventArgs = TouchEventArgsReader.Read(eventArgsJson);
                return(true);

            case "gotpointercapture":
            case "lostpointercapture":
            case "pointercancel":
            case "pointerdown":
            case "pointerenter":
            case "pointerleave":
            case "pointermove":
            case "pointerout":
            case "pointerover":
            case "pointerup":
                eventArgs = PointerEventArgsReader.Read(eventArgsJson);
                return(true);

            case "wheel":
            case "mousewheel":
                eventArgs = WheelEventArgsReader.Read(eventArgsJson);
                return(true);

            case "toggle":
                eventArgs = EventArgs.Empty;
                return(true);

            default:
                // For custom event types, there are no built-in rules, so the deserialization type is
                // determined by the parameter declared on the delegate.
                eventArgs = null;
                return(false);
            }
        }