piral-blazor 1.0.0-pre.2217 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +55 -12
  3. package/convert.d.ts +13 -10
  4. package/convert.js +17 -12
  5. package/esm/converter.d.ts +10 -6
  6. package/esm/converter.js +164 -48
  7. package/esm/converter.js.map +1 -1
  8. package/esm/create.d.ts +21 -1
  9. package/esm/create.js +29 -15
  10. package/esm/create.js.map +1 -1
  11. package/esm/dependencies.d.ts +6 -3
  12. package/esm/dependencies.js +104 -14
  13. package/esm/dependencies.js.map +1 -1
  14. package/esm/events.d.ts +6 -0
  15. package/esm/events.js +145 -0
  16. package/esm/events.js.map +1 -0
  17. package/esm/interop.d.ts +29 -0
  18. package/esm/interop.js +205 -0
  19. package/esm/interop.js.map +1 -0
  20. package/esm/navigation.d.ts +2 -0
  21. package/esm/navigation.js +30 -0
  22. package/esm/navigation.js.map +1 -0
  23. package/esm/types.d.ts +97 -4
  24. package/infra.codegen +53 -68
  25. package/lib/converter.d.ts +10 -6
  26. package/lib/converter.js +164 -48
  27. package/lib/converter.js.map +1 -1
  28. package/lib/create.d.ts +21 -1
  29. package/lib/create.js +31 -17
  30. package/lib/create.js.map +1 -1
  31. package/lib/dependencies.d.ts +6 -3
  32. package/lib/dependencies.js +104 -14
  33. package/lib/dependencies.js.map +1 -1
  34. package/lib/events.d.ts +6 -0
  35. package/lib/events.js +154 -0
  36. package/lib/events.js.map +1 -0
  37. package/lib/index.js +1 -1
  38. package/lib/interop.d.ts +29 -0
  39. package/lib/interop.js +226 -0
  40. package/lib/interop.js.map +1 -0
  41. package/lib/navigation.d.ts +2 -0
  42. package/lib/navigation.js +35 -0
  43. package/lib/navigation.js.map +1 -0
  44. package/lib/types.d.ts +97 -4
  45. package/package.json +26 -13
  46. package/src/converter.ts +237 -57
  47. package/src/create.ts +53 -9
  48. package/src/dependencies.ts +122 -14
  49. package/src/events.ts +174 -0
  50. package/src/interop.ts +273 -0
  51. package/src/navigation.ts +36 -0
  52. package/src/types.ts +115 -4
  53. package/convert.ts +0 -17
  54. package/esm/internal/Environment.d.ts +0 -3
  55. package/esm/internal/Environment.js +0 -6
  56. package/esm/internal/Environment.js.map +0 -1
  57. package/esm/internal/Platform/BootConfig.d.ts +0 -20
  58. package/esm/internal/Platform/BootConfig.js +0 -10
  59. package/esm/internal/Platform/BootConfig.js.map +0 -1
  60. package/esm/internal/Platform/Mono/MonoDebugger.d.ts +0 -3
  61. package/esm/internal/Platform/Mono/MonoDebugger.js +0 -43
  62. package/esm/internal/Platform/Mono/MonoDebugger.js.map +0 -1
  63. package/esm/internal/Platform/Mono/MonoPlatform.d.ts +0 -2
  64. package/esm/internal/Platform/Mono/MonoPlatform.js +0 -403
  65. package/esm/internal/Platform/Mono/MonoPlatform.js.map +0 -1
  66. package/esm/internal/Platform/Mono/TimezoneDataFile.d.ts +0 -1
  67. package/esm/internal/Platform/Mono/TimezoneDataFile.js +0 -51
  68. package/esm/internal/Platform/Mono/TimezoneDataFile.js.map +0 -1
  69. package/esm/internal/Platform/Platform.d.ts +0 -31
  70. package/esm/internal/Platform/Platform.js +0 -2
  71. package/esm/internal/Platform/Platform.js.map +0 -1
  72. package/esm/internal/Platform/Url.d.ts +0 -2
  73. package/esm/internal/Platform/Url.js +0 -11
  74. package/esm/internal/Platform/Url.js.map +0 -1
  75. package/esm/internal/Platform/WebAssemblyConfigLoader.d.ts +0 -4
  76. package/esm/internal/Platform/WebAssemblyConfigLoader.js +0 -64
  77. package/esm/internal/Platform/WebAssemblyConfigLoader.js.map +0 -1
  78. package/esm/internal/Platform/WebAssemblyResourceLoader.d.ts +0 -24
  79. package/esm/internal/Platform/WebAssemblyResourceLoader.js +0 -223
  80. package/esm/internal/Platform/WebAssemblyResourceLoader.js.map +0 -1
  81. package/esm/internal/Platform/WebAssemblyStartOptions.d.ts +0 -13
  82. package/esm/internal/Platform/WebAssemblyStartOptions.js +0 -2
  83. package/esm/internal/Platform/WebAssemblyStartOptions.js.map +0 -1
  84. package/esm/internal/Rendering/BrowserRenderer.d.ts +0 -38
  85. package/esm/internal/Rendering/BrowserRenderer.js +0 -458
  86. package/esm/internal/Rendering/BrowserRenderer.js.map +0 -1
  87. package/esm/internal/Rendering/ElementReferenceCapture.d.ts +0 -1
  88. package/esm/internal/Rendering/ElementReferenceCapture.js +0 -24
  89. package/esm/internal/Rendering/ElementReferenceCapture.js.map +0 -1
  90. package/esm/internal/Rendering/EventDelegator.d.ts +0 -20
  91. package/esm/internal/Rendering/EventDelegator.js +0 -236
  92. package/esm/internal/Rendering/EventDelegator.js.map +0 -1
  93. package/esm/internal/Rendering/EventFieldInfo.d.ts +0 -6
  94. package/esm/internal/Rendering/EventFieldInfo.js +0 -32
  95. package/esm/internal/Rendering/EventFieldInfo.js.map +0 -1
  96. package/esm/internal/Rendering/EventForDotNet.d.ts +0 -10
  97. package/esm/internal/Rendering/EventForDotNet.js +0 -194
  98. package/esm/internal/Rendering/EventForDotNet.js.map +0 -1
  99. package/esm/internal/Rendering/LogicalElements.d.ts +0 -19
  100. package/esm/internal/Rendering/LogicalElements.js +0 -250
  101. package/esm/internal/Rendering/LogicalElements.js.map +0 -1
  102. package/esm/internal/Rendering/RenderBatch/BinaryDecoder.d.ts +0 -5
  103. package/esm/internal/Rendering/RenderBatch/BinaryDecoder.js +0 -34
  104. package/esm/internal/Rendering/RenderBatch/BinaryDecoder.js.map +0 -1
  105. package/esm/internal/Rendering/RenderBatch/OutOfProcessRenderBatch.d.ts +0 -18
  106. package/esm/internal/Rendering/RenderBatch/OutOfProcessRenderBatch.js +0 -190
  107. package/esm/internal/Rendering/RenderBatch/OutOfProcessRenderBatch.js.map +0 -1
  108. package/esm/internal/Rendering/RenderBatch/RenderBatch.d.ts +0 -87
  109. package/esm/internal/Rendering/RenderBatch/RenderBatch.js +0 -26
  110. package/esm/internal/Rendering/RenderBatch/RenderBatch.js.map +0 -1
  111. package/esm/internal/Rendering/RenderBatch/SharedMemoryRenderBatch.d.ts +0 -52
  112. package/esm/internal/Rendering/RenderBatch/SharedMemoryRenderBatch.js +0 -103
  113. package/esm/internal/Rendering/RenderBatch/SharedMemoryRenderBatch.js.map +0 -1
  114. package/esm/internal/Rendering/RenderBatch/Utf8Decoder.d.ts +0 -1
  115. package/esm/internal/Rendering/RenderBatch/Utf8Decoder.js +0 -63
  116. package/esm/internal/Rendering/RenderBatch/Utf8Decoder.js.map +0 -1
  117. package/esm/internal/Rendering/Renderer.d.ts +0 -8
  118. package/esm/internal/Rendering/Renderer.js +0 -69
  119. package/esm/internal/Rendering/Renderer.js.map +0 -1
  120. package/esm/internal/Rendering/RendererEventDispatcher.d.ts +0 -4
  121. package/esm/internal/Rendering/RendererEventDispatcher.js +0 -11
  122. package/esm/internal/Rendering/RendererEventDispatcher.js.map +0 -1
  123. package/esm/internal/Services/NavigationManager.d.ts +0 -16
  124. package/esm/internal/Services/NavigationManager.js +0 -138
  125. package/esm/internal/Services/NavigationManager.js.map +0 -1
  126. package/esm/internal/globals.d.ts +0 -1
  127. package/esm/internal/globals.js +0 -5
  128. package/esm/internal/globals.js.map +0 -1
  129. package/esm/internal/index.d.ts +0 -15
  130. package/esm/internal/index.js +0 -152
  131. package/esm/internal/index.js.map +0 -1
  132. package/lib/internal/Environment.d.ts +0 -3
  133. package/lib/internal/Environment.js +0 -9
  134. package/lib/internal/Environment.js.map +0 -1
  135. package/lib/internal/Platform/BootConfig.d.ts +0 -20
  136. package/lib/internal/Platform/BootConfig.js +0 -13
  137. package/lib/internal/Platform/BootConfig.js.map +0 -1
  138. package/lib/internal/Platform/Mono/MonoDebugger.d.ts +0 -3
  139. package/lib/internal/Platform/Mono/MonoDebugger.js +0 -48
  140. package/lib/internal/Platform/Mono/MonoDebugger.js.map +0 -1
  141. package/lib/internal/Platform/Mono/MonoPlatform.d.ts +0 -2
  142. package/lib/internal/Platform/Mono/MonoPlatform.js +0 -406
  143. package/lib/internal/Platform/Mono/MonoPlatform.js.map +0 -1
  144. package/lib/internal/Platform/Mono/TimezoneDataFile.d.ts +0 -1
  145. package/lib/internal/Platform/Mono/TimezoneDataFile.js +0 -55
  146. package/lib/internal/Platform/Mono/TimezoneDataFile.js.map +0 -1
  147. package/lib/internal/Platform/Platform.d.ts +0 -31
  148. package/lib/internal/Platform/Platform.js +0 -3
  149. package/lib/internal/Platform/Platform.js.map +0 -1
  150. package/lib/internal/Platform/Url.d.ts +0 -2
  151. package/lib/internal/Platform/Url.js +0 -16
  152. package/lib/internal/Platform/Url.js.map +0 -1
  153. package/lib/internal/Platform/WebAssemblyConfigLoader.d.ts +0 -4
  154. package/lib/internal/Platform/WebAssemblyConfigLoader.js +0 -67
  155. package/lib/internal/Platform/WebAssemblyConfigLoader.js.map +0 -1
  156. package/lib/internal/Platform/WebAssemblyResourceLoader.d.ts +0 -24
  157. package/lib/internal/Platform/WebAssemblyResourceLoader.js +0 -226
  158. package/lib/internal/Platform/WebAssemblyResourceLoader.js.map +0 -1
  159. package/lib/internal/Platform/WebAssemblyStartOptions.d.ts +0 -13
  160. package/lib/internal/Platform/WebAssemblyStartOptions.js +0 -3
  161. package/lib/internal/Platform/WebAssemblyStartOptions.js.map +0 -1
  162. package/lib/internal/Rendering/BrowserRenderer.d.ts +0 -38
  163. package/lib/internal/Rendering/BrowserRenderer.js +0 -461
  164. package/lib/internal/Rendering/BrowserRenderer.js.map +0 -1
  165. package/lib/internal/Rendering/ElementReferenceCapture.d.ts +0 -1
  166. package/lib/internal/Rendering/ElementReferenceCapture.js +0 -28
  167. package/lib/internal/Rendering/ElementReferenceCapture.js.map +0 -1
  168. package/lib/internal/Rendering/EventDelegator.d.ts +0 -20
  169. package/lib/internal/Rendering/EventDelegator.js +0 -239
  170. package/lib/internal/Rendering/EventDelegator.js.map +0 -1
  171. package/lib/internal/Rendering/EventFieldInfo.d.ts +0 -6
  172. package/lib/internal/Rendering/EventFieldInfo.js +0 -35
  173. package/lib/internal/Rendering/EventFieldInfo.js.map +0 -1
  174. package/lib/internal/Rendering/EventForDotNet.d.ts +0 -10
  175. package/lib/internal/Rendering/EventForDotNet.js +0 -197
  176. package/lib/internal/Rendering/EventForDotNet.js.map +0 -1
  177. package/lib/internal/Rendering/LogicalElements.d.ts +0 -19
  178. package/lib/internal/Rendering/LogicalElements.js +0 -265
  179. package/lib/internal/Rendering/LogicalElements.js.map +0 -1
  180. package/lib/internal/Rendering/RenderBatch/BinaryDecoder.d.ts +0 -5
  181. package/lib/internal/Rendering/RenderBatch/BinaryDecoder.js +0 -42
  182. package/lib/internal/Rendering/RenderBatch/BinaryDecoder.js.map +0 -1
  183. package/lib/internal/Rendering/RenderBatch/OutOfProcessRenderBatch.d.ts +0 -18
  184. package/lib/internal/Rendering/RenderBatch/OutOfProcessRenderBatch.js +0 -193
  185. package/lib/internal/Rendering/RenderBatch/OutOfProcessRenderBatch.js.map +0 -1
  186. package/lib/internal/Rendering/RenderBatch/RenderBatch.d.ts +0 -87
  187. package/lib/internal/Rendering/RenderBatch/RenderBatch.js +0 -29
  188. package/lib/internal/Rendering/RenderBatch/RenderBatch.js.map +0 -1
  189. package/lib/internal/Rendering/RenderBatch/SharedMemoryRenderBatch.d.ts +0 -52
  190. package/lib/internal/Rendering/RenderBatch/SharedMemoryRenderBatch.js +0 -106
  191. package/lib/internal/Rendering/RenderBatch/SharedMemoryRenderBatch.js.map +0 -1
  192. package/lib/internal/Rendering/RenderBatch/Utf8Decoder.d.ts +0 -1
  193. package/lib/internal/Rendering/RenderBatch/Utf8Decoder.js +0 -66
  194. package/lib/internal/Rendering/RenderBatch/Utf8Decoder.js.map +0 -1
  195. package/lib/internal/Rendering/Renderer.d.ts +0 -8
  196. package/lib/internal/Rendering/Renderer.js +0 -76
  197. package/lib/internal/Rendering/Renderer.js.map +0 -1
  198. package/lib/internal/Rendering/RendererEventDispatcher.d.ts +0 -4
  199. package/lib/internal/Rendering/RendererEventDispatcher.js +0 -16
  200. package/lib/internal/Rendering/RendererEventDispatcher.js.map +0 -1
  201. package/lib/internal/Services/NavigationManager.d.ts +0 -16
  202. package/lib/internal/Services/NavigationManager.js +0 -144
  203. package/lib/internal/Services/NavigationManager.js.map +0 -1
  204. package/lib/internal/globals.d.ts +0 -1
  205. package/lib/internal/globals.js +0 -7
  206. package/lib/internal/globals.js.map +0 -1
  207. package/lib/internal/index.d.ts +0 -15
  208. package/lib/internal/index.js +0 -161
  209. package/lib/internal/index.js.map +0 -1
  210. package/src/internal/Environment.ts +0 -11
  211. package/src/internal/Platform/BootConfig.ts +0 -21
  212. package/src/internal/Platform/Mono/MonoDebugger.ts +0 -48
  213. package/src/internal/Platform/Mono/MonoPlatform.ts +0 -494
  214. package/src/internal/Platform/Mono/MonoTypes.d.ts +0 -27
  215. package/src/internal/Platform/Mono/TimezoneDataFile.ts +0 -46
  216. package/src/internal/Platform/Platform.ts +0 -40
  217. package/src/internal/Platform/Url.ts +0 -11
  218. package/src/internal/Platform/WebAssemblyConfigLoader.ts +0 -34
  219. package/src/internal/Platform/WebAssemblyResourceLoader.ts +0 -234
  220. package/src/internal/Platform/WebAssemblyStartOptions.ts +0 -22
  221. package/src/internal/Rendering/BrowserRenderer.ts +0 -616
  222. package/src/internal/Rendering/ElementReferenceCapture.ts +0 -27
  223. package/src/internal/Rendering/EventDelegator.ts +0 -293
  224. package/src/internal/Rendering/EventFieldInfo.ts +0 -31
  225. package/src/internal/Rendering/EventForDotNet.ts +0 -370
  226. package/src/internal/Rendering/LogicalElements.ts +0 -289
  227. package/src/internal/Rendering/RenderBatch/BinaryDecoder.ts +0 -43
  228. package/src/internal/Rendering/RenderBatch/OutOfProcessRenderBatch.ts +0 -244
  229. package/src/internal/Rendering/RenderBatch/RenderBatch.ts +0 -100
  230. package/src/internal/Rendering/RenderBatch/SharedMemoryRenderBatch.ts +0 -137
  231. package/src/internal/Rendering/RenderBatch/Utf8Decoder.ts +0 -66
  232. package/src/internal/Rendering/Renderer.ts +0 -98
  233. package/src/internal/Rendering/RendererEventDispatcher.ts +0 -20
  234. package/src/internal/Services/NavigationManager.ts +0 -157
  235. package/src/internal/globals.ts +0 -5
  236. package/src/internal/index.ts +0 -170
