@setsquare/review-sdk 0.0.1 → 0.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.
Files changed (105) hide show
  1. package/NOTICE +3 -2
  2. package/README.md +220 -0
  3. package/dist/autoscan.d.ts +15 -1
  4. package/dist/autoscan.d.ts.map +1 -1
  5. package/dist/autoscan.js +168 -13
  6. package/dist/autoscan.js.map +1 -1
  7. package/dist/brand.d.ts +51 -2
  8. package/dist/brand.d.ts.map +1 -1
  9. package/dist/brand.js +560 -5
  10. package/dist/brand.js.map +1 -1
  11. package/dist/checks/context-change.d.ts +96 -0
  12. package/dist/checks/context-change.d.ts.map +1 -0
  13. package/dist/checks/context-change.js +655 -0
  14. package/dist/checks/context-change.js.map +1 -0
  15. package/dist/checks/focus.d.ts +154 -0
  16. package/dist/checks/focus.d.ts.map +1 -0
  17. package/dist/checks/focus.js +1123 -0
  18. package/dist/checks/focus.js.map +1 -0
  19. package/dist/checks/heuristics.d.ts +116 -0
  20. package/dist/checks/heuristics.d.ts.map +1 -0
  21. package/dist/checks/heuristics.js +931 -0
  22. package/dist/checks/heuristics.js.map +1 -0
  23. package/dist/checks/keyboard.d.ts +106 -0
  24. package/dist/checks/keyboard.d.ts.map +1 -0
  25. package/dist/checks/keyboard.js +452 -0
  26. package/dist/checks/keyboard.js.map +1 -0
  27. package/dist/checks/reflow.d.ts +75 -0
  28. package/dist/checks/reflow.d.ts.map +1 -0
  29. package/dist/checks/reflow.js +285 -0
  30. package/dist/checks/reflow.js.map +1 -0
  31. package/dist/checks/rule-pack.d.ts +1 -1
  32. package/dist/checks/rule-pack.d.ts.map +1 -1
  33. package/dist/checks/rule-pack.js +350 -45
  34. package/dist/checks/rule-pack.js.map +1 -1
  35. package/dist/checks/shortcuts.d.ts +71 -0
  36. package/dist/checks/shortcuts.d.ts.map +1 -0
  37. package/dist/checks/shortcuts.js +196 -0
  38. package/dist/checks/shortcuts.js.map +1 -0
  39. package/dist/checks/versions.d.ts.map +1 -1
  40. package/dist/checks/versions.js +33 -1
  41. package/dist/checks/versions.js.map +1 -1
  42. package/dist/contract.d.ts +18 -0
  43. package/dist/contract.d.ts.map +1 -1
  44. package/dist/covers.d.ts +56 -0
  45. package/dist/covers.d.ts.map +1 -0
  46. package/dist/covers.js +135 -0
  47. package/dist/covers.js.map +1 -0
  48. package/dist/dedupe.d.ts +23 -0
  49. package/dist/dedupe.d.ts.map +1 -1
  50. package/dist/dedupe.js +96 -2
  51. package/dist/dedupe.js.map +1 -1
  52. package/dist/document.d.ts.map +1 -1
  53. package/dist/document.js +144 -0
  54. package/dist/document.js.map +1 -1
  55. package/dist/envelope.d.ts +8 -0
  56. package/dist/envelope.d.ts.map +1 -1
  57. package/dist/envelope.js +28 -0
  58. package/dist/envelope.js.map +1 -1
  59. package/dist/fixture.d.ts.map +1 -1
  60. package/dist/fixture.js +12 -0
  61. package/dist/fixture.js.map +1 -1
  62. package/dist/html-report.d.ts +24 -7
  63. package/dist/html-report.d.ts.map +1 -1
  64. package/dist/html-report.js +608 -136
  65. package/dist/html-report.js.map +1 -1
  66. package/dist/index.d.ts +13 -0
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +13 -0
  69. package/dist/index.js.map +1 -1
  70. package/dist/links.d.ts +43 -0
  71. package/dist/links.d.ts.map +1 -1
  72. package/dist/links.js +43 -0
  73. package/dist/links.js.map +1 -1
  74. package/dist/observe.d.ts +8 -0
  75. package/dist/observe.d.ts.map +1 -1
  76. package/dist/observe.js +45 -1
  77. package/dist/observe.js.map +1 -1
  78. package/dist/options.d.ts +53 -0
  79. package/dist/options.d.ts.map +1 -1
  80. package/dist/options.js +3 -0
  81. package/dist/options.js.map +1 -1
  82. package/dist/reading-level.d.ts +22 -1
  83. package/dist/reading-level.d.ts.map +1 -1
  84. package/dist/reading-level.js +122 -19
  85. package/dist/reading-level.js.map +1 -1
  86. package/dist/reporter.d.ts.map +1 -1
  87. package/dist/reporter.js +31 -15
  88. package/dist/reporter.js.map +1 -1
  89. package/dist/scan.d.ts +36 -1
  90. package/dist/scan.d.ts.map +1 -1
  91. package/dist/scan.js +16 -2
  92. package/dist/scan.js.map +1 -1
  93. package/dist/screens.d.ts +55 -4
  94. package/dist/screens.d.ts.map +1 -1
  95. package/dist/screens.js +243 -43
  96. package/dist/screens.js.map +1 -1
  97. package/dist/summary.d.ts +22 -0
  98. package/dist/summary.d.ts.map +1 -1
  99. package/dist/summary.js +197 -22
  100. package/dist/summary.js.map +1 -1
  101. package/dist/viewports.d.ts +105 -0
  102. package/dist/viewports.d.ts.map +1 -0
  103. package/dist/viewports.js +134 -0
  104. package/dist/viewports.js.map +1 -0
  105. package/package.json +5 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heuristics.js","sourceRoot":"","sources":["../../src/checks/heuristics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ import type { Page } from '@playwright/test';
