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,616 +0,0 @@
1
- import {
2
- RenderBatch,
3
- ArrayBuilderSegment,
4
- RenderTreeEdit,
5
- RenderTreeFrame,
6
- EditType,
7
- FrameType,
8
- ArrayValues,
9
- } from './RenderBatch/RenderBatch';
10
- import { EventDelegator } from './EventDelegator';
11
- import { EventForDotNet, UIEventArgs, EventArgsType } from './EventForDotNet';
12
- import {
13
- LogicalElement,
14
- PermutationListEntry,
15
- toLogicalElement,
16
- insertLogicalChild,
17
- removeLogicalChild,
18
- getLogicalParent,
19
- getLogicalChild,
20
- createAndInsertLogicalContainer,
21
- isSvgElement,
22
- getLogicalChildrenArray,
23
- getLogicalSiblingEnd,
24
- permuteLogicalChildren,
25
- getClosestDomElement,
26
- } from './LogicalElements';
27
- import { applyCaptureIdToElement } from './ElementReferenceCapture';
28
- import { EventFieldInfo } from './EventFieldInfo';
29
- import { dispatchEvent } from './RendererEventDispatcher';
30
- import { attachToEventDelegator } from '../Services/NavigationManager';
31
-
32
- const selectValuePropname = '_blazorSelectValue';
33
- const sharedTemplateElemForParsing = document.createElement('template');
34
- const sharedSvgElemForParsing = document.createElementNS('http://www.w3.org/2000/svg', 'g');
35
- const preventDefaultEvents: { [eventType: string]: boolean } = { submit: true };
36
- const rootComponentsPendingFirstRender: { [componentId: number]: LogicalElement } = {};
37
- const internalAttributeNamePrefix = '__internal_';
38
- const eventPreventDefaultAttributeNamePrefix = 'preventDefault_';
39
- const eventStopPropagationAttributeNamePrefix = 'stopPropagation_';
40
-
41
- export class BrowserRenderer {
42
- private eventDelegator: EventDelegator;
43
-
44
- private childComponentLocations: { [componentId: number]: LogicalElement } = {};
45
-
46
- private browserRendererId: number;
47
-
48
- public constructor(browserRendererId: number) {
49
- this.browserRendererId = browserRendererId;
50
- this.eventDelegator = new EventDelegator((event, eventHandlerId, eventArgs, eventFieldInfo) => {
51
- raiseEvent(event, this.browserRendererId, eventHandlerId, eventArgs, eventFieldInfo);
52
- });
53
-
54
- attachToEventDelegator(this.eventDelegator);
55
- }
56
-
57
- public attachRootComponentToLogicalElement(componentId: number, element: LogicalElement): void {
58
- this.attachComponentToElement(componentId, element);
59
- rootComponentsPendingFirstRender[componentId] = element;
60
- }
61
-
62
- public updateComponent(
63
- batch: RenderBatch,
64
- componentId: number,
65
- edits: ArrayBuilderSegment<RenderTreeEdit>,
66
- referenceFrames: ArrayValues<RenderTreeFrame>,
67
- ): void {
68
- const element = this.childComponentLocations[componentId];
69
- if (!element) {
70
- throw new Error(`No element is currently associated with component ${componentId}`);
71
- }
72
-
73
- // On the first render for each root component, clear any existing content (e.g., prerendered)
74
- const rootElementToClear = rootComponentsPendingFirstRender[componentId];
75
- if (rootElementToClear) {
76
- const rootElementToClearEnd = getLogicalSiblingEnd(rootElementToClear);
77
- delete rootComponentsPendingFirstRender[componentId];
78
-
79
- if (!rootElementToClearEnd) {
80
- clearElement((rootElementToClear as unknown) as Element);
81
- } else {
82
- clearBetween((rootElementToClear as unknown) as Node, (rootElementToClearEnd as unknown) as Comment);
83
- }
84
- }
85
-
86
- const ownerDocument = getClosestDomElement(element).ownerDocument;
87
- const activeElementBefore = ownerDocument && ownerDocument.activeElement;
88
-
89
- this.applyEdits(batch, componentId, element, 0, edits, referenceFrames);
90
-
91
- // Try to restore focus in case it was lost due to an element move
92
- if (
93
- activeElementBefore instanceof HTMLElement &&
94
- ownerDocument &&
95
- ownerDocument.activeElement !== activeElementBefore
96
- ) {
97
- activeElementBefore.focus();
98
- }
99
- }
100
-
101
- public disposeComponent(componentId: number) {
102
- delete this.childComponentLocations[componentId];
103
- }
104
-
105
- public disposeEventHandler(eventHandlerId: number) {
106
- this.eventDelegator.removeListener(eventHandlerId);
107
- }
108
-
109
- private attachComponentToElement(componentId: number, element: LogicalElement) {
110
- this.childComponentLocations[componentId] = element;
111
- }
112
-
113
- private applyEdits(
114
- batch: RenderBatch,
115
- componentId: number,
116
- parent: LogicalElement,
117
- childIndex: number,
118
- edits: ArrayBuilderSegment<RenderTreeEdit>,
119
- referenceFrames: ArrayValues<RenderTreeFrame>,
120
- ) {
121
- let currentDepth = 0;
122
- let childIndexAtCurrentDepth = childIndex;
123
- let permutationList: PermutationListEntry[] | undefined;
124
-
125
- const arrayBuilderSegmentReader = batch.arrayBuilderSegmentReader;
126
- const editReader = batch.editReader;
127
- const frameReader = batch.frameReader;
128
- const editsValues = arrayBuilderSegmentReader.values(edits);
129
- const editsOffset = arrayBuilderSegmentReader.offset(edits);
130
- const editsLength = arrayBuilderSegmentReader.count(edits);
131
- const maxEditIndexExcl = editsOffset + editsLength;
132
-
133
- for (let editIndex = editsOffset; editIndex < maxEditIndexExcl; editIndex++) {
134
- const edit = batch.diffReader.editsEntry(editsValues, editIndex);
135
- const editType = editReader.editType(edit);
136
- switch (editType) {
137
- case EditType.prependFrame: {
138
- const frameIndex = editReader.newTreeIndex(edit);
139
- const frame = batch.referenceFramesEntry(referenceFrames, frameIndex);
140
- const siblingIndex = editReader.siblingIndex(edit);
141
- this.insertFrame(
142
- batch,
143
- componentId,
144
- parent,
145
- childIndexAtCurrentDepth + siblingIndex,
146
- referenceFrames,
147
- frame,
148
- frameIndex,
149
- );
150
- break;
151
- }
152
- case EditType.removeFrame: {
153
- const siblingIndex = editReader.siblingIndex(edit);
154
- removeLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
155
- break;
156
- }
157
- case EditType.setAttribute: {
158
- const frameIndex = editReader.newTreeIndex(edit);
159
- const frame = batch.referenceFramesEntry(referenceFrames, frameIndex);
160
- const siblingIndex = editReader.siblingIndex(edit);
161
- const element = getLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
162
- if (element instanceof Element) {
163
- this.applyAttribute(batch, componentId, element, frame);
164
- } else {
165
- throw new Error('Cannot set attribute on non-element child');
166
- }
167
- break;
168
- }
169
- case EditType.removeAttribute: {
170
- // Note that we don't have to dispose the info we track about event handlers here, because the
171
- // disposed event handler IDs are delivered separately (in the 'disposedEventHandlerIds' array)
172
- const siblingIndex = editReader.siblingIndex(edit);
173
- const element = getLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
174
- if (element instanceof HTMLElement) {
175
- const attributeName = editReader.removedAttributeName(edit)!;
176
- // First try to remove any special property we use for this attribute
177
- if (!this.tryApplySpecialProperty(batch, element, attributeName, null)) {
178
- // If that's not applicable, it's a regular DOM attribute so remove that
179
- element.removeAttribute(attributeName);
180
- }
181
- } else {
182
- throw new Error('Cannot remove attribute from non-element child');
183
- }
184
- break;
185
- }
186
- case EditType.updateText: {
187
- const frameIndex = editReader.newTreeIndex(edit);
188
- const frame = batch.referenceFramesEntry(referenceFrames, frameIndex);
189
- const siblingIndex = editReader.siblingIndex(edit);
190
- const textNode = getLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
191
- if (textNode instanceof Text) {
192
- textNode.textContent = frameReader.textContent(frame);
193
- } else {
194
- throw new Error('Cannot set text content on non-text child');
195
- }
196
- break;
197
- }
198
- case EditType.updateMarkup: {
199
- const frameIndex = editReader.newTreeIndex(edit);
200
- const frame = batch.referenceFramesEntry(referenceFrames, frameIndex);
201
- const siblingIndex = editReader.siblingIndex(edit);
202
- removeLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
203
- this.insertMarkup(batch, parent, childIndexAtCurrentDepth + siblingIndex, frame);
204
- break;
205
- }
206
- case EditType.stepIn: {
207
- const siblingIndex = editReader.siblingIndex(edit);
208
- parent = getLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
209
- currentDepth++;
210
- childIndexAtCurrentDepth = 0;
211
- break;
212
- }
213
- case EditType.stepOut: {
214
- parent = getLogicalParent(parent)!;
215
- currentDepth--;
216
- childIndexAtCurrentDepth = currentDepth === 0 ? childIndex : 0; // The childIndex is only ever nonzero at zero depth
217
- break;
218
- }
219
- case EditType.permutationListEntry: {
220
- permutationList = permutationList || [];
221
- permutationList.push({
222
- fromSiblingIndex: childIndexAtCurrentDepth + editReader.siblingIndex(edit),
223
- toSiblingIndex: childIndexAtCurrentDepth + editReader.moveToSiblingIndex(edit),
224
- });
225
- break;
226
- }
227
- case EditType.permutationListEnd: {
228
- permuteLogicalChildren(parent, permutationList!);
229
- permutationList = undefined;
230
- break;
231
- }
232
- default: {
233
- const unknownType: never = editType; // Compile-time verification that the switch was exhaustive
234
- throw new Error(`Unknown edit type: ${unknownType}`);
235
- }
236
- }
237
- }
238
- }
239
-
240
- private insertFrame(
241
- batch: RenderBatch,
242
- componentId: number,
243
- parent: LogicalElement,
244
- childIndex: number,
245
- frames: ArrayValues<RenderTreeFrame>,
246
- frame: RenderTreeFrame,
247
- frameIndex: number,
248
- ): number {
249
- const frameReader = batch.frameReader;
250
- const frameType = frameReader.frameType(frame);
251
- switch (frameType) {
252
- case FrameType.element:
253
- this.insertElement(batch, componentId, parent, childIndex, frames, frame, frameIndex);
254
- return 1;
255
- case FrameType.text:
256
- this.insertText(batch, parent, childIndex, frame);
257
- return 1;
258
- case FrameType.attribute:
259
- throw new Error('Attribute frames should only be present as leading children of element frames.');
260
- case FrameType.component:
261
- this.insertComponent(batch, parent, childIndex, frame);
262
- return 1;
263
- case FrameType.region:
264
- return this.insertFrameRange(
265
- batch,
266
- componentId,
267
- parent,
268
- childIndex,
269
- frames,
270
- frameIndex + 1,
271
- frameIndex + frameReader.subtreeLength(frame),
272
- );
273
- case FrameType.elementReferenceCapture:
274
- if (parent instanceof Element) {
275
- applyCaptureIdToElement(parent, frameReader.elementReferenceCaptureId(frame)!);
276
- return 0; // A "capture" is a child in the diff, but has no node in the DOM
277
- } else {
278
- throw new Error('Reference capture frames can only be children of element frames.');
279
- }
280
- case FrameType.markup:
281
- this.insertMarkup(batch, parent, childIndex, frame);
282
- return 1;
283
- default:
284
- const unknownType: never = frameType; // Compile-time verification that the switch was exhaustive
285
- throw new Error(`Unknown frame type: ${unknownType}`);
286
- }
287
- }
288
-
289
- private insertElement(
290
- batch: RenderBatch,
291
- componentId: number,
292
- parent: LogicalElement,
293
- childIndex: number,
294
- frames: ArrayValues<RenderTreeFrame>,
295
- frame: RenderTreeFrame,
296
- frameIndex: number,
297
- ) {
298
- const frameReader = batch.frameReader;
299
- const tagName = frameReader.elementName(frame)!;
300
- const newDomElementRaw =
301
- tagName === 'svg' || isSvgElement(parent)
302
- ? document.createElementNS('http://www.w3.org/2000/svg', tagName)
303
- : document.createElement(tagName);
304
- const newElement = toLogicalElement(newDomElementRaw);
305
- insertLogicalChild(newDomElementRaw, parent, childIndex);
306
-
307
- // Apply attributes
308
- const descendantsEndIndexExcl = frameIndex + frameReader.subtreeLength(frame);
309
- for (let descendantIndex = frameIndex + 1; descendantIndex < descendantsEndIndexExcl; descendantIndex++) {
310
- const descendantFrame = batch.referenceFramesEntry(frames, descendantIndex);
311
- if (frameReader.frameType(descendantFrame) === FrameType.attribute) {
312
- this.applyAttribute(batch, componentId, newDomElementRaw, descendantFrame);
313
- } else {
314
- // As soon as we see a non-attribute child, all the subsequent child frames are
315
- // not attributes, so bail out and insert the remnants recursively
316
- this.insertFrameRange(batch, componentId, newElement, 0, frames, descendantIndex, descendantsEndIndexExcl);
317
- break;
318
- }
319
- }
320
-
321
- // We handle setting 'value' on a <select> in two different ways:
322
- // [1] When inserting a corresponding <option>, in case you're dynamically adding options
323
- // [2] After we finish inserting the <select>, in case the descendant options are being
324
- // added as an opaque markup block rather than individually
325
- // Right here we implement [2]
326
- if (newDomElementRaw instanceof HTMLSelectElement && selectValuePropname in newDomElementRaw) {
327
- const selectValue = newDomElementRaw[selectValuePropname];
328
- newDomElementRaw.value = selectValue;
329
- delete newDomElementRaw[selectValuePropname];
330
- }
331
- }
332
-
333
- private insertComponent(batch: RenderBatch, parent: LogicalElement, childIndex: number, frame: RenderTreeFrame) {
334
- const containerElement = createAndInsertLogicalContainer(parent, childIndex);
335
-
336
- // All we have to do is associate the child component ID with its location. We don't actually
337
- // do any rendering here, because the diff for the child will appear later in the render batch.
338
- const childComponentId = batch.frameReader.componentId(frame);
339
- this.attachComponentToElement(childComponentId, containerElement);
340
- }
341
-
342
- private insertText(batch: RenderBatch, parent: LogicalElement, childIndex: number, textFrame: RenderTreeFrame) {
343
- const textContent = batch.frameReader.textContent(textFrame)!;
344
- const newTextNode = document.createTextNode(textContent);
345
- insertLogicalChild(newTextNode, parent, childIndex);
346
- }
347
-
348
- private insertMarkup(batch: RenderBatch, parent: LogicalElement, childIndex: number, markupFrame: RenderTreeFrame) {
349
- const markupContainer = createAndInsertLogicalContainer(parent, childIndex);
350
-
351
- const markupContent = batch.frameReader.markupContent(markupFrame);
352
- const parsedMarkup = parseMarkup(markupContent, isSvgElement(parent));
353
- let logicalSiblingIndex = 0;
354
- while (parsedMarkup.firstChild) {
355
- insertLogicalChild(parsedMarkup.firstChild, markupContainer, logicalSiblingIndex++);
356
- }
357
- }
358
-
359
- private applyAttribute(
360
- batch: RenderBatch,
361
- componentId: number,
362
- toDomElement: Element,
363
- attributeFrame: RenderTreeFrame,
364
- ) {
365
- const frameReader = batch.frameReader;
366
- const attributeName = frameReader.attributeName(attributeFrame)!;
367
- const eventHandlerId = frameReader.attributeEventHandlerId(attributeFrame);
368
-
369
- if (eventHandlerId) {
370
- const eventName = stripOnPrefix(attributeName);
371
- this.eventDelegator.setListener(toDomElement, eventName, eventHandlerId, componentId);
372
- return;
373
- }
374
-
375
- // First see if we have special handling for this attribute
376
- if (!this.tryApplySpecialProperty(batch, toDomElement, attributeName, attributeFrame)) {
377
- // If not, treat it as a regular string-valued attribute
378
- toDomElement.setAttribute(attributeName, frameReader.attributeValue(attributeFrame)!);
379
- }
380
- }
381
-
382
- private tryApplySpecialProperty(
383
- batch: RenderBatch,
384
- element: Element,
385
- attributeName: string,
386
- attributeFrame: RenderTreeFrame | null,
387
- ) {
388
- switch (attributeName) {
389
- case 'value':
390
- return this.tryApplyValueProperty(batch, element, attributeFrame);
391
- case 'checked':
392
- return this.tryApplyCheckedProperty(batch, element, attributeFrame);
393
- default: {
394
- if (attributeName.startsWith(internalAttributeNamePrefix)) {
395
- this.applyInternalAttribute(
396
- batch,
397
- element,
398
- attributeName.substring(internalAttributeNamePrefix.length),
399
- attributeFrame,
400
- );
401
- return true;
402
- }
403
- return false;
404
- }
405
- }
406
- }
407
-
408
- private applyInternalAttribute(
409
- batch: RenderBatch,
410
- element: Element,
411
- internalAttributeName: string,
412
- attributeFrame: RenderTreeFrame | null,
413
- ) {
414
- const attributeValue = attributeFrame ? batch.frameReader.attributeValue(attributeFrame) : null;
415
-
416
- if (internalAttributeName.startsWith(eventStopPropagationAttributeNamePrefix)) {
417
- // Stop propagation
418
- const eventName = stripOnPrefix(internalAttributeName.substring(eventStopPropagationAttributeNamePrefix.length));
419
- this.eventDelegator.setStopPropagation(element, eventName, attributeValue !== null);
420
- } else if (internalAttributeName.startsWith(eventPreventDefaultAttributeNamePrefix)) {
421
- // Prevent default
422
- const eventName = stripOnPrefix(internalAttributeName.substring(eventPreventDefaultAttributeNamePrefix.length));
423
- this.eventDelegator.setPreventDefault(element, eventName, attributeValue !== null);
424
- } else {
425
- // The prefix makes this attribute name reserved, so any other usage is disallowed
426
- throw new Error(`Unsupported internal attribute '${internalAttributeName}'`);
427
- }
428
- }
429
-
430
- private tryApplyValueProperty(batch: RenderBatch, element: Element, attributeFrame: RenderTreeFrame | null): boolean {
431
- // Certain elements have built-in behaviour for their 'value' property
432
- const frameReader = batch.frameReader;
433
-
434
- if (element.tagName === 'INPUT' && element.getAttribute('type') === 'time' && !element.getAttribute('step')) {
435
- const timeValue = attributeFrame ? frameReader.attributeValue(attributeFrame) : null;
436
- if (timeValue) {
437
- element['value'] = timeValue.substring(0, 5);
438
- return true;
439
- }
440
- }
441
-
442
- switch (element.tagName) {
443
- case 'INPUT':
444
- case 'SELECT':
445
- case 'TEXTAREA': {
446
- const value = attributeFrame ? frameReader.attributeValue(attributeFrame) : null;
447
- (element as any).value = value;
448
-
449
- if (element.tagName === 'SELECT') {
450
- // <select> is special, in that anything we write to .value will be lost if there
451
- // isn't yet a matching <option>. To maintain the expected behavior no matter the
452
- // element insertion/update order, preserve the desired value separately so
453
- // we can recover it when inserting any matching <option> or after inserting an
454
- // entire markup block of descendants.
455
- element[selectValuePropname] = value;
456
- }
457
- return true;
458
- }
459
- case 'OPTION': {
460
- const value = attributeFrame ? frameReader.attributeValue(attributeFrame) : null;
461
- if (value) {
462
- element.setAttribute('value', value);
463
- } else {
464
- element.removeAttribute('value');
465
- }
466
- // See above for why we have this special handling for <select>/<option>
467
- // Note that this is only one of the two cases where we set the value on a <select>
468
- const selectElem = this.findClosestAncestorSelectElement(element);
469
- if (selectElem && selectValuePropname in selectElem && selectElem[selectValuePropname] === value) {
470
- this.tryApplyValueProperty(batch, selectElem, attributeFrame);
471
- delete selectElem[selectValuePropname];
472
- }
473
- return true;
474
- }
475
- default:
476
- return false;
477
- }
478
- }
479
-
480
- private tryApplyCheckedProperty(batch: RenderBatch, element: Element, attributeFrame: RenderTreeFrame | null) {
481
- // Certain elements have built-in behaviour for their 'checked' property
482
- if (element.tagName === 'INPUT') {
483
- const value = attributeFrame ? batch.frameReader.attributeValue(attributeFrame) : null;
484
- (element as any).checked = value !== null;
485
- return true;
486
- } else {
487
- return false;
488
- }
489
- }
490
-
491
- private findClosestAncestorSelectElement(element: Element | null) {
492
- while (element) {
493
- if (element instanceof HTMLSelectElement) {
494
- return element;
495
- } else {
496
- element = element.parentElement;
497
- }
498
- }
499
-
500
- return null;
501
- }
502
-
503
- private insertFrameRange(
504
- batch: RenderBatch,
505
- componentId: number,
506
- parent: LogicalElement,
507
- childIndex: number,
508
- frames: ArrayValues<RenderTreeFrame>,
509
- startIndex: number,
510
- endIndexExcl: number,
511
- ): number {
512
- const origChildIndex = childIndex;
513
- for (let index = startIndex; index < endIndexExcl; index++) {
514
- const frame = batch.referenceFramesEntry(frames, index);
515
- const numChildrenInserted = this.insertFrame(batch, componentId, parent, childIndex, frames, frame, index);
516
- childIndex += numChildrenInserted;
517
-
518
- // Skip over any descendants, since they are already dealt with recursively
519
- index += countDescendantFrames(batch, frame);
520
- }
521
-
522
- return childIndex - origChildIndex; // Total number of children inserted
523
- }
524
- }
525
-
526
- export interface ComponentDescriptor {
527
- start: Node;
528
- end: Node;
529
- }
530
-
531
- export interface EventDescriptor {
532
- browserRendererId: number;
533
- eventHandlerId: number;
534
- eventArgsType: EventArgsType;
535
- eventFieldInfo: EventFieldInfo | null;
536
- }
537
-
538
- function parseMarkup(markup: string, isSvg: boolean) {
539
- if (isSvg) {
540
- sharedSvgElemForParsing.innerHTML = markup || ' ';
541
- return sharedSvgElemForParsing;
542
- } else {
543
- sharedTemplateElemForParsing.innerHTML = markup || ' ';
544
- return sharedTemplateElemForParsing.content;
545
- }
546
- }
547
-
548
- function countDescendantFrames(batch: RenderBatch, frame: RenderTreeFrame): number {
549
- const frameReader = batch.frameReader;
550
- switch (frameReader.frameType(frame)) {
551
- // The following frame types have a subtree length. Other frames may use that memory slot
552
- // to mean something else, so we must not read it. We should consider having nominal subtypes
553
- // of RenderTreeFramePointer that prevent access to non-applicable fields.
554
- case FrameType.component:
555
- case FrameType.element:
556
- case FrameType.region:
557
- return frameReader.subtreeLength(frame) - 1;
558
- default:
559
- return 0;
560
- }
561
- }
562
-
563
- function raiseEvent(
564
- event: Event,
565
- browserRendererId: number,
566
- eventHandlerId: number,
567
- eventArgs: EventForDotNet<UIEventArgs>,
568
- eventFieldInfo: EventFieldInfo | null,
569
- ): void {
570
- if (preventDefaultEvents[event.type]) {
571
- event.preventDefault();
572
- }
573
-
574
- const eventDescriptor = {
575
- browserRendererId,
576
- eventHandlerId,
577
- eventArgsType: eventArgs.type,
578
- eventFieldInfo: eventFieldInfo,
579
- };
580
-
581
- dispatchEvent(eventDescriptor, eventArgs.data);
582
- }
583
-
584
- function clearElement(element: Element) {
585
- let childNode: Node | null;
586
- while ((childNode = element.firstChild)) {
587
- element.removeChild(childNode);
588
- }
589
- }
590
-
591
- function clearBetween(start: Node, end: Node): void {
592
- const logicalParent = getLogicalParent((start as unknown) as LogicalElement);
593
- if (!logicalParent) {
594
- throw new Error("Can't clear between nodes. The start node does not have a logical parent.");
595
- }
596
- const children = getLogicalChildrenArray(logicalParent);
597
- const removeStart = children.indexOf((start as unknown) as LogicalElement) + 1;
598
- const endIndex = children.indexOf((end as unknown) as LogicalElement);
599
-
600
- // We remove the end component comment from the DOM as we don't need it after this point.
601
- for (let i = removeStart; i <= endIndex; i++) {
602
- removeLogicalChild(logicalParent, removeStart);
603
- }
604
-
605
- // We sanitize the start comment by removing all the information from it now that we don't need it anymore
606
- // as it adds noise to the DOM.
607
- start.textContent = '!';
608
- }
609
-
610
- function stripOnPrefix(attributeName: string) {
611
- if (attributeName.startsWith('on')) {
612
- return attributeName.substring(2);
613
- }
614
-
615
- throw new Error(`Attribute should be an event name, but doesn't start with 'on'. Value: '${attributeName}'`);
616
- }
@@ -1,27 +0,0 @@
1
- export function applyCaptureIdToElement(element: Element, referenceCaptureId: string) {
2
- element.setAttribute(getCaptureIdAttributeName(referenceCaptureId), '');
3
- }
4
-
5
- function getElementByCaptureId(referenceCaptureId: string) {
6
- const selector = `[${getCaptureIdAttributeName(referenceCaptureId)}]`;
7
- return document.querySelector(selector);
8
- }
9
-
10
- function getCaptureIdAttributeName(referenceCaptureId: string) {
11
- return `_bl_${referenceCaptureId}`;
12
- }
13
-
14
- // Support receiving ElementRef instances as args in interop calls
15
- const elementRefKey = '__internalId'; // Keep in sync with ElementRef.cs
16
- DotNet.attachReviver((key, value) => {
17
- if (
18
- value &&
19
- typeof value === 'object' &&
20
- value.hasOwnProperty(elementRefKey) &&
21
- typeof value[elementRefKey] === 'string'
22
- ) {
23
- return getElementByCaptureId(value[elementRefKey]);
24
- } else {
25
- return value;
26
- }
27
- });