@ploaness/config 1.11.0 → 1.13.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/dist/a11y.d.ts +13 -5
- package/dist/a11y.d.ts.map +1 -1
- package/dist/a11y.js +20 -11
- package/dist/a11y.js.map +1 -1
- package/dist/clock-preload.d.ts +2 -0
- package/dist/clock-preload.d.ts.map +1 -0
- package/dist/clock-preload.js +37 -0
- package/dist/clock-preload.js.map +1 -0
- package/dist/eslint-immutability.d.ts.map +1 -1
- package/dist/eslint-immutability.js +37 -4
- package/dist/eslint-immutability.js.map +1 -1
- package/dist/eslint-library.d.ts.map +1 -1
- package/dist/eslint-library.js +6 -1
- package/dist/eslint-library.js.map +1 -1
- package/dist/eslint-runtime.d.ts +11 -0
- package/dist/eslint-runtime.d.ts.map +1 -0
- package/dist/eslint-runtime.js +68 -0
- package/dist/eslint-runtime.js.map +1 -0
- package/dist/eslint.d.ts.map +1 -1
- package/dist/eslint.js +6 -1
- package/dist/eslint.js.map +1 -1
- package/dist/layout.d.ts +34 -16
- package/dist/layout.d.ts.map +1 -1
- package/dist/layout.js +228 -56
- package/dist/layout.js.map +1 -1
- package/dist/payload-view.d.ts +16 -0
- package/dist/payload-view.d.ts.map +1 -0
- package/dist/payload-view.js +35 -0
- package/dist/payload-view.js.map +1 -0
- package/dist/playwright.d.ts.map +1 -1
- package/dist/playwright.js +115 -12
- package/dist/playwright.js.map +1 -1
- package/dist/scanner.d.ts +99 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +278 -0
- package/dist/scanner.js.map +1 -0
- package/dist/settle.d.ts +8 -6
- package/dist/settle.d.ts.map +1 -1
- package/dist/settle.js +55 -42
- package/dist/settle.js.map +1 -1
- package/dist/sweep-disclosures.d.ts +10 -0
- package/dist/sweep-disclosures.d.ts.map +1 -0
- package/dist/sweep-disclosures.js +179 -0
- package/dist/sweep-disclosures.js.map +1 -0
- package/dist/sweep-discovery.d.ts +15 -0
- package/dist/sweep-discovery.d.ts.map +1 -0
- package/dist/sweep-discovery.js +336 -0
- package/dist/sweep-discovery.js.map +1 -0
- package/dist/sweep-interaction.d.ts +19 -0
- package/dist/sweep-interaction.d.ts.map +1 -0
- package/dist/sweep-interaction.js +351 -0
- package/dist/sweep-interaction.js.map +1 -0
- package/dist/sweep-queue.d.ts +24 -0
- package/dist/sweep-queue.d.ts.map +1 -0
- package/dist/sweep-queue.js +56 -0
- package/dist/sweep-queue.js.map +1 -0
- package/dist/sweep-reflow.d.ts +17 -0
- package/dist/sweep-reflow.d.ts.map +1 -0
- package/dist/sweep-reflow.js +210 -0
- package/dist/sweep-reflow.js.map +1 -0
- package/dist/sweep-resting.d.ts +25 -0
- package/dist/sweep-resting.d.ts.map +1 -0
- package/dist/sweep-resting.js +98 -0
- package/dist/sweep-resting.js.map +1 -0
- package/dist/sweep-shared.d.ts +353 -0
- package/dist/sweep-shared.d.ts.map +1 -0
- package/dist/sweep-shared.js +434 -0
- package/dist/sweep-shared.js.map +1 -0
- package/dist/sweep.d.ts +14 -0
- package/dist/sweep.d.ts.map +1 -0
- package/dist/sweep.js +157 -0
- package/dist/sweep.js.map +1 -0
- package/dist/vitest-core.d.ts +1 -1
- package/dist/vitest-core.js +1 -1
- package/dist/vitest-library.d.ts.map +1 -1
- package/dist/vitest-library.js +2 -1
- package/dist/vitest-library.js.map +1 -1
- package/package.json +10 -2
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
// The sweep's reflow passes: the WCAG 1.4.12 spacing and 1.4.4 resize stresses, and the width sweep
|
|
2
|
+
// that reports each reflow defect with the exact widths it holds at.
|
|
3
|
+
import { test } from '@playwright/test';
|
|
4
|
+
import { applyExemptions, bisectionWidth, failingRanges, findingAt, REFLOW_RULES, reflowCandidates, STRESS_VIEWPORTS, SWEEP_HEIGHT, sweepWidths, } from '@ploaness/governance';
|
|
5
|
+
import { measurePage } from './layout.js';
|
|
6
|
+
import { settleFindings } from './scanner.js';
|
|
7
|
+
import { settleForScan } from './settle.js';
|
|
8
|
+
import { armBudget, DESKTOP, finishPass, healthOf, isChromium, itemLabel, loadLocation, locationOfItem, merged, placeAt, preparePage, readDiscovery, sampledLocations, shardLocations, visitAll, } from './sweep-shared.js';
|
|
9
|
+
// ---------------------------------------------------------------------------------------------------
|
|
10
|
+
// Text stress: WCAG 1.4.12 spacing and 1.4.4 resize
|
|
11
|
+
const SPACING_STYLE = '* { line-height: 1.5 !important; letter-spacing: 0.12em !important; word-spacing: 0.16em !important; } ' +
|
|
12
|
+
'p { margin-bottom: 2em !important; }';
|
|
13
|
+
// Every element's text at twice its original computed size, and a line height that keeps its proportion
|
|
14
|
+
// where one was set. Answers the elements whose rendered text did not grow.
|
|
15
|
+
const doubleTextInPage = () => {
|
|
16
|
+
const factor = 2;
|
|
17
|
+
const tolerance = 0.5;
|
|
18
|
+
const textNode = 3;
|
|
19
|
+
const elements = [document.body, ...Array.from(document.body.querySelectorAll('*'))];
|
|
20
|
+
const before = elements.map((element) => {
|
|
21
|
+
const style = getComputedStyle(element);
|
|
22
|
+
return [Number(style.fontSize.replace('px', '')), style.lineHeight];
|
|
23
|
+
});
|
|
24
|
+
for (const [index, element] of elements.entries()) {
|
|
25
|
+
const [size = 0, lineHeight = 'normal'] = before[index] ?? [];
|
|
26
|
+
element.style.setProperty('font-size', `${String(size * factor)}px`, 'important');
|
|
27
|
+
if (!lineHeight.endsWith('px')) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const doubled = Number(lineHeight.replace('px', '')) * factor;
|
|
31
|
+
element.style.setProperty('line-height', `${String(doubled)}px`, 'important');
|
|
32
|
+
}
|
|
33
|
+
return elements.flatMap((element, index) => {
|
|
34
|
+
const [size = 0] = before[index] ?? [];
|
|
35
|
+
const hasText = Array.from(element.childNodes).some((node) => node.nodeType === textNode && (node.textContent ?? '').trim().length > 0);
|
|
36
|
+
const after = Number(getComputedStyle(element).fontSize.replace('px', ''));
|
|
37
|
+
return hasText && element.checkVisibility() && after < size * factor - tolerance
|
|
38
|
+
? [
|
|
39
|
+
{
|
|
40
|
+
label: [element.tagName.toLowerCase(), ...(element.id.length > 0 ? [element.id] : [])].join('#'),
|
|
41
|
+
from: size,
|
|
42
|
+
to: after,
|
|
43
|
+
},
|
|
44
|
+
]
|
|
45
|
+
: [];
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
const applyStress = async (page, mode) => {
|
|
49
|
+
if (mode === 'text-resize') {
|
|
50
|
+
return await page.evaluate(doubleTextInPage);
|
|
51
|
+
}
|
|
52
|
+
await page.addStyleTag({ content: SPACING_STYLE });
|
|
53
|
+
return [];
|
|
54
|
+
};
|
|
55
|
+
const messageKey = (candidate) => `${candidate.rule}|${candidate.subjects.map((subject) => subject.label).join('|')}`;
|
|
56
|
+
const stressVisit = async (page, item, mode) => {
|
|
57
|
+
const place = placeAt(page, item.location, item.viewport, mode);
|
|
58
|
+
const loaded = await loadLocation(page, item.location, item.viewport, place);
|
|
59
|
+
await settleForScan(page);
|
|
60
|
+
const resting = await measurePage(page, item.location.location);
|
|
61
|
+
const existing = new Set(reflowCandidates(resting).map((candidate) => messageKey(candidate)));
|
|
62
|
+
const unchanged = await applyStress(page, mode);
|
|
63
|
+
const unsettled = await settleFindings(page, place);
|
|
64
|
+
const stressed = await measurePage(page, item.location.location);
|
|
65
|
+
const candidates = reflowCandidates(stressed)
|
|
66
|
+
.filter((candidate) => !existing.has(messageKey(candidate)))
|
|
67
|
+
.map((candidate) => ({ ...candidate, rule: mode }));
|
|
68
|
+
const judged = applyExemptions(stressed, place, candidates);
|
|
69
|
+
const scan = {
|
|
70
|
+
findings: [
|
|
71
|
+
...loaded,
|
|
72
|
+
...unsettled,
|
|
73
|
+
...judged.findings,
|
|
74
|
+
...unchanged.map((outcome) => findingAt(place, mode, `text did not grow from ${String(outcome.from)}px ` +
|
|
75
|
+
`(it rendered at ${String(outcome.to)}px): ${outcome.label}`)),
|
|
76
|
+
],
|
|
77
|
+
used: judged.used,
|
|
78
|
+
declared: [],
|
|
79
|
+
snapshot: stressed,
|
|
80
|
+
};
|
|
81
|
+
return merged([{ ...scan, notes: [] }, await healthOf(page, place)]);
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Apply the WCAG text-spacing overrides, then double every text size, and judge the reflow each time,
|
|
85
|
+
* on one shard of the sampled locations.
|
|
86
|
+
* @param page the test's page.
|
|
87
|
+
* @param shard the part of the pass this test visits.
|
|
88
|
+
*/
|
|
89
|
+
export const expectTextStress = async (page, shard) => {
|
|
90
|
+
test.info().skip(!isChromium(page), 'the text-stress pass runs in Chromium');
|
|
91
|
+
const discovery = readDiscovery(test.info());
|
|
92
|
+
const items = sampledLocations(discovery).flatMap((location) => STRESS_VIEWPORTS.map((viewport) => ({ location, viewport })));
|
|
93
|
+
const budget = armBudget(page, 'text-stress', shard, items.length);
|
|
94
|
+
await preparePage(page);
|
|
95
|
+
const { visits, taken } = await visitAll(items, {
|
|
96
|
+
budget,
|
|
97
|
+
labelOf: itemLabel,
|
|
98
|
+
visit: async (item) => merged([
|
|
99
|
+
await stressVisit(page, item, 'text-spacing'),
|
|
100
|
+
// WCAG 1.4.4 asks for text enlarged at a desktop width; a phone's narrow column is the reflow
|
|
101
|
+
// criterion's question, which the baseline's 320 px and the width sweep already ask.
|
|
102
|
+
...(item.viewport.width === DESKTOP.width ? [await stressVisit(page, item, 'text-resize')] : []),
|
|
103
|
+
]),
|
|
104
|
+
});
|
|
105
|
+
finishPass(page, {
|
|
106
|
+
budget,
|
|
107
|
+
pass: 'text-stress',
|
|
108
|
+
visits,
|
|
109
|
+
judgedRules: ['text-spacing', 'text-resize'],
|
|
110
|
+
locations: shardLocations(taken, locationOfItem),
|
|
111
|
+
});
|
|
112
|
+
};
|
|
113
|
+
const readWidth = async (page, location, width) => {
|
|
114
|
+
await page.setViewportSize({ width, height: SWEEP_HEIGHT });
|
|
115
|
+
await settleForScan(page);
|
|
116
|
+
const snapshot = await measurePage(page, location.location, true);
|
|
117
|
+
const place = placeAt(page, location, undefined, 'width-sweep');
|
|
118
|
+
const candidates = reflowCandidates(snapshot);
|
|
119
|
+
const judged = applyExemptions(snapshot, place, candidates);
|
|
120
|
+
const kept = candidates.filter((candidate) => judged.findings.some((finding) => finding.message === candidate.message && finding.rule === candidate.rule));
|
|
121
|
+
return {
|
|
122
|
+
width,
|
|
123
|
+
found: new Map(kept.map((candidate) => [
|
|
124
|
+
messageKey(candidate),
|
|
125
|
+
findingAt(place, candidate.rule, candidate.message),
|
|
126
|
+
])),
|
|
127
|
+
used: judged.used,
|
|
128
|
+
};
|
|
129
|
+
};
|
|
130
|
+
const readingAt = async (page, location, readings, width) => readings.some((reading) => reading.width === width)
|
|
131
|
+
? readings
|
|
132
|
+
: [...readings, await readWidth(page, location, width)];
|
|
133
|
+
const isPresentAt = (readings, width, key) => readings.find((reading) => reading.width === width)?.found.has(key) === true;
|
|
134
|
+
// Narrow one boundary of one defect down to adjacent widths.
|
|
135
|
+
const bisect = async (search, readings, holds, fails) => {
|
|
136
|
+
const middle = bisectionWidth(holds, fails);
|
|
137
|
+
if (middle === undefined) {
|
|
138
|
+
return readings;
|
|
139
|
+
}
|
|
140
|
+
const read = await readingAt(search.page, search.location, readings, middle);
|
|
141
|
+
return isPresentAt(read, middle, search.key)
|
|
142
|
+
? await bisect(search, read, holds, middle)
|
|
143
|
+
: await bisect(search, read, middle, fails);
|
|
144
|
+
};
|
|
145
|
+
const boundariesOf = async (search, steps, readings) => await steps.slice(1).reduce(async (earlier, width, index) => {
|
|
146
|
+
const read = await earlier;
|
|
147
|
+
const previous = steps[index] ?? width;
|
|
148
|
+
const isBefore = isPresentAt(read, previous, search.key);
|
|
149
|
+
const isAfter = isPresentAt(read, width, search.key);
|
|
150
|
+
if (isBefore === isAfter) {
|
|
151
|
+
return read;
|
|
152
|
+
}
|
|
153
|
+
return isAfter ? await bisect(search, read, previous, width) : await bisect(search, read, width, previous);
|
|
154
|
+
}, Promise.resolve(readings));
|
|
155
|
+
const sweepLocation = async (page, location) => {
|
|
156
|
+
const steps = sweepWidths();
|
|
157
|
+
const place = placeAt(page, location, { width: steps[0] ?? 0, height: SWEEP_HEIGHT }, 'width-sweep');
|
|
158
|
+
const loaded = await loadLocation(page, location, { width: steps[0] ?? 0, height: SWEEP_HEIGHT }, place);
|
|
159
|
+
const sampled = await steps.reduce(async (earlier, width) => await readingAt(page, location, await earlier, width), Promise.resolve([]));
|
|
160
|
+
const keys = [
|
|
161
|
+
...new Set(sampled.flatMap((reading) => [...reading.found.keys()])),
|
|
162
|
+
];
|
|
163
|
+
const readings = await keys.reduce(async (earlier, key) => await boundariesOf({ page, location, key }, steps, await earlier), Promise.resolve(sampled));
|
|
164
|
+
const measured = readings.map((reading) => reading.width);
|
|
165
|
+
const findings = keys.flatMap((key) => {
|
|
166
|
+
const failing = readings.filter((reading) => reading.found.has(key));
|
|
167
|
+
const example = failing[0]?.found.get(key);
|
|
168
|
+
return example === undefined
|
|
169
|
+
? []
|
|
170
|
+
: failingRanges(failing.map((reading) => reading.width), measured).map((range) => ({
|
|
171
|
+
...example,
|
|
172
|
+
message: `from ${String(range.from)} to ${String(range.to)}px: ${example.message}`,
|
|
173
|
+
}));
|
|
174
|
+
});
|
|
175
|
+
return merged([
|
|
176
|
+
{
|
|
177
|
+
findings: [...loaded, ...findings],
|
|
178
|
+
used: readings.flatMap((reading) => reading.used),
|
|
179
|
+
declared: [],
|
|
180
|
+
notes: [],
|
|
181
|
+
},
|
|
182
|
+
await healthOf(page, place),
|
|
183
|
+
]);
|
|
184
|
+
};
|
|
185
|
+
/**
|
|
186
|
+
* Resize one shard of one route per template and every story across the whole width range, and report
|
|
187
|
+
* each reflow defect with the exact widths it holds at.
|
|
188
|
+
* @param page the test's page.
|
|
189
|
+
* @param shard the part of the pass this test visits.
|
|
190
|
+
*/
|
|
191
|
+
export const expectWidthSweep = async (page, shard) => {
|
|
192
|
+
test.info().skip(!isChromium(page), 'the width sweep runs in Chromium');
|
|
193
|
+
const discovery = readDiscovery(test.info());
|
|
194
|
+
const locations = sampledLocations(discovery);
|
|
195
|
+
const budget = armBudget(page, 'width-sweep', shard, locations.length * sweepWidths().length);
|
|
196
|
+
await preparePage(page);
|
|
197
|
+
const { visits, taken } = await visitAll(locations, {
|
|
198
|
+
budget,
|
|
199
|
+
labelOf: (location) => location.location,
|
|
200
|
+
visit: async (location) => await sweepLocation(page, location),
|
|
201
|
+
});
|
|
202
|
+
finishPass(page, {
|
|
203
|
+
budget,
|
|
204
|
+
pass: 'width-sweep',
|
|
205
|
+
visits,
|
|
206
|
+
judgedRules: REFLOW_RULES,
|
|
207
|
+
locations: shardLocations(taken, (location) => location),
|
|
208
|
+
});
|
|
209
|
+
};
|
|
210
|
+
//# sourceMappingURL=sweep-reflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sweep-reflow.js","sourceRoot":"","sources":["../src/sweep-reflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type Page } from '@playwright/test';
|
|
2
|
+
import { type Shard } from './sweep-shared.js';
|
|
3
|
+
/**
|
|
4
|
+
* Judge one shard of every location at every baseline and breakpoint-edge viewport by every resting rule.
|
|
5
|
+
* @param page the test's page.
|
|
6
|
+
* @param shard the part of the pass this test visits.
|
|
7
|
+
*/
|
|
8
|
+
export declare const expectRestingRules: (page: Page, shard: Shard) => Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* Judge one shard of one route per template and every story by every resting rule in Firefox or WebKit.
|
|
11
|
+
* @param page the test's page.
|
|
12
|
+
* @param shard the part of the pass this test visits.
|
|
13
|
+
*/
|
|
14
|
+
export declare const expectEngineRules: (page: Page, shard: Shard) => Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Judge one shard of every location whose stylesheets answer `prefers-color-scheme` again in the dark
|
|
17
|
+
* scheme, from a fresh load. A `.dark` class is not followed: only the application's own code can set it,
|
|
18
|
+
* so its presence does not show that a visitor can reach it. Only at the two axe widths: the dark scheme
|
|
19
|
+
* changes colour, which axe judges there, while the geometry it shares with the light scheme is judged by
|
|
20
|
+
* the resting pass at every viewport.
|
|
21
|
+
* @param page the test's page.
|
|
22
|
+
* @param shard the part of the pass this test visits.
|
|
23
|
+
*/
|
|
24
|
+
export declare const expectDarkScheme: (page: Page, shard: Shard) => Promise<void>;
|
|
25
|
+
//# sourceMappingURL=sweep-resting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sweep-resting.d.ts","sourceRoot":"","sources":["../src/sweep-resting.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,IAAI,EAAQ,MAAM,kBAAkB,CAAA;AAWlD,OAAO,EAgBL,KAAK,KAAK,EAQX,MAAM,mBAAmB,CAAA;AAoD1B;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAU,MAAM,IAAI,EAAE,OAAO,KAAK,KAAG,OAAO,CAAC,IAAI,CAQ/E,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAU,MAAM,IAAI,EAAE,OAAO,KAAK,KAAG,OAAO,CAAC,IAAI,CAQ9E,CAAA;AAcD;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,GAAU,MAAM,IAAI,EAAE,OAAO,KAAK,KAAG,OAAO,CAAC,IAAI,CAW7E,CAAA"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// The sweep's resting passes: every resting rule on a fresh load at each viewport, in Chromium, in the
|
|
2
|
+
// other engines, and in the dark scheme.
|
|
3
|
+
import { test } from '@playwright/test';
|
|
4
|
+
import { BASELINE_VIEWPORTS, pageViewports, STRESS_VIEWPORTS, } from '@ploaness/governance';
|
|
5
|
+
import { projectSettings } from './project-settings.js';
|
|
6
|
+
import { axeFindings, isStressViewport, judgeRestingPlace, settleFindings } from './scanner.js';
|
|
7
|
+
import { armBudget, finishPass, healthOf, isChromium, itemLabel, loadLocation, locationOfItem, merged, placeAt, preparePage, RESTING_JUDGED, readDiscovery, sampledLocations, screenshotOf, shardLocations, visitAll, } from './sweep-shared.js';
|
|
8
|
+
const restingVisit = async (page, item, index) => {
|
|
9
|
+
const place = placeAt(page, item.location, item.viewport, 'resting');
|
|
10
|
+
const loaded = await loadLocation(page, item.location, item.viewport, place);
|
|
11
|
+
const unsettled = await settleFindings(page, place);
|
|
12
|
+
const judged = await judgeRestingPlace(page, place);
|
|
13
|
+
const axe = isStressViewport(item.viewport) ? await axeFindings(page, place) : [];
|
|
14
|
+
const scan = { ...judged, findings: [...loaded, ...unsettled, ...judged.findings, ...axe] };
|
|
15
|
+
await screenshotOf(page, scan, place, index);
|
|
16
|
+
return merged([{ ...scan, notes: [] }, await healthOf(page, place)]);
|
|
17
|
+
};
|
|
18
|
+
const placeItems = (locations, viewportsOf) => locations.flatMap((location) => viewportsOf(location).map((viewport) => ({ location, viewport })));
|
|
19
|
+
// A breakpoint edge is where a page's layout changes. A story renders one component alone in a frame,
|
|
20
|
+
// so it is loaded at the baseline and declared viewports only: its own media queries are still met at
|
|
21
|
+
// ten widths, and edges on every story would multiply a large Storybook's loads for layouts it lacks.
|
|
22
|
+
const edgeViewports = (location) => pageViewports(location.isStory ? [] : location.edges, projectSettings.layoutViewports);
|
|
23
|
+
const runRestingPass = async (page, shard, restingPass) => {
|
|
24
|
+
const budget = armBudget(page, restingPass.pass, shard, restingPass.items.length);
|
|
25
|
+
await preparePage(page);
|
|
26
|
+
const { visits, taken } = await visitAll(restingPass.items, {
|
|
27
|
+
budget,
|
|
28
|
+
labelOf: itemLabel,
|
|
29
|
+
visit: async (item, index) => await restingPass.visit(page, item, index),
|
|
30
|
+
});
|
|
31
|
+
await page.emulateMedia({ colorScheme: null });
|
|
32
|
+
finishPass(page, {
|
|
33
|
+
budget,
|
|
34
|
+
pass: restingPass.pass,
|
|
35
|
+
visits,
|
|
36
|
+
judgedRules: RESTING_JUDGED,
|
|
37
|
+
locations: shardLocations(taken, locationOfItem),
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Judge one shard of every location at every baseline and breakpoint-edge viewport by every resting rule.
|
|
42
|
+
* @param page the test's page.
|
|
43
|
+
* @param shard the part of the pass this test visits.
|
|
44
|
+
*/
|
|
45
|
+
export const expectRestingRules = async (page, shard) => {
|
|
46
|
+
test.info().skip(!isChromium(page), 'the resting pass runs in Chromium; other engines run the engine pass');
|
|
47
|
+
const discovery = readDiscovery(test.info());
|
|
48
|
+
await runRestingPass(page, shard, {
|
|
49
|
+
pass: 'resting',
|
|
50
|
+
items: placeItems(discovery.locations, edgeViewports),
|
|
51
|
+
visit: restingVisit,
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Judge one shard of one route per template and every story by every resting rule in Firefox or WebKit.
|
|
56
|
+
* @param page the test's page.
|
|
57
|
+
* @param shard the part of the pass this test visits.
|
|
58
|
+
*/
|
|
59
|
+
export const expectEngineRules = async (page, shard) => {
|
|
60
|
+
test.info().skip(isChromium(page), 'Chromium runs the full resting pass');
|
|
61
|
+
const discovery = readDiscovery(test.info());
|
|
62
|
+
await runRestingPass(page, shard, {
|
|
63
|
+
pass: 'engine',
|
|
64
|
+
items: placeItems(sampledLocations(discovery), () => BASELINE_VIEWPORTS),
|
|
65
|
+
visit: restingVisit,
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
const darkVisit = async (page, item, index) => {
|
|
69
|
+
await page.emulateMedia({ colorScheme: 'dark' });
|
|
70
|
+
const place = placeAt(page, item.location, item.viewport, 'dark');
|
|
71
|
+
const loaded = await loadLocation(page, item.location, item.viewport, place);
|
|
72
|
+
const unsettled = await settleFindings(page, place);
|
|
73
|
+
const judged = await judgeRestingPlace(page, place);
|
|
74
|
+
const axe = isStressViewport(item.viewport) ? await axeFindings(page, place) : [];
|
|
75
|
+
const scan = { ...judged, findings: [...loaded, ...unsettled, ...judged.findings, ...axe] };
|
|
76
|
+
await screenshotOf(page, scan, place, index);
|
|
77
|
+
return merged([{ ...scan, notes: [] }, await healthOf(page, place)]);
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Judge one shard of every location whose stylesheets answer `prefers-color-scheme` again in the dark
|
|
81
|
+
* scheme, from a fresh load. A `.dark` class is not followed: only the application's own code can set it,
|
|
82
|
+
* so its presence does not show that a visitor can reach it. Only at the two axe widths: the dark scheme
|
|
83
|
+
* changes colour, which axe judges there, while the geometry it shares with the light scheme is judged by
|
|
84
|
+
* the resting pass at every viewport.
|
|
85
|
+
* @param page the test's page.
|
|
86
|
+
* @param shard the part of the pass this test visits.
|
|
87
|
+
*/
|
|
88
|
+
export const expectDarkScheme = async (page, shard) => {
|
|
89
|
+
test.info().skip(!isChromium(page), 'the dark-scheme pass runs in Chromium');
|
|
90
|
+
const discovery = readDiscovery(test.info());
|
|
91
|
+
const locations = discovery.locations.filter((location) => location.hasDarkMedia);
|
|
92
|
+
await runRestingPass(page, shard, {
|
|
93
|
+
pass: 'dark-scheme',
|
|
94
|
+
items: placeItems(locations, () => STRESS_VIEWPORTS),
|
|
95
|
+
visit: darkVisit,
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
//# sourceMappingURL=sweep-resting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sweep-resting.js","sourceRoot":"","sources":["../src/sweep-resting.ts"],"names":[],"mappings":"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"}
|