2
+ import type { DynamicCheckEvidence } from './dynamic.js';
3
+ /**
4
+ * WCAG 2.1.2 No Keyboard Trap (A), the only way it can be checked: by pressing
5
+ * the key.
6
+ *
7
+ * A trap is not a property of the document. It is a property of the SEQUENCE of
8
+ * focus moves, which is why no DOM-snapshot analyser has ever had a rule for it
9
+ * and why this is a level A criterion that nothing checks. It is also one of
10
+ * the oldest and most damaging failures there is: a keyboard user who cannot
11
+ * get out has to reload the page.
12
+ *
13
+ * Teardown only, for the reason `focus.ts` gives at length: pressing Tab fires
14
+ * the page's own key and focus handlers, and a handler that opened a menu has
15
+ * already run by the time anything is restored.
16
+ */
17
+ export declare const SETSQUARE_KEYBOARD_CHECKS_VERSION = "setsquare-keyboard@1";
18
+ export declare const KEYBOARD_TRAP_RULE_ID = "setsquare-keyboard-trap";
19
+ export interface TabWalk {
20
+ direction: 'forward' | 'backward';
21
+ /**
22
+ * Where focus landed, in order, as ELEMENT IDENTITIES.
23
+ *
24
+ * Numbers rather than selectors, and the distinction was a real bug. The
25
+ * first version recorded the display selector, and `describe()` stops
26
+ * climbing as soon as it finds a class — so four different navigation links
27
+ * all came back as `a.ss-nav-link`. Cycle detection then ran on colliding
28
+ * identities, and the "how many did we reach" figure counted distinct
29
+ * STRINGS against a count of distinct ELEMENTS. On this repository's own
30
+ * home page that read "40 Tab presses reached 7 of the 20 focusable
31
+ * elements" about a tab order that is exactly right and laps twice.
32
+ */
33
+ sequence: number[];
34
+ /** Identity → a selector for the finding. Display only; never compared. */
35
+ labels: Record<number, string>;
36
+ /** Tab presses actually made. */
37
+ presses: number;
38
+ /**
39
+ * True when a press moved focus nowhere at all.
40
+ *
41
+ * The harshest trap there is — focus stuck on one element — and the one that
42
+ * produces no focus events, so it cannot be seen in the sequence.
43
+ */
44
+ stuck: boolean;
45
+ /**
46
+ * Visible `<iframe>` elements on the page.
47
+ *
48
+ * Any of them means the walk did not observe the whole tab order. Focus
49
+ * moving into a frame is handled by that frame's own document, and — this is
50
+ * the part that is easy to get wrong — the parent gets NO `focusin` for it:
51
+ * the event fires inside the child and does not cross the boundary. So there
52
+ * is nothing to watch for, and the only honest signal is the presence of the
53
+ * frame itself.
54
+ *
55
+ * A cross-origin frame could not be followed even with the machinery to try.
56
+ * Either way this is `incomplete`, never a pass: a trap inside the frame
57
+ * would look exactly like a clean walk from out here.
58
+ */
59
+ frames: number;
60
+ /**
61
+ * True when the press ceiling or the time budget stopped the walk before it
62
+ * had covered the page — the only honest thing left to say about a count.
63
+ */
64
+ truncated: boolean;
65
+ /** Focusable elements the page holds, for the "cycled among a subset" signal. */
66
+ focusableCount: number;
67
+ /**
68
+ * Whether pressing Escape released a cycle. Present only when a cycle was
69
+ * found and the escape was actually attempted.
70
+ */
71
+ escapable?: boolean;
72
+ }
73
+ /**
74
+ * Walk the tab order in both directions and report what happened.
75
+ *
76
+ * The sequence is collected by a `focusin` listener rather than by reading
77
+ * `document.activeElement` after each press. That is one evaluate to install,
78
+ * N presses, one evaluate to read — instead of a round trip per press, which
79
+ * on a 60-press walk in two directions is 240 CDP calls we do not have to
80
+ * make at the end of every test.
81
+ */
82
+ export declare function runKeyboardTrap(page: Page): Promise<DynamicCheckEvidence>;
83
+ /**
84
+ * The trapping cycle in a walk, or undefined if there is none.
85
+ *
86
+ * The test is deliberately self-contained: focus visited something, then
87
+ * settled into a set of elements that never returns to it. That is a trap by
88
+ * definition, and it needs no count of what the page holds — which matters,
89
+ * because "the tab order visited fewer elements than the page has focusable
90
+ * ones" has honest explanations (an `inert` subtree, an offscreen element) and
91
+ * would make this check fire on well-built pages.
92
+ *
93
+ * A page whose tab order simply WRAPS is the case this must not call a trap:
94
+ * 1,2,3,1,2,3 has the same set in both halves, so nothing was left behind.
95
+ */
96
+ export declare function cycleOf(walk: TabWalk): number[] | undefined;
97
+ /**
98
+ * The verdict, as a pure function of the walks.
99
+ *
100
+ * Ordered worst-first, and the order is the argument: focus that cannot move
101
+ * at all outranks a cycle, a cycle that Escape does not release outranks one we
102
+ * could not test, and anything we could not observe is needs-review rather
103
+ * than a pass.
104
+ */
105
+ export declare function keyboardTrapEvidence(walks: TabWalk[]): DynamicCheckEvidence;
106
+ //# sourceMappingURL=keyboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../../src/checks/keyboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAI7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEzD;;;;;;;;;;;;;GAaG;AAEH,eAAO,MAAM,iCAAiC,yBAAyB,CAAC;AAExE,eAAO,MAAM,qBAAqB,4BAA4B,CAAC;AAuB/D,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,SAAS,GAAG,UAAU,CAAC;IAClC;;;;;;;;;;;OAWG;IACH,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,KAAK,EAAE,OAAO,CAAC;IACf;;;;;;;;;;;;;OAaG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB,iFAAiF;IACjF,cAAc,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAKD;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA4B/E;AA0ND;;;;;;;;;;;;GAYG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CA6B3D;AASD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,oBAAoB,CA8H3E"}
@@ -0,0 +1,452 @@
1
+ import { NO_KEYBOARD_TRAP_HELP_URL } from '../links.js';
2
+ import { sanitiseSelectors } from '../sanitise.js';
3
+ /**
4
+ * WCAG 2.1.2 No Keyboard Trap (A), the only way it can be checked: by pressing
5
+ * the key.
6
+ *
7
+ * A trap is not a property of the document. It is a property of the SEQUENCE of
8
+ * focus moves, which is why no DOM-snapshot analyser has ever had a rule for it
9
+ * and why this is a level A criterion that nothing checks. It is also one of
10
+ * the oldest and most damaging failures there is: a keyboard user who cannot
11
+ * get out has to reload the page.
12
+ *
13
+ * Teardown only, for the reason `focus.ts` gives at length: pressing Tab fires
14
+ * the page's own key and focus handlers, and a handler that opened a menu has
15
+ * already run by the time anything is restored.
16
+ */
17
+ export const SETSQUARE_KEYBOARD_CHECKS_VERSION = 'setsquare-keyboard@1';
18
+ export const KEYBOARD_TRAP_RULE_ID = 'setsquare-keyboard-trap';
19
+ /**
20
+ * How many times each direction is tabbed.
21
+ *
22
+ * The bound is the feature, not a defence. A trap is precisely the condition
23
+ * under which "keep tabbing until you reach the end" never terminates, so a
24
+ * walk without a hard ceiling would hang on exactly the pages this check
25
+ * exists to find. Sixty is enough to see a cycle repeat several times on any
26
+ * page, and the verdict states how many presses it is based on.
27
+ *
28
+ * The number is a CEILING, not a target: the walk presses twice what the page
29
+ * holds and stops, so an ordinary page costs a couple of dozen presses and
30
+ * only something enormous ever reaches this. A fixed forty was cheaper and
31
+ * wrong — it reported "the walk did not complete a lap" on every page with
32
+ * more than nineteen focusable elements, which is most pages, about a tab
33
+ * order with nothing wrong with it.
34
+ */
35
+ const MAX_PRESSES = 160;
36
+ /** Wall-clock ceiling for one direction, whichever limit bites first. */
37
+ const BUDGET_MS = 4_000;
38
+ const LOG_KEY = '__setsquareFocusLog';
39
+ const HANDLER_KEY = '__setsquareFocusLogHandler';
40
+ /**
41
+ * Walk the tab order in both directions and report what happened.
42
+ *
43
+ * The sequence is collected by a `focusin` listener rather than by reading
44
+ * `document.activeElement` after each press. That is one evaluate to install,
45
+ * N presses, one evaluate to read — instead of a round trip per press, which
46
+ * on a 60-press walk in two directions is 240 CDP calls we do not have to
47
+ * make at the end of every test.
48
+ */
49
+ export async function runKeyboardTrap(page) {
50
+ try {
51
+ const walks = [];
52
+ for (const direction of ['forward', 'backward']) {
53
+ const walk = await tabWalk(page, direction);
54
+ /*
55
+ * A cycle is only a violation if it cannot be left, and a correctly
56
+ * implemented modal dialog cycles focus ON PURPOSE. So the cycle is not
57
+ * the finding — the cycle plus a failure to escape is. Escape is the
58
+ * mechanism every modal convention uses and the one a person would try
59
+ * first, so it is the one we try.
60
+ */
61
+ if (cycleOf(walk)) {
62
+ await page.keyboard.press('Escape');
63
+ const after = await tabWalk(page, direction, ESCAPE_PRESSES, false);
64
+ const cycle = new Set(cycleOf(walk));
65
+ walk.escapable = after.sequence.some((id) => !cycle.has(id));
66
+ }
67
+ walks.push(walk);
68
+ }
69
+ return keyboardTrapEvidence(walks);
70
+ }
71
+ catch {
72
+ // Never throws into a customer's test, and never reports a guess in place
73
+ // of an answer: a walk that could not run produces no evidence at all.
74
+ return {};
75
+ }
76
+ }
77
+ /** Enough presses after Escape to see whether focus left the cycle. */
78
+ const ESCAPE_PRESSES = 8;
79
+ async function tabWalk(page, direction, maxPresses = MAX_PRESSES, reset = true) {
80
+ const key = direction === 'forward' ? 'Tab' : 'Shift+Tab';
81
+ const counts = await page.evaluate(installLogger, { reset });
82
+ const startedAt = Date.now();
83
+ /*
84
+ * Press enough to LAP the page, not a fixed forty.
85
+ *
86
+ * A trap is the condition under which "keep going until you reach the end"
87
+ * never terminates, so the walk needs a ceiling — but a ceiling below the
88
+ * page's own size turns every long page into a needs-review row about our
89
+ * bookkeeping. Two laps of what the page holds, bounded by the hard ceiling
90
+ * and the wall clock, so the bound only bites on a page big enough that a
91
+ * trap would be visible long before it.
92
+ */
93
+ const target = Math.min(maxPresses, Math.max(12, counts.focusable * 2 + 2));
94
+ let presses = 0;
95
+ let timedOut = false;
96
+ for (let i = 0; i < target; i += 1) {
97
+ if (Date.now() - startedAt > BUDGET_MS) {
98
+ timedOut = true;
99
+ break;
100
+ }
101
+ await page.keyboard.press(key);
102
+ presses += 1;
103
+ }
104
+ const result = await page.evaluate(readLogger);
105
+ return {
106
+ direction,
107
+ sequence: result.sequence,
108
+ labels: result.labels,
109
+ presses,
110
+ /*
111
+ * The single-element trap: sixty presses and focus never reached a second
112
+ * element, on a page that has more than one to reach.
113
+ *
114
+ * The first version compared the number of observed moves to the number of
115
+ * presses, on the reasoning that a swallowed key produces no focus event.
116
+ * That is true and useless: Tab off the end of a document moves focus out
117
+ * of the document entirely — to the browser's own UI — and fires no
118
+ * `focusin` either, so every ordinary page looked stuck. Both fixture pages
119
+ * reported a critical violation of a level A criterion, which is the worst
120
+ * possible direction for this check to be wrong in.
121
+ */
122
+ stuck: presses >= 3 && counts.focusable > 1 && new Set(result.sequence).size <= 1,
123
+ frames: counts.frames,
124
+ focusableCount: counts.focusable,
125
+ // Only truncated if we ran out of room or time before lapping — not merely
126
+ // because the hard ceiling exists.
127
+ truncated: timedOut || presses < counts.focusable + 2,
128
+ };
129
+ }
130
+ /**
131
+ * Injected into the page: start recording focus moves, and count what is
132
+ * focusable while we are there.
133
+ *
134
+ * Written as a standalone function passed to `evaluate` rather than a string,
135
+ * so it typechecks. It must not close over anything from this module.
136
+ */
137
+ function installLogger({ reset }) {
138
+ const step = (el) => {
139
+ const tag = el.tagName.toLowerCase();
140
+ if (el.id)
141
+ return `${tag}#${el.id}`;
142
+ if (el.classList.length > 0)
143
+ return `${tag}.${el.classList[0]}`;
144
+ const parent = el.parentElement;
145
+ if (!parent)
146
+ return tag;
147
+ return `${tag}:nth-child(${Array.prototype.indexOf.call(parent.children, el) + 1})`;
148
+ };
149
+ const describe = (el) => {
150
+ const parts = [];
151
+ let node = el;
152
+ for (let depth = 0; node && depth < 3; depth += 1) {
153
+ parts.unshift(step(node));
154
+ if (node.id || node.classList.length > 0)
155
+ break;
156
+ node = node.parentElement;
157
+ if (!node || node === document.body)
158
+ break;
159
+ }
160
+ return parts.join(' > ');
161
+ };
162
+ const store = window;
163
+ const existing = store['__setsquareFocusLogHandler'];
164
+ if (existing)
165
+ document.removeEventListener('focusin', existing, true);
166
+ /*
167
+ * The reset happens FIRST, before anything reads the identity map.
168
+ *
169
+ * It used to sit lower down, after `ids` had already been captured — so a
170
+ * resetting walk took the previous walk's map into its closure and then
171
+ * deleted the store keys, leaving the escape re-walk to build a third map of
172
+ * its own. Which is the same bug in a different place: two id spaces, and
173
+ * every trap reporting as escapable.
174
+ */
175
+ if (reset) {
176
+ // A fresh walk is a fresh numbering. Ids only have to be stable WITHIN one
177
+ // walk and its escape re-walk; letting them accumulate across directions
178
+ // would grow the label map for nothing.
179
+ delete store['__setsquareFocusIds'];
180
+ delete store['__setsquareFocusLabels'];
181
+ delete store['__setsquareFocusNextId'];
182
+ if (document.activeElement instanceof HTMLElement)
183
+ document.activeElement.blur();
184
+ }
185
+ /*
186
+ * Identity is an id assigned per element, not the selector.
187
+ *
188
+ * A `WeakMap` so nothing is retained, and a counter so every element the
189
+ * walk ever touches has one stable number — including anything outside the
190
+ * candidate list, which is exactly the case a trap involves.
191
+ *
192
+ * **It lives on the window and survives a non-resetting walk.** The escape
193
+ * re-walk runs in its own evaluate, and a fresh numbering there would put
194
+ * its ids in a different space from the cycle's — so `cycle.has(id)` would
195
+ * be false for everything and EVERY trap would report as escapable. That is
196
+ * exactly what happened: the fixture's inescapable dialog came back as a
197
+ * pass the moment identity stopped being a selector.
198
+ */
199
+ const ids = (store['__setsquareFocusIds'] ??= new WeakMap());
200
+ const labels = (store['__setsquareFocusLabels'] ??= {});
201
+ const identify = (el) => {
202
+ const existing = ids.get(el);
203
+ if (existing !== undefined)
204
+ return existing;
205
+ const id = store['__setsquareFocusNextId'] ?? 0;
206
+ store['__setsquareFocusNextId'] = id + 1;
207
+ ids.set(el, id);
208
+ labels[id] = describe(el);
209
+ return id;
210
+ };
211
+ const log = [];
212
+ const handler = (event) => {
213
+ const target = event.target;
214
+ if (!(target instanceof Element))
215
+ return;
216
+ log.push(identify(target));
217
+ };
218
+ store['__setsquareFocusLog'] = log;
219
+ store['__setsquareFocusLogHandler'] = handler;
220
+ document.addEventListener('focusin', handler, true);
221
+ /*
222
+ * A fresh walk starts from a known place, so it measures the document's tab
223
+ * order rather than a continuation of wherever the test left focus.
224
+ *
225
+ * The escape re-walk must NOT reset, and that is not a detail: blurring
226
+ * restarts the tab order from the top of the document, where there are
227
+ * always elements outside the cycle — so every trap on earth would have
228
+ * reported as escapable. The escape test has to continue from inside the
229
+ * cycle, which is where the first walk left focus.
230
+ */
231
+ store['__setsquareFocusStart'] = document.activeElement;
232
+ const FOCUSABLE = 'a[href],button,input,select,textarea,summary,[tabindex],[contenteditable="true"]';
233
+ const visible = (html) => {
234
+ const cs = window.getComputedStyle(html);
235
+ if (cs.visibility === 'hidden' || cs.display === 'none')
236
+ return false;
237
+ const rect = html.getBoundingClientRect();
238
+ return rect.width > 0 && rect.height > 0;
239
+ };
240
+ let focusable = 0;
241
+ for (const el of Array.from(document.querySelectorAll(FOCUSABLE))) {
242
+ const html = el;
243
+ if (html.hasAttribute('disabled'))
244
+ continue;
245
+ if (html.getAttribute('aria-hidden') === 'true')
246
+ continue;
247
+ if (html.tabIndex < 0)
248
+ continue;
249
+ if (!visible(html))
250
+ continue;
251
+ focusable += 1;
252
+ }
253
+ let frames = 0;
254
+ for (const el of Array.from(document.querySelectorAll('iframe'))) {
255
+ if (el.tabIndex < 0)
256
+ continue;
257
+ if (!visible(el))
258
+ continue;
259
+ frames += 1;
260
+ }
261
+ return { focusable, frames };
262
+ }
263
+ /** Injected into the page: read the log back and take the listener off again. */
264
+ function readLogger() {
265
+ const store = window;
266
+ const log = (store['__setsquareFocusLog'] ?? []);
267
+ const labels = (store['__setsquareFocusLabels'] ?? {});
268
+ const handler = store['__setsquareFocusLogHandler'];
269
+ if (handler)
270
+ document.removeEventListener('focusin', handler, true);
271
+ // The log is per walk; the identity map and the labels are per PAGE, and
272
+ // the escape re-walk needs them intact. `runKeyboardTrap` clears them when a
273
+ // fresh walk resets.
274
+ delete store['__setsquareFocusLog'];
275
+ delete store['__setsquareFocusLogHandler'];
276
+ delete store['__setsquareFocusStart'];
277
+ return { sequence: log, labels };
278
+ }
279
+ /**
280
+ * The trapping cycle in a walk, or undefined if there is none.
281
+ *
282
+ * The test is deliberately self-contained: focus visited something, then
283
+ * settled into a set of elements that never returns to it. That is a trap by
284
+ * definition, and it needs no count of what the page holds — which matters,
285
+ * because "the tab order visited fewer elements than the page has focusable
286
+ * ones" has honest explanations (an `inert` subtree, an offscreen element) and
287
+ * would make this check fire on well-built pages.
288
+ *
289
+ * A page whose tab order simply WRAPS is the case this must not call a trap:
290
+ * 1,2,3,1,2,3 has the same set in both halves, so nothing was left behind.
291
+ */
292
+ export function cycleOf(walk) {
293
+ if (walk.sequence.length < 6)
294
+ return undefined;
295
+ const half = Math.floor(walk.sequence.length / 2);
296
+ const tail = walk.sequence.slice(half);
297
+ const tailSet = new Set(tail);
298
+ if (tailSet.size === 0)
299
+ return undefined;
300
+ const leftBehind = walk.sequence.slice(0, half).some((selector) => !tailSet.has(selector));
301
+ if (!leftBehind)
302
+ return undefined;
303
+ /*
304
+ * The tail has to be genuinely PERIODIC, not merely different from the start.
305
+ *
306
+ * Without this, any page with more focusable elements than half the press
307
+ * budget reports as a trap: forty presses across fifty links gives a tail
308
+ * made of links the first half never reached, which is "left behind" by the
309
+ * test above and is nothing of the sort — the walk simply had not finished
310
+ * one lap. A docs page with thirty links would have failed a critical level A
311
+ * criterion.
312
+ *
313
+ * Requiring each tail element to appear at least twice is what separates
314
+ * "focus is going round a small set" from "focus is still travelling". A
315
+ * trap's tail is two elements repeated fifteen times; a long page's tail is
316
+ * twenty elements seen once each.
317
+ */
318
+ if (tail.length < tailSet.size * 2)
319
+ return undefined;
320
+ return [...tailSet];
321
+ }
322
+ /** Identities back to selectors, for the finding only — never for comparison. */
323
+ function label(walk, ids) {
324
+ return ids.map((id) => walk.labels[id] ?? `element ${id}`);
325
+ }
326
+ const TRAP_WCAG = { criteria: ['2.1.2'], level: 'A', versionTags: [] };
327
+ /**
328
+ * The verdict, as a pure function of the walks.
329
+ *
330
+ * Ordered worst-first, and the order is the argument: focus that cannot move
331
+ * at all outranks a cycle, a cycle that Escape does not release outranks one we
332
+ * could not test, and anything we could not observe is needs-review rather
333
+ * than a pass.
334
+ */
335
+ export function keyboardTrapEvidence(walks) {
336
+ if (walks.length === 0 || walks.every((walk) => walk.presses === 0)) {
337
+ return { inapplicable: { ruleId: KEYBOARD_TRAP_RULE_ID, wcag: TRAP_WCAG } };
338
+ }
339
+ const stuck = walks.find((walk) => walk.stuck);
340
+ if (stuck) {
341
+ return finding('violation', 'critical', `Focus never reaches a second element when ` +
342
+ `${stuck.direction === 'forward' ? 'Tab' : 'Shift+Tab'} is pressed: ${stuck.presses} ` +
343
+ `presses, ${new Set(stuck.sequence).size} element(s) reached, on a page with ` +
344
+ `${stuck.focusableCount} focusable elements. A keyboard user cannot leave this page ` +
345
+ `without reloading it. ` +
346
+ escapeCaveat(), label(stuck, stuck.sequence.slice(0, 5)));
347
+ }
348
+ const trapped = walks.filter((walk) => cycleOf(walk) && walk.escapable === false);
349
+ if (trapped.length > 0) {
350
+ const walk = trapped[0];
351
+ const cycle = cycleOf(walk);
352
+ return finding('violation', 'critical', `${walk.direction === 'forward' ? 'Tab' : 'Shift+Tab'} enters a cycle of ${cycle.length} ` +
353
+ `element(s) that focus never leaves — ${label(walk, cycle).slice(0, 4).join(', ')}` +
354
+ `${cycle.length > 4 ? ', …' : ''} — and pressing Escape did not release it. Elements ` +
355
+ `focused earlier in the walk are never reached again. ` +
356
+ escapeCaveat(), label(walk, cycle));
357
+ }
358
+ const untested = walks.filter((walk) => cycleOf(walk) && walk.escapable === undefined);
359
+ if (untested.length > 0) {
360
+ const walk = untested[0];
361
+ const cycle = cycleOf(walk);
362
+ return finding('incomplete', 'serious', `Focus settles into a cycle of ${cycle.length} element(s) and we did not establish whether ` +
363
+ `it can be left. ` +
364
+ escapeCaveat(), label(walk, cycle));
365
+ }
366
+ const framed = walks.find((walk) => walk.frames > 0);
367
+ if (framed) {
368
+ return finding('incomplete', 'serious', `This page contains ${framed.frames} iframe(s), whose own documents handle the tab order ` +
369
+ `once focus is inside them — and the parent gets no focus event for it, so part of this ` +
370
+ `page's tab order was not observed. A cross-origin frame could not be followed at all. ` +
371
+ `This is not a pass: a trap inside the frame would look exactly like this from out here.`, label(framed, [...new Set(framed.sequence)].slice(0, 5)));
372
+ }
373
+ /*
374
+ * A cycle covering fewer elements than the page has focusable ones, with
375
+ * nothing left behind, is NOT reported as a trap. It has honest explanations
376
+ * — an `inert` subtree, an element positioned off screen — and calling it a
377
+ * failure would fire on well-built pages. It is said out loud instead,
378
+ * because "we tabbed sixty times and saw eight of your twenty focusable
379
+ * elements" is worth a person's attention even when it is not a violation.
380
+ */
381
+ /*
382
+ * A walk whose cycle we proved escapable is already explained; letting the
383
+ * checks below second-guess it would report a correctly built modal as
384
+ * something to look at, every time, on every page that has one.
385
+ */
386
+ const uncycled = walks.filter((walk) => !cycleOf(walk));
387
+ /*
388
+ * The press budget ran out before the page did. Said in its own words rather
389
+ * than folded into the one below, because the two are different problems and
390
+ * the reason is the useful half of a needs-review row: one is about our
391
+ * bound, the other is about their tab order.
392
+ */
393
+ /*
394
+ * The press budget ran out before the page did.
395
+ *
396
+ * The only thing left worth saying here, and it is about OUR bound rather
397
+ * than their page — so it is said in those words.
398
+ *
399
+ * What used to sit beside it compared "elements Tab reached" against
400
+ * "focusable elements on the page" and reported whenever the first was
401
+ * smaller. That is deleted rather than fixed, because there is no version of
402
+ * it worth keeping. A roving-tabindex group has one tabbable member and
403
+ * others Tab correctly skips; an `inert` subtree is focusable-looking and
404
+ * unreachable by design. Every one of those makes the two numbers differ on
405
+ * a page with nothing wrong with it, and the row named no actionable element
406
+ * and offered no next step.
407
+ *
408
+ * On this repository's own site it fired on every page — "40 Tab presses
409
+ * reached 7 of the 20 focusable elements" about a tab order that is exactly
410
+ * right and laps twice. Both halves were wrong: the walk had lapped, and the
411
+ * 7 was a count of colliding selector STRINGS rather than of elements.
412
+ *
413
+ * What 2.1.2 is about is traps, and the cycle test answers that with no
414
+ * count at all.
415
+ */
416
+ const bounded = uncycled.find((walk) => walk.truncated);
417
+ if (bounded) {
418
+ return finding('incomplete', 'moderate', `The tab order was walked ${bounded.presses} presses in each direction and this page has ` +
419
+ `${bounded.focusableCount} focusable elements, so the walk did not complete a lap. No ` +
420
+ `trap was seen in what it did cover, which is not the same as there being none.`, label(bounded, [...new Set(bounded.sequence)].slice(0, 5)));
421
+ }
422
+ return {
423
+ pass: {
424
+ ruleId: KEYBOARD_TRAP_RULE_ID,
425
+ nodeCount: new Set(walks.flatMap((walk) => walk.sequence)).size,
426
+ wcag: TRAP_WCAG,
427
+ },
428
+ };
429
+ }
430
+ /**
431
+ * The SC permits a mechanism other than Escape, and it may be described in the
432
+ * page's own text. We cannot read that, so the finding says so rather than
433
+ * implying we ruled it out.
434
+ */
435
+ function escapeCaveat() {
436
+ return ('WCAG 2.1.2 also accepts a mechanism the page documents in text, which this check cannot ' +
437
+ 'read — if one exists and is described to the user, that changes the answer.');
438
+ }
439
+ function finding(status, impact, failureSummary, selectors) {
440
+ return {
441
+ finding: {
442
+ ruleId: KEYBOARD_TRAP_RULE_ID,
443
+ status,
444
+ impact,
445
+ wcag: TRAP_WCAG,
446
+ helpUrl: NO_KEYBOARD_TRAP_HELP_URL,
447
+ evidence: { failureSummary },
448
+ targets: { nodeCount: selectors.length, ...sanitiseSelectors(selectors) },
449
+ },
450
+ };
451
+ }
452
+ //# sourceMappingURL=keyboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard.js","sourceRoot":"","sources":["../../src/checks/keyboard.ts"],"names":[],"mappings":"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"}