Skip to content

Commit 43ad819

Browse files
authored
Merge branch 'main' into add-navigator-clipboard-clipboarditem
2 parents 6ff62ff + 7dd3743 commit 43ad819

File tree

8 files changed

+141
-26
lines changed

8 files changed

+141
-26
lines changed
File renamed without changes.

docs/index.html

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -486,14 +486,14 @@ <h1>GitHub Feature Support Table</h1>
486486
</tr>
487487
<tr>
488488
<th>
489-
<a href="https://chromestatus.com/feature/5768400507764736">
489+
<a href="https://developer.mozilla.org/docs/Web/API/AbortSignal/timeout">
490490
<code>AbortSignal.timeout</code>
491491
</a>
492492
</th>
493493
<td data-polyfill="abortSignalTimeout"><div>*</div></td>
494494
<td data-supported="false"><div>*</div></td>
495495
<td data-supported="false"><div>*</div></td>
496-
<td data-supported="false"><div>*</div></td>
496+
<td data-supported="true"><div>100+</div></td>
497497
<td data-supported="false"><div>*</div></td>
498498
<td data-supported="false"><div>*</div></td>
499499
<td data-supported="false"><div>*</div></td>
@@ -596,6 +596,20 @@ <h1>GitHub Feature Support Table</h1>
596596
<td data-supported="true"><div>63+ †</div></td>
597597
<td data-supported="true"><div>12.0+ †</div></td>
598598
</tr>
599+
<tr>
600+
<th>
601+
<a href="https://developer.mozilla.org/docs/Web/API/HTMLFormElement/requestSubmit">
602+
<code>HTMLFormElement.requestSubmit</code>
603+
</a>
604+
</th>
605+
<td data-polyfill="formRequestSubmit"><div>*</div></td>
606+
<td data-supported="true"><div>76+</div></td>
607+
<td data-supported="true"><div>79+</div></td>
608+
<td data-supported="true"><div>75+</div></td>
609+
<td data-supported="false"<div>*</div></td>
610+
<td data-supported="true"><div>63+</div></td>
611+
<td data-supported="true"><div>12.0+</div></td>
612+
</tr>
599613
<tr>
600614
<th>
601615
<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn">
@@ -737,14 +751,13 @@ <h1>GitHub Feature Support Table</h1>
737751
<td data-supported="true"><div>53+</div></td>
738752
<td data-supported="true"><div>9.0+</div></td>
739753
</tr>
740-
<tr data-transpiled><th></th><th colspan="7"><h3>Transpiled Native Syntax</h3></th></tr>
741754
<tr>
742755
<th>
743756
<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining">
744757
<code>Optional Chaining Operator (?.)</code>
745758
</a>
746759
</th>
747-
<td data-code="window?.foo?.bar?.baz || true"><div>**</div></td>
760+
<td data-code="window?.foo?.bar?.baz || true"><div>!</div></td>
748761
<td data-supported="true"><div>80+</div></td>
749762
<td data-supported="true"><div>80+</div></td>
750763
<td data-supported="true"><div>74+</div></td>
@@ -758,14 +771,15 @@ <h1>GitHub Feature Support Table</h1>
758771
<code>Nullish Coalescing Operator (??)</code>
759772
</a>
760773
</th>
761-
<td data-code="window.foo ?? true"><div>**</div></td>
774+
<td data-code="window.foo ?? true"><div>!</div></td>
762775
<td data-supported="true"><div>80+</div></td>
763776
<td data-supported="true"><div>80+</div></td>
764777
<td data-supported="true"><div>72+</div></td>
765778
<td data-supported="true"><div>13.1+</div></td>
766779
<td data-supported="true"><div>67+</div></td>
767780
<td data-supported="true"><div>13.0+</div></td>
768781
</tr>
782+
<tr data-transpiled><th></th><th colspan="7"><h3>Transpiled Native Syntax</h3></th></tr>
769783
<tr>
770784
<th>
771785
<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_nullish_assignment">
@@ -886,6 +900,7 @@ <h1>GitHub Feature Support Table</h1>
886900
}
887901
Promise.resolve(supported).then((value) => {
888902
el.setAttribute('data-supported', Boolean(value))
903+
if (value) el.querySelector('div').textContent = ''
889904
})
890905
}
891906
for(const el of document.querySelectorAll('[data-polyfill]')) {

package-lock.json

Lines changed: 9 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@github/browser-support",
3-
"version": "1.1.2",
3+
"version": "1.2.2",
44
"description": "Polyfills and Capable Browser detection",
55
"homepage": "https://github.github.io/browser-support",
66
"bugs": {
@@ -47,6 +47,6 @@
4747
"karma-mocha-reporter": "^2.2.5",
4848
"mocha": "^9.2.0",
4949
"tslib": "^2.1.0",
50-
"typescript": "^4.2.2"
50+
"typescript": "^4.7.4"
5151
}
5252
}

