Skip to content

Commit 0589eab

Browse files
committed
Working WIP implementation
1 parent 062e663 commit 0589eab

File tree

3 files changed

+86
-12
lines changed

3 files changed

+86
-12
lines changed

src/Components/Components/src/RenderTree/RenderTreeDiffBuilder.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public static RenderTreeDiff ComputeDiff(
3838
}
3939

4040
public static void DisposeFrames(RenderBatchBuilder batchBuilder, int componentId, ArrayRange<RenderTreeFrame> frames)
41-
=> DisposeFramesInRange(batchBuilder, componentId, frames.Array, 0, frames.Count);
41+
=> DisposeFramesInRange(batchBuilder, componentId, frames.Array, 0, frames.Count, 0);
4242

4343
private static void AppendDiffEntriesForRange(
4444
ref DiffContext diffContext,
@@ -867,7 +867,7 @@ private static void RemoveOldFrame(ref DiffContext diffContext, int oldFrameInde
867867
case RenderTreeFrameType.Element:
868868
{
869869
var endIndexExcl = oldFrameIndex + oldFrame.ElementSubtreeLengthField;
870-
DisposeFramesInRange(diffContext.BatchBuilder, diffContext.ComponentId, oldTree, oldFrameIndex, endIndexExcl);
870+
DisposeFramesInRange(diffContext.BatchBuilder, diffContext.ComponentId, oldTree, oldFrameIndex, endIndexExcl, diffContext.SiblingIndex);
871871
diffContext.Edits.Append(RenderTreeEdit.RemoveFrame(diffContext.SiblingIndex));
872872
break;
873873
}
@@ -1013,7 +1013,7 @@ private static void InitializeNewNamedEvent(ref DiffContext diffContext, int new
10131013
diffContext.BatchBuilder.AddNamedEvent(diffContext.ComponentId, newTreeFrameIndex, ref diffContext.NewTree[newTreeFrameIndex]);
10141014
}
10151015

1016-
private static void DisposeFramesInRange(RenderBatchBuilder batchBuilder, int componentId, RenderTreeFrame[] frames, int startIndex, int endIndexExcl)
1016+
private static void DisposeFramesInRange(RenderBatchBuilder batchBuilder, int componentId, RenderTreeFrame[] frames, int startIndex, int endIndexExcl, int siblingIndex)
10171017
{
10181018
for (var i = startIndex; i < endIndexExcl; i++)
10191019
{
@@ -1022,9 +1022,16 @@ private static void DisposeFramesInRange(RenderBatchBuilder batchBuilder, int co
10221022
{
10231023
batchBuilder.ComponentDisposalQueue.Enqueue(frame.ComponentIdField);
10241024
}
1025-
else if (frame.FrameTypeField == RenderTreeFrameType.Attribute && frame.AttributeEventHandlerIdField > 0)
1025+
else if (frame.FrameTypeField == RenderTreeFrameType.Attribute)
10261026
{
1027-
batchBuilder.DisposedEventHandlerIds.Append(frame.AttributeEventHandlerIdField);
1027+
if (frame.AttributeEventHandlerIdField > 0)
1028+
{
1029+
batchBuilder.DisposedEventHandlerIds.Append(frame.AttributeEventHandlerIdField);
1030+
}
1031+
else if (frame.AttributeValueField is bool boolValue && boolValue && frame.AttributeNameField.StartsWith("__internal_", StringComparison.Ordinal))
1032+
{
1033+
batchBuilder.EditsBuffer.Append(RenderTreeEdit.RemoveAttribute(siblingIndex, frame.AttributeNameField));
1034+
}
10281035
}
10291036
else if (frame.FrameTypeField == RenderTreeFrameType.NamedEvent)
10301037
{
Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,49 @@
11
@page "/counter"
22
@rendermode InteractiveServer
3+
34
<PageTitle>Counter</PageTitle>
45

56
<h1>Counter</h1>
67

78
<p role="status">Current count: @currentCount</p>
9+
<p>showElements: @showElements</p>
10+
<p>preventDefault: @preventDefault</p>
11+
12+
@if (showElements)
13+
{
14+
<button class="btn btn-primary" @onclick="IncrementCount" @onmousedown:preventDefault="preventDefault">
15+
Click me
16+
</button>
17+
}
818

9-
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
19+
<p>
20+
<button class="btn btn-secondary" @onclick="ToggleShow">
21+
Toggle show
22+
</button>
23+
<button class="btn btn-secondary" @onclick="TogglePreventDefault">
24+
Toggle preventDefault
25+
</button>
26+
</p>
1027

1128
@code {
1229
private int currentCount = 0;
30+
private bool showElements = true;
31+
private bool preventDefault = true;
1332

1433
private void IncrementCount()
1534
{
1635
currentCount++;
1736
}
37+
38+
void ToggleShow()
39+
{
40+
showElements = !showElements;
41+
StateHasChanged();
42+
}
43+
44+
void TogglePreventDefault()
45+
{
46+
preventDefault = !preventDefault;
47+
StateHasChanged();
48+
}
1849
}

src/Components/Web.JS/src/Rendering/Events/EventDelegator.ts

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,11 @@ export class EventDelegator {
121121
for (const handlerInfo of infosForElement.enumerateHandlers()) {
122122
this.eventInfoStore.remove(handlerInfo.eventHandlerId);
123123
}
124+
125+
for (const eventName of infosForElement.enumeratedEventNamesForEnabledFlags()) {
126+
this.eventInfoStore.decrementCountByEventName(eventName);
127+
}
128+
124129
delete element[this.eventsCollectionKey];
125130
}
126131
}
@@ -135,12 +140,26 @@ export class EventDelegator {
135140

136141
public setStopPropagation(element: Element, eventName: string, value: boolean): void {
137142
const infoForElement = this.getEventHandlerInfosForElement(element, true)!;
143+
const currentValue = infoForElement.stopPropagation(eventName);
138144
infoForElement.stopPropagation(eventName, value);
145+
146+
if (!currentValue && value) {
147+
this.eventInfoStore.addGlobalListener(eventName);
148+
} else if (currentValue && !value) {
149+
this.eventInfoStore.decrementCountByEventName(eventName);
150+
}
139151
}
140152

141153
public setPreventDefault(element: Element, eventName: string, value: boolean): void {
142154
const infoForElement = this.getEventHandlerInfosForElement(element, true)!;
155+
const currentValue = infoForElement.preventDefault(eventName);
143156
infoForElement.preventDefault(eventName, value);
157+
158+
if (!currentValue && value) {
159+
this.eventInfoStore.addGlobalListener(eventName);
160+
} else if (currentValue && !value) {
161+
this.eventInfoStore.decrementCountByEventName(eventName);
162+
}
144163
}
145164

146165
private onGlobalEvent(evt: Event) {
@@ -298,16 +317,19 @@ class EventInfoStore {
298317

299318
// If this event name is an alias, update the global listener for the corresponding browser event
300319
const eventName = getBrowserEventName(info.eventName);
301-
302-
if (--this.countByEventName[eventName] === 0) {
303-
delete this.countByEventName[eventName];
304-
document.removeEventListener(eventName, this.globalListener);
305-
}
320+
this.decrementCountByEventName(eventName);
306321
}
307322

308323
return info;
309324
}
310325

326+
public decrementCountByEventName(eventName: string) {
327+
if (--this.countByEventName[eventName] === 0) {
328+
delete this.countByEventName[eventName];
329+
document.removeEventListener(eventName, this.globalListener);
330+
}
331+
}
332+
311333
private handleEventNameAliasAdded(aliasEventName, browserEventName) {
312334
// If an event name alias gets registered later, we need to update the global listener
313335
// registrations to match. This makes it equivalent to the alias having been registered
@@ -338,14 +360,28 @@ class EventHandlerInfosForElement {
338360

339361
private stopPropagationFlags: { [eventName: string]: boolean } | null = null;
340362

341-
public *enumerateHandlers() : IterableIterator<EventHandlerInfo> {
363+
public *enumerateHandlers(): IterableIterator<EventHandlerInfo> {
342364
for (const eventName in this.handlers) {
343365
if (Object.prototype.hasOwnProperty.call(this.handlers, eventName)) {
344366
yield this.handlers[eventName];
345367
}
346368
}
347369
}
348370

371+
public *enumeratedEventNamesForEnabledFlags(): IterableIterator<string> {
372+
for (const eventName in this.preventDefaultFlags) {
373+
if (this.preventDefaultFlags[eventName] === true) {
374+
yield eventName;
375+
}
376+
}
377+
378+
for (const eventName in this.stopPropagationFlags) {
379+
if (this.stopPropagationFlags[eventName] === true) {
380+
yield eventName;
381+
}
382+
}
383+
}
384+
349385
public getHandler(eventName: string): EventHandlerInfo | null {
350386
return Object.prototype.hasOwnProperty.call(this.handlers, eventName) ? this.handlers[eventName] : null;
351387
}

0 commit comments

Comments
 (0)