Skip to content

Commit

Permalink
fix: Puppeteer and Electron runners both use the same timeouts now
Browse files Browse the repository at this point in the history
  • Loading branch information
danielweck committed Dec 16, 2024
1 parent 5e6a4c1 commit 1514f87
Show file tree
Hide file tree
Showing 6 changed files with 102 additions and 50 deletions.
12 changes: 8 additions & 4 deletions packages/ace-axe-runner-electron/src/init.js
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,7 @@ function loadUrl(browserWindow) {

if (LOG_DEBUG) console.log(`${ACE_LOG_PREFIX} axeRunner LOAD URL ... ${browserWindow.ace__currentUrlOriginal} => ${rootUrl}${browserWindow.ace__currentUrl}`);

browserWindow.ace__TIME_loadURL_ELLAPSED = undefined;
browserWindow.ace__TIME_loadURL = process.hrtime();
browserWindow.ace__TIME_executeJavaScript = 0;

Expand Down Expand Up @@ -241,8 +242,8 @@ function loadUrl(browserWindow) {
} catch(_e) {
// ignore
}
const MILLISECONDS_TIMEOUT_INITIAL = _MILLISECONDS_TIMEOUT_INITIAL || 10000; // 10s max to load the window's web contents
const MILLISECONDS_TIMEOUT_EXTENSION = _MILLISECONDS_TIMEOUT_EXTENSION || 480000; // 480s (8mn) max to load + execute Axe checkers
const MILLISECONDS_TIMEOUT_INITIAL = _MILLISECONDS_TIMEOUT_INITIAL || 10000; // 10s check to load the browser window web contents + execute Axe checkers
const MILLISECONDS_TIMEOUT_EXTENSION = _MILLISECONDS_TIMEOUT_EXTENSION || 480000; // 480s (8mn) extension (window contents usually loads fast, but Axe runtime takes time...)

const timeoutFunc = () => {
if (browserWindow.ace__replySent) {
Expand All @@ -251,7 +252,7 @@ function loadUrl(browserWindow) {
return;
}

const timeElapsed1 = process.hrtime(browserWindow.ace__TIME_loadURL);
const timeElapsed1 = browserWindow.ace__TIME_loadURL_ELLAPSED || (browserWindow.ace__TIME_loadURL_ELLAPSED = process.hrtime(browserWindow.ace__TIME_loadURL));
const timeElapsed2 = browserWindow.ace__TIME_executeJavaScript ? process.hrtime(browserWindow.ace__TIME_executeJavaScript) : [0, 0];

if (browserWindow.ace__timeoutExtended) {
Expand All @@ -268,6 +269,7 @@ function loadUrl(browserWindow) {
if (!browserWindow.ace__TIME_executeJavaScript) {
if (LOG_DEBUG) console.log(`${ACE_LOG_PREFIX} axeRunner ${MILLISECONDS_TIMEOUT_INITIAL}ms timeout [[RELOAD]] (${timeElapsed1[0]} seconds + ${timeElapsed1[1]} nanoseconds) (${timeElapsed2[0]} seconds + ${timeElapsed2[1]} nanoseconds) ${browserWindow.ace__currentUrlOriginal} => ${rootUrl}${browserWindow.ace__currentUrl}`);

browserWindow.ace__TIME_loadURL_ELLAPSED = undefined;
browserWindow.ace__TIME_loadURL = process.hrtime();
browserWindow.ace__TIME_executeJavaScript = 0;
try {
Expand Down Expand Up @@ -674,7 +676,9 @@ function axeRunnerInit(eventEmmitter, CONCURRENT_INSTANCES) {
// (node:5505) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 did-fail-load listeners added to [EventEmitter]. Use emitter.setMaxListeners() to increase limit
browserWindow.webContents.removeListener("did-fail-load", didFailLoadHandler);

if (LOG_DEBUG) console.log(`${ACE_LOG_PREFIX} axeRunner did-finish-load ${browserWindow.ace__poolIndex} ${browserWindow.ace__currentUrlOriginal} --- ${browserWindow.ace__currentUrl}`);
browserWindow.ace__TIME_loadURL_ELLAPSED = process.hrtime(browserWindow.ace__TIME_loadURL);

if (LOG_DEBUG) console.log(`${ACE_LOG_PREFIX} axeRunner did-finish-load (${browserWindow.ace__TIME_loadURL_ELLAPSED[0]} seconds + ${browserWindow.ace__TIME_loadURL_ELLAPSED[1]} nanoseconds) ${browserWindow.ace__poolIndex} ${browserWindow.ace__currentUrlOriginal} --- ${browserWindow.ace__currentUrl}`);

browserWindow.ace__TIME_executeJavaScript = process.hrtime();

Expand Down
111 changes: 72 additions & 39 deletions packages/ace-axe-runner-puppeteer/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,21 @@ let _browser = undefined;

const isDev = process && process.env && (process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true');

let _MILLISECONDS_TIMEOUT_INITIAL = 0;
try {
_MILLISECONDS_TIMEOUT_INITIAL = process.env.ACE_TIMEOUT_INITIAL ? parseInt(process.env.ACE_TIMEOUT_INITIAL, 10) : 0;
} catch(_e) {
// ignore
}
let _MILLISECONDS_TIMEOUT_EXTENSION = 0;
try {
_MILLISECONDS_TIMEOUT_EXTENSION = process.env.ACE_TIMEOUT_EXTENSION ? parseInt(process.env.ACE_TIMEOUT_EXTENSION, 10) : 0;
} catch(_e) {
// ignore
}
const MILLISECONDS_TIMEOUT_INITIAL = _MILLISECONDS_TIMEOUT_INITIAL || 10000; // 10s check to load the browser window web contents + execute Axe checkers
const MILLISECONDS_TIMEOUT_EXTENSION = _MILLISECONDS_TIMEOUT_EXTENSION || 480000; // 480s (8mn) extension (window contents usually loads fast, but Axe runtime takes time...)

module.exports = {
concurrency: 4,
launch: async function() {
Expand All @@ -19,9 +34,14 @@ module.exports = {
// }
args.push('--no-sandbox');
args.push('--disable-setuid-sandbox');

// https://github.com/puppeteer/puppeteer/blob/2b8ee62475b6614fc95b963c399b0bbad32e9e70/packages/puppeteer-core/src/common/ConnectOptions.ts#L88-L93
// https://github.com/puppeteer/puppeteer/blob/2b8ee62475b6614fc95b963c399b0bbad32e9e70/packages/puppeteer-core/src/node/BrowserLauncher.ts#L85
_browser = await puppeteer.launch({
args,
headless: true,
timeout: MILLISECONDS_TIMEOUT_INITIAL, // 30000 default
protocolTimeout: MILLISECONDS_TIMEOUT_EXTENSION, // 180000 default
});
return Promise.resolve();
},
Expand Down Expand Up @@ -85,54 +105,67 @@ module.exports = {

request.continue();
});

// page.on('response', (resp) => {
// console.log("RESPONSE: ", resp.url(), " ==> ", JSON.stringify(resp.headers(), null, 4), resp.status());
// });

await page.goto(url);

await utils.addScriptContents(scriptContents, page);
await utils.addScripts(scripts, page);

const results = await page.evaluate(() => new Promise((resolve, reject) => {
/* eslint-disable */
try {
window.tryAceAxe = () => {
if (!window.daisy ||
!window.daisy.ace ||
!window.daisy.ace.run ||
!window.daisy.ace.createReport
|| !window.axe
// || !window.HTML5Outline
) {

window.tryAceAxeN++;
if (window.tryAceAxeN < 15) {
setTimeout(window.tryAceAxe, 400);
return;
}

reject("window.tryAceAxe " + window.tryAceAxeN);
return;
}

window.daisy.ace.run((err, res) => {
if (err) {
reject(err);
return;
}
resolve(res);
});
};
window.tryAceAxeN = 0;
window.tryAceAxe();
} catch (exc) {
reject(exc);
}
/* eslint-enable */
let results = undefined;
try {
results = await page.evaluate(() => new Promise((resolve, reject) => {
/* eslint-disable */
try {
window.tryAceAxe = () => {
if (!window.daisy ||
!window.daisy.ace ||
!window.daisy.ace.run ||
!window.daisy.ace.createReport
|| !window.axe
// || !window.HTML5Outline
) {

window.tryAceAxeN++;
if (window.tryAceAxeN < 15) {
setTimeout(window.tryAceAxe, 400);
return;
}

reject("window.tryAceAxe " + window.tryAceAxeN);
return;
}

window.daisy.ace.run((err, res) => {
if (err) {
reject(err);
return;
}
resolve(res);
});
};
window.tryAceAxeN = 0;
window.tryAceAxe();
} catch (exc) {
reject(exc);
}
/* eslint-enable */
}));
} catch (err) {
// ProtocolError: Runtime.callFunctionOn timed out. Increase the 'protocolTimeout' setting in launch/connect calls for a higher timeout if needed.
if (err && err.toString && err.toString().indexOf("protocolTimeout") >= 0) {
err = new Error(`Timeout :( ${MILLISECONDS_TIMEOUT_EXTENSION}ms`);
}
try {
await page.close();
} catch (_e) {
}
throw err;
}
await page.close();
return results;
}
};
};
7 changes: 6 additions & 1 deletion packages/ace-core/src/checker/checker-chromium.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ const axe2ace = require('@daisy/ace-report-axe');

const { getRawResourcesForCurrentLanguage } = require('../l10n/localize').localizer;

const DISABLE_CONCURRENT_TO_DEBUG_INDIVIDUAL_SPINE_ITEM = false;

// const encodeURIComponent_RFC3986 = require('@daisy/epub-utils').encodeURIComponent_RFC3986;
function encodeURIComponent_RFC3986(str) {
Expand Down Expand Up @@ -114,7 +115,9 @@ async function checkSingle(spineItem, epub, lang, axeRunner) {
winston.debug(`- Axe locale problem? [${lang}] => ${localePath}`);
}

if (DISABLE_CONCURRENT_TO_DEBUG_INDIVIDUAL_SPINE_ITEM) console.log("BEFORE axeRunner... ", lang, url, JSON.stringify(spineItem, null, 4), JSON.stringify(scripts, null, 4), JSON.stringify(scriptContents, null, 4)); // JSON.stringify(epub, null, 4)
const results = await axeRunner.run(url, scripts, scriptContents, epub.basedir);
if (DISABLE_CONCURRENT_TO_DEBUG_INDIVIDUAL_SPINE_ITEM) console.log("AFTER axeRunner. ", url);

// Post-process results
if (!results.axe) {
Expand Down Expand Up @@ -201,7 +204,9 @@ async function checkSingle(spineItem, epub, lang, axeRunner) {
module.exports.check = async (epub, lang, axeRunner) => {
await axeRunner.launch();
winston.info('Checking documents...');
return pMap(epub.contentDocs, doc => checkSingle(doc, epub, lang, axeRunner), { concurrency: axeRunner.concurrency })
return pMap(epub.contentDocs, (doc) => {
return checkSingle(doc, epub, lang, axeRunner); // not AWAIT'ed! (pMap takes the Promise)
}, { concurrency: DISABLE_CONCURRENT_TO_DEBUG_INDIVIDUAL_SPINE_ITEM ? 1 : axeRunner.concurrency })
.then(async (results) => {
await axeRunner.close();
return results;
Expand Down
6 changes: 4 additions & 2 deletions packages/ace-core/src/scripts/ace-axe.js
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ daisy.ace.run = function(done) {
// ['tip', 'doc-tip'],
// ['toc', 'doc-toc']
// ]);

// if (node.hasAttributeNS('http://www.idpf.org/2007/ops', 'type')) {
// // abort if descendant of landmarks nav (nav with epub:type=landmarks)
// if (axe.utils.matchesSelector(node, 'nav[*|type~="landmarks"] *')) {
Expand Down Expand Up @@ -197,7 +197,7 @@ daisy.ace.run = function(done) {
// // selector: '[*|type]',
// matches: function matches(node, virtualNode, context) {
// return node.hasAttributeNS('http://www.idpf.org/2007/ops', 'type')
// },
// },
// any: ['matching-aria-role'],
// metadata: {
// // configured from host bootstrapper page (checker-chromium)
Expand Down Expand Up @@ -246,6 +246,8 @@ daisy.ace.run = function(done) {
} catch(e) {
done(e, null);
}
// done(new Error("test"), null);
// done(null, aceResult);

}
);
Expand Down
8 changes: 6 additions & 2 deletions scripts/compareAxeRunners.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,14 @@ echo "ElectronAxeRunner ..."
#node node_modules/electron/cli.js ./packages/ace-axe-runner-electron/lib/cli.js
#node ./packages/ace-axe-runner-electron/bin/ace.js
#node ./packages/ace/bin/ace-electron.js
ACE_PERF=1 node ./packages/ace/bin/ace-electron.js -f -s -o ./CompareAxeRunners/ElectronAxeRunner "$1"

# ACE_TIMEOUT_INITIAL=10000 ACE_TIMEOUT_EXTENSION=480000
ACE_TIMEOUT_INITIAL=5000 ACE_TIMEOUT_EXTENSION=5000 ACE_PERF=1 node ./packages/ace/bin/ace-electron.js -f -s -o ./CompareAxeRunners/ElectronAxeRunner "$1"

echo "PuppeteerAxeRunner ..."
ACE_PERF=1 node ./packages/ace-cli/bin/ace.js -f -s -o ./CompareAxeRunners/PuppeteerAxeRunner "$1"

# ACE_TIMEOUT_INITIAL=10000 ACE_TIMEOUT_EXTENSION=480000
ACE_TIMEOUT_INITIAL=5000 ACE_TIMEOUT_EXTENSION=5000 ACE_PERF=1 node ./packages/ace-cli/bin/ace.js -f -s -o ./CompareAxeRunners/PuppeteerAxeRunner "$1"

node ./scripts/normalise_report_json.js ./CompareAxeRunners/PuppeteerAxeRunner/report.json
node ./scripts/normalise_report_json.js ./CompareAxeRunners/ElectronAxeRunner/report.json
Expand Down
8 changes: 6 additions & 2 deletions scripts/compareAxeRunners_VERBOSE.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,14 @@ echo "ElectronAxeRunner ..."
#node node_modules/electron/cli.js ./packages/ace-axe-runner-electron/lib/cli.js
#node ./packages/ace-axe-runner-electron/bin/ace.js
#node ./packages/ace/bin/ace-electron.js
ACE_PERF=1 node ./packages/ace/bin/ace-electron.js -l en -f -V -o ./CompareAxeRunners/ElectronAxeRunner "$1"

# defaults: ACE_TIMEOUT_INITIAL=10000 ACE_TIMEOUT_EXTENSION=480000
# ACE_TIMEOUT_INITIAL=4000 ACE_TIMEOUT_EXTENSION=150000 ACE_PERF=1 node ./packages/ace/bin/ace-electron.js -l en -f -V -o ./CompareAxeRunners/ElectronAxeRunner "$1"

echo "PuppeteerAxeRunner ..."
ACE_PERF=1 node ./packages/ace-cli/bin/ace.js -l en -f -V -o ./CompareAxeRunners/PuppeteerAxeRunner "$1"

# defaults: ACE_TIMEOUT_INITIAL=10000 ACE_TIMEOUT_EXTENSION=480000
ACE_TIMEOUT_INITIAL=4000 ACE_TIMEOUT_EXTENSION=150000 ACE_PERF=1 node ./packages/ace-cli/bin/ace.js -l en -f -V -o ./CompareAxeRunners/PuppeteerAxeRunner "$1"

node ./scripts/normalise_report_json.js ./CompareAxeRunners/PuppeteerAxeRunner/report.json
node ./scripts/normalise_report_json.js ./CompareAxeRunners/ElectronAxeRunner/report.json
Expand Down

0 comments on commit 1514f87

Please sign in to comment.