Source code
Revision control
Copy as Markdown
Other Tools
/**
* @file Reject use of chrome://newtab or resource://newtab from code
* outside of browser/extensions/newtab, browser/components/newtab,
* browser/modules/AboutNewTab.sys.mjs, and browser/actors/AboutNewTabChild.sys.mjs.
* This prevents coupling with the newtab codebase, which can update out
* band from the rest of the browser.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
import path from "path";
const EXTENSION_FOLDER = path.join("browser", "extensions", "newtab");
const COMPONENT_FOLDER = path.join("browser", "components", "newtab");
const ABOUTNEWTAB_MODULE = path.join(
"browser",
"modules",
"AboutNewTab.sys.mjs"
);
const ABOUTNEWTABCHILD_ACTOR = path.join(
"browser",
"actors",
"AboutNewTabChild.sys.mjs"
);
export default {
meta: {
docs: {
},
messages: {
noNewtabRefs:
"> {{url}} is part of the newtab codebase and cannot be " +
"used by code outside of browser/extensions/newtab, browser/components/newtab, " +
"browser/modules/AboutNewTab.sys.mjs, or browser/actors/AboutNewTabChild.sys.mjs as " +
"it may update out-of-band from the rest of the browser.",
},
schema: [],
type: "suggestion",
},
create(context) {
const filename = context.filename;
// Hard-code some directories and files that should always be exempt.
if (
filename.includes(EXTENSION_FOLDER) ||
filename.includes(COMPONENT_FOLDER) ||
filename.endsWith(ABOUTNEWTAB_MODULE) ||
filename.endsWith(ABOUTNEWTABCHILD_ACTOR)
) {
return {};
}
return {
Literal(node) {
if (typeof node.value != "string") {
return;
}
if (
node.value.startsWith("chrome://newtab") ||
node.value.startsWith("resource://newtab")
) {
context.report({
node,
messageId: "noNewtabRefs",
data: { url: node.value },
});
}
},
};
},
};