accessibility-checker
Version:
An automated testing tools for accessibility testing using Puppeteer, Selenium, or Zombie
449 lines (448 loc) • 20.2 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ACEngineManager = void 0;
const path = __importStar(require("path"));
const fs = __importStar(require("fs"));
const ACConfigManager_js_1 = require("./common/config/ACConfigManager.js");
const Fetch_js_1 = require("./common/api-ext/Fetch.js");
const promises_1 = require("fs/promises");
// The following two lines will be modified by sed for cjs vs mjs environments. Look at package.json before modifying
// import { createRequire } from "module";
// const require = createRequire(import.meta.url);
let ace;
let checker;
class ACEngineManager {
static loadEngine(content) {
return __awaiter(this, void 0, void 0, function* () {
let config = yield ACConfigManager_js_1.ACConfigManager.getConfigUnsupported();
let ENGINE_LOAD_MODE = config.engineMode;
if (ENGINE_LOAD_MODE === "DEFAULT") {
// ENGINE_LOAD_MODE = "REMOTE";
ENGINE_LOAD_MODE = "INJECT";
}
if (ENGINE_LOAD_MODE === "INJECT" && !_a.engineContent) {
_a.engineContent = yield (0, Fetch_js_1.fetch_get_text)(`${config.rulePack}/ace.js`);
}
if (_a.isPuppeteer(content) || _a.isPlaywright(content)) {
config.DEBUG && console.log("[INFO] aChecker.loadEngine detected Puppeteer/Playwright");
let page = content;
if (ENGINE_LOAD_MODE === "REMOTE") {
config.DEBUG && console.log("[INFO] engineMode REMOTE");
yield page.evaluate((scriptUrl) => {
try {
var ace_backup_in_ibma;
if ('undefined' !== typeof (ace)) {
if (!ace || !ace.Checker)
ace_backup_in_ibma = ace;
ace = null;
}
if ('undefined' === typeof (ace) || ace === null) {
return new Promise((resolve, reject) => {
let script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('aChecker', 'ACE');
script.setAttribute('src', scriptUrl);
script.addEventListener('load', function () {
globalThis.ace_ibma = ace;
if ('undefined' !== typeof (ace)) {
ace = ace_backup_in_ibma;
}
resolve();
});
script.addEventListener('error', function (evt) {
reject(new Error(`Unable to load engine into ${document.location.href}. This can happen if the page server sets a Content-Security-Policy that prevents ${scriptUrl} from loading.`));
});
let heads = document.getElementsByTagName('head');
if (heads.length > 0) {
heads[0].appendChild(script);
}
else if (document.body) {
document.body.appendChild(script);
}
else {
Promise.reject("Invalid document");
}
});
}
}
catch (e) {
return Promise.reject(e);
}
}, `${config.rulePack}/ace.js`);
}
else if (ENGINE_LOAD_MODE === "INJECT") {
config.DEBUG && console.log("[INFO] engineMode INJECT");
let aceAlreadyExists = yield page.evaluate(() => { try {
return 'undefined' !== typeof (ace);
}
catch (e) {
return false;
} });
yield page.evaluate(({ engineContent, aceAlreadyExists }) => {
try {
var ace_backup_in_ibma;
if (aceAlreadyExists) {
if (!ace || !ace.Checker)
ace_backup_in_ibma = ace;
ace = null;
}
if (!aceAlreadyExists || ace === null) {
return new Promise((resolve, reject) => {
eval(engineContent);
globalThis.ace_ibma = ace;
if (aceAlreadyExists) {
ace = ace_backup_in_ibma;
}
resolve();
});
}
}
catch (e) {
return Promise.reject(e);
}
}, {
engineContent: _a.engineContent, aceAlreadyExists
});
}
return _a.loadEngineLocal();
}
else if (_a.isSelenium(content)) {
config.DEBUG && console.log("[INFO] aChecker.loadEngine detected Selenium");
try {
let browser = content;
let scriptStr;
if (ENGINE_LOAD_MODE === "REMOTE") {
scriptStr =
`let cb = arguments[arguments.length - 1];
try {
var ace_backup_in_ibma;
if ('undefined' !== typeof(ace)) {
if (!ace || !ace.Checker)
ace_backup_in_ibma = ace;
ace = null;
}
if ('undefined' === typeof (ace) || ace === null) {
let script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('aChecker', 'ACE');
script.setAttribute('src', '${config.rulePack}/ace.js');
script.addEventListener('load', function() {
globalThis.ace_ibma = ace;
if ('undefined' !== typeof(ace)) {
ace = ace_backup_in_ibma;
}
cb();
});
let heads = document.getElementsByTagName('head');
if (heads.length > 0) { heads[0].appendChild(script); }
else { document.body.appendChild(script); }
} else {
cb();
}
} catch (e) {
cb(e);
}
`;
}
else if (ENGINE_LOAD_MODE === "INJECT") {
// Selenium
scriptStr =
`let cb = arguments[arguments.length - 1];
try {
var ace_backup_in_ibma;
if ('undefined' !== typeof(ace)) {
if (!ace || !ace.Checker)
ace_backup_in_ibma = ace;
ace = null;
}
if ('undefined' === typeof (ace) || ace === null) {
eval(${JSON.stringify(_a.engineContent)})
globalThis.ace_ibma = ace;
if ('undefined' !== typeof ace) {
ace = ace_backup_in_ibma;
}
cb();
} else {
cb();
}
} catch (e) {
cb(e);
}
`;
}
let manage = browser.manage();
if (manage.timeouts) {
manage.timeouts().setScriptTimeout(60000);
}
else if (manage.setTimeouts) {
manage.setTimeouts({
"script": 60000
});
}
return browser.executeAsyncScript(scriptStr).then(function (return_success) {
return _a.loadEngineLocal();
}).catch(function (err) {
console.log(err);
return Promise.reject(err);
});
}
catch (e) {
console.log(e);
return Promise.reject(e);
}
}
else if (_a.isWebDriverIO(content)) {
config.DEBUG && console.log("[INFO] aChecker.loadEngine detected WebDriverIO");
let page = content;
// ENGINE_LOAD_MODE = "REMOTE";
if (ENGINE_LOAD_MODE === "REMOTE") {
yield page.executeAsync((scriptUrl, done) => {
try {
var ace_backup_in_ibma;
if ('undefined' !== typeof (ace)) {
if (!ace || !ace.Checker)
ace_backup_in_ibma = ace;
ace = null;
}
if ('undefined' === typeof (ace) || ace === null) {
new Promise((resolve, reject) => {
let script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('aChecker', 'ACE');
script.setAttribute('src', scriptUrl);
script.addEventListener('load', function () {
globalThis.ace_ibma = ace;
if ('undefined' !== typeof (ace)) {
ace = ace_backup_in_ibma;
}
resolve();
});
script.addEventListener('error', function (evt) {
reject(new Error(`Unable to load engine into ${document.location.href}. This can happen if the page server sets a Content-Security-Policy that prevents ${scriptUrl} from loading.`));
});
let heads = document.getElementsByTagName('head');
if (heads.length > 0) {
heads[0].appendChild(script);
}
else if (document.body) {
document.body.appendChild(script);
}
else {
Promise.reject("Invalid document");
}
}).then(done);
}
}
catch (e) {
return Promise.reject(e);
}
}, `${config.rulePack}/ace.js`);
}
else if (ENGINE_LOAD_MODE === "INJECT") {
yield page.executeAsync((engineContent, done) => {
try {
var ace_backup_in_ibma;
if ('undefined' !== typeof (ace)) {
if (!ace || !ace.Checker)
ace_backup_in_ibma = ace;
ace = null;
}
if ('undefined' === typeof (ace) || ace === null) {
return new Promise((resolve, reject) => {
eval(engineContent);
globalThis.ace_ibma = ace;
if ('undefined' !== typeof (ace)) {
ace = ace_backup_in_ibma;
}
resolve();
}).then(done);
}
}
catch (e) {
return Promise.reject(e);
}
}, _a.engineContent);
}
return _a.loadEngineLocal();
}
else {
config.DEBUG && console.log("[INFO] aChecker.loadEngine detected local");
if (globalThis.ace_ibma) {
return Promise.resolve();
}
else {
return _a.loadEngineLocal();
}
}
});
}
static loadEngineLocal() {
return __awaiter(this, void 0, void 0, function* () {
if (globalThis.ace_ibma) {
return Promise.resolve();
}
if (!_a.localLoadPromise) {
_a.localLoadPromise = new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
let config = yield ACConfigManager_js_1.ACConfigManager.getConfigUnsupported();
const data = yield (0, Fetch_js_1.fetch_get_text)(`${config.rulePack}/ace-node.js`);
let engineDir = path.join(path.resolve(config.cacheFolder), "engine");
if (!fs.existsSync(engineDir)) {
fs.mkdirSync(engineDir, { recursive: true });
}
let fileSuffix = "";
if (!config.toolVersion) {
fileSuffix = config.ruleArchiveVersion;
}
else {
fileSuffix = `${config.toolVersion}-${config.ruleArchiveVersion}`;
}
fileSuffix = fileSuffix.replace(/\./g, "_");
const nodePath = path.join(engineDir, `ace-node-${fileSuffix}`);
if (fs.existsSync(`${nodePath}.js`)) {
const ace_ibma = require(nodePath);
checker = new ace_ibma.Checker();
return resolve();
}
else {
try {
yield (0, promises_1.writeFile)(nodePath + ".js", data, { flush: true });
const ace_ibma = require(nodePath);
checker = new ace_ibma.Checker();
resolve();
}
catch (err) {
console.log(err);
reject(err);
}
}
}));
}
return _a.localLoadPromise;
});
}
static isPuppeteer(content) {
if (content && content.constructor) {
return !!content.constructor.toString().match(/Function: Page/)
|| content.constructor.toString().includes("Puppeteer");
}
return false;
}
static isPlaywright(content) {
if (content && content.constructor) {
return !!content.constructor.toString().match(/class Page /);
}
return false;
}
static isSelenium(content) {
if (content && content.constructor) {
return content.constructor.toString().indexOf("Driver") !== -1 ||
// check required for selenium >= 3.0.1
(content.constructor.name && content.constructor.name.indexOf("Driver") !== -1);
}
return false;
}
static isWebDriverIO(content) {
if (content && content.constructor) {
return content.constructor.toString().indexOf("Browser") !== -1;
}
return false;
}
static getChecker() {
return checker;
}
static loadChecker() {
return __awaiter(this, void 0, void 0, function* () {
if (!checker) {
yield _a.loadEngineLocal();
}
return checker;
});
}
}
exports.ACEngineManager = ACEngineManager;
_a = ACEngineManager;
ACEngineManager.customRulesets = [];
ACEngineManager.engineContent = null;
ACEngineManager.localLoadPromise = null;
ACEngineManager.addRuleset = (ruleset) => {
_a.customRulesets.push(ruleset);
};
ACEngineManager.getRuleset = (rsId) => __awaiter(void 0, void 0, void 0, function* () {
if (!checker) {
yield _a.loadEngineLocal();
}
return _a.customRulesets.concat(checker.getGuidelines()).filter((function (rs) { return rs.id === rsId; }))[0];
});
ACEngineManager.getRulesets = function () {
return __awaiter(this, void 0, void 0, function* () {
if (!checker) {
yield _a.loadEngineLocal();
}
return _a.customRulesets.concat(checker.getGuidelines());
});
};
ACEngineManager.getRules = function () {
return __awaiter(this, void 0, void 0, function* () {
if (!checker) {
yield _a.loadEngineLocal();
}
let retVal = [];
for (const ruleId in checker.engine.ruleMap) {
retVal.push(checker.engine.ruleMap[ruleId]);
}
return retVal;
});
};
ACEngineManager.getRulesSync = function () {
if (!checker)
return null;
let retVal = [];
for (const ruleId in checker.engine.ruleMap) {
retVal.push(checker.engine.ruleMap[ruleId]);
}
return retVal;
};
//# sourceMappingURL=ACEngineManager.js.map
;