diff --git a/browsers/chrome.json b/browsers/chrome.json index d907bc0f016a6b..67617359886efe 100644 --- a/browsers/chrome.json +++ b/browsers/chrome.json @@ -5,8 +5,10 @@ "type": "desktop", "preview_name": "Canary", "pref_url": "chrome://flags", - "accepts_flags": true, - "accepts_webextensions": true, + "accepts": { + "flags": true, + "webextensions": true + }, "releases": { "1": { "release_date": "2008-12-11", diff --git a/browsers/chrome_android.json b/browsers/chrome_android.json index a638e0cb673008..74f6aeb3e4ab19 100644 --- a/browsers/chrome_android.json +++ b/browsers/chrome_android.json @@ -5,8 +5,9 @@ "type": "mobile", "upstream": "chrome", "pref_url": "chrome://flags", - "accepts_flags": true, - "accepts_webextensions": false, + "accepts": { + "flags": true + }, "releases": { "18": { "release_date": "2012-06-27", diff --git a/browsers/deno.json b/browsers/deno.json index 501123849697a3..618499a1cec6d3 100644 --- a/browsers/deno.json +++ b/browsers/deno.json @@ -3,8 +3,9 @@ "deno": { "name": "Deno", "type": "server", - "accepts_flags": true, - "accepts_webextensions": false, + "accepts": { + "flags": true + }, "releases": { "1.0": { "release_date": "2020-05-13", diff --git a/browsers/edge.json b/browsers/edge.json index 9badf319e46098..a9523f6c0a74c0 100644 --- a/browsers/edge.json +++ b/browsers/edge.json @@ -5,8 +5,10 @@ "type": "desktop", "upstream": "chrome", "pref_url": "about:flags", - "accepts_flags": true, - "accepts_webextensions": true, + "accepts": { + "flags": true, + "webextensions": true + }, "releases": { "12": { "release_date": "2015-07-29", diff --git a/browsers/firefox.json b/browsers/firefox.json index 31306d14ab98bc..220b1bae2e9fb4 100644 --- a/browsers/firefox.json +++ b/browsers/firefox.json @@ -5,8 +5,10 @@ "type": "desktop", "preview_name": "Nightly", "pref_url": "about:config", - "accepts_flags": true, - "accepts_webextensions": true, + "accepts": { + "flags": true, + "webextensions": true + }, "releases": { "1": { "release_date": "2004-11-09", diff --git a/browsers/firefox_android.json b/browsers/firefox_android.json index c5b44524343d9a..bccaf943b0ff39 100644 --- a/browsers/firefox_android.json +++ b/browsers/firefox_android.json @@ -5,8 +5,9 @@ "type": "mobile", "upstream": "firefox", "pref_url": "about:config", - "accepts_flags": false, - "accepts_webextensions": true, + "accepts": { + "webextensions": true + }, "releases": { "4": { "release_date": "2011-03-29", diff --git a/browsers/ie.json b/browsers/ie.json index cb3101261545a3..d482dee1a3f1f9 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..c18ee7b3768803 100644 --- a/browsers/nodejs.json +++ b/browsers/nodejs.json @@ -3,8 +3,9 @@ "nodejs": { "name": "Node.js", "type": "server", - "accepts_flags": true, - "accepts_webextensions": false, + "accepts": { + "flags": true + }, "releases": { "0.10.0": { "release_date": "2013-03-11", diff --git a/browsers/oculus.json b/browsers/oculus.json index efd2d17b86964a..f83670e4347df0 100644 --- a/browsers/oculus.json +++ b/browsers/oculus.json @@ -5,8 +5,9 @@ "type": "xr", "upstream": "chrome_android", "pref_url": "chrome://flags", - "accepts_flags": true, - "accepts_webextensions": false, + "accepts": { + "flags": true + }, "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..697cc6775a8624 100644 --- a/browsers/opera.json +++ b/browsers/opera.json @@ -5,8 +5,10 @@ "type": "desktop", "upstream": "chrome", "pref_url": "opera://flags", - "accepts_flags": true, - "accepts_webextensions": true, + "accepts": { + "flags": true, + "webextensions": true + }, "releases": { "2": { "release_date": "1996-07-14", diff --git a/browsers/opera_android.json b/browsers/opera_android.json index 7123fafcd62d24..5c47a74a6a27bf 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 6b329492acf6b2..718bca7280d22a 100644 --- a/browsers/safari.json +++ b/browsers/safari.json @@ -4,8 +4,10 @@ "name": "Safari", "type": "desktop", "preview_name": "TP", - "accepts_flags": true, - "accepts_webextensions": true, + "accepts": { + "flags": true, + "webextensions": true + }, "releases": { "1": { "release_date": "2003-06-23", diff --git a/browsers/safari_ios.json b/browsers/safari_ios.json index 6b4c2a847a7091..8754a62b3181ad 100644 --- a/browsers/safari_ios.json +++ b/browsers/safari_ios.json @@ -4,8 +4,10 @@ "name": "Safari on iOS", "type": "mobile", "upstream": "safari", - "accepts_flags": true, - "accepts_webextensions": true, + "accepts": { + "flags": true, + "webextensions": true + }, "releases": { "1": { "release_date": "2007-06-29", diff --git a/browsers/samsunginternet_android.json b/browsers/samsunginternet_android.json index 1681b2b6fc6438..85e33fa5b45b13 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 3823fb235233f0..b0e8f38723221b 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 99d3cde2086052..03e0d3208c8ff8 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..8807550d6e8c04 100644 --- a/lint/linter/test-browsers-data.test.ts +++ b/lint/linter/test-browsers-data.test.ts @@ -20,8 +20,9 @@ describe('test-browsers-data', () => { const data: BrowserStatement = { name: 'Node.js', type: 'server', - accepts_flags: true, - accepts_webextensions: false, + accepts: { + flags: true, + }, releases: { '20.6.0': { release_date: '2023-09-04', @@ -43,8 +44,10 @@ describe('test-browsers-data', () => { const data: BrowserStatement = { name: 'Firefox', type: 'desktop', - accepts_flags: true, - accepts_webextensions: true, + accepts: { + flags: true, + webextensions: true, + }, releases: { '1': { status: 'nightly' }, '2': { status: 'nightly' }, @@ -59,8 +62,9 @@ describe('test-browsers-data', () => { const data: BrowserStatement = { name: 'Node.js', type: 'server', - accepts_flags: true, - accepts_webextensions: false, + accepts: { + flags: true, + }, releases: { '1': { status: 'nightly' }, '2': { status: 'nightly' }, @@ -76,8 +80,7 @@ describe('test-browsers-data', () => { name: 'Safari iOS', type: 'mobile', upstream: browser, - accepts_flags: false, - accepts_webextensions: false, + accepts: {}, releases: {}, }; @@ -91,8 +94,7 @@ describe('test-browsers-data', () => { name: 'Safari iOS', type: 'mobile', upstream: 'unknown' as any, - accepts_flags: false, - accepts_webextensions: false, + accepts: {}, releases: {}, }; @@ -107,8 +109,10 @@ describe('test-browsers-data', () => { type: 'desktop', upstream: 'chrome', pref_url: 'opera://flags', - accepts_flags: true, - accepts_webextensions: true, + accepts: { + flags: true, + webextensions: true, + }, releases: { '97': { status: 'retired', diff --git a/lint/linter/test-browsers-presence.ts b/lint/linter/test-browsers-presence.ts index fc188450f00ab1..eab92de5947433 100644 --- a/lint/linter/test-browsers-presence.ts +++ b/lint/linter/test-browsers-presence.ts @@ -35,14 +35,14 @@ const processData = ( ? ['server'] : []), ].includes(browsers[b].type) && - (category !== 'webextensions' || browsers[b].accepts_webextensions), + (category !== 'webextensions' || browsers[b].accepts.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.webextensions), ); const undefEntries = definedBrowsers.filter( diff --git a/lint/linter/test-mirror.ts b/lint/linter/test-mirror.ts index e82fd166347945..c0963f0d9bbe8b 100644 --- a/lint/linter/test-mirror.ts +++ b/lint/linter/test-mirror.ts @@ -23,7 +23,7 @@ const checkMirroring = ( ): void => { const browsersToCheck = Object.keys(browsers) .filter((b) => - category === 'webextensions' ? browsers[b].accepts_webextensions : !!b, + category === 'webextensions' ? browsers[b].accepts.webextensions : !!b, ) .filter((b) => browsers[b].upstream) as BrowserName[]; diff --git a/lint/linter/test-versions.ts b/lint/linter/test-versions.ts index 714fcf8d3abdcc..a71826fbf4537a 100644 --- a/lint/linter/test-versions.ts +++ b/lint/linter/test-versions.ts @@ -141,7 +141,7 @@ const checkVersions = ( logger: Logger, ): void => { const browsersToCheck = Object.keys(browsers).filter((b) => - category === 'webextensions' ? browsers[b].accepts_webextensions : !!b, + category === 'webextensions' ? browsers[b].accepts.webextensions : !!b, ) as BrowserName[]; for (const browser of browsersToCheck) { @@ -211,7 +211,7 @@ const checkVersions = ( } } - if ('flags' in statement && !browsers[browser].accepts_flags) { + if ('flags' in statement && !browsers[browser].accepts.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..378a69106f6903 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 object indicating which additional features the browser supports. Possible properties 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..df2a70d8fe4df0 100644 --- a/schemas/browsers.schema.json +++ b/schemas/browsers.schema.json @@ -72,13 +72,10 @@ "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": { + "$ref": "#/definitions/accepts_statement", + "description": "The additional features the browser supports.", + "tsType": "AcceptsStatement" }, "releases": { "type": "object", @@ -87,13 +84,22 @@ "tsType": "{ [version: string]: ReleaseStatement };" } }, - "required": [ - "name", - "type", - "releases", - "accepts_flags", - "accepts_webextensions" - ], + "required": ["name", "type", "releases", "accepts"], + "additionalProperties": false + }, + + "accepts_statement": { + "type": "object", + "properties": { + "flags": { + "type": "boolean", + "description": "Whether the browser supports user-toggleable flags that enable or disable features." + }, + "webextensions": { + "type": "boolean", + "description": "Whether the browser supports extensions." + } + }, "additionalProperties": false }, diff --git a/scripts/build/mirror.ts b/scripts/build/mirror.ts index 66549d78509565..31c7763fa08f3c 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.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..efe04b67eb19ea 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.webextensions ) ) { continue;