UNPKG

accessibility-checker

Version:

An automated testing tools for accessibility testing using Puppeteer, Selenium, or Zombie

449 lines (448 loc) 20.2 kB
"use strict"; 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