mcp-accessibility-scanner 3.0.1 → 3.2.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 +265 -12
- package/index.d.ts +1 -1
- package/lib/browserContextFactory.js +1161 -94
- package/lib/browserContextFactory.js.map +1 -1
- package/lib/browserServerBackend.js +199 -22
- package/lib/browserServerBackend.js.map +1 -1
- package/lib/browserSessions.js +172 -0
- package/lib/browserSessions.js.map +1 -0
- package/lib/config.js +48 -7
- package/lib/config.js.map +1 -1
- package/lib/context.js +321 -71
- package/lib/context.js.map +1 -1
- package/lib/extension/cdpRelay.js +5 -0
- package/lib/extension/cdpRelay.js.map +1 -1
- package/lib/extension/extensionContextFactory.js +12 -1
- package/lib/extension/extensionContextFactory.js.map +1 -1
- package/lib/index.js +5 -1
- package/lib/index.js.map +1 -1
- package/lib/mcp/http.js +194 -44
- package/lib/mcp/http.js.map +1 -1
- package/lib/mcp/inProcessTransport.js.map +1 -1
- package/lib/mcp/mdb.js +7 -9
- package/lib/mcp/mdb.js.map +1 -1
- package/lib/mcp/proxyBackend.js +76 -18
- package/lib/mcp/proxyBackend.js.map +1 -1
- package/lib/mcp/server.js +70 -41
- package/lib/mcp/server.js.map +1 -1
- package/lib/mcp/sharedClientSlot.js +134 -0
- package/lib/mcp/sharedClientSlot.js.map +1 -0
- package/lib/mcp/tool.js +3 -0
- package/lib/mcp/tool.js.map +1 -1
- package/lib/networkPolicy.js +73 -0
- package/lib/networkPolicy.js.map +1 -0
- package/lib/program.js +91 -12
- package/lib/program.js.map +1 -1
- package/lib/response.js +16 -3
- package/lib/response.js.map +1 -1
- package/lib/sessionLog.js +36 -6
- package/lib/sessionLog.js.map +1 -1
- package/lib/tab.js +149 -18
- package/lib/tab.js.map +1 -1
- package/lib/tools/auditKeyboard.js +204 -4
- package/lib/tools/auditKeyboard.js.map +1 -1
- package/lib/tools/auditScreenReader.js +823 -0
- package/lib/tools/auditScreenReader.js.map +1 -0
- package/lib/tools/auditSite.js +268 -90
- 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/network.js +136 -8
- package/lib/tools/network.js.map +1 -1
- package/lib/tools/pdf.js +5 -2
- package/lib/tools/pdf.js.map +1 -1
- package/lib/tools/scanPageMatrix.js +135 -47
- package/lib/tools/scanPageMatrix.js.map +1 -1
- package/lib/tools/screenshot.js +8 -4
- package/lib/tools/screenshot.js.map +1 -1
- package/lib/tools/session.js +53 -0
- package/lib/tools/session.js.map +1 -0
- package/lib/tools/snapshot.js +266 -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 +11 -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/fileUtils.js +35 -0
- package/lib/utils/fileUtils.js.map +1 -1
- package/lib/utils/guid.js +8 -0
- package/lib/utils/guid.js.map +1 -1
- package/lib/utils/jsSource.js +187 -0
- package/lib/utils/jsSource.js.map +1 -0
- package/lib/vscode/browserContextFactory.js +87 -0
- package/lib/vscode/browserContextFactory.js.map +1 -0
- package/lib/vscode/host.js +189 -33
- package/lib/vscode/host.js.map +1 -1
- package/lib/vscode/main.js +3 -35
- package/lib/vscode/main.js.map +1 -1
- package/package.json +13 -9
|
@@ -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
|
@@ -2,8 +2,8 @@ import fs from 'node:fs';
|
|
|
2
2
|
import RE2 from 're2';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import { defineTabTool } from './tool.js';
|
|
5
|
-
import { sanitizeForFilePath } from '../utils/fileUtils.js';
|
|
6
|
-
import { axeTagValues,
|
|
5
|
+
import { safeIsoTimestampForFileName, sanitizeForFilePath } from '../utils/fileUtils.js';
|
|
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({
|
|
@@ -109,9 +112,6 @@ function inferStartUrlFromProvidedUrls(urls) {
|
|
|
109
112
|
}
|
|
110
113
|
return undefined;
|
|
111
114
|
}
|
|
112
|
-
function safeIsoTimestampForFileName() {
|
|
113
|
-
return sanitizeForFilePath(new Date().toISOString());
|
|
114
|
-
}
|
|
115
115
|
function isExcludedByPath(candidate, excludePatterns) {
|
|
116
116
|
const value = `${candidate.pathname}${candidate.search}`;
|
|
117
117
|
return excludePatterns.some(pattern => pattern.test(value));
|
|
@@ -139,21 +139,75 @@ function normalizeUrl(rawUrl, baseUrl, ignoredParams) {
|
|
|
139
139
|
url.pathname = url.pathname.slice(0, -1);
|
|
140
140
|
return url;
|
|
141
141
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
142
|
+
/**
|
|
143
|
+
* Cookies the crawled URLs would actually send, keyed by name + domain + path and
|
|
144
|
+
* mapped to the name and expiry needed to report on them. Scoping to the crawl URLs
|
|
145
|
+
* keeps an unrelated origin's expiring cookie from raising a false alarm, and keying
|
|
146
|
+
* on the full identity stops a same-named cookie elsewhere from masking a deleted one.
|
|
147
|
+
* Values are deliberately not compared: a rotating CSRF token is not a lost session.
|
|
148
|
+
* Ceiling: a session cookie scoped to a path below the crawl URLs is not tracked.
|
|
149
|
+
*/
|
|
150
|
+
async function readCrawlCookies(page, urls) {
|
|
151
|
+
const cookies = await page.context().cookies(urls);
|
|
152
|
+
return new Map(cookies.map(cookie => [`${cookie.name}\n${cookie.domain}\n${cookie.path}`, { name: cookie.name, expires: cookie.expires }]));
|
|
148
153
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
154
|
+
/**
|
|
155
|
+
* Baseline cookies the context no longer carries, or null when nothing is missing.
|
|
156
|
+
*
|
|
157
|
+
* A cookie whose own expiry has already passed was deleted by the clock rather than
|
|
158
|
+
* by the site, so it is not a lost session: Cloudflare's `__cf_bm` lives 30 minutes
|
|
159
|
+
* and would otherwise warn on any longer crawl. Cookies are still not classified as
|
|
160
|
+
* "authentication" ones — no cookie attribute marks that, and every proxy for it
|
|
161
|
+
* (httpOnly, session scope) misfires both ways on real sites, which would turn a
|
|
162
|
+
* false warning into a missed logout.
|
|
163
|
+
*
|
|
164
|
+
* A cookie read failure yields no loss: the context is gone, and aborting here would
|
|
165
|
+
* throw away the pages already scanned along with the navigation error for this one.
|
|
166
|
+
*
|
|
167
|
+
* The identities of the missing cookies are returned so the caller can drop them
|
|
168
|
+
* from the baseline: each cookie is reported once, at the URL where it vanished,
|
|
169
|
+
* and monitoring continues afterwards — an analytics cookie expiring early in the
|
|
170
|
+
* crawl must not mask the real session cookie being dropped ten pages later.
|
|
171
|
+
*/
|
|
172
|
+
async function findCookieLoss(page, urls, baseline, requestedUrl, urlBeforeNavigation) {
|
|
173
|
+
const current = await readCrawlCookies(page, urls).catch(() => null);
|
|
174
|
+
if (!current)
|
|
175
|
+
return null;
|
|
176
|
+
const now = Date.now();
|
|
177
|
+
const missing = [...baseline]
|
|
178
|
+
.filter(([identity, cookie]) => !current.has(identity) && !(cookie.expires > 0 && cookie.expires * 1000 <= now));
|
|
179
|
+
if (!missing.length)
|
|
180
|
+
return null;
|
|
181
|
+
// The page reached after redirects is the one that dropped the cookie, and the one
|
|
182
|
+
// worth excluding; the queued URL may only have pointed at it. A navigation that
|
|
183
|
+
// never committed leaves the tab on the previous page, which is innocent — there
|
|
184
|
+
// the URL asked for is the one whose response dropped the cookie.
|
|
185
|
+
const reachedUrl = page.url();
|
|
186
|
+
const url = !reachedUrl || reachedUrl === urlBeforeNavigation ? requestedUrl : reachedUrl;
|
|
187
|
+
return {
|
|
188
|
+
url,
|
|
189
|
+
cookies: [...new Set(missing.map(([, cookie]) => cookie.name))],
|
|
190
|
+
identities: missing.map(([identity]) => identity),
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Title and outgoing links in one round trip: both are wanted for every crawled
|
|
195
|
+
* page, and a second evaluate per page is pure latency on a 200-page crawl.
|
|
196
|
+
* `linkSelector` is empty when this page contributes no links (depth exhausted,
|
|
197
|
+
* or a strategy that only reads the entry page).
|
|
198
|
+
*/
|
|
199
|
+
async function readPage(page, linkSelector) {
|
|
200
|
+
return await page.evaluate(selector => ({
|
|
201
|
+
title: document.title,
|
|
202
|
+
links: selector
|
|
203
|
+
? Array.from(document.querySelectorAll(selector))
|
|
204
|
+
.map(anchor => anchor.href)
|
|
205
|
+
.filter(Boolean)
|
|
206
|
+
: [],
|
|
207
|
+
}), linkSelector);
|
|
156
208
|
}
|
|
209
|
+
const allLinksSelector = 'a[href]';
|
|
210
|
+
const navLinksSelector = 'nav a[href], header a[href], [role="navigation"] a[href]';
|
|
157
211
|
async function extractSitemapUrls(page, sitemapUrl) {
|
|
158
212
|
const response = await page.request.get(sitemapUrl, { timeout: 15000 });
|
|
159
213
|
if (!response.ok())
|
|
@@ -162,6 +216,62 @@ async function extractSitemapUrls(page, sitemapUrl) {
|
|
|
162
216
|
const matches = [...xmlText.matchAll(/<loc>([\s\S]*?)<\/loc>/gi)];
|
|
163
217
|
return matches.map(match => match[1].replace('<![CDATA[', '').replace(']]>', '').trim()).filter(Boolean);
|
|
164
218
|
}
|
|
219
|
+
function aggregateIntoSummary(summaryByRuleId, violations, pageUrl) {
|
|
220
|
+
for (const violation of violations) {
|
|
221
|
+
const existingSummary = summaryByRuleId.get(violation.id);
|
|
222
|
+
const summary = existingSummary ?? {
|
|
223
|
+
id: violation.id,
|
|
224
|
+
impact: violation.impact,
|
|
225
|
+
tags: [...violation.tags],
|
|
226
|
+
help: violation.help,
|
|
227
|
+
helpUrl: violation.helpUrl,
|
|
228
|
+
description: violation.description,
|
|
229
|
+
pagesAffected: new Set(),
|
|
230
|
+
totalOccurrences: 0,
|
|
231
|
+
fingerprints: new Set(),
|
|
232
|
+
sampleNodes: [],
|
|
233
|
+
};
|
|
234
|
+
summary.pagesAffected.add(pageUrl);
|
|
235
|
+
summary.totalOccurrences += violation.nodes.length;
|
|
236
|
+
for (const node of violation.nodes) {
|
|
237
|
+
// The fingerprint set is scoped to one violation id, so the
|
|
238
|
+
// normalized node HTML alone identifies a unique occurrence.
|
|
239
|
+
const fingerprint = fastFingerprint(normalizeWhitespace(node.html ?? ''));
|
|
240
|
+
if (summary.fingerprints.has(fingerprint))
|
|
241
|
+
continue;
|
|
242
|
+
summary.fingerprints.add(fingerprint);
|
|
243
|
+
if (summary.sampleNodes.length < 3) {
|
|
244
|
+
summary.sampleNodes.push({
|
|
245
|
+
pageUrl,
|
|
246
|
+
target: [...(node.target ?? [])],
|
|
247
|
+
html: node.html ?? '',
|
|
248
|
+
failureSummary: node.failureSummary ?? null,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
summaryByRuleId.set(violation.id, summary);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
function toSortedSummaryViolations(summaryByRuleId) {
|
|
256
|
+
return [...summaryByRuleId.values()].map(summary => ({
|
|
257
|
+
id: summary.id,
|
|
258
|
+
impact: summary.impact,
|
|
259
|
+
tags: summary.tags,
|
|
260
|
+
help: summary.help,
|
|
261
|
+
helpUrl: summary.helpUrl,
|
|
262
|
+
description: summary.description,
|
|
263
|
+
pagesAffected: [...summary.pagesAffected],
|
|
264
|
+
totalOccurrences: summary.totalOccurrences,
|
|
265
|
+
uniqueOccurrences: summary.fingerprints.size,
|
|
266
|
+
sampleNodes: summary.sampleNodes,
|
|
267
|
+
})).sort((first, second) => {
|
|
268
|
+
const firstImpact = impactPriority[first.impact ?? 'unknown'] ?? impactPriority.unknown;
|
|
269
|
+
const secondImpact = impactPriority[second.impact ?? 'unknown'] ?? impactPriority.unknown;
|
|
270
|
+
if (firstImpact !== secondImpact)
|
|
271
|
+
return firstImpact - secondImpact;
|
|
272
|
+
return second.pagesAffected.length - first.pagesAffected.length;
|
|
273
|
+
});
|
|
274
|
+
}
|
|
165
275
|
function summarizeTopViolations(violations, count) {
|
|
166
276
|
return violations
|
|
167
277
|
.slice(0, count)
|
|
@@ -187,6 +297,10 @@ const auditSite = defineTabTool({
|
|
|
187
297
|
type: 'destructive',
|
|
188
298
|
},
|
|
189
299
|
handle: async (tab, params, response) => {
|
|
300
|
+
// Rule ids apply to the whole run, so a bad one must fail before any tab is
|
|
301
|
+
// opened or any URL visited; leaving it to the per-page scan would crawl the
|
|
302
|
+
// entire site and write a "completed" report of nothing but errored pages.
|
|
303
|
+
assertRuleOptionsValid({ rules: params.withRules, disableRules: params.disableRules });
|
|
190
304
|
const context = tab.context;
|
|
191
305
|
const originalTab = tab;
|
|
192
306
|
const queue = [];
|
|
@@ -205,6 +319,7 @@ const auditSite = defineTabTool({
|
|
|
205
319
|
const ignoredParams = new Set(params.ignoreQueryParams.map(param => param.toLowerCase()));
|
|
206
320
|
const excludePatterns = buildExcludePathPatterns(params.excludePathPatterns);
|
|
207
321
|
const summaryByViolation = new Map();
|
|
322
|
+
const summaryByIncomplete = new Map();
|
|
208
323
|
const enqueueUrl = (rawUrl, depth, discoveredFrom) => {
|
|
209
324
|
const normalizedUrl = normalizeUrl(rawUrl, startUrl, ignoredParams);
|
|
210
325
|
if (!normalizedUrl) {
|
|
@@ -228,8 +343,11 @@ const auditSite = defineTabTool({
|
|
|
228
343
|
skippedUrls++;
|
|
229
344
|
return;
|
|
230
345
|
}
|
|
346
|
+
const cookieUrl = new URL(rawUrl, startUrl);
|
|
347
|
+
cookieUrl.hash = '';
|
|
231
348
|
queue.push({
|
|
232
349
|
url: normalizedUrlString,
|
|
350
|
+
cookieUrl: cookieUrl.toString(),
|
|
233
351
|
depth,
|
|
234
352
|
discoveredFrom,
|
|
235
353
|
});
|
|
@@ -262,6 +380,19 @@ const auditSite = defineTabTool({
|
|
|
262
380
|
message: `Initialized site audit with ${queue.length} queued URL(s).`,
|
|
263
381
|
});
|
|
264
382
|
const crawlTab = await context.newTab();
|
|
383
|
+
// Cookies the crawl URLs carry before the crawl are the session the caller
|
|
384
|
+
// signed in with. If one disappears mid-crawl every later page is audited as a
|
|
385
|
+
// signed-out user, which still looks like a clean run, so record where it happened.
|
|
386
|
+
const cookieScopeUrls = queue.map(item => item.cookieUrl);
|
|
387
|
+
const cookieScope = new Set(cookieScopeUrls);
|
|
388
|
+
// The whole jar is snapshotted once, so a URL discovered mid-crawl can only
|
|
389
|
+
// add identities that existed when the crawl started. Without this, a cookie
|
|
390
|
+
// minted by an earlier crawled page would enter the baseline at discovery
|
|
391
|
+
// and its later removal would be misreported as losing a crawl-start cookie.
|
|
392
|
+
const initialCookieIdentities = new Set((await crawlTab.page.context().cookies().catch(() => []))
|
|
393
|
+
.map(cookie => `${cookie.name}\n${cookie.domain}\n${cookie.path}`));
|
|
394
|
+
const baselineCookies = await readCrawlCookies(crawlTab.page, cookieScopeUrls);
|
|
395
|
+
const sessionLosses = [];
|
|
265
396
|
let processedPages = 0;
|
|
266
397
|
try {
|
|
267
398
|
while (queue.length && pages.length < params.maxPages) {
|
|
@@ -281,64 +412,63 @@ const auditSite = defineTabTool({
|
|
|
281
412
|
error: null,
|
|
282
413
|
summary: null,
|
|
283
414
|
violations: [],
|
|
415
|
+
incomplete: [],
|
|
416
|
+
unscannedFrames: [],
|
|
284
417
|
};
|
|
285
418
|
pages.push(pageReport);
|
|
419
|
+
// URLs discovered mid-crawl join cookie tracking before they are visited:
|
|
420
|
+
// a session cookie scoped below the start URL (say /app, discovered from /)
|
|
421
|
+
// is invisible to the start-URL baseline, so deleting it later would
|
|
422
|
+
// otherwise never raise a warning. Read before navigating — the visit
|
|
423
|
+
// itself may be what drops the cookie. Only identities from the crawl-start
|
|
424
|
+
// jar snapshot may join, so the warning's "present when the crawl started"
|
|
425
|
+
// stays literally true. Ceiling: a crawl-start cookie deleted before its
|
|
426
|
+
// scope URL is discovered is not seen by this live read and goes
|
|
427
|
+
// unreported — accepted, because deciding which snapshot cookies apply to
|
|
428
|
+
// a URL ourselves would reimplement browser cookie matching, and getting
|
|
429
|
+
// that wrong turns into false session-loss warnings.
|
|
430
|
+
if (!cookieScope.has(item.cookieUrl)) {
|
|
431
|
+
cookieScope.add(item.cookieUrl);
|
|
432
|
+
cookieScopeUrls.push(item.cookieUrl);
|
|
433
|
+
const discovered = await readCrawlCookies(crawlTab.page, [item.cookieUrl]).catch(() => null);
|
|
434
|
+
for (const [identity, cookie] of discovered ?? []) {
|
|
435
|
+
if (initialCookieIdentities.has(identity) && !baselineCookies.has(identity))
|
|
436
|
+
baselineCookies.set(identity, cookie);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
const urlBeforeNavigation = crawlTab.page.url();
|
|
286
440
|
try {
|
|
287
441
|
await crawlTab.navigate(item.url);
|
|
288
442
|
await crawlTab.waitForTimeout(params.waitAfterNavigationMs);
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
443
|
+
// Discover before scanning. A scoped scan throws when an
|
|
444
|
+
// includeSelectors entry is absent from this page, and that must not
|
|
445
|
+
// silently drop every descendant reachable only through it.
|
|
446
|
+
let linkSelector = '';
|
|
447
|
+
if (params.strategy === 'links' && item.depth < params.maxDepth)
|
|
448
|
+
linkSelector = allLinksSelector;
|
|
449
|
+
else if (params.strategy === 'nav' && item.depth === 0)
|
|
450
|
+
linkSelector = navLinksSelector;
|
|
451
|
+
const { title, links } = await readPage(crawlTab.page, linkSelector);
|
|
452
|
+
pageReport.title = title;
|
|
453
|
+
for (const link of links)
|
|
454
|
+
enqueueUrl(link, item.depth + 1, item.url);
|
|
455
|
+
const axeResult = await runAxeScan(crawlTab.page, {
|
|
456
|
+
tags: params.violationsTag,
|
|
457
|
+
rules: params.withRules,
|
|
458
|
+
disableRules: params.disableRules,
|
|
459
|
+
include: params.includeSelectors,
|
|
460
|
+
exclude: params.excludeSelectors,
|
|
461
|
+
});
|
|
462
|
+
const violations = prepareAxeResults(axeResult.violations, params.maxNodesPerViolation);
|
|
296
463
|
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);
|
|
464
|
+
pageReport.unscannedFrames = axeResult.unscannedFrames;
|
|
465
|
+
pageReport.violations = violations.trimmed;
|
|
466
|
+
pageReport.summary = summarizeAxeViolations(violations.trimmed);
|
|
467
|
+
aggregateIntoSummary(summaryByViolation, violations.deduped, item.url);
|
|
468
|
+
if (params.includeIncomplete) {
|
|
469
|
+
const incomplete = prepareAxeResults(axeResult.incomplete, params.maxNodesPerViolation);
|
|
470
|
+
pageReport.incomplete = incomplete.trimmed;
|
|
471
|
+
aggregateIntoSummary(summaryByIncomplete, incomplete.deduped, item.url);
|
|
342
472
|
}
|
|
343
473
|
}
|
|
344
474
|
catch (error) {
|
|
@@ -347,6 +477,25 @@ const auditSite = defineTabTool({
|
|
|
347
477
|
pageReport.error = error instanceof Error ? error.message : String(error);
|
|
348
478
|
}
|
|
349
479
|
finally {
|
|
480
|
+
// Checked after failed navigations too: a logout URL that clears the cookie
|
|
481
|
+
// and then times out still ended the session, and skipping it pins the
|
|
482
|
+
// warning on the next page that happens to load — an innocent route.
|
|
483
|
+
// Monitoring never stops at the first loss: reported cookies leave the
|
|
484
|
+
// baseline, so each later disappearance is still caught and attributed
|
|
485
|
+
// to its own URL instead of being masked by an earlier, unrelated one.
|
|
486
|
+
if (baselineCookies.size) {
|
|
487
|
+
const loss = await findCookieLoss(crawlTab.page, cookieScopeUrls, baselineCookies, item.url, urlBeforeNavigation);
|
|
488
|
+
if (loss) {
|
|
489
|
+
sessionLosses.push({ url: loss.url, cookies: loss.cookies });
|
|
490
|
+
// Removed from the jar snapshot too, or a later-discovered URL
|
|
491
|
+
// could re-admit an already-reported cookie to the baseline and
|
|
492
|
+
// report the same loss twice.
|
|
493
|
+
for (const identity of loss.identities) {
|
|
494
|
+
baselineCookies.delete(identity);
|
|
495
|
+
initialCookieIdentities.delete(identity);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
350
499
|
processedPages++;
|
|
351
500
|
const message = pageReport.status === 'scanned'
|
|
352
501
|
? `Scanned page ${processedPages}/${params.maxPages}: ${item.url}`
|
|
@@ -367,24 +516,11 @@ const auditSite = defineTabTool({
|
|
|
367
516
|
if (originalTabIndex !== -1)
|
|
368
517
|
await context.selectTab(originalTabIndex);
|
|
369
518
|
}
|
|
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
|
-
});
|
|
519
|
+
const summaryViolations = toSortedSummaryViolations(summaryByViolation);
|
|
520
|
+
const summaryIncomplete = toSortedSummaryViolations(summaryByIncomplete);
|
|
521
|
+
// A partly-scanned page reports fewer violations, and a reader counting them
|
|
522
|
+
// must know which pages those numbers are incomplete for.
|
|
523
|
+
const pagesWithUnscannedFrames = pages.filter(page => page.unscannedFrames.length);
|
|
388
524
|
const scannedPagesByViolations = sortScannedPagesByViolations(pages);
|
|
389
525
|
const summary = {
|
|
390
526
|
totals: {
|
|
@@ -394,9 +530,12 @@ const auditSite = defineTabTool({
|
|
|
394
530
|
queuedUrls: visited.size,
|
|
395
531
|
},
|
|
396
532
|
violations: summaryViolations,
|
|
533
|
+
incomplete: summaryIncomplete,
|
|
397
534
|
};
|
|
398
535
|
const report = {
|
|
399
|
-
|
|
536
|
+
// v2: the singular `sessionLoss` object became the `sessionLosses` list,
|
|
537
|
+
// so a consumer keying its parser on the version has a signal.
|
|
538
|
+
version: 'v2',
|
|
400
539
|
metadata: {
|
|
401
540
|
startUrl: startUrl.toString(),
|
|
402
541
|
strategy: params.strategy,
|
|
@@ -408,6 +547,11 @@ const auditSite = defineTabTool({
|
|
|
408
547
|
excludePathPatterns: params.excludePathPatterns,
|
|
409
548
|
ignoreQueryParams: params.ignoreQueryParams,
|
|
410
549
|
violationsTag: params.violationsTag,
|
|
550
|
+
includeIncomplete: params.includeIncomplete,
|
|
551
|
+
includeSelectors: params.includeSelectors ?? null,
|
|
552
|
+
excludeSelectors: params.excludeSelectors ?? null,
|
|
553
|
+
withRules: params.withRules ?? null,
|
|
554
|
+
disableRules: params.disableRules ?? null,
|
|
411
555
|
maxNodesPerViolation: params.maxNodesPerViolation,
|
|
412
556
|
waitAfterNavigationMs: params.waitAfterNavigationMs,
|
|
413
557
|
},
|
|
@@ -417,6 +561,7 @@ const auditSite = defineTabTool({
|
|
|
417
561
|
},
|
|
418
562
|
pages,
|
|
419
563
|
summary,
|
|
564
|
+
sessionLosses,
|
|
420
565
|
};
|
|
421
566
|
const reportFileName = sanitizeForFilePath(params.reportFile ?? `audit-site-${safeIsoTimestampForFileName()}.json`);
|
|
422
567
|
const reportPath = await context.outputFile(reportFileName);
|
|
@@ -429,6 +574,9 @@ const auditSite = defineTabTool({
|
|
|
429
574
|
});
|
|
430
575
|
response.setStructuredContent({
|
|
431
576
|
kind: 'audit_site',
|
|
577
|
+
// Mirrors the JSON report version: v2 replaced the singular sessionLoss
|
|
578
|
+
// object with the sessionLosses list on both surfaces.
|
|
579
|
+
version: 'v2',
|
|
432
580
|
report: {
|
|
433
581
|
path: reportPath,
|
|
434
582
|
uri: reportResourceLink.uri,
|
|
@@ -442,6 +590,11 @@ const auditSite = defineTabTool({
|
|
|
442
590
|
durationMs: report.metadata.durationMs,
|
|
443
591
|
},
|
|
444
592
|
totals: summary.totals,
|
|
593
|
+
sessionLosses,
|
|
594
|
+
pagesWithUnscannedFrames: pagesWithUnscannedFrames.map(page => ({
|
|
595
|
+
url: page.url,
|
|
596
|
+
unscannedFrames: page.unscannedFrames,
|
|
597
|
+
})),
|
|
445
598
|
topViolations: summaryViolations.slice(0, 5).map(violation => ({
|
|
446
599
|
id: violation.id,
|
|
447
600
|
impact: violation.impact ?? null,
|
|
@@ -449,6 +602,13 @@ const auditSite = defineTabTool({
|
|
|
449
602
|
totalOccurrences: violation.totalOccurrences,
|
|
450
603
|
helpUrl: violation.helpUrl,
|
|
451
604
|
})),
|
|
605
|
+
topIncomplete: summaryIncomplete.slice(0, 5).map(item => ({
|
|
606
|
+
id: item.id,
|
|
607
|
+
impact: item.impact ?? null,
|
|
608
|
+
pagesAffected: item.pagesAffected.length,
|
|
609
|
+
totalOccurrences: item.totalOccurrences,
|
|
610
|
+
helpUrl: item.helpUrl,
|
|
611
|
+
})),
|
|
452
612
|
topPages: scannedPagesByViolations
|
|
453
613
|
.slice(0, 5)
|
|
454
614
|
.map(page => ({
|
|
@@ -459,15 +619,33 @@ const auditSite = defineTabTool({
|
|
|
459
619
|
})),
|
|
460
620
|
});
|
|
461
621
|
const topViolations = summarizeTopViolations(summaryViolations, 10);
|
|
622
|
+
const topIncomplete = summarizeTopViolations(summaryIncomplete, 10);
|
|
462
623
|
const topPages = summarizeTopPages(scannedPagesByViolations, 20);
|
|
624
|
+
const frameWarning = pagesWithUnscannedFrames.length ? [
|
|
625
|
+
`WARNING: Axe could not be installed in frames on ${pagesWithUnscannedFrames.length} page(s); their contents were not scanned and contribute no findings below.`,
|
|
626
|
+
...pagesWithUnscannedFrames.slice(0, 10).map(page => `- ${page.url}: ${page.unscannedFrames.join(', ')}`),
|
|
627
|
+
'',
|
|
628
|
+
] : [];
|
|
629
|
+
const sessionWarning = sessionLosses.length ? [
|
|
630
|
+
...sessionLosses.map(loss => `WARNING: cookie(s) ${loss.cookies.join(', ')} present when the crawl started disappeared while loading ${loss.url}.`),
|
|
631
|
+
'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.',
|
|
632
|
+
'',
|
|
633
|
+
] : [];
|
|
463
634
|
response.addCode('// Crawled pages in a temporary tab and aggregated Axe violations.');
|
|
464
635
|
response.addResult([
|
|
636
|
+
...frameWarning,
|
|
637
|
+
...sessionWarning,
|
|
465
638
|
`Scanned pages: ${summary.totals.scannedPages}`,
|
|
466
639
|
`Errored pages: ${summary.totals.erroredPages}`,
|
|
467
640
|
`Skipped URLs: ${summary.totals.skippedUrls}`,
|
|
468
641
|
'',
|
|
469
642
|
'Top violations by pages affected:',
|
|
470
643
|
...(topViolations.length ? topViolations : ['- None']),
|
|
644
|
+
...(params.includeIncomplete ? [
|
|
645
|
+
'',
|
|
646
|
+
'Top incomplete (needs review — verify these on the page):',
|
|
647
|
+
...(topIncomplete.length ? topIncomplete : ['- None']),
|
|
648
|
+
] : []),
|
|
471
649
|
'',
|
|
472
650
|
'Per-page summary (top 20 by violation count):',
|
|
473
651
|
...(topPages.length ? topPages : ['- None']),
|