From aa599ea05e90717bacdbca62969d884ff52c38b9 Mon Sep 17 00:00:00 2001 From: Claas Augner Date: Fri, 31 Jan 2025 15:51:39 +0100 Subject: [PATCH] [Schema] Merge browser accepts_* fields into accepts array --- browsers/chrome.json | 3 +- browsers/chrome_android.json | 3 +- browsers/deno.json | 3 +- browsers/edge.json | 3 +- browsers/firefox.json | 3 +- browsers/firefox_android.json | 3 +- browsers/ie.json | 3 +- browsers/nodejs.json | 3 +- browsers/oculus.json | 3 +- browsers/opera.json | 3 +- browsers/opera_android.json | 3 +- browsers/safari.json | 3 +- browsers/safari_ios.json | 3 +- browsers/samsunginternet_android.json | 3 +- browsers/webview_android.json | 3 +- browsers/webview_ios.json | 3 +- lint/linter/test-browsers-data.test.ts | 18 +++------ lint/linter/test-browsers-presence.ts | 6 ++- lint/linter/test-mirror.ts | 4 +- lint/linter/test-versions.ts | 9 ++++- schemas/browsers-schema.md | 12 +++--- schemas/browsers.schema.json | 38 ++++++++++++------- scripts/build/mirror.ts | 2 +- scripts/lib/stringify-and-order-properties.ts | 3 +- scripts/traverse.ts | 2 +- 25 files changed, 69 insertions(+), 73 deletions(-) diff --git a/browsers/chrome.json b/browsers/chrome.json index c50424f103c31c..f5eeced17585f2 100644 --- a/browsers/chrome.json +++ b/browsers/chrome.json @@ -5,8 +5,7 @@ "type": "desktop", "preview_name": "Canary", "pref_url": "chrome://flags", - "accepts_flags": true, - "accepts_webextensions": true, + "accepts": ["flags", "webextensions"], "releases": { "1": { "release_date": "2008-12-11", diff --git a/browsers/chrome_android.json b/browsers/chrome_android.json index d97a8b6de543f0..40ac70f7043f23 100644 --- a/browsers/chrome_android.json +++ b/browsers/chrome_android.json @@ -5,8 +5,7 @@ "type": "mobile", "upstream": "chrome", "pref_url": "chrome://flags", - "accepts_flags": true, - "accepts_webextensions": false, + "accepts": ["flags"], "releases": { "18": { "release_date": "2012-06-27", diff --git a/browsers/deno.json b/browsers/deno.json index fe82abe277f721..db9b88fc35def3 100644 --- a/browsers/deno.json +++ b/browsers/deno.json @@ -3,8 +3,7 @@ "deno": { "name": "Deno", "type": "server", - "accepts_flags": true, - "accepts_webextensions": false, + "accepts": ["flags"], "releases": { "1.0": { "release_date": "2020-05-13", diff --git a/browsers/edge.json b/browsers/edge.json index fe0e78aaf2fc67..bd68d39ebea25a 100644 --- a/browsers/edge.json +++ b/browsers/edge.json @@ -5,8 +5,7 @@ "type": "desktop", "upstream": "chrome", "pref_url": "about:flags", - "accepts_flags": true, - "accepts_webextensions": true, + "accepts": ["flags", "webextensions"], "releases": { "12": { "release_date": "2015-07-29", diff --git a/browsers/firefox.json b/browsers/firefox.json index a85fcb4f2231a4..71a84ac6255e6c 100644 --- a/browsers/firefox.json +++ b/browsers/firefox.json @@ -5,8 +5,7 @@ "type": "desktop", "preview_name": "Nightly", "pref_url": "about:config", - "accepts_flags": true, - "accepts_webextensions": true, + "accepts": ["flags", "webextensions"], "releases": { "1": { "release_date": "2004-11-09", diff --git a/browsers/firefox_android.json b/browsers/firefox_android.json index 3b90752a47fad5..0a6d6071f0e34e 100644 --- a/browsers/firefox_android.json +++ b/browsers/firefox_android.json @@ -5,8 +5,7 @@ "type": "mobile", "upstream": "firefox", "pref_url": "about:config", - "accepts_flags": false, - "accepts_webextensions": true, + "accepts": ["webextensions"], "releases": { "4": { "release_date": "2011-03-29", diff --git a/browsers/ie.json b/browsers/ie.json index cb3101261545a3..a0fa86340c9665 100644 --- a/browsers/ie.json +++ b/browsers/ie.json @@ -3,8 +3,7 @@ "ie": { "name": "Internet Explorer", "type": "desktop", - "accepts_flags": false, - "accepts_webextensions": false, + "accepts": [], "releases": { "1": { "release_date": "1995-08-16", diff --git a/browsers/nodejs.json b/browsers/nodejs.json index 0634d7a7be3e21..ee0068843975a7 100644 --- a/browsers/nodejs.json +++ b/browsers/nodejs.json @@ -3,8 +3,7 @@ "nodejs": { "name": "Node.js", "type": "server", - "accepts_flags": true, - "accepts_webextensions": false, + "accepts": ["flags"], "releases": { "0.10.0": { "release_date": "2013-03-11", diff --git a/browsers/oculus.json b/browsers/oculus.json index efd2d17b86964a..03f8df040ec38a 100644 --- a/browsers/oculus.json +++ b/browsers/oculus.json @@ -5,8 +5,7 @@ "type": "xr", "upstream": "chrome_android", "pref_url": "chrome://flags", - "accepts_flags": true, - "accepts_webextensions": false, + "accepts": ["flags"], "releases": { "5.0": { "release_notes": "https://developer.oculus.com/documentation/web/browser-release-notes/#oculus-browser-50", diff --git a/browsers/opera.json b/browsers/opera.json index ea05bab71239f4..c6fafc669a2512 100644 --- a/browsers/opera.json +++ b/browsers/opera.json @@ -5,8 +5,7 @@ "type": "desktop", "upstream": "chrome", "pref_url": "opera://flags", - "accepts_flags": true, - "accepts_webextensions": true, + "accepts": ["flags", "webextensions"], "releases": { "2": { "release_date": "1996-07-14", diff --git a/browsers/opera_android.json b/browsers/opera_android.json index 7123fafcd62d24..f8b1618e954604 100644 --- a/browsers/opera_android.json +++ b/browsers/opera_android.json @@ -4,8 +4,7 @@ "name": "Opera Android", "type": "mobile", "upstream": "chrome_android", - "accepts_flags": false, - "accepts_webextensions": false, + "accepts": [], "releases": { "10.1": { "release_date": "2010-11-09", diff --git a/browsers/safari.json b/browsers/safari.json index c3f0053245fea2..877429f7446aab 100644 --- a/browsers/safari.json +++ b/browsers/safari.json @@ -4,8 +4,7 @@ "name": "Safari", "type": "desktop", "preview_name": "TP", - "accepts_flags": true, - "accepts_webextensions": true, + "accepts": ["flags", "webextensions"], "releases": { "1": { "release_date": "2003-06-23", diff --git a/browsers/safari_ios.json b/browsers/safari_ios.json index 893330e3b5037a..acdaa11873bde3 100644 --- a/browsers/safari_ios.json +++ b/browsers/safari_ios.json @@ -4,8 +4,7 @@ "name": "Safari on iOS", "type": "mobile", "upstream": "safari", - "accepts_flags": true, - "accepts_webextensions": true, + "accepts": ["flags", "webextensions"], "releases": { "1": { "release_date": "2007-06-29", diff --git a/browsers/samsunginternet_android.json b/browsers/samsunginternet_android.json index 1681b2b6fc6438..6a3de1cefd537b 100644 --- a/browsers/samsunginternet_android.json +++ b/browsers/samsunginternet_android.json @@ -4,8 +4,7 @@ "name": "Samsung Internet", "type": "mobile", "upstream": "chrome_android", - "accepts_flags": false, - "accepts_webextensions": false, + "accepts": [], "releases": { "1.0": { "release_date": "2013-04-27", diff --git a/browsers/webview_android.json b/browsers/webview_android.json index 4d1f00bda4e0ac..207a4edad988eb 100644 --- a/browsers/webview_android.json +++ b/browsers/webview_android.json @@ -4,8 +4,7 @@ "name": "WebView Android", "type": "mobile", "upstream": "chrome_android", - "accepts_flags": false, - "accepts_webextensions": false, + "accepts": [], "releases": { "1": { "release_date": "2008-09-23", diff --git a/browsers/webview_ios.json b/browsers/webview_ios.json index 0b1018e3b96194..f9d3d3d14ca93b 100644 --- a/browsers/webview_ios.json +++ b/browsers/webview_ios.json @@ -4,8 +4,7 @@ "name": "WebView on iOS", "type": "mobile", "upstream": "safari_ios", - "accepts_flags": false, - "accepts_webextensions": false, + "accepts": [], "releases": { "1": { "release_date": "2007-06-29", diff --git a/lint/linter/test-browsers-data.test.ts b/lint/linter/test-browsers-data.test.ts index d7271a47565068..f3d9c68b578cb1 100644 --- a/lint/linter/test-browsers-data.test.ts +++ b/lint/linter/test-browsers-data.test.ts @@ -20,8 +20,7 @@ describe('test-browsers-data', () => { const data: BrowserStatement = { name: 'Node.js', type: 'server', - accepts_flags: true, - accepts_webextensions: false, + accepts: ['flags'], releases: { '20.6.0': { release_date: '2023-09-04', @@ -43,8 +42,7 @@ describe('test-browsers-data', () => { const data: BrowserStatement = { name: 'Firefox', type: 'desktop', - accepts_flags: true, - accepts_webextensions: true, + accepts: ['flags', 'webextensions'], releases: { '1': { status: 'nightly' }, '2': { status: 'nightly' }, @@ -59,8 +57,7 @@ describe('test-browsers-data', () => { const data: BrowserStatement = { name: 'Node.js', type: 'server', - accepts_flags: true, - accepts_webextensions: false, + accepts: ['flags'], releases: { '1': { status: 'nightly' }, '2': { status: 'nightly' }, @@ -76,8 +73,7 @@ describe('test-browsers-data', () => { name: 'Safari iOS', type: 'mobile', upstream: browser, - accepts_flags: false, - accepts_webextensions: false, + accepts: [], releases: {}, }; @@ -91,8 +87,7 @@ describe('test-browsers-data', () => { name: 'Safari iOS', type: 'mobile', upstream: 'unknown' as any, - accepts_flags: false, - accepts_webextensions: false, + accepts: [], releases: {}, }; @@ -107,8 +102,7 @@ describe('test-browsers-data', () => { type: 'desktop', upstream: 'chrome', pref_url: 'opera://flags', - accepts_flags: true, - accepts_webextensions: true, + accepts: ['flags', 'webextensions'], releases: { '97': { status: 'retired', diff --git a/lint/linter/test-browsers-presence.ts b/lint/linter/test-browsers-presence.ts index fc188450f00ab1..a322529911ef68 100644 --- a/lint/linter/test-browsers-presence.ts +++ b/lint/linter/test-browsers-presence.ts @@ -35,14 +35,16 @@ const processData = ( ? ['server'] : []), ].includes(browsers[b].type) && - (category !== 'webextensions' || browsers[b].accepts_webextensions), + (category !== 'webextensions' || + browsers[b].accepts.includes('webextensions')), ); const requiredBrowsers = ( Object.keys(browsers) as (keyof typeof browsers)[] ).filter( (b) => browsers[b].type == 'desktop' && - (category !== 'webextensions' || browsers[b].accepts_webextensions), + (category !== 'webextensions' || + browsers[b].accepts.includes('webextensions')), ); const undefEntries = definedBrowsers.filter( diff --git a/lint/linter/test-mirror.ts b/lint/linter/test-mirror.ts index e82fd166347945..17683805ba6c8e 100644 --- a/lint/linter/test-mirror.ts +++ b/lint/linter/test-mirror.ts @@ -23,7 +23,9 @@ const checkMirroring = ( ): void => { const browsersToCheck = Object.keys(browsers) .filter((b) => - category === 'webextensions' ? browsers[b].accepts_webextensions : !!b, + category === 'webextensions' + ? browsers[b].accepts.includes('webextensions') + : !!b, ) .filter((b) => browsers[b].upstream) as BrowserName[]; diff --git a/lint/linter/test-versions.ts b/lint/linter/test-versions.ts index 275ffe7b092601..7e4782c0a14f66 100644 --- a/lint/linter/test-versions.ts +++ b/lint/linter/test-versions.ts @@ -132,7 +132,9 @@ const checkVersions = ( logger: Logger, ): void => { const browsersToCheck = Object.keys(browsers).filter((b) => - category === 'webextensions' ? browsers[b].accepts_webextensions : !!b, + category === 'webextensions' + ? browsers[b].accepts.includes('webextensions') + : !!b, ) as BrowserName[]; for (const browser of browsersToCheck) { @@ -202,7 +204,10 @@ const checkVersions = ( } } - if ('flags' in statement && !browsers[browser].accepts_flags) { + if ( + 'flags' in statement && + !browsers[browser].accepts?.includes('flags') + ) { logger.error( chalk`This browser ({bold ${browser}}) does not support flags, so support cannot be behind a flag for this feature.`, ); diff --git a/schemas/browsers-schema.md b/schemas/browsers-schema.md index 651594a0de8664..222c478918b1bb 100644 --- a/schemas/browsers-schema.md +++ b/schemas/browsers-schema.md @@ -16,8 +16,7 @@ Below is an example of the browser data: "type": "desktop", "preview_name": "Nightly", "pref_url": "about:config", - "accepts_flags": true, - "accepts_webextensions": true, + "accepts" ["flags", "webextensions"], "releases": { "1.5": { "release_date": "2005-11-29", @@ -46,13 +45,14 @@ The `type` string is a required property which indicates the platform category t The `upstream` string is an optional property which indicates the upstream browser updates are derived from. For example, Firefox Android's upstream browser is Firefox (desktop), and Edge's upstream browser is Chrome. This is used for mirroring data between browsers. Valid options are any browser defined in the data. -### `accepts_flags` +### `accepts` -An optional boolean indicating whether the browser supports flags. If it is set to `false`, flag data will not be allowed for that browser. +An optional array indicating which additional features the browser supports. Possible items are: -### `accepts_webextensions` +- `flags` - if the browser supports flags. +- `webextensions` - if the browser supports web extensions. -An optional boolean indicating whether the browser supports web extensions. A `true` value will allow this browser to be defined in web extensions support. +The value is used to determine if support data for this feature can be added for the browser. ### `pref_url` diff --git a/schemas/browsers.schema.json b/schemas/browsers.schema.json index efe46ff6a84f6b..df056f618aa5c2 100644 --- a/schemas/browsers.schema.json +++ b/schemas/browsers.schema.json @@ -72,13 +72,11 @@ "type": "string", "description": "URL of the page where feature flags can be changed (e.g. 'about:config' for Firefox or 'chrome://flags' for Chrome)." }, - "accepts_flags": { - "type": "boolean", - "description": "Whether the browser supports user-toggleable flags that enable or disable features." - }, - "accepts_webextensions": { - "type": "boolean", - "description": "Whether the browser supports extensions." + "accepts": { + "type": "array", + "additionalProperties": { "$ref": "#/definitions/accepts_value" }, + "description": "The additional features the browser supports.", + "tsType": "AcceptsValue[]" }, "releases": { "type": "object", @@ -87,16 +85,28 @@ "tsType": "{ [version: string]: ReleaseStatement };" } }, - "required": [ - "name", - "type", - "releases", - "accepts_flags", - "accepts_webextensions" - ], + "required": ["name", "type", "releases", "accepts"], "additionalProperties": false }, + "accepts_value": { + "type": "array", + "items": { + "oneOf": [ + { + "const": "flags", + "description": "User-toggleable flags that enable or disable features." + }, + { + "const": "webextensions", + "description": "Extensions." + } + ] + }, + "uniqueItems": true, + "tsType": "\"flags\" | \"webextensions\"" + }, + "release_statement": { "type": "object", "properties": { diff --git a/scripts/build/mirror.ts b/scripts/build/mirror.ts index 66549d78509565..72b623a62d4673 100644 --- a/scripts/build/mirror.ts +++ b/scripts/build/mirror.ts @@ -210,7 +210,7 @@ export const bumpSupport = ( const newData: SimpleSupportStatement = copyStatement(sourceData); - if (!browsers[destination].accepts_flags && newData.flags) { + if (!browsers[destination].accepts?.includes('flags') && newData.flags) { // Remove flag data if the target browser doesn't accept flags return { version_added: false }; } diff --git a/scripts/lib/stringify-and-order-properties.ts b/scripts/lib/stringify-and-order-properties.ts index 725948f9b456e3..14458119d437cf 100644 --- a/scripts/lib/stringify-and-order-properties.ts +++ b/scripts/lib/stringify-and-order-properties.ts @@ -19,8 +19,7 @@ const propOrder = { 'upstream', 'preview_name', 'pref_url', - 'accepts_flags', - 'accepts_webextensions', + 'accepts', 'releases', ], release: [ diff --git a/scripts/traverse.ts b/scripts/traverse.ts index 0d4062d5ac39e9..090401e3bccc3f 100644 --- a/scripts/traverse.ts +++ b/scripts/traverse.ts @@ -75,7 +75,7 @@ export function* iterateFeatures( if ( !( identifier.startsWith('webextensions.') && - bcd.browsers[browser].accepts_webextensions + bcd.browsers[browser].accepts?.includes('webextensions') ) ) { continue;