@@ -1,293 +0,0 @@
1
- import { EventForDotNet, UIEventArgs } from './EventForDotNet';
2
- import { EventFieldInfo } from './EventFieldInfo';
3
-
4
- const nonBubblingEvents = toLookup([
5
- 'abort',
6
- 'blur',
7
- 'change',
8
- 'error',
9
- 'focus',
10
- 'load',
11
- 'loadend',
12
- 'loadstart',
13
- 'mouseenter',
14
- 'mouseleave',
15
- 'progress',
16
- 'reset',
17
- 'scroll',
18
- 'submit',
19
- 'unload',
20
- 'DOMNodeInsertedIntoDocument',
21
- 'DOMNodeRemovedFromDocument',
22
- ]);
23
-
24
- const disableableEventNames = toLookup(['click', 'dblclick', 'mousedown', 'mousemove', 'mouseup']);
25
-
26
- export interface OnEventCallback {
27
- (
28
- event: Event,
29
- eventHandlerId: number,
30
- eventArgs: EventForDotNet<UIEventArgs>,
31
- eventFieldInfo: EventFieldInfo | null,
32
- ): void;
33
- }
34
-
35
- // Responsible for adding/removing the eventInfo on an expando property on DOM elements, and
36
- // calling an EventInfoStore that deals with registering/unregistering the underlying delegated
37
- // event listeners as required (and also maps actual events back to the given callback).
38
- export class EventDelegator {
39
- private static nextEventDelegatorId = 0;
40
-
41
- private readonly eventsCollectionKey: string;
42
-
43
- private readonly afterClickCallbacks: ((event: MouseEvent) => void)[] = [];
44
-
45
- private eventInfoStore: EventInfoStore;
46
-
47
- constructor(private onEvent: OnEventCallback) {
48
- const eventDelegatorId = ++EventDelegator.nextEventDelegatorId;
49
- this.eventsCollectionKey = `_blazorEvents_${eventDelegatorId}`;
50
- this.eventInfoStore = new EventInfoStore(this.onGlobalEvent.bind(this));
51
- }
52
-
53
- public setListener(element: Element, eventName: string, eventHandlerId: number, renderingComponentId: number) {
54
- const infoForElement = this.getEventHandlerInfosForElement(element, true)!;
55
- const existingHandler = infoForElement.getHandler(eventName);
56
-
57
- if (existingHandler) {
58
- // We can cheaply update the info on the existing object and don't need any other housekeeping
59
- // Note that this also takes care of updating the eventHandlerId on the existing handler object
60
- this.eventInfoStore.update(existingHandler.eventHandlerId, eventHandlerId);
61
- } else {
62
- // Go through the whole flow which might involve registering a new global handler
63
- const newInfo = { element, eventName, eventHandlerId, renderingComponentId };
64
- this.eventInfoStore.add(newInfo);
65
- infoForElement.setHandler(eventName, newInfo);
66
- }
67
- }
68
-
69
- public removeListener(eventHandlerId: number) {
70
- // This method gets called whenever the .NET-side code reports that a certain event handler
71
- // has been disposed. However we will already have disposed the info about that handler if
72
- // the eventHandlerId for the (element,eventName) pair was replaced during diff application.
73
- const info = this.eventInfoStore.remove(eventHandlerId);
74
- if (info) {
75
- // Looks like this event handler wasn't already disposed
76
- // Remove the associated data from the DOM element
77
- const element = info.element;
78
- const elementEventInfos = this.getEventHandlerInfosForElement(element, false);
79
- if (elementEventInfos) {
80
- elementEventInfos.removeHandler(info.eventName);
81
- }
82
- }
83
- }
84
-
85
- public notifyAfterClick(callback: (event: MouseEvent) => void) {
86
- // This is extremely special-case. It's needed so that navigation link click interception
87
- // can be sure to run *after* our synthetic bubbling process. If a need arises, we can
88
- // generalise this, but right now it's a purely internal detail.
89
- this.afterClickCallbacks.push(callback);
90
- this.eventInfoStore.addGlobalListener('click'); // Ensure we always listen for this
91
- }
92
-
93
- public setStopPropagation(element: Element, eventName: string, value: boolean) {
94
- const infoForElement = this.getEventHandlerInfosForElement(element, true)!;
95
- infoForElement.stopPropagation(eventName, value);
96
- }
97
-
98
- public setPreventDefault(element: Element, eventName: string, value: boolean) {
99
- const infoForElement = this.getEventHandlerInfosForElement(element, true)!;
100
- infoForElement.preventDefault(eventName, value);
101
- }
102
-
103
- private onGlobalEvent(evt: Event) {
104
- if (!(evt.target instanceof Element)) {
105
- return;
106
- }
107
-
108
- // Scan up the element hierarchy, looking for any matching registered event handlers
109
- let candidateElement = evt.target as Element | null;
110
- let eventArgs: EventForDotNet<UIEventArgs> | null = null; // Populate lazily
111
- const eventIsNonBubbling = nonBubblingEvents.hasOwnProperty(evt.type);
112
- let stopPropagationWasRequested = false;
113
- while (candidateElement) {
114
- const handlerInfos = this.getEventHandlerInfosForElement(candidateElement, false);
115
- if (handlerInfos) {
116
- const handlerInfo = handlerInfos.getHandler(evt.type);
117
- if (handlerInfo && !eventIsDisabledOnElement(candidateElement, evt.type)) {
118
- // We are going to raise an event for this element, so prepare info needed by the .NET code
119
- if (!eventArgs) {
120
- eventArgs = EventForDotNet.fromDOMEvent(evt);
121
- }
122
-
123
- const eventFieldInfo = EventFieldInfo.fromEvent(handlerInfo.renderingComponentId, evt);
124
- this.onEvent(evt, handlerInfo.eventHandlerId, eventArgs, eventFieldInfo);
125
- }
126
-
127
- if (handlerInfos.stopPropagation(evt.type)) {
128
- stopPropagationWasRequested = true;
129
- }
130
-
131
- if (handlerInfos.preventDefault(evt.type)) {
132
- evt.preventDefault();
133
- }
134
- }
135
-
136
- candidateElement = eventIsNonBubbling || stopPropagationWasRequested ? null : candidateElement.parentElement;
137
- }
138
-
139
- // Special case for navigation interception
140
- if (evt.type === 'click') {
141
- this.afterClickCallbacks.forEach((callback) => callback(evt as MouseEvent));
142
- }
143
- }
144
-
145
- private getEventHandlerInfosForElement(
146
- element: Element,
147
- createIfNeeded: boolean,
148
- ): EventHandlerInfosForElement | null {
149
- if (element.hasOwnProperty(this.eventsCollectionKey)) {
150
- return element[this.eventsCollectionKey];
151
- } else if (createIfNeeded) {
152
- return (element[this.eventsCollectionKey] = new EventHandlerInfosForElement());
153
- } else {
154
- return null;
155
- }
156
- }
157
- }
158
-
159
- // Responsible for adding and removing the global listener when the number of listeners
160
- // for a given event name changes between zero and nonzero
161
- class EventInfoStore {
162
- private infosByEventHandlerId: { [eventHandlerId: number]: EventHandlerInfo } = {};
163
-
164
- private countByEventName: { [eventName: string]: number } = {};
165
-
166
- constructor(private globalListener: EventListener) {}
167
-
168
- public add(info: EventHandlerInfo) {
169
- if (this.infosByEventHandlerId[info.eventHandlerId]) {
170
- // Should never happen, but we want to know if it does
171
- throw new Error(`Event ${info.eventHandlerId} is already tracked`);
172
- }
173
-
174
- this.infosByEventHandlerId[info.eventHandlerId] = info;
175
-
176
- this.addGlobalListener(info.eventName);
177
- }
178
-
179
- public addGlobalListener(eventName: string) {
180
- if (this.countByEventName.hasOwnProperty(eventName)) {
181
- this.countByEventName[eventName]++;
182
- } else {
183
- this.countByEventName[eventName] = 1;
184
-
185
- // To make delegation work with non-bubbling events, register a 'capture' listener.
186
- // We preserve the non-bubbling behavior by only dispatching such events to the targeted element.
187
- const useCapture = nonBubblingEvents.hasOwnProperty(eventName);
188
- document.addEventListener(eventName, this.globalListener, useCapture);
189
- }
190
- }
191
-
192
- public update(oldEventHandlerId: number, newEventHandlerId: number) {
193
- if (this.infosByEventHandlerId.hasOwnProperty(newEventHandlerId)) {
194
- // Should never happen, but we want to know if it does
195
- throw new Error(`Event ${newEventHandlerId} is already tracked`);
196
- }
197
-
198
- // Since we're just updating the event handler ID, there's no need to update the global counts
199
- const info = this.infosByEventHandlerId[oldEventHandlerId];
200
- delete this.infosByEventHandlerId[oldEventHandlerId];
201
- info.eventHandlerId = newEventHandlerId;
202
- this.infosByEventHandlerId[newEventHandlerId] = info;
203
- }
204
-
205
- public remove(eventHandlerId: number): EventHandlerInfo {
206
- const info = this.infosByEventHandlerId[eventHandlerId];
207
- if (info) {
208
- delete this.infosByEventHandlerId[eventHandlerId];
209
-
210
- const eventName = info.eventName;
211
- if (--this.countByEventName[eventName] === 0) {
212
- delete this.countByEventName[eventName];
213
- document.removeEventListener(eventName, this.globalListener);
214
- }
215
- }
216
-
217
- return info;
218
- }
219
- }
220
-
221
- class EventHandlerInfosForElement {
222
- // Although we *could* track multiple event handlers per (element, eventName) pair
223
- // (since they have distinct eventHandlerId values), there's no point doing so because
224
- // our programming model is that you declare event handlers as attributes. An element
225
- // can only have one attribute with a given name, hence only one event handler with
226
- // that name at any one time.
227
- // So to keep things simple, only track one EventHandlerInfo per (element, eventName)
228
- private handlers: { [eventName: string]: EventHandlerInfo } = {};
229
- private preventDefaultFlags: { [eventName: string]: boolean } | null = null;
230
- private stopPropagationFlags: { [eventName: string]: boolean } | null = null;
231
-
232
- public getHandler(eventName: string): EventHandlerInfo | null {
233
- return this.handlers.hasOwnProperty(eventName) ? this.handlers[eventName] : null;
234
- }
235
-
236
- public setHandler(eventName: string, handler: EventHandlerInfo) {
237
- this.handlers[eventName] = handler;
238
- }
239
-
240
- public removeHandler(eventName: string) {
241
- delete this.handlers[eventName];
242
- }
243
-
244
- public preventDefault(eventName: string, setValue?: boolean): boolean {
245
- if (setValue !== undefined) {
246
- this.preventDefaultFlags = this.preventDefaultFlags || {};
247
- this.preventDefaultFlags[eventName] = setValue;
248
- }
249
-
250
- return this.preventDefaultFlags ? this.preventDefaultFlags[eventName] : false;
251
- }
252
-
253
- public stopPropagation(eventName: string, setValue?: boolean): boolean {
254
- if (setValue !== undefined) {
255
- this.stopPropagationFlags = this.stopPropagationFlags || {};
256
- this.stopPropagationFlags[eventName] = setValue;
257
- }
258
-
259
- return this.stopPropagationFlags ? this.stopPropagationFlags[eventName] : false;
260
- }
261
- }
262
-
263
- interface EventHandlerInfo {
264
- element: Element;
265
- eventName: string;
266
- eventHandlerId: number;
267
-
268
- // The component whose tree includes the event handler attribute frame, *not* necessarily the
269
- // same component that will be re-rendered after the event is handled (since we re-render the
270
- // component that supplied the delegate, not the one that rendered the event handler frame)
271
- renderingComponentId: number;
272
- }
273
-
274
- function toLookup(items: string[]): { [key: string]: boolean } {
275
- const result = {};
276
- items.forEach((value) => {
277
- result[value] = true;
278
- });
279
- return result;
280
- }
281
-
282
- function eventIsDisabledOnElement(element: Element, eventName: string): boolean {
283
- // We want to replicate the normal DOM event behavior that, for 'interactive' elements
284
- // with a 'disabled' attribute, certain mouse events are suppressed
285
- return (
286
- (element instanceof HTMLButtonElement ||
287
- element instanceof HTMLInputElement ||
288
- element instanceof HTMLTextAreaElement ||
289
- element instanceof HTMLSelectElement) &&
290
- disableableEventNames.hasOwnProperty(eventName) &&
291
- element.disabled
292
- );
293
- }
@@ -1,31 +0,0 @@
1
- export class EventFieldInfo {
2
- constructor(public componentId: number, public fieldValue: string | boolean) {}
3
-
4
- public static fromEvent(componentId: number, event: Event): EventFieldInfo | null {
5
- const elem = event.target;
6
- if (elem instanceof Element) {
7
- const fieldData = getFormFieldData(elem);
8
- if (fieldData) {
9
- return new EventFieldInfo(componentId, fieldData.value);
10
- }
11
- }
12
-
13
- // This event isn't happening on a form field that we can reverse-map back to some incoming attribute
14
- return null;
15
- }
16
- }
17
-
18
- function getFormFieldData(elem: Element) {
19
- // The logic in here should be the inverse of the logic in BrowserRenderer's tryApplySpecialProperty.
20
- // That is, we're doing the reverse mapping, starting from an HTML property and reconstructing which
21
- // "special" attribute would have been mapped to that property.
22
- if (elem instanceof HTMLInputElement) {
23
- return elem.type && elem.type.toLowerCase() === 'checkbox' ? { value: elem.checked } : { value: elem.value };
24
- }
25
-
26
- if (elem instanceof HTMLSelectElement || elem instanceof HTMLTextAreaElement) {
27
- return { value: elem.value };
28
- }
29
-
30
- return null;
31
- }
@@ -1,370 +0,0 @@
1
- export class EventForDotNet<TData extends UIEventArgs> {
2
- public constructor(public readonly type: EventArgsType, public readonly data: TData) {}
3
-
4
- public static fromDOMEvent(event: Event): EventForDotNet<UIEventArgs> {
5
- const element = event.target as Element;
6
- switch (event.type) {
7
- case 'input':
8
- case 'change': {
9
- if (isTimeBasedInput(element)) {
10
- const normalizedValue = normalizeTimeBasedValue(element);
11
- return new EventForDotNet<UIChangeEventArgs>('change', { type: event.type, value: normalizedValue });
12
- }
13
-
14
- const targetIsCheckbox = isCheckbox(element);
15
- const newValue = targetIsCheckbox ? !!element['checked'] : element['value'];
16
- return new EventForDotNet<UIChangeEventArgs>('change', { type: event.type, value: newValue });
17
- }
18
-
19
- case 'copy':
20
- case 'cut':
21
- case 'paste':
22
- return new EventForDotNet<UIClipboardEventArgs>('clipboard', { type: event.type });
23
-
24
- case 'drag':
25
- case 'dragend':
26
- case 'dragenter':
27
- case 'dragleave':
28
- case 'dragover':
29
- case 'dragstart':
30
- case 'drop':
31
- return new EventForDotNet<UIDragEventArgs>('drag', parseDragEvent(event));
32
-
33
- case 'focus':
34
- case 'blur':
35
- case 'focusin':
36
- case 'focusout':
37
- return new EventForDotNet<UIFocusEventArgs>('focus', { type: event.type });
38
-
39
- case 'keydown':
40
- case 'keyup':
41
- case 'keypress':
42
- return new EventForDotNet<UIKeyboardEventArgs>('keyboard', parseKeyboardEvent(event as KeyboardEvent));
43
-
44
- case 'contextmenu':
45
- case 'click':
46
- case 'mouseover':
47
- case 'mouseout':
48
- case 'mousemove':
49
- case 'mousedown':
50
- case 'mouseup':
51
- case 'dblclick':
52
- return new EventForDotNet<UIMouseEventArgs>('mouse', parseMouseEvent(event as MouseEvent));
53
-
54
- case 'error':
55
- return new EventForDotNet<UIErrorEventArgs>('error', parseErrorEvent(event as ErrorEvent));
56
-
57
- case 'loadstart':
58
- case 'timeout':
59
- case 'abort':
60
- case 'load':
61
- case 'loadend':
62
- case 'progress':
63
- return new EventForDotNet<UIProgressEventArgs>('progress', parseProgressEvent(event as ProgressEvent));
64
-
65
- case 'touchcancel':
66
- case 'touchend':
67
- case 'touchmove':
68
- case 'touchenter':
69
- case 'touchleave':
70
- case 'touchstart':
71
- return new EventForDotNet<UITouchEventArgs>('touch', parseTouchEvent(event as TouchEvent));
72
-
73
- case 'gotpointercapture':
74
- case 'lostpointercapture':
75
- case 'pointercancel':
76
- case 'pointerdown':
77
- case 'pointerenter':
78
- case 'pointerleave':
79
- case 'pointermove':
80
- case 'pointerout':
81
- case 'pointerover':
82
- case 'pointerup':
83
- return new EventForDotNet<UIPointerEventArgs>('pointer', parsePointerEvent(event as PointerEvent));
84
-
85
- case 'wheel':
86
- case 'mousewheel':
87
- return new EventForDotNet<UIWheelEventArgs>('wheel', parseWheelEvent(event as WheelEvent));
88
-
89
- default:
90
- return new EventForDotNet<UIEventArgs>('unknown', { type: event.type });
91
- }
92
- }
93
- }
94
-
95
- function parseDragEvent(event: any) {
96
- return {
97
- ...parseMouseEvent(event),
98
- dataTransfer: event.dataTransfer,
99
- };
100
- }
101
-
102
- function parseWheelEvent(event: WheelEvent) {
103
- return {
104
- ...parseMouseEvent(event),
105
- deltaX: event.deltaX,
106
- deltaY: event.deltaY,
107
- deltaZ: event.deltaZ,
108
- deltaMode: event.deltaMode,
109
- };
110
- }
111
-
112
- function parseErrorEvent(event: ErrorEvent) {
113
- return {
114
- type: event.type,
115
- message: event.message,
116
- filename: event.filename,
117
- lineno: event.lineno,
118
- colno: event.colno,
119
- };
120
- }
121
-
122
- function parseProgressEvent(event: ProgressEvent) {
123
- return {
124
- type: event.type,
125
- lengthComputable: event.lengthComputable,
126
- loaded: event.loaded,
127
- total: event.total,
128
- };
129
- }
130
-
131
- function parseTouchEvent(event: TouchEvent) {
132
- function parseTouch(touchList: TouchList) {
133
- const touches: UITouchPoint[] = [];
134
-
135
- for (let i = 0; i < touchList.length; i++) {
136
- const touch = touchList[i];
137
- touches.push({
138
- identifier: touch.identifier,
139
- clientX: touch.clientX,
140
- clientY: touch.clientY,
141
- screenX: touch.screenX,
142
- screenY: touch.screenY,
143
- pageX: touch.pageX,
144
- pageY: touch.pageY,
145
- });
146
- }
147
- return touches;
148
- }
149
-
150
- return {
151
- type: event.type,
152
- detail: event.detail,
153
- touches: parseTouch(event.touches),
154
- targetTouches: parseTouch(event.targetTouches),
155
- changedTouches: parseTouch(event.changedTouches),
156
- ctrlKey: event.ctrlKey,
157
- shiftKey: event.shiftKey,
158
- altKey: event.altKey,
159
- metaKey: event.metaKey,
160
- };
161
- }
162
-
163
- function parseKeyboardEvent(event: KeyboardEvent) {
164
- return {
165
- type: event.type,
166
- key: event.key,
167
- code: event.code,
168
- location: event.location,
169
- repeat: event.repeat,
170
- ctrlKey: event.ctrlKey,
171
- shiftKey: event.shiftKey,
172
- altKey: event.altKey,
173
- metaKey: event.metaKey,
174
- };
175
- }
176
-
177
- function parsePointerEvent(event: PointerEvent) {
178
- return {
179
- ...parseMouseEvent(event),
180
- pointerId: event.pointerId,
181
- width: event.width,
182
- height: event.height,
183
- pressure: event.pressure,
184
- tiltX: event.tiltX,
185
- tiltY: event.tiltY,
186
- pointerType: event.pointerType,
187
- isPrimary: event.isPrimary,
188
- };
189
- }
190
-
191
- function parseMouseEvent(event: MouseEvent) {
192
- return {
193
- type: event.type,
194
- detail: event.detail,
195
- screenX: event.screenX,
196
- screenY: event.screenY,
197
- clientX: event.clientX,
198
- clientY: event.clientY,
199
- button: event.button,
200
- buttons: event.buttons,
201
- ctrlKey: event.ctrlKey,
202
- shiftKey: event.shiftKey,
203
- altKey: event.altKey,
204
- metaKey: event.metaKey,
205
- };
206
- }
207
-
208
- function isCheckbox(element: Element | null): boolean {
209
- return !!element && element.tagName === 'INPUT' && element.getAttribute('type') === 'checkbox';
210
- }
211
-
212
- const timeBasedInputs = ['date', 'datetime-local', 'month', 'time', 'week'];
213
-
214
- function isTimeBasedInput(element: Element): element is HTMLInputElement {
215
- return timeBasedInputs.indexOf(element.getAttribute('type')!) !== -1;
216
- }
217
-
218
- function normalizeTimeBasedValue(element: HTMLInputElement): string {
219
- const value = element.value;
220
- const type = element.type;
221
- switch (type) {
222
- case 'date':
223
- case 'datetime-local':
224
- case 'month':
225
- return value;
226
- case 'time':
227
- return value.length === 5 ? value + ':00' : value; // Convert hh:mm to hh:mm:00
228
- case 'week':
229
- // For now we are not going to normalize input type week as it is not trivial
230
- return value;
231
- }
232
-
233
- throw new Error(`Invalid element type '${type}'.`);
234
- }
235
-
236
- // The following interfaces must be kept in sync with the UIEventArgs C# classes
237
-
238
- export type EventArgsType =
239
- | 'change'
240
- | 'clipboard'
241
- | 'drag'
242
- | 'error'
243
- | 'focus'
244
- | 'keyboard'
245
- | 'mouse'
246
- | 'pointer'
247
- | 'progress'
248
- | 'touch'
249
- | 'unknown'
250
- | 'wheel';
251
-
252
- export interface UIEventArgs {
253
- type: string;
254
- }
255
-
256
- interface UIChangeEventArgs extends UIEventArgs {
257
- value: string | boolean;
258
- }
259
-
260
- interface UIClipboardEventArgs extends UIEventArgs {}
261
-
262
- interface UIDragEventArgs extends UIEventArgs {
263
- detail: number;
264
- dataTransfer: UIDataTransfer;
265
- screenX: number;
266
- screenY: number;
267
- clientX: number;
268
- clientY: number;
269
- button: number;
270
- buttons: number;
271
- ctrlKey: boolean;
272
- shiftKey: boolean;
273
- altKey: boolean;
274
- metaKey: boolean;
275
- }
276
-
277
- interface UIDataTransfer {
278
- dropEffect: string;
279
- effectAllowed: string;
280
- files: string[];
281
- items: UIDataTransferItem[];
282
- types: string[];
283
- }
284
-
285
- interface UIDataTransferItem {
286
- kind: string;
287
- type: string;
288
- }
289
-
290
- interface UIErrorEventArgs extends UIEventArgs {
291
- message: string;
292
- filename: string;
293
- lineno: number;
294
- colno: number;
295
-
296
- // omitting 'error' here since we'd have to serialize it, and it's not clear we will want to
297
- // do that. https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent
298
- }
299
-
300
- interface UIFocusEventArgs extends UIEventArgs {}
301
-
302
- interface UIKeyboardEventArgs extends UIEventArgs {
303
- key: string;
304
- code: string;
305
- location: number;
306
- repeat: boolean;
307
- ctrlKey: boolean;
308
- shiftKey: boolean;
309
- altKey: boolean;
310
- metaKey: boolean;
311
- }
312
-
313
- interface UIMouseEventArgs extends UIEventArgs {
314
- detail: number;
315
- screenX: number;
316
- screenY: number;
317
- clientX: number;
318
- clientY: number;
319
- button: number;
320
- buttons: number;
321
- ctrlKey: boolean;
322
- shiftKey: boolean;
323
- altKey: boolean;
324
- metaKey: boolean;
325
- }
326
-
327
- interface UIPointerEventArgs extends UIMouseEventArgs {
328
- pointerId: number;
329
- width: number;
330
- height: number;
331
- pressure: number;
332
- tiltX: number;
333
- tiltY: number;
334
- pointerType: string;
335
- isPrimary: boolean;
336
- }
337
-
338
- interface UIProgressEventArgs extends UIEventArgs {
339
- lengthComputable: boolean;
340
- loaded: number;
341
- total: number;
342
- }
343
-
344
- interface UITouchEventArgs extends UIEventArgs {
345
- detail: number;
346
- touches: UITouchPoint[];
347
- targetTouches: UITouchPoint[];
348
- changedTouches: UITouchPoint[];
349
- ctrlKey: boolean;
350
- shiftKey: boolean;
351
- altKey: boolean;
352
- metaKey: boolean;
353
- }
354
-
355
- interface UITouchPoint {
356
- identifier: number;
357
- screenX: number;
358
- screenY: number;
359
- clientX: number;
360
- clientY: number;
361
- pageX: number;
362
- pageY: number;
363
- }
364
-
365
- interface UIWheelEventArgs extends UIMouseEventArgs {
366
- deltaX: number;
367
- deltaY: number;
368
- deltaZ: number;
369
- deltaMode: number;
370
- }