web-platform-dx / web-features

Exploring how to present Web platform features adoptability
Apache License 2.0
338 stars 63 forks source link

compute-baseline: Can features be baseline when they don't have a specification? #1497

Open Elchi3 opened 1 month ago

Elchi3 commented 1 month ago

Not sure if this is intended behavior.

If you compute the status for ShadowRoot.elementFromPoint and ShadowRoot.elementsFromPoint:

import { computeBaseline } from "compute-baseline";

console.log(
JSON.parse(computeBaseline({compatKeys: ["api.ShadowRoot.elementFromPoint", "api.ShadowRoot.elementsFromPoint"], withAncestors: false}).toJSON())
);

you get

{
  baseline: 'high',
  baseline_low_date: '2020-01-15',
  baseline_high_date: '2022-07-15',
  support: {
    chrome: '53',
    chrome_android: '53',
    edge: '79',
    firefox: '63',
    firefox_android: '63',
    safari: '11.1',
    safari_ios: '11.3'
  }
}

even though these two keys have no specification.

Issue for them to be specified: https://github.com/w3c/csswg-drafts/issues/5886

Can features be baseline when they don't have a valid specification?

foolip commented 1 month ago

This is unclear from the definition in https://github.com/web-platform-dx/web-features/blob/main/docs/baseline.md#interoperable-low-status. The only mention of specs in the whole document is "The specification text contains discouraging language, such as a deprecation notice, obsolescence warning, or legacy tag" but the case where there is no spec isn't mentioned.

I think we'll need to make a case-by-case judgment about this, and we haven't given these two keys a Baseline status yet, they're not part of any feature.

Elchi3 commented 1 month ago

