Skip to content

Commit 9ac948e

Browse files
fix: polyfill accepts non-string values like Chrome
1 parent 50a8fef commit 9ac948e

File tree

5 files changed

+40
-9
lines changed

5 files changed

+40
-9
lines changed

Diff for: src/element-internals.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -135,12 +135,12 @@ export class ElementInternals implements IElementInternals {
135135
return undefined;
136136
}
137137
removeHiddenInputs(this);
138-
if (typeof value === 'string') {
138+
if (value && !(value instanceof FormData)) {
139139
if (ref.getAttribute('name')) {
140140
const hiddenInput = createHiddenInput(ref, this);
141141
hiddenInput.value = value;
142142
}
143-
} else if (value != null) {
143+
} else if (value && value instanceof FormData) {
144144
value.forEach((formDataValue, formDataKey) => {
145145
if (typeof formDataValue === 'string') {
146146
const hiddenInput = createHiddenInput(ref, this);

Diff for: static/index.html

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
<label for="some-input">Some input</label>
1616
<input id="some-input" type="text" name="some-input" required minlength="3">
1717

18+
<x-array name="selected"></x-array>
19+
<x-address></x-address>
1820
<div class="buttons">
1921
<button type="reset">Reset</button>
2022
<button type="submit">Submit</button>

Diff for: static/scripts/page.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
import 'https://cdn.skypack.dev/construct-style-sheets-polyfill';
2+
import './x-array.js';
3+
import './address.js';
4+
15
const form = document.getElementById('form');
26

37
form.addEventListener('submit', event => {
4-
console.log(event);
5-
// event.preventDefault();
8+
event.preventDefault();
69

710
const formData = new FormData(event.target);
811
const formValue = {};

Diff for: static/scripts/x-array.js

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class XArray extends HTMLElement {
2+
static get formAssociated() {
3+
return true;
4+
}
5+
6+
internals = this.attachInternals();
7+
8+
connectedCallback() {
9+
console.log(this.internals);
10+
this.internals.setFormValue({a:1,b:2});
11+
12+
console.log(this.getAttribute('name'),
13+
new FormData(this.internals.form)
14+
.get(this.getAttribute('name'))
15+
)
16+
}
17+
}
18+
19+
customElements.define('x-array', XArray);

Diff for: test/ElementInternals.test.js

+12-5
Original file line numberDiff line numberDiff line change
@@ -292,21 +292,21 @@ describe('The ElementInternals polyfill', () => {
292292

293293
it('will call formAssociatedCallback after internals have been set', () => {
294294
expect(internalsAvailableInFormAssociatedCallback).to.be.true;
295-
})
295+
});
296296

297297
it('will not include null values set via setFormValue', () => {
298298
internals.setFormValue('test');
299299
internals.setFormValue(null);
300300
const output = new FormData(form);
301301
expect(Array.from(output.keys()).length).to.equal(0);
302-
})
302+
});
303303

304304
it('will not include undefined values set via setFormValue', () => {
305305
internals.setFormValue('test');
306306
internals.setFormValue(undefined);
307307
const output = new FormData(form);
308308
expect(Array.from(output.keys()).length).to.equal(0);
309-
})
309+
});
310310

311311
it('will include multiple form values passed via FormData to setFormValue', () => {
312312
let input;
@@ -326,13 +326,13 @@ describe('The ElementInternals polyfill', () => {
326326
output = new FormData(form);
327327
expect(Array.from(output.keys()).length).to.equal(1);
328328
expect(output.get('override')).to.equal('3');
329-
})
329+
});
330330

331331
it('will not include form values from elements without a name', () => {
332332
noname.internals.setFormValue('noop');
333333
const output = new FormData(form);
334334
expect(Array.from(output.keys()).length).to.equal(0);
335-
})
335+
});
336336

337337
it('will include form values from elements without a name if set with FormData', () => {
338338
const formData = new FormData();
@@ -354,6 +354,13 @@ describe('The ElementInternals polyfill', () => {
354354
internals.reportValidity();
355355
expect(document.activeElement).to.equal(el);
356356
});
357+
358+
if('will accept non strings', async () => {
359+
internals.setFormValue(['a', 'b']);
360+
expect(
361+
new FormData(internals.form).get('foo')
362+
).to.equal('a,b');
363+
});
357364
});
358365

359366
describe('closed shadow root element', () => {

0 commit comments

Comments
 (0)