diff --git a/.eslintrc-test-paths.js b/.eslintrc-test-paths.js index 3a42e5fbe8d90722b7fd4d4efea22037b82b8b6d..e93e11ff34383ab104af823645bf05c499839126 100644 --- a/.eslintrc-test-paths.js +++ b/.eslintrc-test-paths.js @@ -6,8 +6,21 @@ /* eslint-env node */ -// The expressions defined below for test paths are the main path formats we +// The `*testPaths` defined below for test paths are the main path formats we // prefer to support for tests as they are commonly used across the tree. + +// We prefer the tests to be in named directories as this makes it easier +// to identify the types of tests developers are working with. Additionally, +// it is not possible to scope ESLint rules to individual files based on .ini +// files without a build step that would break editors, or an expensive loading +// cycle. + +// Please do not add more cases of multiple test types in a single +// directory. This may cause ESLint rules to be incorrectly applied to the wrong +// tests, leading to false negatives. It could cause the wrong sets of globals +// to be defined in the scope, causing false positives when checking for no +// undefined variables. + // See https://firefox-source-docs.mozilla.org/code-quality/lint/linters/eslint.html#i-m-adding-tests-how-do-i-set-up-the-right-configuration // for more information. @@ -31,11 +44,426 @@ const xpcshellTestPaths = [ "**/test*/xpcshell/**/", ]; +// NOTE: Before adding to the list below, please see the note at the top +// of the file. + +const extraXpcshellTestPaths = [ + "devtools/platform/tests/xpcshell/", + "dom/file/tests/", + "dom/ipc/tests/", + "intl/benchmarks/", + "intl/l10n/test/", + "ipc/testshell/tests/", + "memory/replace/dmd/test/", + "netwerk/test/httpserver/test/", + "testing/modules/tests/xpcshell/", + "toolkit/components/backgroundhangmonitor/tests/", + "toolkit/components/downloads/test/data/", + "toolkit/components/mozintl/test/", + "toolkit/components/places/tests/", + "toolkit/components/places/tests/bookmarks/", + "toolkit/components/places/tests/expiration/", + "toolkit/components/places/tests/favicons/", + "toolkit/components/places/tests/history/", + "toolkit/components/places/tests/legacy/", + "toolkit/components/places/tests/migration/", + "toolkit/components/places/tests/queries/", + "toolkit/components/thumbnails/test/", + "toolkit/modules/tests/modules/", + "toolkit/mozapps/update/tests/data/", + "toolkit/profile/xpcshell/", + "toolkit/xre/test/", + "widget/headless/tests/", +]; + +// NOTE: Before adding to the list below, please see the note at the top +// of the file. + +const extraBrowserTestPaths = [ + "dom/ipc/tests/", + "toolkit/components/thumbnails/test/", + "toolkit/xre/test/", + "browser/base/content/test/about/", + "browser/base/content/test/alerts/", + "browser/base/content/test/backforward/", + "browser/base/content/test/caps/", + "browser/base/content/test/captivePortal/", + "browser/base/content/test/contentTheme/", + "browser/base/content/test/contextMenu/", + "browser/base/content/test/favicons/", + "browser/base/content/test/forms/", + "browser/base/content/test/fullscreen/", + "browser/base/content/test/general/", + "browser/base/content/test/gesture/", + "browser/base/content/test/historySwipeAnimation/", + "browser/base/content/test/keyboard/", + "browser/base/content/test/menubar/", + "browser/base/content/test/metaTags/", + "browser/base/content/test/notificationbox/", + "browser/base/content/test/outOfProcess/", + "browser/base/content/test/pageActions/", + "browser/base/content/test/pageStyle/", + "browser/base/content/test/pageinfo/", + "browser/base/content/test/performance/", + "browser/base/content/test/permissions/", + "browser/base/content/test/plugins/", + "browser/base/content/test/popupNotifications/", + "browser/base/content/test/popups/", + "browser/base/content/test/protectionsUI/", + "browser/base/content/test/referrer/", + "browser/base/content/test/sanitize/", + "browser/base/content/test/sidebar/", + "browser/base/content/test/siteIdentity/", + "browser/base/content/test/startup/", + "browser/base/content/test/static/", + "browser/base/content/test/statuspanel/", + "browser/base/content/test/sync/", + "browser/base/content/test/tabMediaIndicator/", + "browser/base/content/test/tabPrompts/", + "browser/base/content/test/tabcrashed/", + "browser/base/content/test/tabdialogs/", + "browser/base/content/test/tabs/", + "browser/base/content/test/touch/", + "browser/base/content/test/utilityOverlay/", + "browser/base/content/test/webextensions/", + "browser/base/content/test/webrtc/", + "browser/base/content/test/zoom/", + "browser/components/customizableui/test/", + "browser/components/pocket/test/", + "browser/components/preferences/tests/", + "browser/components/safebrowsing/content/test/", + "browser/components/sessionstore/test/", + "browser/components/shell/test/", + "browser/components/touchbar/tests/", + "browser/components/translation/test/", + "browser/components/uitour/test/", + "browser/extensions/report-site-issue/test/browser/", + "browser/tools/mozscreenshots/", + "caps/tests/mochitest/", + "devtools/client/debugger/test/mochitest/", + "devtools/client/dom/test/", + "devtools/client/framework/browser-toolbox/test/", + "devtools/client/framework/test/", + "devtools/client/inspector/animation/test/", + "devtools/client/inspector/boxmodel/test/", + "devtools/client/inspector/changes/test/", + "devtools/client/inspector/computed/test/", + "devtools/client/inspector/extensions/test/", + "devtools/client/inspector/flexbox/test/", + "devtools/client/inspector/fonts/test/", + "devtools/client/inspector/grids/test/", + "devtools/client/inspector/markup/test/", + "devtools/client/inspector/rules/test/", + "devtools/client/inspector/shared/test/", + "devtools/client/inspector/test/", + "devtools/client/jsonview/test/", + "devtools/client/memory/test/browser/", + "devtools/client/netmonitor/src/har/test/", + "devtools/client/netmonitor/test/", + "devtools/client/shared/sourceeditor/test/", + "devtools/client/shared/test/", + "devtools/client/storage/test/", + "devtools/client/styleeditor/test/", + "devtools/shared/commands/inspected-window/tests/", + "devtools/shared/commands/inspector/tests/", + "devtools/shared/commands/resource/tests/", + "devtools/shared/commands/script/tests/", + "devtools/shared/commands/target-configuration/tests/", + "devtools/shared/commands/target/tests/", + "devtools/shared/commands/thread-configuration/tests/", + "devtools/shared/test-helpers/", + "docshell/test/navigation/", + "dom/base/test/", + "dom/broadcastchannel/tests/", + "dom/events/test/", + "dom/fetch/tests/", + "dom/html/test/", + "dom/indexedDB/test/", + "dom/ipc/tests/", + "dom/l10n/tests/mochitest/", + "dom/localstorage/test/", + "dom/manifest/test/", + "dom/midi/tests/", + "dom/payments/test/", + "dom/plugins/test/mochitest/", + "dom/reporting/tests/", + "dom/security/test/general/", + "dom/security/test/https-first/", + "dom/security/test/https-only/", + "dom/security/test/referrer-policy/", + "dom/security/test/sec-fetch/", + "dom/serviceworkers/test/", + "dom/tests/browser/", + "dom/url/tests/", + "dom/workers/test/", + "dom/xhr/tests/", + "editor/libeditor/tests/", + "extensions/permissions/test/", + "layout/base/tests/", + "layout/style/test/", + "layout/xul/test/", + "parser/htmlparser/tests/mochitest/", + "security/sandbox/test/", + "testing/mochitest/baselinecoverage/browser_chrome/", + "testing/mochitest/tests/python/files/", + "toolkit/components/alerts/test/", + "toolkit/components/mozprotocol/tests/", + "toolkit/components/narrate/test/", + "toolkit/components/pdfjs/test/", + "toolkit/components/pictureinpicture/tests/", + "toolkit/components/printing/tests/", + "toolkit/components/reader/test/", + "toolkit/components/thumbnails/test/", + "toolkit/components/tooltiptext/tests/", + "toolkit/components/windowcreator/test/", + "toolkit/components/windowwatcher/test/", + "toolkit/mozapps/extensions/test/xpinstall/", + "uriloader/exthandler/tests/mochitest/", +]; + +// NOTE: Before adding to the list below, please see the note at the top +// of the file. + +const extraChromeTestPaths = [ + "devtools/shared/security/tests/chrome/", + "devtools/shared/webconsole/test/chrome/", + "dom/base/test/", + "dom/battery/test/", + "dom/bindings/test/", + "dom/console/tests/", + "dom/encoding/test/", + "dom/events/test/", + "dom/flex/test/", + "dom/grid/test/", + "dom/html/test/", + "dom/html/test/forms/", + "dom/indexedDB/test/", + "dom/messagechannel/tests/", + "dom/network/tests/", + "dom/promise/tests/", + "dom/security/test/general/", + "dom/security/test/sec-fetch/", + "dom/serviceworkers/test/", + "dom/system/tests/", + "dom/url/tests/", + "dom/websocket/tests/", + "dom/workers/test/", + "dom/xul/test/", + "editor/composer/test/", + "extensions/universalchardet/tests/", + "gfx/layers/apz/test/mochitest/", + "image/test/mochitest/", + "layout/forms/test/", + "layout/generic/test/", + "layout/mathml/tests/", + "layout/svg/tests/", + "layout/xul/test/", + "toolkit/components/aboutmemory/tests/", + "toolkit/components/osfile/tests/mochi/", + "toolkit/components/printing/tests/", + "toolkit/components/url-classifier/tests/mochitest/", + "toolkit/components/viewsource/test/", + "toolkit/components/windowcreator/test/", + "toolkit/components/windowwatcher/test/", + "toolkit/components/workerloader/tests/", + "toolkit/content/tests/widgets/", + "toolkit/profile/test/", + "widget/tests/", + "xpfe/appshell/test/", +]; + +// NOTE: Before adding to the list below, please see the note at the top +// of the file. + +const extraMochitestTestPaths = [ + "dom/file/tests/", + "dom/ipc/tests/", + "toolkit/xre/test/", + "accessible/tests/crashtests/", + "browser/components/protocolhandler/test/", + "caps/tests/mochitest/", + "docshell/test/iframesandbox/", + "docshell/test/navigation/", + "dom/abort/tests/", + "dom/animation/test/mozilla/", + "dom/animation/test/style/", + "dom/base/test/", + "dom/battery/test/", + "dom/bindings/test/", + "dom/broadcastchannel/tests/", + "dom/canvas/test/", + "dom/console/tests/", + "dom/credentialmanagement/tests/", + "dom/crypto/test/", + "dom/encoding/test/", + "dom/events/test/", + "dom/file/tests/", + "dom/filesystem/compat/tests/", + "dom/filesystem/tests/", + "dom/html/test/", + "dom/html/test/forms/", + "dom/indexedDB/test/", + "dom/ipc/tests/", + "dom/jsurl/test/", + "dom/localstorage/test/", + "dom/locks/test/", + "dom/manifest/test/", + "dom/media/mediasession/test/", + "dom/media/mediasource/test/", + "dom/media/test/", + "dom/media/webspeech/recognition/test/", + "dom/media/webspeech/synth/test/", + "dom/messagechannel/tests/", + "dom/midi/tests/", + "dom/network/tests/", + "dom/payments/test/", + "dom/performance/tests/", + "dom/permission/tests/", + "dom/plugins/test/mochitest/", + "dom/promise/tests/", + "dom/push/test/", + "dom/quota/test/modules/content/", + "dom/reporting/tests/", + "dom/security/test/https-only/", + "dom/security/test/referrer-policy/", + "dom/security/test/sec-fetch/", + "dom/security/test/sri/", + "dom/serviceworkers/test/", + "dom/smil/test/", + "dom/svg/test/", + "dom/system/tests/", + "dom/u2f/tests/", + "dom/url/tests/", + "dom/webauthn/tests/", + "dom/websocket/tests/", + "dom/workers/test/", + "dom/worklet/tests/", + "dom/xhr/tests/", + "dom/xml/test/", + "dom/xul/test/", + "editor/composer/test/", + "editor/libeditor/tests/", + "editor/spellchecker/tests/", + "extensions/permissions/test/", + "gfx/layers/apz/test/mochitest/", + "image/test/mochitest/", + "intl/uconv/tests/", + "layout/base/tests/", + "layout/forms/test/", + "layout/generic/test/", + "layout/inspector/tests/", + "layout/mathml/tests/", + "layout/style/test/", + "layout/svg/tests/", + "layout/tables/test/", + "layout/xul/test/", + "parser/htmlparser/tests/mochitest/", + "services/sync/tests/tps/", + "testing/mochitest/baselinecoverage/plain/", + "testing/mochitest/tests/python/files/", + "toolkit/components/alerts/test/", + "toolkit/components/passwordmgr/test/mochitest/", + "toolkit/components/prompts/test/", + "toolkit/components/satchel/test/", + "toolkit/components/url-classifier/tests/mochitest/", + "toolkit/components/windowcreator/test/", + "toolkit/components/windowwatcher/test/", + "toolkit/content/tests/widgets/", + "toolkit/xre/test/", + "uriloader/exthandler/tests/mochitest/", + "widget/tests/", +]; + +// Please DO NOT add more entries to the list below. +// Doing so may cause conflicts in ESLint rules and globals, and cause +// unexpected issues to be raised or missed. +let expectedDupePaths = new Set([ + "caps/tests/mochitest/", + "docshell/test/navigation/", + "dom/base/test/", + "dom/battery/test/", + "dom/bindings/test/", + "dom/broadcastchannel/tests/", + "dom/console/tests/", + "dom/encoding/test/", + "dom/events/test/", + "dom/file/tests/", + "dom/indexedDB/test/", + "dom/ipc/tests/", + "dom/localstorage/test/", + "dom/html/test/", + "dom/html/test/forms/", + "dom/manifest/test/", + "dom/messagechannel/tests/", + "dom/midi/tests/", + "dom/network/tests/", + "dom/payments/test/", + "dom/plugins/test/mochitest/", + "dom/promise/tests/", + "dom/reporting/tests/", + "dom/security/test/general/", + "dom/security/test/https-only/", + "dom/security/test/referrer-policy/", + "dom/security/test/sec-fetch/", + "dom/serviceworkers/test/", + "dom/system/tests/", + "dom/url/tests/", + "dom/websocket/tests/", + "dom/workers/test/", + "dom/xhr/tests/", + "dom/xul/test/", + "editor/composer/test/", + "editor/libeditor/tests/", + "extensions/permissions/test/", + "gfx/layers/apz/test/mochitest/", + "image/test/mochitest/", + "layout/base/tests/", + "layout/forms/test/", + "layout/generic/test/", + "layout/mathml/tests/", + "layout/style/test/", + "layout/svg/tests/", + "layout/xul/test/", + "parser/htmlparser/tests/mochitest/", + "testing/mochitest/tests/python/files/", + "toolkit/components/alerts/test/", + "toolkit/components/printing/tests/", + "toolkit/components/thumbnails/test/", + "toolkit/components/url-classifier/tests/mochitest/", + "toolkit/components/windowcreator/test/", + "toolkit/components/windowwatcher/test/", + "toolkit/content/tests/widgets/", + "toolkit/xre/test/", + "uriloader/exthandler/tests/mochitest/", + "widget/tests/", +]); +// Please DO NOT add more paths to the list above. + +let paths = new Set(extraXpcshellTestPaths); +for (let path of [ + ...extraBrowserTestPaths, + ...extraChromeTestPaths, + ...extraMochitestTestPaths, +]) { + if (paths.has(path) && !expectedDupePaths.has(path)) { + throw new Error(` +Unexpected directory containing different test types: ${path} + +Please do not add new paths containing different test types. Please use +separate directories. + +Having different test types in the same directory may cause ESLint rules to be +incorrectly applied. +`); + } + paths.add(path); +} + module.exports = { testPaths: { - browser: [...browserTestPaths], - chrome: [...chromeTestPaths], - mochitest: [...mochitestTestPaths], - xpcshell: [...xpcshellTestPaths], + browser: [...browserTestPaths, ...extraBrowserTestPaths], + chrome: [...chromeTestPaths, ...extraChromeTestPaths], + mochitest: [...mochitestTestPaths, ...extraMochitestTestPaths], + xpcshell: [...xpcshellTestPaths, ...extraXpcshellTestPaths], }, }; diff --git a/.eslintrc.js b/.eslintrc.js index 4b955f7a2cfb9d989481087945363ce02f18a3a6..54bcd9b90228ba031ad88c273e5663088902e9e5 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -130,7 +130,6 @@ module.exports = { { ...removeOverrides(xpcshellTestConfig), files: testPaths.xpcshell.map(path => `${path}**`), - excludedFiles: "devtools/**", }, { // If it is an xpcshell head file, we turn off global unused variable checks, as it diff --git a/docs/code-quality/lint/linters/eslint.rst b/docs/code-quality/lint/linters/eslint.rst index 1d4e814a8dfb9b46bd836708b57fbd0b3a64c470..3a8dea0df90ec1e58c1fb63c493a6671982e9aab 100644 --- a/docs/code-quality/lint/linters/eslint.rst +++ b/docs/code-quality/lint/linters/eslint.rst @@ -52,6 +52,12 @@ My editor doesn't understand a new global I've just added (e.g. to a content fil I'm adding tests, how do I set up the right configuration? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Please note we prefer the tests to be in named directories as this makes it +easier to identify the types of tests developers are working with. Additionally, +it is not possible to scope ESLint rules to individual files based on .ini +files without a build step that would break editors, or an expensive loading +cycle. + * If the directory path of the tests is one of the `known ones`_, then ESLint will do the right thing for that test type. This is the preferred option. @@ -59,10 +65,11 @@ I'm adding tests, how do I set up the right configuration? will set up ESLint correctly. * If you really can't match the directory name, e.g. like the - ``browser/base/content/tests/*``, then you'll need `a file in the directory`_. + ``browser/base/content/tests/*``, then you'll need to add a new entry in + :searchfox:`.eslintrc-test-paths.js <.eslintrc-test-paths.js>`. -Note: If you have multiple types of tests within a single directory, this is -`difficult for ESLint to handle`_. Currently this may cause: +Please do not add new cases of multiple types of tests within a single directory, +this is `difficult for ESLint to handle`_. Currently this may cause: * Rules to be incorrectly applied to the wrong types of test file. * Extra definitions for globals in tests which means that the no undefined variables @@ -143,5 +150,4 @@ Sources .. _Configuration (YAML): https://searchfox.org/mozilla-central/source/tools/lint/eslint.yml .. _Source: https://searchfox.org/mozilla-central/source/tools/lint/eslint/__init__.py .. _known ones: https://searchfox.org/mozilla-central/rev/287583a4a605eee8cd2d41381ffaea7a93d7b987/.eslintrc.js#24-40 -.. _a file in the directory: https://searchfox.org/mozilla-central/source/browser/base/content/test/popups/.eslintrc.js .. _difficult for ESLint to handle: https://bugzilla.mozilla.org/show_bug.cgi?id=1379669