@@ -3,6 +3,7 @@ import { EventDelegator } from './EventDelegator';
3
3
import { EventForDotNet , UIEventArgs } from './EventForDotNet' ;
4
4
import { LogicalElement , PermutationListEntry , toLogicalElement , insertLogicalChild , removeLogicalChild , getLogicalParent , getLogicalChild , createAndInsertLogicalContainer , isSvgElement , getLogicalChildrenArray , getLogicalSiblingEnd , permuteLogicalChildren , getClosestDomElement } from './LogicalElements' ;
5
5
import { applyCaptureIdToElement } from './ElementReferenceCapture' ;
6
+ import { EventFieldInfo } from './EventFieldInfo' ;
6
7
const selectValuePropname = '_blazorSelectValue' ;
7
8
const sharedTemplateElemForParsing = document . createElement ( 'template' ) ;
8
9
const sharedSvgElemForParsing = document . createElementNS ( 'http://www.w3.org/2000/svg' , 'g' ) ;
@@ -18,8 +19,8 @@ export class BrowserRenderer {
18
19
19
20
public constructor ( browserRendererId : number ) {
20
21
this . browserRendererId = browserRendererId ;
21
- this . eventDelegator = new EventDelegator ( ( event , eventHandlerId , eventArgs ) => {
22
- raiseEvent ( event , this . browserRendererId , eventHandlerId , eventArgs ) ;
22
+ this . eventDelegator = new EventDelegator ( ( event , eventHandlerId , eventArgs , eventFieldInfo ) => {
23
+ raiseEvent ( event , this . browserRendererId , eventHandlerId , eventArgs , eventFieldInfo ) ;
23
24
} ) ;
24
25
}
25
26
@@ -50,7 +51,7 @@ export class BrowserRenderer {
50
51
const ownerDocument = getClosestDomElement ( element ) . ownerDocument ;
51
52
const activeElementBefore = ownerDocument && ownerDocument . activeElement ;
52
53
53
- this . applyEdits ( batch , element , 0 , edits , referenceFrames ) ;
54
+ this . applyEdits ( batch , componentId , element , 0 , edits , referenceFrames ) ;
54
55
55
56
// Try to restore focus in case it was lost due to an element move
56
57
if ( ( activeElementBefore instanceof HTMLElement ) && ownerDocument && ownerDocument . activeElement !== activeElementBefore ) {
@@ -70,7 +71,7 @@ export class BrowserRenderer {
70
71
this . childComponentLocations [ componentId ] = element ;
71
72
}
72
73
73
- private applyEdits ( batch : RenderBatch , parent : LogicalElement , childIndex : number , edits : ArraySegment < RenderTreeEdit > , referenceFrames : ArrayValues < RenderTreeFrame > ) {
74
+ private applyEdits ( batch : RenderBatch , componentId : number , parent : LogicalElement , childIndex : number , edits : ArraySegment < RenderTreeEdit > , referenceFrames : ArrayValues < RenderTreeFrame > ) {
74
75
let currentDepth = 0 ;
75
76
let childIndexAtCurrentDepth = childIndex ;
76
77
let permutationList : PermutationListEntry [ ] | undefined ;
@@ -91,7 +92,7 @@ export class BrowserRenderer {
91
92
const frameIndex = editReader . newTreeIndex ( edit ) ;
92
93
const frame = batch . referenceFramesEntry ( referenceFrames , frameIndex ) ;
93
94
const siblingIndex = editReader . siblingIndex ( edit ) ;
94
- this . insertFrame ( batch , parent , childIndexAtCurrentDepth + siblingIndex , referenceFrames , frame , frameIndex ) ;
95
+ this . insertFrame ( batch , componentId , parent , childIndexAtCurrentDepth + siblingIndex , referenceFrames , frame , frameIndex ) ;
95
96
break ;
96
97
}
97
98
case EditType . removeFrame : {
@@ -105,7 +106,7 @@ export class BrowserRenderer {
105
106
const siblingIndex = editReader . siblingIndex ( edit ) ;
106
107
const element = getLogicalChild ( parent , childIndexAtCurrentDepth + siblingIndex ) ;
107
108
if ( element instanceof Element ) {
108
- this . applyAttribute ( batch , element , frame ) ;
109
+ this . applyAttribute ( batch , componentId , element , frame ) ;
109
110
} else {
110
111
throw new Error ( 'Cannot set attribute on non-element child' ) ;
111
112
}
@@ -182,12 +183,12 @@ export class BrowserRenderer {
182
183
}
183
184
}
184
185
185
- private insertFrame ( batch : RenderBatch , parent : LogicalElement , childIndex : number , frames : ArrayValues < RenderTreeFrame > , frame : RenderTreeFrame , frameIndex : number ) : number {
186
+ private insertFrame ( batch : RenderBatch , componentId : number , parent : LogicalElement , childIndex : number , frames : ArrayValues < RenderTreeFrame > , frame : RenderTreeFrame , frameIndex : number ) : number {
186
187
const frameReader = batch . frameReader ;
187
188
const frameType = frameReader . frameType ( frame ) ;
188
189
switch ( frameType ) {
189
190
case FrameType . element :
190
- this . insertElement ( batch , parent , childIndex , frames , frame , frameIndex ) ;
191
+ this . insertElement ( batch , componentId , parent , childIndex , frames , frame , frameIndex ) ;
191
192
return 1 ;
192
193
case FrameType . text :
193
194
this . insertText ( batch , parent , childIndex , frame ) ;
@@ -198,7 +199,7 @@ export class BrowserRenderer {
198
199
this . insertComponent ( batch , parent , childIndex , frame ) ;
199
200
return 1 ;
200
201
case FrameType . region :
201
- return this . insertFrameRange ( batch , parent , childIndex , frames , frameIndex + 1 , frameIndex + frameReader . subtreeLength ( frame ) ) ;
202
+ return this . insertFrameRange ( batch , componentId , parent , childIndex , frames , frameIndex + 1 , frameIndex + frameReader . subtreeLength ( frame ) ) ;
202
203
case FrameType . elementReferenceCapture :
203
204
if ( parent instanceof Element ) {
204
205
applyCaptureIdToElement ( parent , frameReader . elementReferenceCaptureId ( frame ) ! ) ;
@@ -215,7 +216,7 @@ export class BrowserRenderer {
215
216
}
216
217
}
217
218
218
- private insertElement ( batch : RenderBatch , parent : LogicalElement , childIndex : number , frames : ArrayValues < RenderTreeFrame > , frame : RenderTreeFrame , frameIndex : number ) {
219
+ private insertElement ( batch : RenderBatch , componentId : number , parent : LogicalElement , childIndex : number , frames : ArrayValues < RenderTreeFrame > , frame : RenderTreeFrame , frameIndex : number ) {
219
220
const frameReader = batch . frameReader ;
220
221
const tagName = frameReader . elementName ( frame ) ! ;
221
222
const newDomElementRaw = tagName === 'svg' || isSvgElement ( parent ) ?
@@ -229,11 +230,11 @@ export class BrowserRenderer {
229
230
for ( let descendantIndex = frameIndex + 1 ; descendantIndex < descendantsEndIndexExcl ; descendantIndex ++ ) {
230
231
const descendantFrame = batch . referenceFramesEntry ( frames , descendantIndex ) ;
231
232
if ( frameReader . frameType ( descendantFrame ) === FrameType . attribute ) {
232
- this . applyAttribute ( batch , newDomElementRaw , descendantFrame ) ;
233
+ this . applyAttribute ( batch , componentId , newDomElementRaw , descendantFrame ) ;
233
234
} else {
234
235
// As soon as we see a non-attribute child, all the subsequent child frames are
235
236
// not attributes, so bail out and insert the remnants recursively
236
- this . insertFrameRange ( batch , newElement , 0 , frames , descendantIndex , descendantsEndIndexExcl ) ;
237
+ this . insertFrameRange ( batch , componentId , newElement , 0 , frames , descendantIndex , descendantsEndIndexExcl ) ;
237
238
break ;
238
239
}
239
240
}
@@ -265,7 +266,7 @@ export class BrowserRenderer {
265
266
}
266
267
}
267
268
268
- private applyAttribute ( batch : RenderBatch , toDomElement : Element , attributeFrame : RenderTreeFrame ) {
269
+ private applyAttribute ( batch : RenderBatch , componentId : number , toDomElement : Element , attributeFrame : RenderTreeFrame ) {
269
270
const frameReader = batch . frameReader ;
270
271
const attributeName = frameReader . attributeName ( attributeFrame ) ! ;
271
272
const browserRendererId = this . browserRendererId ;
@@ -277,7 +278,7 @@ export class BrowserRenderer {
277
278
if ( firstTwoChars !== 'on' || ! eventName ) {
278
279
throw new Error ( `Attribute has nonzero event handler ID, but attribute name '${ attributeName } ' does not start with 'on'.` ) ;
279
280
}
280
- this . eventDelegator . setListener ( toDomElement , eventName , eventHandlerId ) ;
281
+ this . eventDelegator . setListener ( toDomElement , eventName , eventHandlerId , componentId ) ;
281
282
return ;
282
283
}
283
284
@@ -352,11 +353,11 @@ export class BrowserRenderer {
352
353
}
353
354
}
354
355
355
- private insertFrameRange ( batch : RenderBatch , parent : LogicalElement , childIndex : number , frames : ArrayValues < RenderTreeFrame > , startIndex : number , endIndexExcl : number ) : number {
356
+ private insertFrameRange ( batch : RenderBatch , componentId : number , parent : LogicalElement , childIndex : number , frames : ArrayValues < RenderTreeFrame > , startIndex : number , endIndexExcl : number ) : number {
356
357
const origChildIndex = childIndex ;
357
358
for ( let index = startIndex ; index < endIndexExcl ; index ++ ) {
358
359
const frame = batch . referenceFramesEntry ( frames , index ) ;
359
- const numChildrenInserted = this . insertFrame ( batch , parent , childIndex , frames , frame , index ) ;
360
+ const numChildrenInserted = this . insertFrame ( batch , componentId , parent , childIndex , frames , frame , index ) ;
360
361
childIndex += numChildrenInserted ;
361
362
362
363
// Skip over any descendants, since they are already dealt with recursively
@@ -397,7 +398,7 @@ function countDescendantFrames(batch: RenderBatch, frame: RenderTreeFrame): numb
397
398
}
398
399
}
399
400
400
- function raiseEvent ( event : Event , browserRendererId : number , eventHandlerId : number , eventArgs : EventForDotNet < UIEventArgs > ) {
401
+ function raiseEvent ( event : Event , browserRendererId : number , eventHandlerId : number , eventArgs : EventForDotNet < UIEventArgs > , eventFieldInfo : EventFieldInfo | null ) {
401
402
if ( preventDefaultEvents [ event . type ] ) {
402
403
event . preventDefault ( ) ;
403
404
}
@@ -406,6 +407,7 @@ function raiseEvent(event: Event, browserRendererId: number, eventHandlerId: num
406
407
browserRendererId,
407
408
eventHandlerId,
408
409
eventArgsType : eventArgs . type ,
410
+ eventFieldInfo : eventFieldInfo ,
409
411
} ;
410
412
411
413
return DotNet . invokeMethodAsync (
0 commit comments