tenfourfox/testing/eslint-plugin-mozilla/lib/rules/import-headjs-globals.js
Cameron Kaiser c9b2922b70 hello FPR
2017-04-19 00:56:45 -07:00

102 lines
3.0 KiB
JavaScript

/**
* @fileoverview Import globals from head.js and from any files that were
* imported by head.js (as far as we can correctly resolve the path).
*
* 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 path = require("path");
var helpers = require("../helpers");
var importRx = /^(?:Services\.scriptloader\.|loader)?loadSubScript\((.+)[",]/;
module.exports = function(context) {
// ---------------------------------------------------------------------------
// Helpers
// ---------------------------------------------------------------------------
function checkFile(fileArray) {
var filePath = fileArray.pop();
while (filePath) {
var headText;
try {
headText = fs.readFileSync(filePath, "utf8");
} catch (e) {
// Couldn't find file, continue.
filePath = fileArray.pop();
continue;
}
var ast = helpers.getAST(headText);
var globalVars = helpers.getGlobals(ast);
for (var i = 0; i < globalVars.length; i++) {
var varName = globalVars[i];
helpers.addVarToScope(varName, context);
}
for (var index in ast.body) {
var node = ast.body[index];
var source = helpers.getTextForNode(node, headText);
var name = helpers.getVarNameFromImportSource(source);
if (name) {
helpers.addVarToScope(name, context);
continue;
}
// Scripts loaded using loadSubScript or loadHelperScript
var matches = source.match(importRx);
if (!matches) {
matches = source.match(/^loadHelperScript\((.+)[",]/);
}
if (matches) {
var cwd = process.cwd();
filePath = matches[1];
filePath = filePath.replace("chrome://mochitests/content/browser",
cwd + "/../../../..");
filePath = filePath.replace(/testdir\s*\+\s*["']/gi, cwd + "/");
filePath = filePath.replace(/test_dir\s*\+\s*["']/gi, cwd);
filePath = filePath.replace(/["']/gi, "");
filePath = path.normalize(filePath);
fileArray.push(filePath);
}
}
filePath = fileArray.pop();
}
}
// ---------------------------------------------------------------------------
// Public
// ---------------------------------------------------------------------------
return {
Program: function() {
if (!helpers.getIsBrowserMochitest(this)) {
return;
}
var currentFilePath = helpers.getAbsoluteFilePath(context);
var dirName = path.dirname(currentFilePath);
var fullHeadjsPath = path.resolve(dirName, "head.js");
checkFile([currentFilePath, fullHeadjsPath]);
}
};
};