src/aggregateerror.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export class AggregateError extends Error {
22
declare errors: unknown[]
3-
declare cause: unknown
3+
declare cause: Error | undefined
44

55
constructor(errors: unknown[], message: string, options: {cause?: unknown} = {}) {
66
super(message)

src/form-requestsubmit.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
export function requestSubmit(
2+
this: HTMLFormElement,
3+
submitter: HTMLButtonElement | HTMLInputElement | null = null
4+
): void {
5+
const event = new SubmitEvent('submit', {bubbles: true, cancelable: true, submitter})
6+
let input
7+
if (submitter && submitter.name) {
8+
input = Object.assign(document.createElement('input'), {
9+
type: 'hidden',
10+
hidden: true,
11+
name: submitter.name,
12+
value: submitter.value
13+
})
14+
this.append(input)
15+
}
16+
this.checkValidity() && !this.dispatchEvent(event) && this.submit()
17+
input?.remove()
18+
}
19+
20+
export function isSupported(): boolean {
21+
return 'requestSubmit' in HTMLFormElement.prototype && typeof HTMLFormElement.prototype.requestSubmit === 'function'
22+
}
23+
24+
export function isPolyfilled(): boolean {
25+
return HTMLFormElement.prototype.requestSubmit === requestSubmit
26+
}
27+
28+
export function apply(): void {
29+
if (!isSupported()) {
30+
HTMLFormElement.prototype.requestSubmit = requestSubmit
31+
}
32+
}

src/index.ts

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import * as cryptoRandomUUID from './crypto-randomuuid.js'
77
import * as elementReplaceChildren from './element-replacechildren.js'
88
import * as eventAbortSignal from './event-abortsignal.js'
99
import * as navigatorClipboard from './navigator-clipboard.js'
10+
import * as formRequestSubmit from './form-requestsubmit.js'
1011
import * as objectHasOwn from './object-hasown.js'
1112
import * as promiseAllSettled from './promise-allsettled.js'
1213
import * as promiseAny from './promise-any.js'
@@ -64,6 +65,7 @@ export const polyfills = {
6465
elementReplaceChildren,
6566
eventAbortSignal,
6667
navigatorClipboard,
68+
formRequestSubmit,
6769
objectHasOwn,
6870
promiseAllSettled,
6971
promiseAny,
@@ -72,18 +74,11 @@ export const polyfills = {
7274
}
7375

7476
export function isSupported() {
75-
return (
76-
baseSupport &&
77-
Object.values(polyfills).every(polyfill => {
78-
polyfill.isSupported()
79-
})
80-
)
77+
return baseSupport && Object.values(polyfills).every(polyfill => polyfill.isSupported())
8178
}
8279

8380
export function isPolyfilled() {
84-
return Object.values(polyfills).every(polyfill => {
85-
polyfill.isPolyfilled()
86-
})
81+
return Object.values(polyfills).every(polyfill => polyfill.isPolyfilled())
8782
}
8883

8984
export function apply() {

test/form-requestsubmit.js

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import {requestSubmit, apply, isPolyfilled, isSupported} from '../lib/form-requestsubmit.js'
2+
3+
describe('requestSubmit', () => {
4+
let form
5+
beforeEach(() => {
6+
form = document.createElement('form')
7+
document.body.append(form)
8+
})
9+
afterEach(() => {
10+
form.remove()
11+
})
12+
13+
it('has standard isSupported, isPolyfilled, apply API', () => {
14+
expect(isSupported).to.be.a('function')
15+
expect(isPolyfilled).to.be.a('function')
16+
expect(apply).to.be.a('function')
17+
expect(isSupported()).to.be.a('boolean')
18+
expect(isPolyfilled()).to.equal(false)
19+
})
20+
21+
it('does not dispatch or submit for invalid forms', () => {
22+
const input = document.createElement('input')
23+
input.required = true
24+
form.append(input)
25+
let called = false
26+
form.addEventListener('submit', () => {
27+
called = true
28+
})
29+
requestSubmit.call(form)
30+
expect(called).to.equal(false)
31+
})
32+
33+
it('dispatches submit event', () => {
34+
const input = document.createElement('input')
35+
form.append(input)
36+
let called = false
37+
form.addEventListener('submit', event => {
38+
called = true
39+
event.stopPropagation()
40+
})
41+
requestSubmit.call(form)
42+
expect(called).to.equal(true)
43+
})
44+
45+
it('passes submitter in event', () => {
46+
const input = document.createElement('input')
47+
input.type = 'button'
48+
form.append(input)
49+
let submitter = null
50+
form.addEventListener('submit', event => {
51+
submitter = event.submitter
52+
event.stopPropagation()
53+
})
54+
requestSubmit.call(form, input)
55+
expect(submitter).to.equal(input)
56+
})
57+
58+
it('includes the input value in FormData', () => {
59+
const input = document.createElement('input')
60+
input.type = 'button'
61+
input.name = 'foo'
62+
input.value = '1'
63+
form.append(input)
64+
let formdata = null
65+
form.addEventListener('submit', event => {
66+
formdata = new FormData(form)
67+
event.stopPropagation()
68+
})
69+
requestSubmit.call(form, input)
70+
expect(formdata.get('foo')).to.equal('1')
71+
expect(Array.from(form.querySelectorAll('input')).length).to.equal(1)
72+
})
73+
})

0 commit comments

Comments
 (0)