Skip to content

Commit 31375b2

Browse files
Loredana SpataruLoredana Spataru
authored andcommitted
fix(number-field): mitigate safari memory leak in number-field
1 parent bc0e901 commit 31375b2

File tree

1 file changed

+38
-1
lines changed

1 file changed

+38
-1
lines changed

packages/number-field/src/NumberField.ts

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ export class NumberField extends TextfieldBase {
101101
@query('.buttons')
102102
private buttons!: HTMLDivElement;
103103

104+
@query('#form')
105+
public form!: HTMLFormElement;
106+
104107
@property({ type: Boolean, reflect: true })
105108
public override focused = false;
106109

@@ -476,6 +479,16 @@ export class NumberField extends TextfieldBase {
476479
this.inputElement.setSelectionRange(nextSelectStart, nextSelectStart);
477480
}
478481

482+
private handleSubmit(event: Event): void {
483+
event.preventDefault();
484+
this.dispatchEvent(
485+
new Event('submit', {
486+
cancelable: true,
487+
bubbles: true,
488+
})
489+
);
490+
}
491+
479492
private valueWithLimits(nextValue: number): number {
480493
let value = nextValue;
481494
if (typeof this.min !== 'undefined') {
@@ -606,7 +619,7 @@ export class NumberField extends TextfieldBase {
606619
protected override renderField(): TemplateResult {
607620
this.autocomplete = 'off';
608621
return html`
609-
${super.renderField()}
622+
<form id="form">${super.renderField()}</form>
610623
${this.hideStepper
611624
? nothing
612625
: html`
@@ -704,7 +717,31 @@ export class NumberField extends TextfieldBase {
704717
this.addEventListener('compositionend', this.handleCompositionEnd);
705718
}
706719

720+
public override connectedCallback(): void {
721+
super.connectedCallback();
722+
this._firstUpdateAfterConnected = true;
723+
this.requestUpdate();
724+
}
725+
726+
public override disconnectedCallback(): void {
727+
// Cleanup form event listener and remove form element from DOM
728+
this.form.removeEventListener('submit', this.handleSubmit.bind(this));
729+
this.form.remove();
730+
super.disconnectedCallback();
731+
}
732+
733+
protected override firstUpdateAfterConnected(): void {
734+
super.firstUpdateAfterConnected();
735+
this.form.addEventListener('submit', this.handleSubmit.bind(this));
736+
}
737+
707738
protected override updated(changes: PropertyValues<this>): void {
739+
super.updated(changes);
740+
if (this._firstUpdateAfterConnected) {
741+
this._firstUpdateAfterConnected = false;
742+
this.firstUpdateAfterConnected();
743+
}
744+
708745
if (changes.has('min') || changes.has('formatOptions')) {
709746
let inputMode = 'numeric';
710747
const hasNegative = typeof this.min !== 'undefined' && this.min < 0;

0 commit comments

Comments
 (0)