diff --git a/docs/code-quality/lint/linters/eslint-plugin-mozilla/rules/no-browser-refs-in-toolkit.rst b/docs/code-quality/lint/linters/eslint-plugin-mozilla/rules/no-browser-refs-in-toolkit.rst index 9f2501ba2337..93bf9cf407e9 100644 --- a/docs/code-quality/lint/linters/eslint-plugin-mozilla/rules/no-browser-refs-in-toolkit.rst +++ b/docs/code-quality/lint/linters/eslint-plugin-mozilla/rules/no-browser-refs-in-toolkit.rst @@ -11,6 +11,8 @@ Examples of incorrect code for this rule: .. code-block:: js "chrome://browser/content/browser.xhtml" + "moz-src:///browser/components/search/SearchUIUtils.sys.mjs" + "moz-src://foo/browser/components/search/Foo.sys.mjs" "resource:///modules/BrowserWindowTracker.sys.mjs" "browser/browser.ftl" @@ -20,5 +22,6 @@ Examples of correct code for this rule: .. code-block:: js "chrome://global/content/aboutAbout.html" + "moz-src:///toolkit/components/search/SearchService.sys.mjs" "resource://gre/modules/AppConstants.sys.mjs" "toolkit/global/aboutFoo.ftl" diff --git a/tools/lint/eslint/eslint-plugin-mozilla/lib/rules/no-browser-refs-in-toolkit.js b/tools/lint/eslint/eslint-plugin-mozilla/lib/rules/no-browser-refs-in-toolkit.js index fea94d364ece..a00b9632e305 100644 --- a/tools/lint/eslint/eslint-plugin-mozilla/lib/rules/no-browser-refs-in-toolkit.js +++ b/tools/lint/eslint/eslint-plugin-mozilla/lib/rules/no-browser-refs-in-toolkit.js @@ -34,7 +34,8 @@ module.exports = { node.value.startsWith("chrome://browser") || node.value.startsWith("resource:///") || node.value.startsWith("resource://app/") || - (node.value.startsWith("browser/") && node.value.endsWith(".ftl")) + (node.value.startsWith("browser/") && node.value.endsWith(".ftl")) || + /moz-src:\/\/\w*\/browser\//.test(node.value) ) { context.report({ node, diff --git a/tools/lint/eslint/eslint-plugin-mozilla/tests/no-browser-refs-in-toolkit.js b/tools/lint/eslint/eslint-plugin-mozilla/tests/no-browser-refs-in-toolkit.js new file mode 100644 index 000000000000..dab4de17bc45 --- /dev/null +++ b/tools/lint/eslint/eslint-plugin-mozilla/tests/no-browser-refs-in-toolkit.js @@ -0,0 +1,65 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +// ------------------------------------------------------------------------------ +// Requirements +// ------------------------------------------------------------------------------ + +var rule = require("../lib/rules/no-browser-refs-in-toolkit"); +var RuleTester = require("eslint").RuleTester; + +const ruleTester = new RuleTester({ + parserOptions: { ecmaVersion: "latest", sourceType: "module" }, +}); + +// ------------------------------------------------------------------------------ +// Tests +// ------------------------------------------------------------------------------ + +function invalidCode(code, url) { + return { + code, + errors: [ + { + messageId: "noBrowserChrome", + data: { url }, + type: "Literal", + }, + ], + }; +} + +ruleTester.run("no-browser-refs-in-toolkit", rule, { + valid: [ + 'import foo from "chrome://global/content/aboutAbout.html"', + 'ChromeUtils.importESModule("resource://gre/modules/AppConstants.sys.mjs")', + 'ChromeUtils.defineESModuleGetters(null, {foo: "toolkit/global/aboutFoo.ftl"})', + 'import foo from "moz-src:///toolkit/Foo.sys.mjs"', + 'import foo from "moz-src:///toolkit/browser.js"', + 'import foo from "moz-src://bar/toolkit/browser.js"', + ], + invalid: [ + invalidCode( + 'import foo from "chrome://browser/content/browser.xhtml"', + "chrome://browser/content/browser.xhtml" + ), + invalidCode( + 'ChromeUtils.importESModule("resource:///modules/BrowserWindowTracker.sys.mjs")', + "resource:///modules/BrowserWindowTracker.sys.mjs" + ), + invalidCode( + 'ChromeUtils.defineESModuleGetters(null, {foo: "browser/browser.ftl"})', + "browser/browser.ftl" + ), + invalidCode( + 'import foo from "moz-src:///browser/Foo.sys.mjs"', + "moz-src:///browser/Foo.sys.mjs" + ), + invalidCode( + 'import foo from "moz-src://bar/browser/Foo.sys.mjs"', + "moz-src://bar/browser/Foo.sys.mjs" + ), + ], +});