fugu-api-data 1.9.0 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/package.json +3 -3
  2. package/patterns.js +449 -482
  3. package/patterns.mjs +449 -482
package/patterns.mjs CHANGED
@@ -1,41 +1,19 @@
1
1
  export default {
2
- 'Service Worker': {
3
- regEx: /navigator\.serviceWorker\.register\s*\(/g,
4
- where: 'JavaScript',
5
- supported: (async () => 'serviceWorker' in navigator)(),
6
- featureDetection: `(async () => 'serviceWorker' in navigator)()`,
7
- documentation:
8
- 'https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API',
9
- blinkFeatureID: 990,
10
- },
11
- 'Cache Storage': {
12
- regEx: /caches\.open\s*\(/g,
13
- where: 'JavaScript',
14
- supported: (async () => 'serviceWorker' in navigator && 'caches' in self)(),
15
- featureDetection: `(async () => 'serviceWorker' in navigator && 'caches' in self)()`,
16
- documentation:
17
- 'https://developer.mozilla.org/en-US/docs/Web/API/CacheStorage',
18
- blinkFeatureID: 3022,
19
- },
20
- 'Push': {
21
- regEx: /\.pushManager\.subscribe\s*\(/g,
2
+ 'Absolute Orientation Sensor': {
3
+ regEx: /new\s+AbsoluteOrientationSensor\s*\(/g,
22
4
  where: 'JavaScript',
23
- supported: (async () =>
24
- 'serviceWorker' in navigator &&
25
- 'pushManager' in
26
- ((await navigator.serviceWorker?.ready) || self.registration))(),
27
- featureDetection: `(async () => 'serviceWorker' in navigator && 'pushManager' in (await navigator.serviceWorker?.ready || self.registration))()`,
28
- documentation: 'https://developer.mozilla.org/en-US/docs/Web/API/Push_API',
29
- blinkFeatureID: 769,
5
+ supported: (async () => 'AbsoluteOrientationSensor' in self)(),
6
+ featureDetection: `(async () => 'AbsoluteOrientationSensor' in self)()`,
7
+ documentation: 'https://web.dev/generic-sensor/',
8
+ blinkFeatureID: 1900,
30
9
  },
31
- 'HapticsDevice': {
32
- regEx: /\.haptics\.play\s*\(/g,
10
+ 'Accelerometer': {
11
+ regEx: /new\s+Accelerometer\s*\(/g,
33
12
  where: 'JavaScript',
34
- supported: (async () => 'HapticsDevice' in self)(),
35
- featureDetection: `(async () => 'HapticsDevice' in self)()`,
36
- documentation:
37
- 'https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/main/HapticsDevice/explainer.md',
38
- blinkFeatureID: undefined,
13
+ supported: (async () => 'Accelerometer' in self)(),
14
+ featureDetection: `(async () => 'Accelerometer' in self)()`,
15
+ documentation: 'https://web.dev/generic-sensor/',
16
+ blinkFeatureID: 1899,
39
17
  },
40
18
  'Add to Home Screen': {
41
19
  regEx: /["']beforeinstallprompt["']|\.onbeforeinstallprompt/g,
@@ -46,17 +24,31 @@ export default {
46
24
  'https://developer.mozilla.org/en-US/docs/Web/API/BeforeInstallPromptEvent',
47
25
  blinkFeatureID: 1436,
48
26
  },
49
- 'Background Sync': {
50
- regEx: /\.sync\.register\s*\(["']/g,
27
+ 'Ambient Light Sensor': {
28
+ regEx: /new\s+AmbientLightSensor\s*\(\)/g,
29
+ where: 'JavaScript',
30
+ supported: (async () => 'AmbientLightSensor' in self)(),
31
+ featureDetection: `(async () => 'AmbientLightSensor' in self)()`,
32
+ documentation: 'https://web.dev/generic-sensor/',
33
+ blinkFeatureID: 1901,
34
+ },
35
+ 'Async Clipboard': {
36
+ regEx: /navigator\.clipboard\.writeText\s*\(/g,
51
37
  where: 'JavaScript',
52
38
  supported: (async () =>
53
- 'serviceWorker' in navigator &&
54
- 'sync' in
55
- ((await navigator.serviceWorker?.ready) || self.registration))(),
56
- featureDetection: `(async () => 'serviceWorker' in navigator && 'sync' in (await navigator.serviceWorker?.ready || self.registration))()`,
57
- documentation:
58
- 'https://developer.mozilla.org/en-US/docs/Web/API/Background_Synchronization_API',
59
- blinkFeatureID: 745,
39
+ 'clipboard' in navigator && 'writeText' in navigator.clipboard)(),
40
+ featureDetection: `(async () => 'clipboard' in navigator && 'writeText' in navigator.clipboard)()`,
41
+ documentation: 'https://web.dev/async-clipboard/',
42
+ blinkFeatureID: 2372,
43
+ },
44
+ 'Async Clipboard (Images)': {
45
+ regEx: /navigator\.clipboard\.write\s*\(/g,
46
+ where: 'JavaScript',
47
+ supported: (async () =>
48
+ 'clipboard' in navigator && 'write' in navigator.clipboard)(),
49
+ featureDetection: `(async () => 'clipboard' in navigator && 'write' in navigator.clipboard)()`,
50
+ documentation: 'https://web.dev/async-clipboard/',
51
+ blinkFeatureID: 2370,
60
52
  },
61
53
  'Background Fetch': {
62
54
  regEx: /\.backgroundFetch\.fetch\s*\(["']/g,
@@ -67,56 +59,78 @@ export default {
67
59
  'https://developer.mozilla.org/en-US/docs/Web/API/Background_Fetch_API',
68
60
  blinkFeatureID: 2549,
69
61
  },
70
- 'Navigation Preload': {
71
- regEx: /\.navigationPreload\.enable\s*\(\)/g,
62
+ 'Background Sync': {
63
+ regEx: /\.sync\.register\s*\(["']/g,
72
64
  where: 'JavaScript',
73
65
  supported: (async () =>
74
66
  'serviceWorker' in navigator &&
75
- 'navigationPreload' in
67
+ 'sync' in
76
68
  ((await navigator.serviceWorker?.ready) || self.registration))(),
77
- featureDetection: `(async () => 'serviceWorker' in navigator && 'navigationPreload' in (await navigator.serviceWorker?.ready || self.registration))()`,
69
+ featureDetection: `(async () => 'serviceWorker' in navigator && 'sync' in (await navigator.serviceWorker?.ready || self.registration))()`,
78
70
  documentation:
79
- 'https://developer.mozilla.org/en-US/docs/Web/API/NavigationPreloadManager',
80
- blinkFeatureID: 1803,
71
+ 'https://developer.mozilla.org/en-US/docs/Web/API/Background_Synchronization_API',
72
+ blinkFeatureID: 745,
81
73
  },
82
- 'Storage Estimation': {
83
- regEx: /navigator\.storage\.estimate\s*\(\)/g,
74
+ 'Badging': {
75
+ regEx: /navigator\.setAppBadge\s*\(/g,
84
76
  where: 'JavaScript',
85
- supported: (async () =>
86
- 'storage' in navigator && 'estimate' in navigator.storage)(),
87
- featureDetection: `(async () => 'storage' in navigator && 'estimate' in navigator.storage)()`,
88
- documentation:
89
- 'https://developer.mozilla.org/en-US/docs/Web/API/StorageManager/estimate',
90
- blinkFeatureID: 1371,
77
+ supported: (async () => 'setAppBadge' in navigator)(),
78
+ featureDetection: `(async () => 'setAppBadge' in navigator)()`,
79
+ documentation: 'https://web.dev/badging-api/',
80
+ blinkFeatureID: 2726,
91
81
  },
92
- 'Persistent Storage': {
93
- regEx: /navigator\.storage\.persist\s*\(\)/g,
82
+ 'Cache Storage': {
83
+ regEx: /caches\.open\s*\(/g,
94
84
  where: 'JavaScript',
95
- supported: (async () =>
96
- 'storage' in navigator && 'persist' in navigator.storage)(),
97
- featureDetection: `(async () => 'storage' in navigator && 'persist' in navigator.storage)()`,
85
+ supported: (async () => 'serviceWorker' in navigator && 'caches' in self)(),
86
+ featureDetection: `(async () => 'serviceWorker' in navigator && 'caches' in self)()`,
98
87
  documentation:
99
- 'https://developer.mozilla.org/en-US/docs/Web/API/StorageManager/persist',
100
- blinkFeatureID: 1369,
88
+ 'https://developer.mozilla.org/en-US/docs/Web/API/CacheStorage',
89
+ blinkFeatureID: 3022,
101
90
  },
102
- 'Media Session': {
103
- regEx:
104
- /navigator\.mediaSession\.setActionHandler|navigator\.mediaSession\.metadata/g,
91
+ 'Compression Streams': {
92
+ regEx: /new\s+CompressionStream\s*\(/g,
105
93
  where: 'JavaScript',
106
- supported: (async () => 'mediaSession' in navigator)(),
107
- featureDetection: `(async () => 'mediaSession' in navigator)()`,
108
- documentation:
109
- 'https://developer.mozilla.org/en-US/docs/Web/API/Media_Session_API',
110
- blinkFeatureID: 1792,
94
+ supported: (async () => 'CompressionStream' in self)(),
95
+ featureDetection: `(async () => 'CompressionStream' in self)()`,
96
+ documentation: 'https://wicg.github.io/compression/',
97
+ blinkFeatureID: 3060,
111
98
  },
112
- 'Media Capabilities': {
113
- regEx: /navigator\.mediaCapabilities\.decodingInfo\s*\(/g,
99
+ 'Compute Pressure': {
100
+ regEx: /new\s+ComputePressureObserver\s*\(/g,
114
101
  where: 'JavaScript',
115
- supported: (async () => 'mediaCapabilities' in navigator)(),
116
- featureDetection: `(async () => 'mediaCapabilities' in navigator)()`,
102
+ supported: (async () => 'ComputePressureObserver' in self)(),
103
+ featureDetection: `(async () => 'ComputePressureObserver' in self)()`,
104
+ documentation: 'https://web.dev/compute-pressure/',
105
+ blinkFeatureID: 3899,
106
+ },
107
+ 'Contact Picker': {
108
+ regEx: /navigator\.contacts\.select\s*\(/g,
109
+ where: 'JavaScript',
110
+ supported: (async () => 'contacts' in navigator)(),
111
+ featureDetection: `(async () => 'contacts' in navigator)()`,
112
+ documentation: 'https://web.dev/contact-picker/',
113
+ blinkFeatureID: 2993,
114
+ },
115
+ 'Content Index': {
116
+ regEx: /index\.getAll\s*\(/g,
117
+ where: 'JavaScript',
118
+ supported: (async () =>
119
+ 'serviceWorker' in navigator &&
120
+ 'index' in
121
+ ((await navigator.serviceWorker?.ready) || self.registration))(),
122
+ featureDetection: `(async () => 'serviceWorker' in navigator && 'index' in (await navigator.serviceWorker?.ready || self.registration))()`,
123
+ documentation: 'https://web.dev/content-indexing-api/',
124
+ blinkFeatureID: 2985,
125
+ },
126
+ 'Credential Management': {
127
+ regEx: /navigator\.credentials\.get\s*\(/g,
128
+ where: 'JavaScript',
129
+ supported: (async () => 'credentials' in navigator)(),
130
+ featureDetection: `(async () => 'credentials' in navigator)()`,
117
131
  documentation:
118
- 'https://developer.mozilla.org/en-US/docs/Web/API/Media_Capabilities_API',
119
- blinkFeatureID: 2239,
132
+ 'https://developers.google.com/web/updates/2016/04/credential-management-api',
133
+ blinkFeatureID: 960,
120
134
  },
121
135
  'Device Memory': {
122
136
  regEx: /navigator\.deviceMemory/g,
@@ -127,89 +141,57 @@ export default {
127
141
  'https://developer.mozilla.org/en-US/docs/Web/API/Device_Memory_API',
128
142
  blinkFeatureID: 2121,
129
143
  },
130
- 'Payment Request': {
131
- regEx: /new\s+PaymentRequest\s*\(/g,
144
+ 'Device Posture': {
145
+ regEx: /navigator\.devicePosture/g,
132
146
  where: 'JavaScript',
133
- supported: (async () => 'PaymentRequest' in self)(),
134
- featureDetection: `(async () => 'PaymentRequest' in self)()`,
147
+ supported: (async () => 'devicePosture' in navigator)(),
148
+ featureDetection: `(async () => 'devicePosture' in navigator)()`,
135
149
  documentation:
136
- 'https://developer.mozilla.org/en-US/docs/Web/API/Payment_Request_API',
137
- blinkFeatureID: 2894,
138
- },
139
- 'Payment Handler': {
140
- regEx: /\.paymentManager\.instruments\.set\s*\(/g,
141
- where: 'JavaScript',
142
- supported: (async () => 'PaymentInstruments' in self)(),
143
- featureDetection: `(async () => 'PaymentInstruments' in self)()`,
144
- documentation: 'https://web.dev/registering-a-web-based-payment-app/',
145
- blinkFeatureID: 2397,
150
+ 'https://github.com/w3c/device-posture/blob/gh-pages/README.md',
151
+ blinkFeatureID: undefined,
146
152
  },
147
- 'WebMIDI': {
148
- regEx: /navigator\.requestMIDIAccess\s*\(/g,
153
+ 'Digital Goods': {
154
+ regEx: /getDigitalGoodsService\s*\(/g,
149
155
  where: 'JavaScript',
150
- supported: (async () => 'requestMIDIAccess' in navigator)(),
151
- featureDetection: `(async () => 'requestMIDIAccess' in navigator)()`,
156
+ supported: (async () => 'getDigitalGoodsService' in self)(),
157
+ featureDetection: `(async () => 'getDigitalGoodsService' in self)()`,
152
158
  documentation:
153
- 'https://developer.mozilla.org/en-US/docs/Web/API/Web_MIDI_API',
154
- blinkFeatureID: 2029,
159
+ 'https://developer.chrome.com/docs/android/trusted-web-activity/receive-payments-play-billing/',
160
+ blinkFeatureID: 3397,
155
161
  },
156
- 'WebBluetooth': {
157
- regEx: /navigator\.bluetooth\.requestDevice\s*\(/g,
162
+ 'EyeDropper': {
163
+ regEx: /new\s+EyeDropper\s*\(\)/g,
158
164
  where: 'JavaScript',
159
- supported: (async () => 'bluetooth' in navigator)(),
160
- featureDetection: `(async () => 'bluetooth' in navigator)()`,
161
- documentation: 'https://web.dev/bluetooth/',
162
- blinkFeatureID: 1670,
165
+ supported: (async () => 'EyeDropper' in self)(),
166
+ featureDetection: `(async () => 'EyeDropper' in self)()`,
167
+ documentation: 'https://github.com/WICG/eyedropper-api/blob/main/README.md',
168
+ blinkFeatureID: undefined,
163
169
  },
164
- 'WebUSB': {
165
- regEx: /navigator\.usb\.requestDevice\s*\(/g,
166
- where: 'JavaScript',
167
- supported: (async () => 'usb' in navigator)(),
168
- featureDetection: `(async () => 'usb' in navigator)()`,
169
- documentation: 'https://web.dev/usb/',
170
- blinkFeatureID: 1520,
170
+ 'File Handling': {
171
+ regEx: /"file_handlers"/g,
172
+ where: 'Web App Manifest',
173
+ supported: (async () =>
174
+ 'launchQueue' in self && 'files' in LaunchParams.prototype)(),
175
+ featureDetection: `(async () => 'launchQueue' in self && 'files' in LaunchParams.prototype)()`,
176
+ documentation: 'https://web.dev/file-handling/',
177
+ blinkFeatureID: 3875,
171
178
  },
172
- 'Web Share': {
173
- regEx: /navigator\.share\s*\(/g,
179
+ 'File System Access': {
180
+ regEx:
181
+ /showOpenFilePicker\s*\(|showSaveFilePicker\s*\(|showDirectoryPicker\s*\(/g,
174
182
  where: 'JavaScript',
175
- supported: (async () => 'share' in navigator)(),
176
- featureDetection: `(async () => 'share' in navigator)()`,
177
- documentation: 'https://web.dev/web-share/',
178
- blinkFeatureID: 1501,
183
+ supported: (async () => 'showOpenFilePicker' in self)(),
184
+ featureDetection: `(async () => 'showOpenFilePicker' in self)()`,
185
+ documentation: 'https://web.dev/file-system-access/',
186
+ blinkFeatureID: 3340,
179
187
  },
180
- 'Web Share (Files)': {
181
- regEx: /navigator\.canShare\s*\(/g,
188
+ 'Gamepad': {
189
+ regEx: /navigator\.getGamepads\s*\(/g,
182
190
  where: 'JavaScript',
183
- supported: (async () => 'canShare' in navigator)(),
184
- featureDetection: `(async () => 'canShare' in navigator)()`,
185
- documentation: 'https://web.dev/web-share/',
186
- blinkFeatureID: 2737,
187
- },
188
- 'Async Clipboard': {
189
- regEx: /navigator\.clipboard\.writeText\s*\(/g,
190
- where: 'JavaScript',
191
- supported: (async () =>
192
- 'clipboard' in navigator && 'writeText' in navigator.clipboard)(),
193
- featureDetection: `(async () => 'clipboard' in navigator && 'writeText' in navigator.clipboard)()`,
194
- documentation: 'https://web.dev/async-clipboard/',
195
- blinkFeatureID: 2372,
196
- },
197
- 'Async Clipboard (Images)': {
198
- regEx: /navigator\.clipboard\.write\s*\(/g,
199
- where: 'JavaScript',
200
- supported: (async () =>
201
- 'clipboard' in navigator && 'write' in navigator.clipboard)(),
202
- featureDetection: `(async () => 'clipboard' in navigator && 'write' in navigator.clipboard)()`,
203
- documentation: 'https://web.dev/async-clipboard/',
204
- blinkFeatureID: 2370,
205
- },
206
- 'Contact Picker': {
207
- regEx: /navigator\.contacts\.select\s*\(/g,
208
- where: 'JavaScript',
209
- supported: (async () => 'contacts' in navigator)(),
210
- featureDetection: `(async () => 'contacts' in navigator)()`,
211
- documentation: 'https://web.dev/contact-picker/',
212
- blinkFeatureID: 2993,
191
+ supported: (async () => 'getGamepads' in navigator)(),
192
+ featureDetection: `(async () => 'getGamepads' in navigator)()`,
193
+ documentation: 'https://web.dev/gamepad/',
194
+ blinkFeatureID: 1916,
213
195
  },
214
196
  'getInstalledRelatedApps': {
215
197
  regEx: /navigator\.getInstalledRelatedApps\s*\(/g,
@@ -219,98 +201,173 @@ export default {
219
201
  documentation: 'https://web.dev/get-installed-related-apps/',
220
202
  blinkFeatureID: 1870,
221
203
  },
222
- 'Compression Streams': {
223
- regEx: /new\s+CompressionStream\s*\(/g,
204
+ 'Gravity Sensor': {
205
+ regEx: /new\s+GravitySensor\s*\(/g,
224
206
  where: 'JavaScript',
225
- supported: (async () => 'CompressionStream' in self)(),
226
- featureDetection: `(async () => 'CompressionStream' in self)()`,
227
- documentation: 'https://wicg.github.io/compression/',
228
- blinkFeatureID: 3060,
207
+ supported: (async () => 'GravitySensor' in self)(),
208
+ featureDetection: `(async () => 'GravitySensor' in self)()`,
209
+ documentation: 'https://web.dev/generic-sensor/',
210
+ blinkFeatureID: 3795,
229
211
  },
230
- 'Periodic Background Sync': {
231
- regEx: /periodicSync\.register\s*\(/g,
212
+ 'Gyroscope': {
213
+ regEx: /new\s+Gyroscope\s*\(/g,
232
214
  where: 'JavaScript',
233
- supported: (async () => 'PeriodicSyncManager' in self)(),
234
- featureDetection: `(async () => 'PeriodicSyncManager' in self)()`,
235
- documentation: 'https://web.dev/periodic-background-sync/',
236
- blinkFeatureID: 2931,
215
+ supported: (async () => 'Gyroscope' in self)(),
216
+ featureDetection: `(async () => 'Gyroscope' in self)()`,
217
+ documentation: 'https://web.dev/generic-sensor/',
218
+ blinkFeatureID: 1906,
237
219
  },
238
- 'Badging': {
239
- regEx: /navigator\.setAppBadge\s*\(/g,
220
+ 'Handwriting Recognition': {
221
+ regEx: /navigator\.queryHandwritingRecognizerSupport\s*\(/g,
240
222
  where: 'JavaScript',
241
- supported: (async () => 'setAppBadge' in navigator)(),
242
- featureDetection: `(async () => 'setAppBadge' in navigator)()`,
243
- documentation: 'https://web.dev/badging-api/',
244
- blinkFeatureID: 2726,
223
+ supported: (async () => 'queryHandwritingRecognizerSupport' in navigator)(),
224
+ featureDetection: `(async () => 'queryHandwritingRecognizerSupport' in navigator)()`,
225
+ documentation: 'https://web.dev/handwriting-recognition/',
226
+ blinkFeatureID: 3893,
245
227
  },
246
- 'Shape Detection (Barcodes)': {
247
- regEx: /new\s+BarcodeDetector\s*\(/g,
228
+ 'HapticsDevice': {
229
+ regEx: /\.haptics\.play\s*\(/g,
248
230
  where: 'JavaScript',
249
- supported: (async () => 'BarcodeDetector' in self)(),
250
- featureDetection: `(async () => 'BarcodeDetector' in self)()`,
251
- documentation: 'https://web.dev/shape-detection/',
252
- blinkFeatureID: 3711,
231
+ supported: (async () => 'HapticsDevice' in self)(),
232
+ featureDetection: `(async () => 'HapticsDevice' in self)()`,
233
+ documentation:
234
+ 'https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/main/HapticsDevice/explainer.md',
235
+ blinkFeatureID: undefined,
253
236
  },
254
- 'Shape Detection (Faces)': {
255
- regEx: /new\s+FaceDetector\s*\(/g,
237
+ 'Idle Detection': {
238
+ regEx: /new\s+IdleDetector\s*\(/g,
256
239
  where: 'JavaScript',
257
- supported: (async () => 'FaceDetector' in self)(),
258
- featureDetection: `(async () => 'FaceDetector' in self)()`,
259
- documentation: 'https://web.dev/shape-detection/',
260
- blinkFeatureID: 3712,
240
+ supported: (async () => 'IdleDetector' in self)(),
241
+ featureDetection: `(async () => 'IdleDetector' in self)()`,
242
+ documentation: 'https://web.dev/idle-detection/',
243
+ blinkFeatureID: 2834,
261
244
  },
262
- 'Shape Detection (Texts)': {
263
- regEx: /new\s+TextDetector\s*\(/g,
245
+ 'Ink': {
246
+ regEx: /navigator\.ink\.requestPresenter\s*\(/g,
264
247
  where: 'JavaScript',
265
- supported: (async () => 'TextDetector' in self)(),
266
- featureDetection: `(async () => 'TextDetector' in self)()`,
267
- documentation: 'https://web.dev/shape-detection/',
268
- blinkFeatureID: 3713,
248
+ supported: (async () => 'ink' in navigator)(),
249
+ featureDetection: `(async () => 'ink' in navigator)()`,
250
+ documentation:
251
+ 'https://blogs.windows.com/msedgedev/2021/08/18/enhancing-inking-on-the-web/',
252
+ blinkFeatureID: undefined,
269
253
  },
270
- 'Screen Wake Lock': {
271
- regEx: /navigator\.wakeLock\.request\s*\(/g,
254
+ 'Insertable streams for MediaStreamTrack': {
255
+ regEx: /MediaStreamTrackProcessor\s*\(/g,
272
256
  where: 'JavaScript',
273
- supported: (async () => 'wakeLock' in navigator)(),
274
- featureDetection: `(async () => 'wakeLock' in navigator)()`,
275
- documentation: 'https://web.dev/wake-lock/',
276
- blinkFeatureID: 3005,
257
+ supported: (async () =>
258
+ 'MediaStreamTrackProcessor' in self &&
259
+ 'MediaStreamTrackGenerator' in self)(),
260
+ featureDetection: `(async () => 'MediaStreamTrackProcessor' in self && 'MediaStreamTrackGenerator' in self)()`,
261
+ documentation:
262
+ 'https://web.dev/mediastreamtrack-insertable-media-processing/',
263
+ blinkFeatureID: 3729,
277
264
  },
278
- 'Content Index': {
279
- regEx: /index\.getAll\s*\(/g,
265
+ 'Launch Handler': {
266
+ regEx: /"launch_handler"/g,
267
+ where: 'Web App Manifest',
268
+ supported: (async () =>
269
+ 'launchQueue' in self && 'targetURL' in LaunchParams.prototype)(),
270
+ featureDetection: `(async () => 'launchQueue' in self && 'targetURL' in LaunchParams.prototype)()`,
271
+ documentation: 'https://web.dev/launch-handler/',
272
+ blinkFeatureID: undefined,
273
+ },
274
+ 'Linear Acceleration Sensor': {
275
+ regEx: /new\s+LinearAccelerationSensor\s*\(/g,
276
+ where: 'JavaScript',
277
+ supported: (async () => 'LinearAccelerationSensor' in self)(),
278
+ featureDetection: `(async () => 'LinearAccelerationSensor' in self)()`,
279
+ documentation: 'https://web.dev/generic-sensor/',
280
+ blinkFeatureID: 2051,
281
+ },
282
+ 'Local Font Access': {
283
+ regEx: /queryLocalFonts\s*\(/g,
284
+ where: 'JavaScript',
285
+ supported: (async () => 'queryLocalFonts' in self)(),
286
+ featureDetection: `(async () => 'queryLocalFonts' in self)()`,
287
+ documentation: 'https://web.dev/local-fonts/',
288
+ blinkFeatureID: 4211,
289
+ },
290
+ 'Magnetometer': {
291
+ regEx: /new\s+Magnetometer\s*\(/g,
292
+ where: 'JavaScript',
293
+ supported: (async () => 'Magnetometer' in self)(),
294
+ featureDetection: `(async () => 'Magnetometer' in self)()`,
295
+ documentation: 'https://web.dev/generic-sensor/',
296
+ blinkFeatureID: 1907,
297
+ },
298
+ 'Media Capabilities': {
299
+ regEx: /navigator\.mediaCapabilities\.decodingInfo\s*\(/g,
300
+ where: 'JavaScript',
301
+ supported: (async () => 'mediaCapabilities' in navigator)(),
302
+ featureDetection: `(async () => 'mediaCapabilities' in navigator)()`,
303
+ documentation:
304
+ 'https://developer.mozilla.org/en-US/docs/Web/API/Media_Capabilities_API',
305
+ blinkFeatureID: 2239,
306
+ },
307
+ 'Media Session': {
308
+ regEx:
309
+ /navigator\.mediaSession\.setActionHandler|navigator\.mediaSession\.metadata/g,
310
+ where: 'JavaScript',
311
+ supported: (async () => 'mediaSession' in navigator)(),
312
+ featureDetection: `(async () => 'mediaSession' in navigator)()`,
313
+ documentation:
314
+ 'https://developer.mozilla.org/en-US/docs/Web/API/Media_Session_API',
315
+ blinkFeatureID: 1792,
316
+ },
317
+ 'Multi-Screen Window Placement': {
318
+ regEx: /getScreens\s*\(\)/g,
319
+ where: 'JavaScript',
320
+ supported: (async () => 'getScreens' in self)(),
321
+ featureDetection: `(async () => 'getScreens' in self)()`,
322
+ documentation: 'https://web.dev/multi-screen-window-placement/',
323
+ blinkFeatureID: 3388,
324
+ },
325
+ 'Navigation Preload': {
326
+ regEx: /\.navigationPreload\.enable\s*\(\)/g,
280
327
  where: 'JavaScript',
281
328
  supported: (async () =>
282
329
  'serviceWorker' in navigator &&
283
- 'index' in
330
+ 'navigationPreload' in
284
331
  ((await navigator.serviceWorker?.ready) || self.registration))(),
285
- featureDetection: `(async () => 'serviceWorker' in navigator && 'index' in (await navigator.serviceWorker?.ready || self.registration))()`,
286
- documentation: 'https://web.dev/content-indexing-api/',
287
- blinkFeatureID: 2985,
332
+ featureDetection: `(async () => 'serviceWorker' in navigator && 'navigationPreload' in (await navigator.serviceWorker?.ready || self.registration))()`,
333
+ documentation:
334
+ 'https://developer.mozilla.org/en-US/docs/Web/API/NavigationPreloadManager',
335
+ blinkFeatureID: 1803,
288
336
  },
289
- 'Credential Management': {
290
- regEx: /navigator\.credentials\.get\s*\(/g,
337
+ 'Payment Handler': {
338
+ regEx: /\.paymentManager\.instruments\.set\s*\(/g,
291
339
  where: 'JavaScript',
292
- supported: (async () => 'credentials' in navigator)(),
293
- featureDetection: `(async () => 'credentials' in navigator)()`,
340
+ supported: (async () => 'PaymentInstruments' in self)(),
341
+ featureDetection: `(async () => 'PaymentInstruments' in self)()`,
342
+ documentation: 'https://web.dev/registering-a-web-based-payment-app/',
343
+ blinkFeatureID: 2397,
344
+ },
345
+ 'Payment Request': {
346
+ regEx: /new\s+PaymentRequest\s*\(/g,
347
+ where: 'JavaScript',
348
+ supported: (async () => 'PaymentRequest' in self)(),
349
+ featureDetection: `(async () => 'PaymentRequest' in self)()`,
294
350
  documentation:
295
- 'https://developers.google.com/web/updates/2016/04/credential-management-api',
296
- blinkFeatureID: 960,
351
+ 'https://developer.mozilla.org/en-US/docs/Web/API/Payment_Request_API',
352
+ blinkFeatureID: 2894,
297
353
  },
298
- 'WebOTP': {
299
- regEx: /transport\s*\:\s*\[["']sms["']\]/g,
354
+ 'Periodic Background Sync': {
355
+ regEx: /periodicSync\.register\s*\(/g,
300
356
  where: 'JavaScript',
301
- supported: (async () => 'OTPCredential' in self)(),
302
- featureDetection: `(async () => 'OTPCredential' in self)()`,
303
- documentation: 'https://web.dev/web-otp/',
304
- blinkFeatureID: 2880,
357
+ supported: (async () => 'PeriodicSyncManager' in self)(),
358
+ featureDetection: `(async () => 'PeriodicSyncManager' in self)()`,
359
+ documentation: 'https://web.dev/periodic-background-sync/',
360
+ blinkFeatureID: 2931,
305
361
  },
306
- 'File System Access': {
307
- regEx:
308
- /showOpenFilePicker\s*\(|showSaveFilePicker\s*\(|showDirectoryPicker\s*\(/g,
362
+ 'Persistent Storage': {
363
+ regEx: /navigator\.storage\.persist\s*\(\)/g,
309
364
  where: 'JavaScript',
310
- supported: (async () => 'showOpenFilePicker' in self)(),
311
- featureDetection: `(async () => 'showOpenFilePicker' in self)()`,
312
- documentation: 'https://web.dev/file-system-access/',
313
- blinkFeatureID: 3340,
365
+ supported: (async () =>
366
+ 'storage' in navigator && 'persist' in navigator.storage)(),
367
+ featureDetection: `(async () => 'storage' in navigator && 'persist' in navigator.storage)()`,
368
+ documentation:
369
+ 'https://developer.mozilla.org/en-US/docs/Web/API/StorageManager/persist',
370
+ blinkFeatureID: 1369,
314
371
  },
315
372
  'Pointer Lock (unadjustedMovement)': {
316
373
  regEx: /unadjustedMovement\s*\:\s*/g,
@@ -322,183 +379,221 @@ export default {
322
379
  .createElement('p')
323
380
  .requestPointerLock({ unadjustedMovement: true }));
324
381
  } catch {
325
- return true;
382
+ return 'requestPointerLock' in HTMLParagraphElement.prototype;
326
383
  }
327
384
  })())(),
328
- featureDetection: `(async () => await (async () => { try { return !!await document.createElement("p").requestPointerLock({ unadjustedMovement: true }) } catch { return true } })())()`,
385
+ featureDetection: `(async () => await (async () => { try { return !!await document.createElement("p").requestPointerLock({ unadjustedMovement: true }) } catch { return 'requestPointerLock' in HTMLParagraphElement.prototype } })())()`,
329
386
  documentation: 'https://web.dev/disable-mouse-acceleration/',
330
387
  blinkFeatureID: 3027,
331
388
  },
332
- 'WebHID': {
333
- regEx: /navigator\.hid\.requestDevice\s*\(/g,
389
+ 'Protocol Handlers': {
390
+ regEx: /"protocol_handlers"/g,
391
+ where: 'Web App Manifest',
392
+ supported: (async () => undefined)(),
393
+ featureDetection: `(async () => undefined)()`,
394
+ documentation: 'https://web.dev/url-protocol-handler/',
395
+ blinkFeatureID: 3884,
396
+ },
397
+ 'Push': {
398
+ regEx: /\.pushManager\.subscribe\s*\(/g,
334
399
  where: 'JavaScript',
335
- supported: (async () => 'hid' in navigator)(),
336
- featureDetection: `(async () => 'hid' in navigator)()`,
337
- documentation: 'https://web.dev/hid/',
338
- blinkFeatureID: 2866,
400
+ supported: (async () =>
401
+ 'serviceWorker' in navigator &&
402
+ 'pushManager' in
403
+ ((await navigator.serviceWorker?.ready) || self.registration))(),
404
+ featureDetection: `(async () => 'serviceWorker' in navigator && 'pushManager' in (await navigator.serviceWorker?.ready || self.registration))()`,
405
+ documentation: 'https://developer.mozilla.org/en-US/docs/Web/API/Push_API',
406
+ blinkFeatureID: 769,
339
407
  },
340
- 'WebSerial': {
341
- regEx: /navigator\.serial\.requestPort\s*\(/g,
408
+ 'Relative Orientation Sensor': {
409
+ regEx: /new\s+RelativeOrientationSensor\s*\(/g,
342
410
  where: 'JavaScript',
343
- supported: (async () => 'serial' in navigator)(),
344
- featureDetection: `(async () => 'serial' in navigator)()`,
345
- documentation: 'https://web.dev/serial/',
346
- blinkFeatureID: 2546,
411
+ supported: (async () => 'RelativeOrientationSensor' in self)(),
412
+ featureDetection: `(async () => 'RelativeOrientationSensor' in self)()`,
413
+ documentation: 'https://web.dev/generic-sensor/',
414
+ blinkFeatureID: 2019,
347
415
  },
348
- 'WebNFC': {
349
- regEx: /new\s+NDEFReader\s*\(/g,
416
+ 'Screen Wake Lock': {
417
+ regEx: /navigator\.wakeLock\.request\s*\(/g,
350
418
  where: 'JavaScript',
351
- supported: (async () => 'NDEFReader' in self)(),
352
- featureDetection: `(async () => 'NDEFReader' in self)()`,
353
- documentation: 'https://web.dev/nfc/',
354
- blinkFeatureID: 3094,
419
+ supported: (async () => 'wakeLock' in navigator)(),
420
+ featureDetection: `(async () => 'wakeLock' in navigator)()`,
421
+ documentation: 'https://web.dev/wake-lock/',
422
+ blinkFeatureID: 3005,
355
423
  },
356
- 'Run On Login': {
357
- regEx: /navigator\.runOnOsLogin\.set\s*\(/g,
424
+ 'Service Worker': {
425
+ regEx: /navigator\.serviceWorker\.register\s*\(/g,
358
426
  where: 'JavaScript',
359
- supported: (async () => 'runOnOsLogin' in navigator)(),
360
- featureDetection: `(async () => 'runOnOsLogin' in navigator)()`,
427
+ supported: (async () => 'serviceWorker' in navigator)(),
428
+ featureDetection: `(async () => 'serviceWorker' in navigator)()`,
361
429
  documentation:
362
- 'https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/main/RunOnLogin/Explainer.md',
363
- blinkFeatureID: undefined,
430
+ 'https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API',
431
+ blinkFeatureID: 990,
364
432
  },
365
- 'WebCodecs': {
366
- regEx: /new\s+MediaStreamTrackProcessor\s*\(/g,
433
+ 'Shape Detection (Barcodes)': {
434
+ regEx: /new\s+BarcodeDetector\s*\(/g,
367
435
  where: 'JavaScript',
368
- supported: (async () => 'MediaStreamTrackProcessor' in self)(),
369
- featureDetection: `(async () => 'MediaStreamTrackProcessor' in self)()`,
370
- documentation: 'https://web.dev/webcodecs/',
371
- blinkFeatureID: 3728,
436
+ supported: (async () => 'BarcodeDetector' in self)(),
437
+ featureDetection: `(async () => 'BarcodeDetector' in self)()`,
438
+ documentation: 'https://web.dev/shape-detection/',
439
+ blinkFeatureID: 3711,
372
440
  },
373
- 'Digital Goods': {
374
- regEx: /getDigitalGoodsService\s*\(/g,
441
+ 'Shape Detection (Faces)': {
442
+ regEx: /new\s+FaceDetector\s*\(/g,
375
443
  where: 'JavaScript',
376
- supported: (async () => 'getDigitalGoodsService' in self)(),
377
- featureDetection: `(async () => 'getDigitalGoodsService' in self)()`,
378
- documentation:
379
- 'https://developer.chrome.com/docs/android/trusted-web-activity/receive-payments-play-billing/',
380
- blinkFeatureID: 3397,
444
+ supported: (async () => 'FaceDetector' in self)(),
445
+ featureDetection: `(async () => 'FaceDetector' in self)()`,
446
+ documentation: 'https://web.dev/shape-detection/',
447
+ blinkFeatureID: 3712,
381
448
  },
382
- 'Idle Detection': {
383
- regEx: /new\s+IdleDetector\s*\(/g,
449
+ 'Shape Detection (Texts)': {
450
+ regEx: /new\s+TextDetector\s*\(/g,
384
451
  where: 'JavaScript',
385
- supported: (async () => 'IdleDetector' in self)(),
386
- featureDetection: `(async () => 'IdleDetector' in self)()`,
387
- documentation: 'https://web.dev/idle-detection/',
388
- blinkFeatureID: 2834,
452
+ supported: (async () => 'TextDetector' in self)(),
453
+ featureDetection: `(async () => 'TextDetector' in self)()`,
454
+ documentation: 'https://web.dev/shape-detection/',
455
+ blinkFeatureID: 3713,
389
456
  },
390
- 'Storage Foundation': {
391
- regEx: /storageFoundation\.open\s*\(/g,
392
- where: 'JavaScript',
393
- supported: (async () => 'storageFoundation' in self)(),
394
- featureDetection: `(async () => 'storageFoundation' in self)()`,
395
- documentation: 'https://web.dev/storage-foundation/',
396
- blinkFeatureID: 3822,
457
+ 'Shortcuts': {
458
+ regEx: /"shortcuts"/g,
459
+ where: 'Web App Manifest',
460
+ supported: (async () => undefined)(),
461
+ featureDetection: `(async () => undefined)()`,
462
+ documentation: 'https://web.dev/app-shortcuts/',
463
+ blinkFeatureID: undefined,
397
464
  },
398
- 'Handwriting Recognition': {
399
- regEx: /navigator\.queryHandwritingRecognizerSupport\s*\(/g,
465
+ 'Storage Estimation': {
466
+ regEx: /navigator\.storage\.estimate\s*\(\)/g,
400
467
  where: 'JavaScript',
401
- supported: (async () => 'queryHandwritingRecognizerSupport' in navigator)(),
402
- featureDetection: `(async () => 'queryHandwritingRecognizerSupport' in navigator)()`,
403
- documentation: 'https://web.dev/handwriting-recognition/',
404
- blinkFeatureID: 3893,
468
+ supported: (async () =>
469
+ 'storage' in navigator && 'estimate' in navigator.storage)(),
470
+ featureDetection: `(async () => 'storage' in navigator && 'estimate' in navigator.storage)()`,
471
+ documentation:
472
+ 'https://developer.mozilla.org/en-US/docs/Web/API/StorageManager/estimate',
473
+ blinkFeatureID: 1371,
405
474
  },
406
- 'Compute Pressure': {
407
- regEx: /new\s+ComputePressureObserver\s*\(/g,
408
- where: 'JavaScript',
409
- supported: (async () => 'ComputePressureObserver' in self)(),
410
- featureDetection: `(async () => 'ComputePressureObserver' in self)()`,
411
- documentation: 'https://web.dev/compute-pressure/',
412
- blinkFeatureID: 3899,
475
+ 'Tabbed Application Mode': {
476
+ regEx: /"tabbed"/g,
477
+ where: 'Web App Manifest',
478
+ supported: (async () => undefined)(),
479
+ featureDetection: `(async () => undefined)()`,
480
+ documentation: 'https://web.dev/tabbed-application-mode/',
481
+ blinkFeatureID: undefined,
413
482
  },
414
- 'Accelerometer': {
415
- regEx: /new\s+Accelerometer\s*\(/g,
483
+ 'VirtualKeyboard': {
484
+ regEx: /navigator\.virtualKeyboard/g,
416
485
  where: 'JavaScript',
417
- supported: (async () => 'Accelerometer' in self)(),
418
- featureDetection: `(async () => 'Accelerometer' in self)()`,
419
- documentation: 'https://web.dev/generic-sensor/',
420
- blinkFeatureID: 1899,
486
+ supported: (async () => 'virtualKeyboard' in navigator)(),
487
+ featureDetection: `(async () => 'virtualKeyboard' in navigator)()`,
488
+ documentation:
489
+ 'https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/main/VirtualKeyboardAPI/explainer.md',
490
+ blinkFeatureID: undefined,
421
491
  },
422
- 'Gyroscope': {
423
- regEx: /new\s+Gyroscope\s*\(/g,
492
+ 'Web App Link Handling': {
493
+ regEx: /"handle_links"/g,
494
+ where: 'Web App Manifest',
495
+ supported: (async () => undefined)(),
496
+ featureDetection: `(async () => undefined)()`,
497
+ documentation:
498
+ 'https://github.com/WICG/pwa-url-handler/blob/main/handle_links/explainer.md',
499
+ blinkFeatureID: undefined,
500
+ },
501
+ 'Web Share': {
502
+ regEx: /navigator\.share\s*\(/g,
424
503
  where: 'JavaScript',
425
- supported: (async () => 'Gyroscope' in self)(),
426
- featureDetection: `(async () => 'Gyroscope' in self)()`,
427
- documentation: 'https://web.dev/generic-sensor/',
428
- blinkFeatureID: 1906,
504
+ supported: (async () => 'share' in navigator)(),
505
+ featureDetection: `(async () => 'share' in navigator)()`,
506
+ documentation: 'https://web.dev/web-share/',
507
+ blinkFeatureID: 1501,
429
508
  },
430
- 'Absolute Orientation Sensor': {
431
- regEx: /new\s+AbsoluteOrientationSensor\s*\(/g,
509
+ 'Web Share (Files)': {
510
+ regEx: /navigator\.canShare\s*\(/g,
432
511
  where: 'JavaScript',
433
- supported: (async () => 'AbsoluteOrientationSensor' in self)(),
434
- featureDetection: `(async () => 'AbsoluteOrientationSensor' in self)()`,
435
- documentation: 'https://web.dev/generic-sensor/',
436
- blinkFeatureID: 1900,
512
+ supported: (async () => 'canShare' in navigator)(),
513
+ featureDetection: `(async () => 'canShare' in navigator)()`,
514
+ documentation: 'https://web.dev/web-share/',
515
+ blinkFeatureID: 2737,
437
516
  },
438
- 'Relative Orientation Sensor': {
439
- regEx: /new\s+RelativeOrientationSensor\s*\(/g,
517
+ 'Web Share Target': {
518
+ regEx: /"share_target"/g,
519
+ where: 'Web App Manifest',
520
+ supported: (async () => undefined)(),
521
+ featureDetection: `(async () => undefined)()`,
522
+ documentation: 'https://web.dev/web-share-target/',
523
+ blinkFeatureID: undefined,
524
+ },
525
+ 'Web Share Target (Files)': {
526
+ regEx: /"enctype"\s*\:\s*"multipart\/form\-data"/g,
527
+ where: 'Web App Manifest',
528
+ supported: (async () => undefined)(),
529
+ featureDetection: `(async () => undefined)()`,
530
+ documentation: 'https://web.dev/web-share-target/',
531
+ blinkFeatureID: undefined,
532
+ },
533
+ 'WebBluetooth': {
534
+ regEx: /navigator\.bluetooth\.requestDevice\s*\(/g,
440
535
  where: 'JavaScript',
441
- supported: (async () => 'RelativeOrientationSensor' in self)(),
442
- featureDetection: `(async () => 'RelativeOrientationSensor' in self)()`,
443
- documentation: 'https://web.dev/generic-sensor/',
444
- blinkFeatureID: 2019,
536
+ supported: (async () => 'bluetooth' in navigator)(),
537
+ featureDetection: `(async () => 'bluetooth' in navigator)()`,
538
+ documentation: 'https://web.dev/bluetooth/',
539
+ blinkFeatureID: 1670,
445
540
  },
446
- 'Gravity Sensor': {
447
- regEx: /new\s+GravitySensor\s*\(/g,
541
+ 'WebCodecs': {
542
+ regEx: /new\s+MediaStreamTrackProcessor\s*\(/g,
448
543
  where: 'JavaScript',
449
- supported: (async () => 'GravitySensor' in self)(),
450
- featureDetection: `(async () => 'GravitySensor' in self)()`,
451
- documentation: 'https://web.dev/generic-sensor/',
452
- blinkFeatureID: 3795,
544
+ supported: (async () => 'MediaStreamTrackProcessor' in self)(),
545
+ featureDetection: `(async () => 'MediaStreamTrackProcessor' in self)()`,
546
+ documentation: 'https://web.dev/webcodecs/',
547
+ blinkFeatureID: 3728,
453
548
  },
454
- 'Linear Acceleration Sensor': {
455
- regEx: /new\s+LinearAccelerationSensor\s*\(/g,
549
+ 'WebGPU': {
550
+ regEx: /navigator\.gpu\.requestAdapter\s*\(/g,
456
551
  where: 'JavaScript',
457
- supported: (async () => 'LinearAccelerationSensor' in self)(),
458
- featureDetection: `(async () => 'LinearAccelerationSensor' in self)()`,
459
- documentation: 'https://web.dev/generic-sensor/',
460
- blinkFeatureID: 2051,
552
+ supported: (async () => 'gpu' in navigator)(),
553
+ featureDetection: `(async () => 'gpu' in navigator)()`,
554
+ documentation: 'https://web.dev/webgpu',
555
+ blinkFeatureID: 3888,
461
556
  },
462
- 'Magnetometer': {
463
- regEx: /new\s+Magnetometer\s*\(/g,
557
+ 'WebHID': {
558
+ regEx: /navigator\.hid\.requestDevice\s*\(/g,
464
559
  where: 'JavaScript',
465
- supported: (async () => 'Magnetometer' in self)(),
466
- featureDetection: `(async () => 'Magnetometer' in self)()`,
467
- documentation: 'https://web.dev/generic-sensor/',
468
- blinkFeatureID: 1907,
560
+ supported: (async () => 'hid' in navigator)(),
561
+ featureDetection: `(async () => 'hid' in navigator)()`,
562
+ documentation: 'https://web.dev/hid/',
563
+ blinkFeatureID: 2866,
469
564
  },
470
- 'Ambient Light Sensor': {
471
- regEx: /new\s+AmbientLightSensor\s*\(\)/g,
565
+ 'WebMIDI': {
566
+ regEx: /navigator\.requestMIDIAccess\s*\(/g,
472
567
  where: 'JavaScript',
473
- supported: (async () => 'AmbientLightSensor' in self)(),
474
- featureDetection: `(async () => 'AmbientLightSensor' in self)()`,
475
- documentation: 'https://web.dev/generic-sensor/',
476
- blinkFeatureID: 1901,
568
+ supported: (async () => 'requestMIDIAccess' in navigator)(),
569
+ featureDetection: `(async () => 'requestMIDIAccess' in navigator)()`,
570
+ documentation:
571
+ 'https://developer.mozilla.org/en-US/docs/Web/API/Web_MIDI_API',
572
+ blinkFeatureID: 2029,
477
573
  },
478
- 'Notification Triggers': {
479
- regEx: /showTrigger\s*\:\s*new\s+TimestampTrigger\s*\(/g,
574
+ 'WebNFC': {
575
+ regEx: /new\s+NDEFReader\s*\(/g,
480
576
  where: 'JavaScript',
481
- supported: (async () =>
482
- 'Notification' in self && 'showTrigger' in Notification.prototype)(),
483
- featureDetection: `(async () => 'Notification' in self && 'showTrigger' in Notification.prototype)()`,
484
- documentation: 'https://web.dev/notification-triggers/',
485
- blinkFeatureID: 3017,
577
+ supported: (async () => 'NDEFReader' in self)(),
578
+ featureDetection: `(async () => 'NDEFReader' in self)()`,
579
+ documentation: 'https://web.dev/nfc/',
580
+ blinkFeatureID: 3094,
486
581
  },
487
- 'Local Font Access': {
488
- regEx: /navigator\.fonts\.query\s*\(\)/g,
582
+ 'WebOTP': {
583
+ regEx: /transport\s*\:\s*\[["']sms["']\]/g,
489
584
  where: 'JavaScript',
490
- supported: (async () => 'fonts' in navigator)(),
491
- featureDetection: `(async () => 'fonts' in navigator)()`,
492
- documentation: 'https://web.dev/local-fonts/',
493
- blinkFeatureID: 3386,
585
+ supported: (async () => 'OTPCredential' in self)(),
586
+ featureDetection: `(async () => 'OTPCredential' in self)()`,
587
+ documentation: 'https://web.dev/web-otp/',
588
+ blinkFeatureID: 2880,
494
589
  },
495
- 'Multi-Screen Window Placement': {
496
- regEx: /getScreens\s*\(\)/g,
590
+ 'WebSerial': {
591
+ regEx: /navigator\.serial\.requestPort\s*\(/g,
497
592
  where: 'JavaScript',
498
- supported: (async () => 'getScreens' in self)(),
499
- featureDetection: `(async () => 'getScreens' in self)()`,
500
- documentation: 'https://web.dev/multi-screen-window-placement/',
501
- blinkFeatureID: 3388,
593
+ supported: (async () => 'serial' in navigator)(),
594
+ featureDetection: `(async () => 'serial' in navigator)()`,
595
+ documentation: 'https://web.dev/serial/',
596
+ blinkFeatureID: 2546,
502
597
  },
503
598
  'WebSocketStream': {
504
599
  regEx: /new\s+WebSocketStream\s*\(/g,
@@ -516,67 +611,13 @@ export default {
516
611
  documentation: 'https://web.dev/webtransport/',
517
612
  blinkFeatureID: 3472,
518
613
  },
519
- 'Gamepad': {
520
- regEx: /navigator\.getGamepads\s*\(/g,
521
- where: 'JavaScript',
522
- supported: (async () => 'getGamepads' in navigator)(),
523
- featureDetection: `(async () => 'getGamepads' in navigator)()`,
524
- documentation: 'https://web.dev/gamepad/',
525
- blinkFeatureID: 1916,
526
- },
527
- 'WebGPU': {
528
- regEx: /navigator\.gpu\.requestAdapter\s*\(/g,
529
- where: 'JavaScript',
530
- supported: (async () => 'gpu' in navigator)(),
531
- featureDetection: `(async () => 'gpu' in navigator)()`,
532
- documentation: 'https://web.dev/webgpu',
533
- blinkFeatureID: 3888,
534
- },
535
- 'VirtualKeyboard': {
536
- regEx: /navigator\.virtualKeyboard/g,
537
- where: 'JavaScript',
538
- supported: (async () => 'virtualKeyboard' in navigator)(),
539
- featureDetection: `(async () => 'virtualKeyboard' in navigator)()`,
540
- documentation:
541
- 'https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/main/VirtualKeyboardAPI/explainer.md',
542
- blinkFeatureID: undefined,
543
- },
544
- 'EyeDropper': {
545
- regEx: /new\s+EyeDropper\s*\(\)/g,
546
- where: 'JavaScript',
547
- supported: (async () => 'EyeDropper' in self)(),
548
- featureDetection: `(async () => 'EyeDropper' in self)()`,
549
- documentation: 'https://github.com/WICG/eyedropper-api/blob/main/README.md',
550
- blinkFeatureID: undefined,
551
- },
552
- 'Device Posture': {
553
- regEx: /navigator\.devicePosture/g,
554
- where: 'JavaScript',
555
- supported: (async () => 'devicePosture' in navigator)(),
556
- featureDetection: `(async () => 'devicePosture' in navigator)()`,
557
- documentation:
558
- 'https://github.com/w3c/device-posture/blob/gh-pages/README.md',
559
- blinkFeatureID: undefined,
560
- },
561
- 'Insertable streams for MediaStreamTrack': {
562
- regEx: /MediaStreamTrackProcessor\s*\(/g,
563
- where: 'JavaScript',
564
- supported: (async () =>
565
- 'MediaStreamTrackProcessor' in self &&
566
- 'MediaStreamTrackGenerator' in self)(),
567
- featureDetection: `(async () => 'MediaStreamTrackProcessor' in self && 'MediaStreamTrackGenerator' in self)()`,
568
- documentation:
569
- 'https://web.dev/mediastreamtrack-insertable-media-processing/',
570
- blinkFeatureID: 3729,
571
- },
572
- 'Ink': {
573
- regEx: /navigator\.ink\.requestPresenter\s*\(/g,
614
+ 'WebUSB': {
615
+ regEx: /navigator\.usb\.requestDevice\s*\(/g,
574
616
  where: 'JavaScript',
575
- supported: (async () => 'ink' in navigator)(),
576
- featureDetection: `(async () => 'ink' in navigator)()`,
577
- documentation:
578
- 'https://blogs.windows.com/msedgedev/2021/08/18/enhancing-inking-on-the-web/',
579
- blinkFeatureID: undefined,
617
+ supported: (async () => 'usb' in navigator)(),
618
+ featureDetection: `(async () => 'usb' in navigator)()`,
619
+ documentation: 'https://web.dev/usb/',
620
+ blinkFeatureID: 1520,
580
621
  },
581
622
  'Window Controls Overlay': {
582
623
  regEx: /"window\-controls\-overlay"/g,
@@ -586,78 +627,4 @@ export default {
586
627
  documentation: 'https://web.dev/window-controls-overlay/',
587
628
  blinkFeatureID: 3902,
588
629
  },
589
- 'Web Share Target': {
590
- regEx: /"share_target"/g,
591
- where: 'Web App Manifest',
592
- supported: (async () => undefined)(),
593
- featureDetection: `(async () => undefined)()`,
594
- documentation: 'https://web.dev/web-share-target/',
595
- blinkFeatureID: undefined,
596
- },
597
- 'Web Share Target (Files)': {
598
- regEx: /"enctype"\s*\:\s*"multipart\/form\-data"/g,
599
- where: 'Web App Manifest',
600
- supported: (async () => undefined)(),
601
- featureDetection: `(async () => undefined)()`,
602
- documentation: 'https://web.dev/web-share-target/',
603
- blinkFeatureID: undefined,
604
- },
605
- 'Shortcuts': {
606
- regEx: /"shortcuts"/g,
607
- where: 'Web App Manifest',
608
- supported: (async () => undefined)(),
609
- featureDetection: `(async () => undefined)()`,
610
- documentation: 'https://web.dev/app-shortcuts/',
611
- blinkFeatureID: undefined,
612
- },
613
- 'Declarative Link Capturing': {
614
- regEx: /"capture_links"/g,
615
- where: 'Web App Manifest',
616
- supported: (async () => undefined)(),
617
- featureDetection: `(async () => undefined)()`,
618
- documentation: 'https://web.dev/declarative-link-capturing/',
619
- blinkFeatureID: 3813,
620
- },
621
- 'Tabbed Application Mode': {
622
- regEx: /"tabbed"/g,
623
- where: 'Web App Manifest',
624
- supported: (async () => undefined)(),
625
- featureDetection: `(async () => undefined)()`,
626
- documentation: 'https://web.dev/tabbed-application-mode/',
627
- blinkFeatureID: undefined,
628
- },
629
- 'URL Handlers': {
630
- regEx: /"url_handlers"/g,
631
- where: 'Web App Manifest',
632
- supported: (async () => undefined)(),
633
- featureDetection: `(async () => undefined)()`,
634
- documentation: 'https://web.dev/pwa-url-handler/',
635
- blinkFeatureID: 3851,
636
- },
637
- 'Protocol Handlers': {
638
- regEx: /"protocol_handlers"/g,
639
- where: 'Web App Manifest',
640
- supported: (async () => undefined)(),
641
- featureDetection: `(async () => undefined)()`,
642
- documentation: 'https://web.dev/url-protocol-handler/',
643
- blinkFeatureID: 3884,
644
- },
645
- 'File Handling': {
646
- regEx: /"file_handlers"/g,
647
- where: 'Web App Manifest',
648
- supported: (async () =>
649
- 'launchQueue' in self && 'files' in LaunchParams.prototype)(),
650
- featureDetection: `(async () => 'launchQueue' in self && 'files' in LaunchParams.prototype)()`,
651
- documentation: 'https://web.dev/file-handling/',
652
- blinkFeatureID: 3875,
653
- },
654
- 'Launch Handler': {
655
- regEx: /"launch_handler"/g,
656
- where: 'Web App Manifest',
657
- supported: (async () =>
658
- 'launchQueue' in self && 'targetURL' in LaunchParams.prototype)(),
659
- featureDetection: `(async () => 'launchQueue' in self && 'targetURL' in LaunchParams.prototype)()`,
660
- documentation: 'https://web.dev/launch-handler/',
661
- blinkFeatureID: undefined,
662
- },
663
630
  };