fwiw, I see 310 IDs in BCD where deprecated is false and standard_track is also false. So this question will arise for about 300 IDs. (it might also be that we need to mark some of them as deprecated: true in BCD, or that a spec exists but hasn't been added.)

Details

1. api.AbortPaymentEvent 2. api.AbortPaymentEvent.AbortPaymentEvent 3. api.AbortPaymentEvent.respondWith 4. api.BeforeInstallPromptEvent 5. api.BeforeInstallPromptEvent.BeforeInstallPromptEvent 6. api.BeforeInstallPromptEvent.platforms 7. api.BeforeInstallPromptEvent.prompt 8. api.BeforeInstallPromptEvent.userChoice 9. api.CredentialsContainer.get.identity_option.error_api 10. api.DataTransfer.addElement 11. api.DataTransfer.mozCursor 12. api.DataTransfer.mozSourceNode 13. api.DataTransfer.mozUserCancelled 14. api.Directory 15. api.Directory.getFiles 16. api.Directory.getFilesAndDirectories 17. api.Directory.name 18. api.Directory.path 19. api.Document.afterscriptexecute_event 20. api.Document.beforescriptexecute_event 21. api.Document.browsingTopics 22. api.Document.caretRangeFromPoint 23. api.Document.mozSetImageElement 24. api.Document.releaseCapture 25. api.Element.afterscriptexecute_event 26. api.Element.ariaRelevant 27. api.Element.beforescriptexecute_event 28. api.Element.gesturechange_event 29. api.Element.gestureend_event 30. api.Element.gesturestart_event 31. api.Element.requestPointerLock.options_unadjustedMovement_parameter 32. api.Element.scrollIntoViewIfNeeded 33. api.Element.scrollLeftMax 34. api.Element.scrollTopMax 35. api.Element.webkitmouseforcechanged_event 36. api.Element.webkitmouseforcedown_event 37. api.Element.webkitmouseforceup_event 38. api.Element.webkitmouseforcewillbegin_event 39. api.ElementInternals.ariaRelevant 40. api.Event.explicitOriginalTarget 41. api.Event.originalTarget 42. api.FileSystemHandle.move 43. api.FileSystemHandle.remove 44. api.GPUComputePassEncoder.writeTimestamp 45. api.GPURenderPassEncoder.writeTimestamp 46. api.Gamepad.vibrationActuator 47. api.GestureEvent 48. api.GestureEvent.altKey 49. api.GestureEvent.clientX 50. api.GestureEvent.clientY 51. api.GestureEvent.ctrlKey 52. api.GestureEvent.initGestureEvent 53. api.GestureEvent.metaKey 54. api.GestureEvent.rotation 55. api.GestureEvent.scale 56. api.GestureEvent.screenX 57. api.GestureEvent.screenY 58. api.GestureEvent.shiftKey 59. api.GestureEvent.target 60. api.HTMLCanvasElement.mozPrintCallback 61. api.HTMLElement.anchorElement 62. api.HTMLIFrameElement.browsingTopics 63. api.HTMLInputElement.incremental 64. api.HTMLInputElement.search_event 65. api.HTMLPortalElement 66. api.IDBDatabase.transaction.option_durability_parameter_readwriteflush 67. api.IdentityCredential.isAutoSelected 68. api.MediaDevices.getDisplayMedia.preferCurrentTab_option 69. api.MediaStream.active_event 70. api.MediaStream.inactive_event 71. api.MediaStreamTrackGenerator 72. api.MediaStreamTrackGenerator.MediaStreamTrackGenerator 73. api.MediaStreamTrackGenerator.writable 74. api.Metadata 75. api.Metadata.modificationTime 76. api.Metadata.size 77. api.MouseEvent.layerX 78. api.MouseEvent.layerY 79. api.Navigator.buildID 80. api.Navigator.globalPrivacyControl 81. api.Navigator.registerProtocolHandler.scheme_parameter_cabal 82. api.Navigator.registerProtocolHandler.scheme_parameter_dat 83. api.Navigator.registerProtocolHandler.scheme_parameter_did 84. api.Navigator.registerProtocolHandler.scheme_parameter_dweb 85. api.Navigator.registerProtocolHandler.scheme_parameter_ethereum 86. api.Navigator.registerProtocolHandler.scheme_parameter_hyper 87. api.Navigator.registerProtocolHandler.scheme_parameter_ipfs 88. api.Navigator.registerProtocolHandler.scheme_parameter_ipns 89. api.Navigator.registerProtocolHandler.scheme_parameter_ssb 90. api.Permissions.permission_clipboard-read 91. api.Permissions.requestAll 92. api.Request.Request.init_browsingTopics_parameter 93. api.SVGStringList.length 94. api.SVGTransformList.length 95. api.Screen.availLeft 96. api.Screen.availLeft.relative-multi-screen 97. api.Screen.availTop 98. api.Screen.availTop.relative-multi-screen 99. api.Screen.left 100. api.Screen.left.relative-multi-screen 101. api.Screen.top.relative-multi-screen 102. api.Selection.getComposedRanges.returns_multiple_ranges 103. api.ServiceWorkerGlobalScope.abortpayment_event 104. api.ShadowRoot.elementFromPoint 105. api.ShadowRoot.elementsFromPoint 106. api.ShadowRoot.getSelection 107. api.SourceBuffer.appendBufferAsync 108. api.SourceBuffer.removeAsync 109. api.SpeechGrammar.SpeechGrammar 110. api.StorageManager.estimate.usageDetails 111. api.Window.dump 112. api.Window.find 113. api.Window.fullScreen 114. api.Window.getDefaultComputedStyle 115. api.Window.getDefaultComputedStyle.pseudo_element_support 116. api.Window.mozInnerScreenX 117. api.Window.mozInnerScreenY 118. api.Window.resolveLocalFileSystemURL 119. api.Window.scrollByLines 120. api.Window.scrollByPages 121. api.Window.scrollMaxX 122. api.Window.scrollMaxY 123. api.Window.sizeToContent 124. api.Window.updateCommands 125. api.WorkerNavigator.globalPrivacyControl 126. api.WorkletSharedStorage.context 127. api.console.dir_static.options_colors_parameter 128. api.console.dir_static.options_depth_parameter 129. api.console.dir_static.options_showHidden_parameter 130. api.console.profileEnd_static 131. api.console.profile_static 132. api.console.timeStamp_static 133. api.createImageBitmap.options_imageOrientation_parameter.none 134. api.fetch.init_browsingTopics_parameter 135. css.at-rules.font-face.src.format_variations 136. css.at-rules.media.-webkit-transform-2d 137. css.at-rules.media.prefers-color-scheme.respects-inherited-scheme 138. css.properties.-moz-image-region 139. css.properties.-moz-orient 140. css.properties.-moz-orient.block 141. css.properties.-moz-orient.inline 142. css.properties.-webkit-app-region 143. css.properties.-webkit-border-before 144. css.properties.-webkit-border-horizontal-spacing 145. css.properties.-webkit-border-vertical-spacing 146. css.properties.-webkit-box-reflect 147. css.properties.-webkit-column-axis 148. css.properties.-webkit-column-break-after 149. css.properties.-webkit-column-break-before 150. css.properties.-webkit-column-break-inside 151. css.properties.-webkit-column-progression 152. css.properties.-webkit-cursor-visibility 153. css.properties.-webkit-hyphenate-limit-after 154. css.properties.-webkit-hyphenate-limit-before 155. css.properties.-webkit-hyphenate-limit-lines 156. css.properties.-webkit-initial-letter 157. css.properties.-webkit-line-align 158. css.properties.-webkit-line-box-contain 159. css.properties.-webkit-line-grid 160. css.properties.-webkit-line-snap 161. css.properties.-webkit-locale 162. css.properties.-webkit-logical-height 163. css.properties.-webkit-logical-width 164. css.properties.-webkit-margin-after 165. css.properties.-webkit-margin-before 166. css.properties.-webkit-mask-box-image 167. css.properties.-webkit-mask-composite 168. css.properties.-webkit-mask-position-x 169. css.properties.-webkit-mask-position-y 170. css.properties.-webkit-mask-repeat-x 171. css.properties.-webkit-mask-repeat-y 172. css.properties.-webkit-mask-source-type 173. css.properties.-webkit-max-logical-height 174. css.properties.-webkit-max-logical-width 175. css.properties.-webkit-min-logical-height 176. css.properties.-webkit-min-logical-width 177. css.properties.-webkit-nbsp-mode 178. css.properties.-webkit-perspective-origin-x 179. css.properties.-webkit-perspective-origin-y 180. css.properties.-webkit-rtl-ordering 181. css.properties.-webkit-tap-highlight-color 182. css.properties.-webkit-text-combine 183. css.properties.-webkit-text-decoration-skip 184. css.properties.-webkit-text-decorations-in-effect 185. css.properties.-webkit-text-security 186. css.properties.-webkit-text-zoom 187. css.properties.-webkit-touch-callout 188. css.properties.-webkit-transform-origin-x 189. css.properties.-webkit-transform-origin-y 190. css.properties.-webkit-transform-origin-z 191. css.properties.-webkit-user-drag 192. css.properties.-webkit-user-modify 193. css.properties.caption-side.bottom-outside 194. css.properties.caption-side.left 195. css.properties.caption-side.right 196. css.properties.caption-side.top-outside 197. css.properties.flex-grow.less_than_zero_animate 198. css.properties.font-smooth 199. css.properties.mask-clip.border 200. css.properties.mask-clip.content 201. css.properties.mask-clip.padding 202. css.properties.mask-clip.text 203. css.properties.mask-origin.border 204. css.properties.mask-origin.content 205. css.properties.mask-origin.padding 206. css.properties.text-rendering.auto 207. css.properties.text-rendering.geometricPrecision 208. css.selectors.-moz-color-swatch 209. css.selectors.-moz-first-node 210. css.selectors.-moz-focus-inner 211. css.selectors.-moz-last-node 212. css.selectors.-moz-list-bullet 213. css.selectors.-moz-list-number 214. css.selectors.-moz-only-whitespace 215. css.selectors.-moz-progress-bar 216. css.selectors.-moz-range-progress 217. css.selectors.-moz-range-thumb 218. css.selectors.-moz-range-track 219. css.selectors.-moz-submit-invalid 220. css.selectors.-moz-window-inactive 221. css.selectors.-webkit-inner-spin-button 222. css.selectors.-webkit-meter-bar 223. css.selectors.-webkit-meter-even-less-good-value 224. css.selectors.-webkit-meter-inner-element 225. css.selectors.-webkit-meter-optimum-value 226. css.selectors.-webkit-meter-suboptimum-value 227. css.selectors.-webkit-progress-bar 228. css.selectors.-webkit-progress-inner-element 229. css.selectors.-webkit-progress-value 230. css.selectors.-webkit-resizer 231. css.selectors.-webkit-scrollbar 232. css.selectors.-webkit-scrollbar-button 233. css.selectors.-webkit-scrollbar-corner 234. css.selectors.-webkit-scrollbar-thumb 235. css.selectors.-webkit-scrollbar-track 236. css.selectors.-webkit-scrollbar-track-piece 237. css.selectors.-webkit-search-cancel-button 238. css.selectors.-webkit-search-results-button 239. css.selectors.hover.a_elements 240. css.selectors.hover.all_elements 241. html.elements.iframe.browsingtopics 242. html.elements.iframe.sandbox.allow-storage-access-by-user-activation 243. html.elements.input.type_password.insecure_login_handling 244. html.global_attributes.anchor 245. html.manifest.serviceworker 246. html.manifest.serviceworker.scope 247. html.manifest.serviceworker.src 248. html.manifest.serviceworker.use_cache 249. http.headers.Cache-Control.stale-if-error 250. http.headers.Cache-Control.stale-while-revalidate 251. http.headers.Content-Security-Policy.form-action.blocks_redirects 252. http.headers.Observe-Browsing-Topics 253. http.headers.Permissions-Policy.browsing-topics 254. http.headers.Sec-Browsing-Topics 255. http.headers.Sec-GPC 256. http.headers.Snapshot-Content-Location 257. http.headers.X-DNS-Prefetch-Control 258. http.headers.X-XSS-Protection 259. javascript.builtins.AggregateError.serializable_object 260. javascript.builtins.Error.Error.fileName_parameter 261. javascript.builtins.Error.Error.lineNumber_parameter 262. javascript.builtins.Error.cause.displayed_in_console 263. javascript.builtins.Error.columnNumber 264. javascript.builtins.Error.fileName 265. javascript.builtins.Error.lineNumber 266. javascript.builtins.Error.stack 267. javascript.builtins.Function.displayName 268. javascript.builtins.InternalError 269. javascript.builtins.InternalError.InternalError 270. javascript.grammar.trailing_commas.trailing_commas_in_dynamic_import 271. javascript.operators.import.options_parameter 272. mathml.attribute_values.named_space 273. mathml.attribute_values.nonzero_unitless_values 274. mathml.elements.menclose 275. mathml.elements.menclose.notation 276. mathml.elements.menclose.notation.actuarial 277. mathml.elements.menclose.notation.bottom 278. mathml.elements.menclose.notation.box 279. mathml.elements.menclose.notation.circle 280. mathml.elements.menclose.notation.downdiagonalstrike 281. mathml.elements.menclose.notation.horizontalstrike 282. mathml.elements.menclose.notation.left 283. mathml.elements.menclose.notation.longdiv 284. mathml.elements.menclose.notation.madruwb 285. mathml.elements.menclose.notation.phasorangle 286. mathml.elements.menclose.notation.right 287. mathml.elements.menclose.notation.roundedbox 288. mathml.elements.menclose.notation.top 289. mathml.elements.menclose.notation.updiagonalarrow 290. mathml.elements.menclose.notation.updiagonalstrike 291. mathml.elements.menclose.notation.verticalstrike 292. mathml.elements.mo.accent 293. mathml.elements.mpadded.relative_values 294. mathml.elements.mtable.align 295. mathml.elements.mtable.columnalign 296. mathml.elements.mtable.columnlines 297. mathml.elements.mtable.columnspacing 298. mathml.elements.mtable.frame 299. mathml.elements.mtable.framespacing 300. mathml.elements.mtable.rowalign 301. mathml.elements.mtable.rowlines 302. mathml.elements.mtable.rowspacing 303. mathml.elements.mtable.width 304. mathml.elements.mtd.columnalign 305. mathml.elements.mtd.rowalign 306. mathml.elements.mtr.columnalign 307. mathml.elements.mtr.rowalign 308. mathml.global_attributes.href 309. webassembly.api.Exception.Exception.options_parameter_traceStack 310. webassembly.api.Exception.stack

ddbeck commented 1 month ago

Abstractly, I think this is a step removed from computing a status: what feature would unspecified behavior be a part of?

More concretely, unspecified behavior wouldn't have a reportable status because it wouldn't be part of a web-features feature. And even if it were, how would we be able to review the status that would result, if what "should" happen is indeterminate?

Eventually getStatus() will actually assert this by checking whether a key is part of a feature or not, but this doesn't actually happen yet.

Pragmatically, I suppose that unspecified but interoperable behavior could be included in a feature, as it would be a de facto standard. But I suspect the exception would be easy to make, because it'd be very likely that a proposal exists to specify that behavior.

(And for unspecified single-engine behaviors, I suppose we could consider some kind of "unspecified" status to live alongside Baseline. We'll probably want to have some sort of deprecated or discouraged status as well, so developers can understand support in that context.)