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.
Files changed (85) hide show
  1. package/README.md +265 -12
  2. package/index.d.ts +1 -1
  3. package/lib/browserContextFactory.js +1161 -94
  4. package/lib/browserContextFactory.js.map +1 -1
  5. package/lib/browserServerBackend.js +199 -22
  6. package/lib/browserServerBackend.js.map +1 -1
  7. package/lib/browserSessions.js +172 -0
  8. package/lib/browserSessions.js.map +1 -0
  9. package/lib/config.js +48 -7
  10. package/lib/config.js.map +1 -1
  11. package/lib/context.js +321 -71
  12. package/lib/context.js.map +1 -1
  13. package/lib/extension/cdpRelay.js +5 -0
  14. package/lib/extension/cdpRelay.js.map +1 -1
  15. package/lib/extension/extensionContextFactory.js +12 -1
  16. package/lib/extension/extensionContextFactory.js.map +1 -1
  17. package/lib/index.js +5 -1
  18. package/lib/index.js.map +1 -1
  19. package/lib/mcp/http.js +194 -44
  20. package/lib/mcp/http.js.map +1 -1
  21. package/lib/mcp/inProcessTransport.js.map +1 -1
  22. package/lib/mcp/mdb.js +7 -9
  23. package/lib/mcp/mdb.js.map +1 -1
  24. package/lib/mcp/proxyBackend.js +76 -18
  25. package/lib/mcp/proxyBackend.js.map +1 -1
  26. package/lib/mcp/server.js +70 -41
  27. package/lib/mcp/server.js.map +1 -1
  28. package/lib/mcp/sharedClientSlot.js +134 -0
  29. package/lib/mcp/sharedClientSlot.js.map +1 -0
  30. package/lib/mcp/tool.js +3 -0
  31. package/lib/mcp/tool.js.map +1 -1
  32. package/lib/networkPolicy.js +73 -0
  33. package/lib/networkPolicy.js.map +1 -0
  34. package/lib/program.js +91 -12
  35. package/lib/program.js.map +1 -1
  36. package/lib/response.js +16 -3
  37. package/lib/response.js.map +1 -1
  38. package/lib/sessionLog.js +36 -6
  39. package/lib/sessionLog.js.map +1 -1
  40. package/lib/tab.js +149 -18
  41. package/lib/tab.js.map +1 -1
  42. package/lib/tools/auditKeyboard.js +204 -4
  43. package/lib/tools/auditKeyboard.js.map +1 -1
  44. package/lib/tools/auditScreenReader.js +823 -0
  45. package/lib/tools/auditScreenReader.js.map +1 -0
  46. package/lib/tools/auditSite.js +268 -90
  47. package/lib/tools/auditSite.js.map +1 -1
  48. package/lib/tools/axe.js +479 -21
  49. package/lib/tools/axe.js.map +1 -1
  50. package/lib/tools/dialogs.js +18 -4
  51. package/lib/tools/dialogs.js.map +1 -1
  52. package/lib/tools/evaluate.js +34 -5
  53. package/lib/tools/evaluate.js.map +1 -1
  54. package/lib/tools/network.js +136 -8
  55. package/lib/tools/network.js.map +1 -1
  56. package/lib/tools/pdf.js +5 -2
  57. package/lib/tools/pdf.js.map +1 -1
  58. package/lib/tools/scanPageMatrix.js +135 -47
  59. package/lib/tools/scanPageMatrix.js.map +1 -1
  60. package/lib/tools/screenshot.js +8 -4
  61. package/lib/tools/screenshot.js.map +1 -1
  62. package/lib/tools/session.js +53 -0
  63. package/lib/tools/session.js.map +1 -0
  64. package/lib/tools/snapshot.js +266 -8
  65. package/lib/tools/snapshot.js.map +1 -1
  66. package/lib/tools/tool.js.map +1 -1
  67. package/lib/tools/utils.js +62 -6
  68. package/lib/tools/utils.js.map +1 -1
  69. package/lib/tools.js +11 -2
  70. package/lib/tools.js.map +1 -1
  71. package/lib/utils/dataUrl.js +58 -35
  72. package/lib/utils/dataUrl.js.map +1 -1
  73. package/lib/utils/fileUtils.js +35 -0
  74. package/lib/utils/fileUtils.js.map +1 -1
  75. package/lib/utils/guid.js +8 -0
  76. package/lib/utils/guid.js.map +1 -1
  77. package/lib/utils/jsSource.js +187 -0
  78. package/lib/utils/jsSource.js.map +1 -0
  79. package/lib/vscode/browserContextFactory.js +87 -0
  80. package/lib/vscode/browserContextFactory.js.map +1 -0
  81. package/lib/vscode/host.js +189 -33
  82. package/lib/vscode/host.js.map +1 -1
  83. package/lib/vscode/main.js +3 -35
  84. package/lib/vscode/main.js.map +1 -1
  85. 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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"}
@@ -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, dedupeAxeNodes, runAxeScan, summarizeAxeViolations, trimAxeResults } from './axe.js';
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([...axeTagValues]).describe('Axe tags to include in scans.'),
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
- async function extractLinks(page) {
143
- return await page.evaluate(() => {
144
- return Array.from(document.querySelectorAll('a[href]'))
145
- .map(anchor => anchor.href)
146
- .filter(Boolean);
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
- async function extractNavLinks(page) {
150
- return await page.evaluate(() => {
151
- const selectors = 'nav a[href], header a[href], [role="navigation"] a[href]';
152
- return Array.from(document.querySelectorAll(selectors))
153
- .map(anchor => anchor.href)
154
- .filter(Boolean);
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
- pageReport.title = await crawlTab.page.title();
290
- const axeResult = await runAxeScan(crawlTab.page, params.violationsTag);
291
- const dedupedViolations = axeResult.violations.map(violation => ({
292
- ...violation,
293
- nodes: dedupeAxeNodes(violation.nodes),
294
- }));
295
- const trimmedViolations = trimAxeResults({ violations: dedupedViolations }, { maxNodesPerViolation: params.maxNodesPerViolation, dedupe: false });
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.violations = trimmedViolations;
298
- pageReport.summary = summarizeAxeViolations(trimmedViolations);
299
- for (const violation of dedupedViolations) {
300
- const existingSummary = summaryByViolation.get(violation.id);
301
- const summary = existingSummary ?? {
302
- id: violation.id,
303
- impact: violation.impact,
304
- tags: [...violation.tags],
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 = [...summaryByViolation.values()].map(summary => ({
371
- id: summary.id,
372
- impact: summary.impact,
373
- tags: summary.tags,
374
- help: summary.help,
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
- version: 'v1',
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']),