1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
/**
* @fileoverview Defines the environment when in the browser.xhtml window.
* Imports many globals from various files.
*
* 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/.
*/
"use strict";
// -----------------------------------------------------------------------------
// Rule Definition
// -----------------------------------------------------------------------------
var fs = require("fs");
var helpers = require("../helpers");
var { getScriptGlobals } = require("./utils");
// When updating EXTRA_SCRIPTS or MAPPINGS, be sure to also update the
// 'support-files' config in `tools/lint/eslint.yml`.
// These are scripts not loaded from browser.xhtml or global-scripts.inc
// but via other includes.
const EXTRA_SCRIPTS = [
"browser/base/content/nsContextMenu.js",
"browser/components/downloads/content/downloads.js",
"browser/components/downloads/content/indicator.js",
"toolkit/content/customElements.js",
"toolkit/content/editMenuOverlay.js",
];
const extraDefinitions = [
// Via Components.utils, defineModuleGetter, defineLazyModuleGetters or
// defineLazyScriptGetter (and map to
// single) variable.
{ name: "XPCOMUtils", writable: false },
{ name: "Task", writable: false },
{ name: "windowGlobalChild", writable: false },
// structuredClone is a new global that would be defined for the `browser`
// environment in ESLint, but only Firefox has implemented it currently and so
// it isn't in ESLint's globals yet.
// https://developer.mozilla.org/docs/Web/API/structuredClone
{ name: "structuredClone", writable: false },
];
// Some files in global-scripts.inc need mapping to specific locations.
const MAPPINGS = {
"printUtils.js": "toolkit/components/printing/content/printUtils.js",
"panelUI.js": "browser/components/customizableui/content/panelUI.js",
"viewSourceUtils.js":
"toolkit/components/viewsource/content/viewSourceUtils.js",
"browserPlacesViews.js":
"browser/components/places/content/browserPlacesViews.js",
"places-tree.js": "browser/components/places/content/places-tree.js",
"places-menupopup.js":
"browser/components/places/content/places-menupopup.js",
"shopping-sidebar.js":
"browser/components/shopping/content/shopping-sidebar.js",
"browser-sidebar.js": "browser/components/sidebar/browser-sidebar.js",
};
const globalScriptsRegExp =
/^\s*Services.scriptloader.loadSubScript\(\"(.*?)\", this\);$/;
function getGlobalScriptIncludes(scriptPath) {
let fileData;
try {
fileData = fs.readFileSync(scriptPath, { encoding: "utf8" });
} catch (ex) {
// The file isn't present, so this isn't an m-c repository.
return null;
}
fileData = fileData.split("\n");
let result = [];
for (let line of fileData) {
let match = line.match(globalScriptsRegExp);
if (match) {
let sourceFile = match[1]
.replace(
"chrome://browser/content/search/",
"browser/components/search/content/"
)
.replace(
"chrome://browser/content/screenshots/",
"browser/components/screenshots/content/"
)
.replace("chrome://browser/content/", "browser/base/content/")
.replace("chrome://global/content/", "toolkit/content/");
for (let mapping of Object.getOwnPropertyNames(MAPPINGS)) {
if (sourceFile.includes(mapping)) {
sourceFile = MAPPINGS[mapping];
}
}
result.push(sourceFile);
}
}
return result;
}
function getGlobalScripts() {
let results = [];
for (let scriptPath of helpers.globalScriptPaths) {
results = results.concat(getGlobalScriptIncludes(scriptPath));
}
return results;
}
module.exports = getScriptGlobals(
"browser-window",
getGlobalScripts().concat(EXTRA_SCRIPTS),
extraDefinitions,
{
browserjsScripts: getGlobalScripts().concat(EXTRA_SCRIPTS),
}
);
|