mcp-accessibility-scanner 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +232 -7
- package/lib/browserContextFactory.js +645 -32
- package/lib/browserContextFactory.js.map +1 -1
- package/lib/browserServerBackend.js +8 -2
- package/lib/browserServerBackend.js.map +1 -1
- package/lib/context.js +179 -62
- package/lib/context.js.map +1 -1
- package/lib/extension/extensionContextFactory.js +3 -0
- package/lib/extension/extensionContextFactory.js.map +1 -1
- package/lib/mcp/proxyBackend.js +1 -0
- package/lib/mcp/proxyBackend.js.map +1 -1
- package/lib/networkPolicy.js +73 -0
- package/lib/networkPolicy.js.map +1 -0
- package/lib/program.js +21 -3
- package/lib/program.js.map +1 -1
- package/lib/response.js +8 -3
- package/lib/response.js.map +1 -1
- package/lib/tab.js +117 -16
- package/lib/tab.js.map +1 -1
- package/lib/tools/auditKeyboard.js +203 -0
- package/lib/tools/auditKeyboard.js.map +1 -1
- package/lib/tools/auditScreenReader.js +826 -0
- package/lib/tools/auditScreenReader.js.map +1 -0
- package/lib/tools/auditSite.js +267 -86
- package/lib/tools/auditSite.js.map +1 -1
- package/lib/tools/axe.js +479 -21
- package/lib/tools/axe.js.map +1 -1
- package/lib/tools/dialogs.js +18 -4
- package/lib/tools/dialogs.js.map +1 -1
- package/lib/tools/evaluate.js +34 -5
- package/lib/tools/evaluate.js.map +1 -1
- package/lib/tools/keyboard.js +1 -2
- package/lib/tools/keyboard.js.map +1 -1
- package/lib/tools/navigate.js +2 -1
- package/lib/tools/navigate.js.map +1 -1
- package/lib/tools/network.js +225 -8
- package/lib/tools/network.js.map +1 -1
- package/lib/tools/scanPageMatrix.js +134 -43
- package/lib/tools/scanPageMatrix.js.map +1 -1
- package/lib/tools/screenshot.js +3 -3
- package/lib/tools/screenshot.js.map +1 -1
- package/lib/tools/snapshot.js +269 -8
- package/lib/tools/snapshot.js.map +1 -1
- package/lib/tools/tool.js.map +1 -1
- package/lib/tools/utils.js +62 -6
- package/lib/tools/utils.js.map +1 -1
- package/lib/tools.js +5 -2
- package/lib/tools.js.map +1 -1
- package/lib/utils/dataUrl.js +58 -35
- package/lib/utils/dataUrl.js.map +1 -1
- package/lib/utils/jsSource.js +187 -0
- package/lib/utils/jsSource.js.map +1 -0
- package/lib/vscode/browserContextFactory.js +83 -0
- package/lib/vscode/browserContextFactory.js.map +1 -0
- package/lib/vscode/host.js +16 -1
- package/lib/vscode/host.js.map +1 -1
- package/lib/vscode/main.js +1 -33
- package/lib/vscode/main.js.map +1 -1
- package/package.json +6 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auditScreenReader.js","sourceRoot":"","sources":["../../src/tools/auditScreenReader.ts"],"names":[],"mappings":"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"}
|
package/lib/tools/auditSite.js
CHANGED
|
@@ -3,7 +3,7 @@ import RE2 from 're2';
|
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import { defineTabTool } from './tool.js';
|
|
5
5
|
import { sanitizeForFilePath } from '../utils/fileUtils.js';
|
|
6
|
-
import { axeTagValues,
|
|
6
|
+
import { assertRuleOptionsValid, axeRuleSchemaShape, axeScopeSchemaShape, axeTagValues, defaultAxeTags, prepareAxeResults, runAxeScan, summarizeAxeViolations, } from './axe.js';
|
|
7
7
|
const defaultIgnoreQueryParams = [
|
|
8
8
|
'utm_source',
|
|
9
9
|
'utm_medium',
|
|
@@ -36,10 +36,13 @@ const auditSiteSchema = z.object({
|
|
|
36
36
|
includeSubdomains: z.boolean().default(false).describe('Only applies when sameOriginOnly=true. When enabled, also allows subdomains of the start host (e.g. blog.example.com when start host is example.com). Ignored when sameOriginOnly=false.'),
|
|
37
37
|
excludePathPatterns: z.array(z.string()).default(defaultExcludePathPatterns).describe('Regex patterns applied to pathname+query. Avoid complex nested quantifiers to prevent performance issues.'),
|
|
38
38
|
ignoreQueryParams: z.array(z.string()).default(defaultIgnoreQueryParams).describe('Query parameters dropped during URL normalization.'),
|
|
39
|
-
violationsTag: z.array(z.enum(axeTagValues)).min(1).default([...
|
|
39
|
+
violationsTag: z.array(z.enum(axeTagValues)).min(1).default([...defaultAxeTags]).describe('Axe tags to include in scans.'),
|
|
40
|
+
includeIncomplete: z.boolean().default(true).describe('Also collect Axe "incomplete" results — checks Axe could not decide automatically. They are reported separately from violations.'),
|
|
40
41
|
maxNodesPerViolation: z.number().int().min(1).max(50).default(10).describe('Maximum nodes kept per violation in the report.'),
|
|
41
42
|
waitAfterNavigationMs: z.number().int().min(0).max(5000).default(250).describe('Extra wait after navigation before scanning.'),
|
|
42
43
|
reportFile: z.string().optional().describe('Output JSON report file name.'),
|
|
44
|
+
...axeScopeSchemaShape,
|
|
45
|
+
...axeRuleSchemaShape,
|
|
43
46
|
}).superRefine((value, context) => {
|
|
44
47
|
if (value.strategy === 'provided' && (!value.urls || !value.urls.length)) {
|
|
45
48
|
context.addIssue({
|
|
@@ -139,21 +142,75 @@ function normalizeUrl(rawUrl, baseUrl, ignoredParams) {
|
|
|
139
142
|
url.pathname = url.pathname.slice(0, -1);
|
|
140
143
|
return url;
|
|
141
144
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
145
|
+
/**
|
|
146
|
+
* Cookies the crawled URLs would actually send, keyed by name + domain + path and
|
|
147
|
+
* mapped to the name and expiry needed to report on them. Scoping to the crawl URLs
|
|
148
|
+
* keeps an unrelated origin's expiring cookie from raising a false alarm, and keying
|
|
149
|
+
* on the full identity stops a same-named cookie elsewhere from masking a deleted one.
|
|
150
|
+
* Values are deliberately not compared: a rotating CSRF token is not a lost session.
|
|
151
|
+
* Ceiling: a session cookie scoped to a path below the crawl URLs is not tracked.
|
|
152
|
+
*/
|
|
153
|
+
async function readCrawlCookies(page, urls) {
|
|
154
|
+
const cookies = await page.context().cookies(urls);
|
|
155
|
+
return new Map(cookies.map(cookie => [`${cookie.name}\n${cookie.domain}\n${cookie.path}`, { name: cookie.name, expires: cookie.expires }]));
|
|
148
156
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
157
|
+
/**
|
|
158
|
+
* Baseline cookies the context no longer carries, or null when nothing is missing.
|
|
159
|
+
*
|
|
160
|
+
* A cookie whose own expiry has already passed was deleted by the clock rather than
|
|
161
|
+
* by the site, so it is not a lost session: Cloudflare's `__cf_bm` lives 30 minutes
|
|
162
|
+
* and would otherwise warn on any longer crawl. Cookies are still not classified as
|
|
163
|
+
* "authentication" ones — no cookie attribute marks that, and every proxy for it
|
|
164
|
+
* (httpOnly, session scope) misfires both ways on real sites, which would turn a
|
|
165
|
+
* false warning into a missed logout.
|
|
166
|
+
*
|
|
167
|
+
* A cookie read failure yields no loss: the context is gone, and aborting here would
|
|
168
|
+
* throw away the pages already scanned along with the navigation error for this one.
|
|
169
|
+
*
|
|
170
|
+
* The identities of the missing cookies are returned so the caller can drop them
|
|
171
|
+
* from the baseline: each cookie is reported once, at the URL where it vanished,
|
|
172
|
+
* and monitoring continues afterwards — an analytics cookie expiring early in the
|
|
173
|
+
* crawl must not mask the real session cookie being dropped ten pages later.
|
|
174
|
+
*/
|
|
175
|
+
async function findCookieLoss(page, urls, baseline, requestedUrl, urlBeforeNavigation) {
|
|
176
|
+
const current = await readCrawlCookies(page, urls).catch(() => null);
|
|
177
|
+
if (!current)
|
|
178
|
+
return null;
|
|
179
|
+
const now = Date.now();
|
|
180
|
+
const missing = [...baseline]
|
|
181
|
+
.filter(([identity, cookie]) => !current.has(identity) && !(cookie.expires > 0 && cookie.expires * 1000 <= now));
|
|
182
|
+
if (!missing.length)
|
|
183
|
+
return null;
|
|
184
|
+
// The page reached after redirects is the one that dropped the cookie, and the one
|
|
185
|
+
// worth excluding; the queued URL may only have pointed at it. A navigation that
|
|
186
|
+
// never committed leaves the tab on the previous page, which is innocent — there
|
|
187
|
+
// the URL asked for is the one whose response dropped the cookie.
|
|
188
|
+
const reachedUrl = page.url();
|
|
189
|
+
const url = !reachedUrl || reachedUrl === urlBeforeNavigation ? requestedUrl : reachedUrl;
|
|
190
|
+
return {
|
|
191
|
+
url,
|
|
192
|
+
cookies: [...new Set(missing.map(([, cookie]) => cookie.name))],
|
|
193
|
+
identities: missing.map(([identity]) => identity),
|
|
194
|
+
};
|
|
156
195
|
}
|
|
196
|
+
/**
|
|
197
|
+
* Title and outgoing links in one round trip: both are wanted for every crawled
|
|
198
|
+
* page, and a second evaluate per page is pure latency on a 200-page crawl.
|
|
199
|
+
* `linkSelector` is empty when this page contributes no links (depth exhausted,
|
|
200
|
+
* or a strategy that only reads the entry page).
|
|
201
|
+
*/
|
|
202
|
+
async function readPage(page, linkSelector) {
|
|
203
|
+
return await page.evaluate(selector => ({
|
|
204
|
+
title: document.title,
|
|
205
|
+
links: selector
|
|
206
|
+
? Array.from(document.querySelectorAll(selector))
|
|
207
|
+
.map(anchor => anchor.href)
|
|
208
|
+
.filter(Boolean)
|
|
209
|
+
: [],
|
|
210
|
+
}), linkSelector);
|
|
211
|
+
}
|
|
212
|
+
const allLinksSelector = 'a[href]';
|
|
213
|
+
const navLinksSelector = 'nav a[href], header a[href], [role="navigation"] a[href]';
|
|
157
214
|
async function extractSitemapUrls(page, sitemapUrl) {
|
|
158
215
|
const response = await page.request.get(sitemapUrl, { timeout: 15000 });
|
|
159
216
|
if (!response.ok())
|
|
@@ -162,6 +219,62 @@ async function extractSitemapUrls(page, sitemapUrl) {
|
|
|
162
219
|
const matches = [...xmlText.matchAll(/<loc>([\s\S]*?)<\/loc>/gi)];
|
|
163
220
|
return matches.map(match => match[1].replace('<![CDATA[', '').replace(']]>', '').trim()).filter(Boolean);
|
|
164
221
|
}
|
|
222
|
+
function aggregateIntoSummary(summaryByRuleId, violations, pageUrl) {
|
|
223
|
+
for (const violation of violations) {
|
|
224
|
+
const existingSummary = summaryByRuleId.get(violation.id);
|
|
225
|
+
const summary = existingSummary ?? {
|
|
226
|
+
id: violation.id,
|
|
227
|
+
impact: violation.impact,
|
|
228
|
+
tags: [...violation.tags],
|
|
229
|
+
help: violation.help,
|
|
230
|
+
helpUrl: violation.helpUrl,
|
|
231
|
+
description: violation.description,
|
|
232
|
+
pagesAffected: new Set(),
|
|
233
|
+
totalOccurrences: 0,
|
|
234
|
+
fingerprints: new Set(),
|
|
235
|
+
sampleNodes: [],
|
|
236
|
+
};
|
|
237
|
+
summary.pagesAffected.add(pageUrl);
|
|
238
|
+
summary.totalOccurrences += violation.nodes.length;
|
|
239
|
+
for (const node of violation.nodes) {
|
|
240
|
+
// The fingerprint set is scoped to one violation id, so the
|
|
241
|
+
// normalized node HTML alone identifies a unique occurrence.
|
|
242
|
+
const fingerprint = fastFingerprint(normalizeWhitespace(node.html ?? ''));
|
|
243
|
+
if (summary.fingerprints.has(fingerprint))
|
|
244
|
+
continue;
|
|
245
|
+
summary.fingerprints.add(fingerprint);
|
|
246
|
+
if (summary.sampleNodes.length < 3) {
|
|
247
|
+
summary.sampleNodes.push({
|
|
248
|
+
pageUrl,
|
|
249
|
+
target: [...(node.target ?? [])],
|
|
250
|
+
html: node.html ?? '',
|
|
251
|
+
failureSummary: node.failureSummary ?? null,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
summaryByRuleId.set(violation.id, summary);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
function toSortedSummaryViolations(summaryByRuleId) {
|
|
259
|
+
return [...summaryByRuleId.values()].map(summary => ({
|
|
260
|
+
id: summary.id,
|
|
261
|
+
impact: summary.impact,
|
|
262
|
+
tags: summary.tags,
|
|
263
|
+
help: summary.help,
|
|
264
|
+
helpUrl: summary.helpUrl,
|
|
265
|
+
description: summary.description,
|
|
266
|
+
pagesAffected: [...summary.pagesAffected],
|
|
267
|
+
totalOccurrences: summary.totalOccurrences,
|
|
268
|
+
uniqueOccurrences: summary.fingerprints.size,
|
|
269
|
+
sampleNodes: summary.sampleNodes,
|
|
270
|
+
})).sort((first, second) => {
|
|
271
|
+
const firstImpact = impactPriority[first.impact ?? 'unknown'] ?? impactPriority.unknown;
|
|
272
|
+
const secondImpact = impactPriority[second.impact ?? 'unknown'] ?? impactPriority.unknown;
|
|
273
|
+
if (firstImpact !== secondImpact)
|
|
274
|
+
return firstImpact - secondImpact;
|
|
275
|
+
return second.pagesAffected.length - first.pagesAffected.length;
|
|
276
|
+
});
|
|
277
|
+
}
|
|
165
278
|
function summarizeTopViolations(violations, count) {
|
|
166
279
|
return violations
|
|
167
280
|
.slice(0, count)
|
|
@@ -187,6 +300,10 @@ const auditSite = defineTabTool({
|
|
|
187
300
|
type: 'destructive',
|
|
188
301
|
},
|
|
189
302
|
handle: async (tab, params, response) => {
|
|
303
|
+
// Rule ids apply to the whole run, so a bad one must fail before any tab is
|
|
304
|
+
// opened or any URL visited; leaving it to the per-page scan would crawl the
|
|
305
|
+
// entire site and write a "completed" report of nothing but errored pages.
|
|
306
|
+
assertRuleOptionsValid({ rules: params.withRules, disableRules: params.disableRules });
|
|
190
307
|
const context = tab.context;
|
|
191
308
|
const originalTab = tab;
|
|
192
309
|
const queue = [];
|
|
@@ -205,6 +322,7 @@ const auditSite = defineTabTool({
|
|
|
205
322
|
const ignoredParams = new Set(params.ignoreQueryParams.map(param => param.toLowerCase()));
|
|
206
323
|
const excludePatterns = buildExcludePathPatterns(params.excludePathPatterns);
|
|
207
324
|
const summaryByViolation = new Map();
|
|
325
|
+
const summaryByIncomplete = new Map();
|
|
208
326
|
const enqueueUrl = (rawUrl, depth, discoveredFrom) => {
|
|
209
327
|
const normalizedUrl = normalizeUrl(rawUrl, startUrl, ignoredParams);
|
|
210
328
|
if (!normalizedUrl) {
|
|
@@ -228,8 +346,11 @@ const auditSite = defineTabTool({
|
|
|
228
346
|
skippedUrls++;
|
|
229
347
|
return;
|
|
230
348
|
}
|
|
349
|
+
const cookieUrl = new URL(rawUrl, startUrl);
|
|
350
|
+
cookieUrl.hash = '';
|
|
231
351
|
queue.push({
|
|
232
352
|
url: normalizedUrlString,
|
|
353
|
+
cookieUrl: cookieUrl.toString(),
|
|
233
354
|
depth,
|
|
234
355
|
discoveredFrom,
|
|
235
356
|
});
|
|
@@ -262,6 +383,19 @@ const auditSite = defineTabTool({
|
|
|
262
383
|
message: `Initialized site audit with ${queue.length} queued URL(s).`,
|
|
263
384
|
});
|
|
264
385
|
const crawlTab = await context.newTab();
|
|
386
|
+
// Cookies the crawl URLs carry before the crawl are the session the caller
|
|
387
|
+
// signed in with. If one disappears mid-crawl every later page is audited as a
|
|
388
|
+
// signed-out user, which still looks like a clean run, so record where it happened.
|
|
389
|
+
const cookieScopeUrls = queue.map(item => item.cookieUrl);
|
|
390
|
+
const cookieScope = new Set(cookieScopeUrls);
|
|
391
|
+
// The whole jar is snapshotted once, so a URL discovered mid-crawl can only
|
|
392
|
+
// add identities that existed when the crawl started. Without this, a cookie
|
|
393
|
+
// minted by an earlier crawled page would enter the baseline at discovery
|
|
394
|
+
// and its later removal would be misreported as losing a crawl-start cookie.
|
|
395
|
+
const initialCookieIdentities = new Set((await crawlTab.page.context().cookies().catch(() => []))
|
|
396
|
+
.map(cookie => `${cookie.name}\n${cookie.domain}\n${cookie.path}`));
|
|
397
|
+
const baselineCookies = await readCrawlCookies(crawlTab.page, cookieScopeUrls);
|
|
398
|
+
const sessionLosses = [];
|
|
265
399
|
let processedPages = 0;
|
|
266
400
|
try {
|
|
267
401
|
while (queue.length && pages.length < params.maxPages) {
|
|
@@ -281,64 +415,63 @@ const auditSite = defineTabTool({
|
|
|
281
415
|
error: null,
|
|
282
416
|
summary: null,
|
|
283
417
|
violations: [],
|
|
418
|
+
incomplete: [],
|
|
419
|
+
unscannedFrames: [],
|
|
284
420
|
};
|
|
285
421
|
pages.push(pageReport);
|
|
422
|
+
// URLs discovered mid-crawl join cookie tracking before they are visited:
|
|
423
|
+
// a session cookie scoped below the start URL (say /app, discovered from /)
|
|
424
|
+
// is invisible to the start-URL baseline, so deleting it later would
|
|
425
|
+
// otherwise never raise a warning. Read before navigating — the visit
|
|
426
|
+
// itself may be what drops the cookie. Only identities from the crawl-start
|
|
427
|
+
// jar snapshot may join, so the warning's "present when the crawl started"
|
|
428
|
+
// stays literally true. Ceiling: a crawl-start cookie deleted before its
|
|
429
|
+
// scope URL is discovered is not seen by this live read and goes
|
|
430
|
+
// unreported — accepted, because deciding which snapshot cookies apply to
|
|
431
|
+
// a URL ourselves would reimplement browser cookie matching, and getting
|
|
432
|
+
// that wrong turns into false session-loss warnings.
|
|
433
|
+
if (!cookieScope.has(item.cookieUrl)) {
|
|
434
|
+
cookieScope.add(item.cookieUrl);
|
|
435
|
+
cookieScopeUrls.push(item.cookieUrl);
|
|
436
|
+
const discovered = await readCrawlCookies(crawlTab.page, [item.cookieUrl]).catch(() => null);
|
|
437
|
+
for (const [identity, cookie] of discovered ?? []) {
|
|
438
|
+
if (initialCookieIdentities.has(identity) && !baselineCookies.has(identity))
|
|
439
|
+
baselineCookies.set(identity, cookie);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
const urlBeforeNavigation = crawlTab.page.url();
|
|
286
443
|
try {
|
|
287
444
|
await crawlTab.navigate(item.url);
|
|
288
445
|
await crawlTab.waitForTimeout(params.waitAfterNavigationMs);
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
446
|
+
// Discover before scanning. A scoped scan throws when an
|
|
447
|
+
// includeSelectors entry is absent from this page, and that must not
|
|
448
|
+
// silently drop every descendant reachable only through it.
|
|
449
|
+
let linkSelector = '';
|
|
450
|
+
if (params.strategy === 'links' && item.depth < params.maxDepth)
|
|
451
|
+
linkSelector = allLinksSelector;
|
|
452
|
+
else if (params.strategy === 'nav' && item.depth === 0)
|
|
453
|
+
linkSelector = navLinksSelector;
|
|
454
|
+
const { title, links } = await readPage(crawlTab.page, linkSelector);
|
|
455
|
+
pageReport.title = title;
|
|
456
|
+
for (const link of links)
|
|
457
|
+
enqueueUrl(link, item.depth + 1, item.url);
|
|
458
|
+
const axeResult = await runAxeScan(crawlTab.page, {
|
|
459
|
+
tags: params.violationsTag,
|
|
460
|
+
rules: params.withRules,
|
|
461
|
+
disableRules: params.disableRules,
|
|
462
|
+
include: params.includeSelectors,
|
|
463
|
+
exclude: params.excludeSelectors,
|
|
464
|
+
});
|
|
465
|
+
const violations = prepareAxeResults(axeResult.violations, params.maxNodesPerViolation);
|
|
296
466
|
pageReport.status = 'scanned';
|
|
297
|
-
pageReport.
|
|
298
|
-
pageReport.
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
help: violation.help,
|
|
306
|
-
helpUrl: violation.helpUrl,
|
|
307
|
-
description: violation.description,
|
|
308
|
-
pagesAffected: new Set(),
|
|
309
|
-
totalOccurrences: 0,
|
|
310
|
-
fingerprints: new Set(),
|
|
311
|
-
sampleNodes: [],
|
|
312
|
-
};
|
|
313
|
-
summary.pagesAffected.add(item.url);
|
|
314
|
-
summary.totalOccurrences += violation.nodes.length;
|
|
315
|
-
for (const node of violation.nodes) {
|
|
316
|
-
// The fingerprint set is scoped to one violation id, so the
|
|
317
|
-
// normalized node HTML alone identifies a unique occurrence.
|
|
318
|
-
const fingerprint = fastFingerprint(normalizeWhitespace(node.html ?? ''));
|
|
319
|
-
if (summary.fingerprints.has(fingerprint))
|
|
320
|
-
continue;
|
|
321
|
-
summary.fingerprints.add(fingerprint);
|
|
322
|
-
if (summary.sampleNodes.length < 3) {
|
|
323
|
-
summary.sampleNodes.push({
|
|
324
|
-
pageUrl: item.url,
|
|
325
|
-
target: [...(node.target ?? [])],
|
|
326
|
-
html: node.html ?? '',
|
|
327
|
-
failureSummary: node.failureSummary ?? null,
|
|
328
|
-
});
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
summaryByViolation.set(violation.id, summary);
|
|
332
|
-
}
|
|
333
|
-
if (params.strategy === 'links' && item.depth < params.maxDepth) {
|
|
334
|
-
const links = await extractLinks(crawlTab.page);
|
|
335
|
-
for (const link of links)
|
|
336
|
-
enqueueUrl(link, item.depth + 1, item.url);
|
|
337
|
-
}
|
|
338
|
-
if (params.strategy === 'nav' && item.depth === 0) {
|
|
339
|
-
const links = await extractNavLinks(crawlTab.page);
|
|
340
|
-
for (const link of links)
|
|
341
|
-
enqueueUrl(link, item.depth + 1, item.url);
|
|
467
|
+
pageReport.unscannedFrames = axeResult.unscannedFrames;
|
|
468
|
+
pageReport.violations = violations.trimmed;
|
|
469
|
+
pageReport.summary = summarizeAxeViolations(violations.trimmed);
|
|
470
|
+
aggregateIntoSummary(summaryByViolation, violations.deduped, item.url);
|
|
471
|
+
if (params.includeIncomplete) {
|
|
472
|
+
const incomplete = prepareAxeResults(axeResult.incomplete, params.maxNodesPerViolation);
|
|
473
|
+
pageReport.incomplete = incomplete.trimmed;
|
|
474
|
+
aggregateIntoSummary(summaryByIncomplete, incomplete.deduped, item.url);
|
|
342
475
|
}
|
|
343
476
|
}
|
|
344
477
|
catch (error) {
|
|
@@ -347,6 +480,25 @@ const auditSite = defineTabTool({
|
|
|
347
480
|
pageReport.error = error instanceof Error ? error.message : String(error);
|
|
348
481
|
}
|
|
349
482
|
finally {
|
|
483
|
+
// Checked after failed navigations too: a logout URL that clears the cookie
|
|
484
|
+
// and then times out still ended the session, and skipping it pins the
|
|
485
|
+
// warning on the next page that happens to load — an innocent route.
|
|
486
|
+
// Monitoring never stops at the first loss: reported cookies leave the
|
|
487
|
+
// baseline, so each later disappearance is still caught and attributed
|
|
488
|
+
// to its own URL instead of being masked by an earlier, unrelated one.
|
|
489
|
+
if (baselineCookies.size) {
|
|
490
|
+
const loss = await findCookieLoss(crawlTab.page, cookieScopeUrls, baselineCookies, item.url, urlBeforeNavigation);
|
|
491
|
+
if (loss) {
|
|
492
|
+
sessionLosses.push({ url: loss.url, cookies: loss.cookies });
|
|
493
|
+
// Removed from the jar snapshot too, or a later-discovered URL
|
|
494
|
+
// could re-admit an already-reported cookie to the baseline and
|
|
495
|
+
// report the same loss twice.
|
|
496
|
+
for (const identity of loss.identities) {
|
|
497
|
+
baselineCookies.delete(identity);
|
|
498
|
+
initialCookieIdentities.delete(identity);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
}
|
|
350
502
|
processedPages++;
|
|
351
503
|
const message = pageReport.status === 'scanned'
|
|
352
504
|
? `Scanned page ${processedPages}/${params.maxPages}: ${item.url}`
|
|
@@ -367,24 +519,11 @@ const auditSite = defineTabTool({
|
|
|
367
519
|
if (originalTabIndex !== -1)
|
|
368
520
|
await context.selectTab(originalTabIndex);
|
|
369
521
|
}
|
|
370
|
-
const summaryViolations =
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
helpUrl: summary.helpUrl,
|
|
376
|
-
description: summary.description,
|
|
377
|
-
pagesAffected: [...summary.pagesAffected],
|
|
378
|
-
totalOccurrences: summary.totalOccurrences,
|
|
379
|
-
uniqueOccurrences: summary.fingerprints.size,
|
|
380
|
-
sampleNodes: summary.sampleNodes,
|
|
381
|
-
})).sort((first, second) => {
|
|
382
|
-
const firstImpact = impactPriority[first.impact ?? 'unknown'] ?? impactPriority.unknown;
|
|
383
|
-
const secondImpact = impactPriority[second.impact ?? 'unknown'] ?? impactPriority.unknown;
|
|
384
|
-
if (firstImpact !== secondImpact)
|
|
385
|
-
return firstImpact - secondImpact;
|
|
386
|
-
return second.pagesAffected.length - first.pagesAffected.length;
|
|
387
|
-
});
|
|
522
|
+
const summaryViolations = toSortedSummaryViolations(summaryByViolation);
|
|
523
|
+
const summaryIncomplete = toSortedSummaryViolations(summaryByIncomplete);
|
|
524
|
+
// A partly-scanned page reports fewer violations, and a reader counting them
|
|
525
|
+
// must know which pages those numbers are incomplete for.
|
|
526
|
+
const pagesWithUnscannedFrames = pages.filter(page => page.unscannedFrames.length);
|
|
388
527
|
const scannedPagesByViolations = sortScannedPagesByViolations(pages);
|
|
389
528
|
const summary = {
|
|
390
529
|
totals: {
|
|
@@ -394,9 +533,12 @@ const auditSite = defineTabTool({
|
|
|
394
533
|
queuedUrls: visited.size,
|
|
395
534
|
},
|
|
396
535
|
violations: summaryViolations,
|
|
536
|
+
incomplete: summaryIncomplete,
|
|
397
537
|
};
|
|
398
538
|
const report = {
|
|
399
|
-
|
|
539
|
+
// v2: the singular `sessionLoss` object became the `sessionLosses` list,
|
|
540
|
+
// so a consumer keying its parser on the version has a signal.
|
|
541
|
+
version: 'v2',
|
|
400
542
|
metadata: {
|
|
401
543
|
startUrl: startUrl.toString(),
|
|
402
544
|
strategy: params.strategy,
|
|
@@ -408,6 +550,11 @@ const auditSite = defineTabTool({
|
|
|
408
550
|
excludePathPatterns: params.excludePathPatterns,
|
|
409
551
|
ignoreQueryParams: params.ignoreQueryParams,
|
|
410
552
|
violationsTag: params.violationsTag,
|
|
553
|
+
includeIncomplete: params.includeIncomplete,
|
|
554
|
+
includeSelectors: params.includeSelectors ?? null,
|
|
555
|
+
excludeSelectors: params.excludeSelectors ?? null,
|
|
556
|
+
withRules: params.withRules ?? null,
|
|
557
|
+
disableRules: params.disableRules ?? null,
|
|
411
558
|
maxNodesPerViolation: params.maxNodesPerViolation,
|
|
412
559
|
waitAfterNavigationMs: params.waitAfterNavigationMs,
|
|
413
560
|
},
|
|
@@ -417,6 +564,7 @@ const auditSite = defineTabTool({
|
|
|
417
564
|
},
|
|
418
565
|
pages,
|
|
419
566
|
summary,
|
|
567
|
+
sessionLosses,
|
|
420
568
|
};
|
|
421
569
|
const reportFileName = sanitizeForFilePath(params.reportFile ?? `audit-site-${safeIsoTimestampForFileName()}.json`);
|
|
422
570
|
const reportPath = await context.outputFile(reportFileName);
|
|
@@ -429,6 +577,9 @@ const auditSite = defineTabTool({
|
|
|
429
577
|
});
|
|
430
578
|
response.setStructuredContent({
|
|
431
579
|
kind: 'audit_site',
|
|
580
|
+
// Mirrors the JSON report version: v2 replaced the singular sessionLoss
|
|
581
|
+
// object with the sessionLosses list on both surfaces.
|
|
582
|
+
version: 'v2',
|
|
432
583
|
report: {
|
|
433
584
|
path: reportPath,
|
|
434
585
|
uri: reportResourceLink.uri,
|
|
@@ -442,6 +593,11 @@ const auditSite = defineTabTool({
|
|
|
442
593
|
durationMs: report.metadata.durationMs,
|
|
443
594
|
},
|
|
444
595
|
totals: summary.totals,
|
|
596
|
+
sessionLosses,
|
|
597
|
+
pagesWithUnscannedFrames: pagesWithUnscannedFrames.map(page => ({
|
|
598
|
+
url: page.url,
|
|
599
|
+
unscannedFrames: page.unscannedFrames,
|
|
600
|
+
})),
|
|
445
601
|
topViolations: summaryViolations.slice(0, 5).map(violation => ({
|
|
446
602
|
id: violation.id,
|
|
447
603
|
impact: violation.impact ?? null,
|
|
@@ -449,6 +605,13 @@ const auditSite = defineTabTool({
|
|
|
449
605
|
totalOccurrences: violation.totalOccurrences,
|
|
450
606
|
helpUrl: violation.helpUrl,
|
|
451
607
|
})),
|
|
608
|
+
topIncomplete: summaryIncomplete.slice(0, 5).map(item => ({
|
|
609
|
+
id: item.id,
|
|
610
|
+
impact: item.impact ?? null,
|
|
611
|
+
pagesAffected: item.pagesAffected.length,
|
|
612
|
+
totalOccurrences: item.totalOccurrences,
|
|
613
|
+
helpUrl: item.helpUrl,
|
|
614
|
+
})),
|
|
452
615
|
topPages: scannedPagesByViolations
|
|
453
616
|
.slice(0, 5)
|
|
454
617
|
.map(page => ({
|
|
@@ -459,15 +622,33 @@ const auditSite = defineTabTool({
|
|
|
459
622
|
})),
|
|
460
623
|
});
|
|
461
624
|
const topViolations = summarizeTopViolations(summaryViolations, 10);
|
|
625
|
+
const topIncomplete = summarizeTopViolations(summaryIncomplete, 10);
|
|
462
626
|
const topPages = summarizeTopPages(scannedPagesByViolations, 20);
|
|
627
|
+
const frameWarning = pagesWithUnscannedFrames.length ? [
|
|
628
|
+
`WARNING: Axe could not be installed in frames on ${pagesWithUnscannedFrames.length} page(s); their contents were not scanned and contribute no findings below.`,
|
|
629
|
+
...pagesWithUnscannedFrames.slice(0, 10).map(page => `- ${page.url}: ${page.unscannedFrames.join(', ')}`),
|
|
630
|
+
'',
|
|
631
|
+
] : [];
|
|
632
|
+
const sessionWarning = sessionLosses.length ? [
|
|
633
|
+
...sessionLosses.map(loss => `WARNING: cookie(s) ${loss.cookies.join(', ')} present when the crawl started disappeared while loading ${loss.url}.`),
|
|
634
|
+
'If one of these was a session cookie, pages scanned after the URL that dropped it were audited as a signed-out user. Add that URL to excludePathPatterns, sign in again, and re-run.',
|
|
635
|
+
'',
|
|
636
|
+
] : [];
|
|
463
637
|
response.addCode('// Crawled pages in a temporary tab and aggregated Axe violations.');
|
|
464
638
|
response.addResult([
|
|
639
|
+
...frameWarning,
|
|
640
|
+
...sessionWarning,
|
|
465
641
|
`Scanned pages: ${summary.totals.scannedPages}`,
|
|
466
642
|
`Errored pages: ${summary.totals.erroredPages}`,
|
|
467
643
|
`Skipped URLs: ${summary.totals.skippedUrls}`,
|
|
468
644
|
'',
|
|
469
645
|
'Top violations by pages affected:',
|
|
470
646
|
...(topViolations.length ? topViolations : ['- None']),
|
|
647
|
+
...(params.includeIncomplete ? [
|
|
648
|
+
'',
|
|
649
|
+
'Top incomplete (needs review — verify these on the page):',
|
|
650
|
+
...(topIncomplete.length ? topIncomplete : ['- None']),
|
|
651
|
+
] : []),
|
|
471
652
|
'',
|
|
472
653
|
'Per-page summary (top 20 by violation count):',
|
|
473
654
|
...(topPages.length ? topPages : ['- None']),
|