@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.
- package/NOTICE +3 -2
- package/README.md +220 -0
- package/dist/autoscan.d.ts +15 -1
- package/dist/autoscan.d.ts.map +1 -1
- package/dist/autoscan.js +168 -13
- package/dist/autoscan.js.map +1 -1
- package/dist/brand.d.ts +51 -2
- package/dist/brand.d.ts.map +1 -1
- package/dist/brand.js +560 -5
- package/dist/brand.js.map +1 -1
- package/dist/checks/context-change.d.ts +96 -0
- package/dist/checks/context-change.d.ts.map +1 -0
- package/dist/checks/context-change.js +655 -0
- package/dist/checks/context-change.js.map +1 -0
- package/dist/checks/focus.d.ts +154 -0
- package/dist/checks/focus.d.ts.map +1 -0
- package/dist/checks/focus.js +1123 -0
- package/dist/checks/focus.js.map +1 -0
- package/dist/checks/heuristics.d.ts +116 -0
- package/dist/checks/heuristics.d.ts.map +1 -0
- package/dist/checks/heuristics.js +931 -0
- package/dist/checks/heuristics.js.map +1 -0
- package/dist/checks/keyboard.d.ts +106 -0
- package/dist/checks/keyboard.d.ts.map +1 -0
- package/dist/checks/keyboard.js +452 -0
- package/dist/checks/keyboard.js.map +1 -0
- package/dist/checks/reflow.d.ts +75 -0
- package/dist/checks/reflow.d.ts.map +1 -0
- package/dist/checks/reflow.js +285 -0
- package/dist/checks/reflow.js.map +1 -0
- package/dist/checks/rule-pack.d.ts +1 -1
- package/dist/checks/rule-pack.d.ts.map +1 -1
- package/dist/checks/rule-pack.js +350 -45
- package/dist/checks/rule-pack.js.map +1 -1
- package/dist/checks/shortcuts.d.ts +71 -0
- package/dist/checks/shortcuts.d.ts.map +1 -0
- package/dist/checks/shortcuts.js +196 -0
- package/dist/checks/shortcuts.js.map +1 -0
- package/dist/checks/versions.d.ts.map +1 -1
- package/dist/checks/versions.js +33 -1
- package/dist/checks/versions.js.map +1 -1
- package/dist/contract.d.ts +18 -0
- package/dist/contract.d.ts.map +1 -1
- package/dist/covers.d.ts +56 -0
- package/dist/covers.d.ts.map +1 -0
- package/dist/covers.js +135 -0
- package/dist/covers.js.map +1 -0
- package/dist/dedupe.d.ts +23 -0
- package/dist/dedupe.d.ts.map +1 -1
- package/dist/dedupe.js +96 -2
- package/dist/dedupe.js.map +1 -1
- package/dist/document.d.ts.map +1 -1
- package/dist/document.js +144 -0
- package/dist/document.js.map +1 -1
- package/dist/envelope.d.ts +8 -0
- package/dist/envelope.d.ts.map +1 -1
- package/dist/envelope.js +28 -0
- package/dist/envelope.js.map +1 -1
- package/dist/fixture.d.ts.map +1 -1
- package/dist/fixture.js +12 -0
- package/dist/fixture.js.map +1 -1
- package/dist/html-report.d.ts +24 -7
- package/dist/html-report.d.ts.map +1 -1
- package/dist/html-report.js +608 -136
- package/dist/html-report.js.map +1 -1
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/links.d.ts +43 -0
- package/dist/links.d.ts.map +1 -1
- package/dist/links.js +43 -0
- package/dist/links.js.map +1 -1
- package/dist/observe.d.ts +8 -0
- package/dist/observe.d.ts.map +1 -1
- package/dist/observe.js +45 -1
- package/dist/observe.js.map +1 -1
- package/dist/options.d.ts +53 -0
- package/dist/options.d.ts.map +1 -1
- package/dist/options.js +3 -0
- package/dist/options.js.map +1 -1
- package/dist/reading-level.d.ts +22 -1
- package/dist/reading-level.d.ts.map +1 -1
- package/dist/reading-level.js +122 -19
- package/dist/reading-level.js.map +1 -1
- package/dist/reporter.d.ts.map +1 -1
- package/dist/reporter.js +31 -15
- package/dist/reporter.js.map +1 -1
- package/dist/scan.d.ts +36 -1
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js +16 -2
- package/dist/scan.js.map +1 -1
- package/dist/screens.d.ts +55 -4
- package/dist/screens.d.ts.map +1 -1
- package/dist/screens.js +243 -43
- package/dist/screens.js.map +1 -1
- package/dist/summary.d.ts +22 -0
- package/dist/summary.d.ts.map +1 -1
- package/dist/summary.js +197 -22
- package/dist/summary.js.map +1 -1
- package/dist/viewports.d.ts +105 -0
- package/dist/viewports.d.ts.map +1 -0
- package/dist/viewports.js +134 -0
- package/dist/viewports.js.map +1 -0
- 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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"}
|