1
1
// Copyright (c) .NET Foundation. All rights reserved.
2
2
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3
3
4
+ #nullable enable
5
+
4
6
using System ;
5
7
using System . Diagnostics . CodeAnalysis ;
6
8
using System . Text . Json ;
7
9
using Microsoft . AspNetCore . Components . RenderTree ;
8
10
using static Microsoft . AspNetCore . Internal . LinkerFlags ;
9
- #nullable enable
11
+
10
12
namespace Microsoft . AspNetCore . Components . Web
11
13
{
12
14
internal class WebEventData
@@ -61,21 +63,13 @@ private static EventArgs ParseEventArgsJson(Renderer renderer, ulong eventHandle
61
63
{
62
64
try
63
65
{
64
- if ( TryGetStandardWebEventArgsType ( eventName , out var eventArgsType ) )
65
- {
66
- // Special case for ChangeEventArgs because its value type can be one of
67
- // several types, and System.Text.Json doesn't pick types dynamically
68
- if ( eventArgsType == typeof ( ChangeEventArgs ) )
69
- {
70
- return DeserializeChangeEventArgs ( eventArgsJson ) ;
71
- }
72
- }
73
- else
66
+ if ( TryDeserializeStandardWebEventArgs ( eventName , eventArgsJson , out var eventArgs ) )
74
67
{
75
- // For custom events, the args type is determined from the associated delegate
76
- eventArgsType = renderer . GetEventArgsType ( eventHandlerId ) ;
68
+ return eventArgs ;
77
69
}
78
70
71
+ // For custom events, the args type is determined from the associated delegate
72
+ var eventArgsType = renderer . GetEventArgsType ( eventHandlerId ) ;
79
73
return ( EventArgs ) JsonSerializer . Deserialize ( eventArgsJson , eventArgsType , JsonSerializerOptionsProvider . Options ) ! ;
80
74
}
81
75
catch ( Exception e )
@@ -84,7 +78,7 @@ private static EventArgs ParseEventArgsJson(Renderer renderer, ulong eventHandle
84
78
}
85
79
}
86
80
87
- private static bool TryGetStandardWebEventArgsType ( string eventName , [ MaybeNullWhen ( false ) ] out Type type )
81
+ private static bool TryDeserializeStandardWebEventArgs ( string eventName , string eventArgsJson , [ NotNullWhen ( true ) ] out EventArgs ? eventArgs )
88
82
{
89
83
// For back-compatibility, we recognize the built-in list of web event names and hard-code
90
84
// rules about the deserialization type for their eventargs. This makes it possible to declare
@@ -97,13 +91,15 @@ private static bool TryGetStandardWebEventArgsType(string eventName, [MaybeNullW
97
91
{
98
92
case "input" :
99
93
case "change" :
100
- type = typeof ( ChangeEventArgs ) ;
94
+ // Special case for ChangeEventArgs because its value type can be one of
95
+ // several types, and System.Text.Json doesn't pick types dynamically
96
+ eventArgs = DeserializeChangeEventArgs ( eventArgsJson ) ;
101
97
return true ;
102
98
103
99
case "copy" :
104
100
case "cut" :
105
101
case "paste" :
106
- type = typeof ( ClipboardEventArgs ) ;
102
+ eventArgs = Deserialize < ClipboardEventArgs > ( eventArgsJson ) ;
107
103
return true ;
108
104
109
105
case "drag" :
@@ -113,20 +109,20 @@ private static bool TryGetStandardWebEventArgsType(string eventName, [MaybeNullW
113
109
case "dragover" :
114
110
case "dragstart" :
115
111
case "drop" :
116
- type = typeof ( DragEventArgs ) ;
112
+ eventArgs = Deserialize < DragEventArgs > ( eventArgsJson ) ;
117
113
return true ;
118
114
119
115
case "focus" :
120
116
case "blur" :
121
117
case "focusin" :
122
118
case "focusout" :
123
- type = typeof ( FocusEventArgs ) ;
119
+ eventArgs = Deserialize < FocusEventArgs > ( eventArgsJson ) ;
124
120
return true ;
125
121
126
122
case "keydown" :
127
123
case "keyup" :
128
124
case "keypress" :
129
- type = typeof ( KeyboardEventArgs ) ;
125
+ eventArgs = Deserialize < KeyboardEventArgs > ( eventArgsJson ) ;
130
126
return true ;
131
127
132
128
case "contextmenu" :
@@ -137,11 +133,11 @@ private static bool TryGetStandardWebEventArgsType(string eventName, [MaybeNullW
137
133
case "mousedown" :
138
134
case "mouseup" :
139
135
case "dblclick" :
140
- type = typeof ( MouseEventArgs ) ;
136
+ eventArgs = Deserialize < MouseEventArgs > ( eventArgsJson ) ;
141
137
return true ;
142
138
143
139
case "error" :
144
- type = typeof ( ErrorEventArgs ) ;
140
+ eventArgs = Deserialize < ErrorEventArgs > ( eventArgsJson ) ;
145
141
return true ;
146
142
147
143
case "loadstart" :
@@ -150,7 +146,7 @@ private static bool TryGetStandardWebEventArgsType(string eventName, [MaybeNullW
150
146
case "load" :
151
147
case "loadend" :
152
148
case "progress" :
153
- type = typeof ( ProgressEventArgs ) ;
149
+ eventArgs = Deserialize < ProgressEventArgs > ( eventArgsJson ) ;
154
150
return true ;
155
151
156
152
case "touchcancel" :
@@ -159,7 +155,7 @@ private static bool TryGetStandardWebEventArgsType(string eventName, [MaybeNullW
159
155
case "touchenter" :
160
156
case "touchleave" :
161
157
case "touchstart" :
162
- type = typeof ( TouchEventArgs ) ;
158
+ eventArgs = Deserialize < TouchEventArgs > ( eventArgsJson ) ;
163
159
return true ;
164
160
165
161
case "gotpointercapture" :
@@ -172,22 +168,22 @@ private static bool TryGetStandardWebEventArgsType(string eventName, [MaybeNullW
172
168
case "pointerout" :
173
169
case "pointerover" :
174
170
case "pointerup" :
175
- type = typeof ( PointerEventArgs ) ;
171
+ eventArgs = Deserialize < PointerEventArgs > ( eventArgsJson ) ;
176
172
return true ;
177
173
178
174
case "wheel" :
179
175
case "mousewheel" :
180
- type = typeof ( WheelEventArgs ) ;
176
+ eventArgs = Deserialize < WheelEventArgs > ( eventArgsJson ) ;
181
177
return true ;
182
178
183
179
case "toggle" :
184
- type = typeof ( EventArgs ) ;
180
+ eventArgs = Deserialize < EventArgs > ( eventArgsJson ) ;
185
181
return true ;
186
182
187
183
default :
188
184
// For custom event types, there are no built-in rules, so the deserialization type is
189
185
// determined by the parameter declared on the delegate.
190
- type = null ;
186
+ eventArgs = null ;
191
187
return false ;
192
188
}
193
189
}
0 commit comments