renderdiff 0.3.2 → 0.4.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/config.d.ts CHANGED
@@ -137,6 +137,8 @@ export type Mask = {
137
137
  } | {
138
138
  locate: (page: Page) => Locator;
139
139
  });
140
+ /** The `maskMedia` / `--mask-media` preset: embeds that differ per load. Video is frozen instead. */
141
+ export declare const MEDIA_MASK: Mask;
140
142
  /** The shape a `renderdiff.config.*` file default-exports. Every field is optional. */
141
143
  export interface RenderdiffConfig {
142
144
  /** Left origin, e.g. `http://localhost:3000`. A trailing slash is stripped. */
@@ -157,7 +159,7 @@ export interface RenderdiffConfig {
157
159
  };
158
160
  /** Viewport widths. Replaces {@link DEFAULT_WIDTHS} outright. */
159
161
  widths?: number[];
160
- /** Fail the run if any comparison scores below this, 0..1. */
162
+ /** Fail only when a comparison scores below this (0..1), instead of on any diff. */
161
163
  threshold?: number;
162
164
  /** Where to write screenshots and `report.html`. Relative paths resolve from cwd. */
163
165
  outDir?: string;
@@ -171,6 +173,12 @@ export interface RenderdiffConfig {
171
173
  extraCss?: string;
172
174
  /** Per-route regions painted over on both sides. */
173
175
  masks?: Mask[];
176
+ /** Also diff every element's computed style, and say whether the markup is identical. */
177
+ computed?: boolean;
178
+ /** Mask every `iframe` on every route. */
179
+ maskMedia?: boolean;
180
+ /** Keep every video from playing, so it shows its poster, and hide video.js overlays. Default true. */
181
+ freezeVideo?: boolean;
174
182
  }
175
183
  /** A fully merged config. Everything the run needs, nothing optional. */
176
184
  export interface ResolvedConfig {
@@ -191,6 +199,8 @@ export interface ResolvedConfig {
191
199
  left: string | null;
192
200
  right: string | null;
193
201
  };
202
+ computed: boolean;
203
+ freezeVideo: boolean;
194
204
  }
195
205
  /** package.json's version; the same relative path resolves from `src/` and `dist/`. */
196
206
  export declare function version(): string;
@@ -218,6 +228,11 @@ export interface CliOverrides {
218
228
  left?: string;
219
229
  right?: string;
220
230
  };
231
+ computed?: boolean;
232
+ /** From --mask, appended to the config's masks. */
233
+ masks?: string[];
234
+ maskMedia?: boolean;
235
+ freezeVideo?: boolean;
221
236
  }
222
237
  /** Merge built-in defaults, the config file, and CLI flags into one resolved config. */
223
238
  export declare function resolveConfig(file: RenderdiffConfig, cli: CliOverrides): ResolvedConfig;
package/dist/config.js CHANGED
@@ -146,6 +146,11 @@ export const CONTEXT_OPTIONS = {
146
146
  };
147
147
  /** Fill colour for masks and for height/width padding. Loud on purpose. */
148
148
  export const MASK_COLOR = "#FF00FF";
149
+ /** The `maskMedia` / `--mask-media` preset: embeds that differ per load. Video is frozen instead. */
150
+ export const MEDIA_MASK = {
151
+ selector: "iframe",
152
+ reason: "iframes (--mask-media)",
153
+ };
149
154
  /** package.json's version; the same relative path resolves from `src/` and `dist/`. */
150
155
  export function version() {
151
156
  const pkg = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "package.json");
@@ -285,6 +290,8 @@ function validate(c, file) {
285
290
  bad("widths", "an array of positive numbers");
286
291
  }
287
292
  }
293
+ if (c.computed !== undefined && typeof c.computed !== "boolean")
294
+ bad("computed", "a boolean");
288
295
  if (c.threshold !== undefined) {
289
296
  const t = c.threshold;
290
297
  if (typeof t !== "number" || !Number.isFinite(t) || t < 0 || t > 1) {
@@ -322,6 +329,10 @@ function validate(c, file) {
322
329
  }
323
330
  });
324
331
  }
332
+ if (c.maskMedia !== undefined && typeof c.maskMedia !== "boolean")
333
+ bad("maskMedia", "a boolean");
334
+ if (c.freezeVideo !== undefined && typeof c.freezeVideo !== "boolean")
335
+ bad("freezeVideo", "a boolean");
325
336
  }
326
337
  /** Merge built-in defaults, the config file, and CLI flags into one resolved config. */
327
338
  export function resolveConfig(file, cli) {
@@ -339,6 +350,7 @@ export function resolveConfig(file, cli) {
339
350
  ? { left: file.storageState, right: file.storageState }
340
351
  : file.storageState;
341
352
  const hideSelectors = [...DEFAULT_HIDE_SELECTORS, ...(file.hideSelectors ?? [])];
353
+ const freezeVideo = cli.freezeVideo ?? file.freezeVideo ?? true;
342
354
  return {
343
355
  left: left.replace(/\/+$/, ""),
344
356
  right: right.replace(/\/+$/, ""),
@@ -348,12 +360,24 @@ export function resolveConfig(file, cli) {
348
360
  concurrency: cli.concurrency ?? file.concurrency ?? DEFAULT_CONCURRENCY,
349
361
  blockUrlPatterns: [...DEFAULT_BLOCK_URL_PATTERNS, ...(file.blockUrlPatterns ?? [])],
350
362
  hideSelectors,
351
- neutralizeCss: STILL_CSS + `${hideSelectors.join(",")}{display:none!important}\n` + (file.extraCss ?? ""),
352
- masks: (file.masks ?? []).map((m) => m.urlPath === undefined ? m : { ...m, urlPath: normalize(m.urlPath) }),
363
+ neutralizeCss: STILL_CSS +
364
+ `${hideSelectors.join(",")}{display:none!important}\n` +
365
+ // visibility, not display, so the player keeps its layout.
366
+ (freezeVideo
367
+ ? ".vjs-text-track-display,.vjs-control-bar,.vjs-control-bar *{visibility:hidden!important}\n"
368
+ : "") +
369
+ (file.extraCss ?? ""),
370
+ masks: [
371
+ ...(file.masks ?? []).map((m) => m.urlPath === undefined ? m : { ...m, urlPath: normalize(m.urlPath) }),
372
+ ...(cli.masks ?? []).map((selector) => ({ selector, reason: `${selector} (--mask)` })),
373
+ ...(cli.maskMedia || file.maskMedia ? [MEDIA_MASK] : []),
374
+ ],
353
375
  storageState: {
354
376
  left: storageFile(cli.storageState?.left ?? fileState?.left),
355
377
  right: storageFile(cli.storageState?.right ?? fileState?.right),
356
378
  },
379
+ computed: cli.computed ?? file.computed ?? false,
380
+ freezeVideo,
357
381
  };
358
382
  }
359
383
  /** Absolute path to a storage state file that parses as a JSON object. Never echoes its contents. */
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/format.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { Line } from "./compare.ts";
1
2
  import type { ElementDiff } from "./locate.ts";
2
3
  /** Number formatting shared by the console summary (`run.ts`) and the HTML report. */
3
4
  /** Down to 4 decimals, so a shot that differs never reads as 100% or clears a threshold it missed. The epsilon absorbs float error like 0.29 * 1e4 = 2899.99…. */
@@ -21,5 +22,7 @@ export declare const fmtBand: (b: {
21
22
  y: number;
22
23
  h: number;
23
24
  }) => string;
25
+ /** `line -1px@y812`: signed like a band, − when only the reference draws it; `~` when approximate. */
26
+ export declare const fmtLine: (l: Line, approx?: boolean) => string;
24
27
  /** `+sel "text"` / `-sel "text"` for one side only, `sel prop l→r`, else its box deltas (left − right). */
25
28
  export declare const fmtElements: (els: ElementDiff[], props?: number) => string;
package/dist/format.js CHANGED
@@ -10,6 +10,8 @@ export const fmtFailed = (f) => ["left", "right"]
10
10
  export const fmtRegion = (r) => `${r.w}×${r.h} at (${r.x},${r.y})`;
11
11
  /** Signed like the height delta: + when left has the extra rows, − when right does. */
12
12
  export const fmtBand = (b) => `${b.side === "left" ? "+" : "-"}${b.h}px at y=${b.y} (${b.side})`;
13
+ /** `line -1px@y812`: signed like a band, − when only the reference draws it; `~` when approximate. */
14
+ export const fmtLine = (l, approx = false) => `line ${l.side === "left" ? "+" : l.side === "right" ? "-" : ""}${l.h}px@y${approx ? "~" : ""}${l.y}`;
13
15
  /** `+sel "text"` / `-sel "text"` for one side only, `sel prop l→r`, else its box deltas (left − right). */
14
16
  export const fmtElements = (els, props = 2) => els
15
17
  .map((e) => {
@@ -18,13 +20,14 @@ export const fmtElements = (els, props = 2) => els
18
20
  const changed = Object.entries(e.changed)
19
21
  .slice(0, props)
20
22
  .map(([p, [l, r]]) => (p === "text" ? `"${l}"→"${r}"` : `${p} ${l}→${r}`));
23
+ const re = e.reparented ? " (re-parented)" : "";
21
24
  if (changed.length)
22
- return `${e.selector} ${changed.join(", ")}`;
25
+ return `${e.selector} ${changed.join(", ")}${re}`;
23
26
  const moved = ["x", "y", "w", "h"].flatMap((k) => {
24
27
  const d = e.left[k] - e.right[k];
25
28
  return d ? [`${k}${signed(d)}`] : [];
26
29
  });
27
- return [e.selector, ...moved].join(" ");
30
+ return [e.selector, ...moved].join(" ") + re;
28
31
  })
29
32
  .join("; ");
30
33
  //# sourceMappingURL=format.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -13,4 +13,5 @@ export { defineConfig, DEFAULT_BLOCK_URL_PATTERNS, DEFAULT_CONCURRENCY, DEFAULT_
13
13
  export { type ComparedResult, type CropResult, type ErrorResult, type Results, type RouteResult, type RunMeta, type Summary, } from "./report.ts";
14
14
  export { type Band, type Box, type Region, type TextDiff } from "./compare.ts";
15
15
  export { type ElementDiff } from "./locate.ts";
16
+ export { type ComputedDiff, type Finding, type StyleChange } from "./computed.ts";
16
17
  export { type Accepted, type Fingerprint } from "./accept.ts";
package/dist/index.js CHANGED
@@ -13,5 +13,6 @@ export { defineConfig, DEFAULT_BLOCK_URL_PATTERNS, DEFAULT_CONCURRENCY, DEFAULT_
13
13
  export {} from "./report.js";
14
14
  export {} from "./compare.js";
15
15
  export {} from "./locate.js";
16
+ export {} from "./computed.js";
16
17
  export {} from "./accept.js";
17
18
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EACL,YAAY,EACZ,0BAA0B,EAC1B,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,cAAc,EACd,UAAU,GAQX,MAAM,aAAa,CAAC;AAErB,OAAO,EAQN,MAAM,aAAa,CAAC;AAErB,OAAO,EAAmD,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAoB,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAmC,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EACL,YAAY,EACZ,0BAA0B,EAC1B,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,cAAc,EACd,UAAU,GAQX,MAAM,aAAa,CAAC;AAErB,OAAO,EAQN,MAAM,aAAa,CAAC;AAErB,OAAO,EAAmD,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAoB,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAqD,MAAM,eAAe,CAAC;AAClF,OAAO,EAAmC,MAAM,aAAa,CAAC"}
package/dist/locate.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import type { Locator, Page } from "playwright";
2
2
  import type { Shot } from "./capture.ts";
3
3
  import type { Box, Spot } from "./compare.ts";
4
+ import type { Snapshot } from "./computed.ts";
4
5
  /** Names the DOM elements behind each change, from the pages still holding the shot's document. */
5
6
  /** A DOM element behind a change. Boxes in that side's page px (element px for a selector route). */
6
7
  export interface ElementDiff {
@@ -16,7 +17,17 @@ export interface ElementDiff {
16
17
  text: string;
17
18
  /** The right side's selector, when it was found by its text under a different one. */
18
19
  rightSelector?: string;
20
+ /** Paired although its parent's or grandparent's tags differ, so the props may not be the cause. */
21
+ reparented?: true;
19
22
  }
23
+ /** Layout first; width and height last, since they are usually a consequence. */
24
+ export declare const PROPS: string[];
25
+ /**
26
+ * Every rendered element's computed `PROPS` and `content`, and its `::before`/`::after` when
27
+ * generated, keyed by a selector path; masked and `display: none` subtrees are skipped.
28
+ * Finishes the page's animations, so it runs after `locate`.
29
+ */
30
+ export declare function snapshot(page: Page, masks: Locator[], budget: number, root: Locator | null): Promise<Snapshot>;
20
31
  /**
21
32
  * The elements behind each of the first `MAX_SPOTS` spots, in spot order. Each side picks the
22
33
  * elements that best fill its box, then the other side looks for each by selector.
package/dist/locate.js CHANGED
@@ -2,7 +2,7 @@ const MAX_SPOTS = 5;
2
2
  const PER_SPOT = 3;
3
3
  const MAX_CHANGED = 6;
4
4
  /** Layout first; width and height last, since they are usually a consequence. */
5
- const PROPS = [
5
+ export const PROPS = [
6
6
  "display",
7
7
  "position",
8
8
  "float",
@@ -46,7 +46,7 @@ const PROPS = [
46
46
  "height",
47
47
  ];
48
48
  /** Runs in the page. At scroll 0 a client rect is page px, below the fold too. */
49
- function probe({ boxes, find, masked, props, perSpot }) {
49
+ function probe({ boxes, find, masked, props, perSpot, walk, root }) {
50
50
  const MAX_SCAN = 50_000;
51
51
  const HASHED = /\d{3,}|^(css|sc|jsx|svelte)-|__[\w-]{5,}$|^_/;
52
52
  const TEST = ["data-testid", "data-test", "data-test-id", "data-cy", "data-qa"];
@@ -55,7 +55,13 @@ function probe({ boxes, find, masked, props, perSpot }) {
55
55
  `[${n}="${v.replace(/["\\]/g, "\\$&").replace(/[\0-\x1f\x7f]/g, (c) => `\\${c.charCodeAt(0).toString(16)} `)}"]`;
56
56
  const unique = (s) => document.querySelectorAll(s).length === 1;
57
57
  const snippet = (e) => (e.innerText ?? e.textContent ?? "").replace(/\s+/g, " ").trim().slice(0, 40);
58
- const part = (e) => {
58
+ const generated = (e, pseudo) => {
59
+ const ps = getComputedStyle(e, pseudo);
60
+ const c = ps.getPropertyValue("content");
61
+ return c !== "none" && c !== "normal" ? ps : null;
62
+ };
63
+ /** Tag, a naming attribute and up to two classes that don't look generated. */
64
+ const base = (e, sorted) => {
59
65
  const tag = e.localName;
60
66
  let s = CSS.escape(tag);
61
67
  const href = e.getAttribute("href");
@@ -71,11 +77,18 @@ function probe({ boxes, find, masked, props, perSpot }) {
71
77
  }
72
78
  }
73
79
  // ponytail: hashed-class heuristic, attributes and nth-of-type are the fallback
74
- s += Array.from(e.classList)
75
- .filter((c) => !HASHED.test(c))
76
- .slice(0, 2)
77
- .map((c) => `.${CSS.escape(c)}`)
78
- .join("");
80
+ const classes = Array.from(e.classList).filter((c) => !HASHED.test(c));
81
+ if (sorted)
82
+ classes.sort();
83
+ return (s +
84
+ classes
85
+ .slice(0, 2)
86
+ .map((c) => `.${CSS.escape(c)}`)
87
+ .join(""));
88
+ };
89
+ const part = (e) => {
90
+ const tag = e.localName;
91
+ let s = base(e, false);
79
92
  const siblings = e.parentElement ? Array.from(e.parentElement.children) : [];
80
93
  if (siblings.some((c) => c !== e && c.matches(s))) {
81
94
  s += `:nth-of-type(${siblings.filter((c) => c.localName === tag).indexOf(e) + 1})`;
@@ -114,6 +127,32 @@ function probe({ boxes, find, masked, props, perSpot }) {
114
127
  h: Math.round(r.height),
115
128
  },
116
129
  styles: props.map((p) => cs.getPropertyValue(p)),
130
+ up: (() => {
131
+ const tags = [];
132
+ for (let n = e.parentElement; n && tags.length < 2; n = n.parentElement)
133
+ tags.unshift(n.localName);
134
+ return tags.join(">");
135
+ })(),
136
+ pseudo: ["::before", "::after"].map((p) => {
137
+ const ps = generated(e, p);
138
+ return (ps &&
139
+ Object.fromEntries([
140
+ "content",
141
+ "width",
142
+ "height",
143
+ "background-color",
144
+ "background-image",
145
+ "border-top-width",
146
+ "border-top-color",
147
+ "border-bottom-width",
148
+ "border-bottom-color",
149
+ "box-shadow",
150
+ ].map((q) => [
151
+ q,
152
+ // A url() resolves against each side's origin.
153
+ ps.getPropertyValue(q).replaceAll(location.origin, ""),
154
+ ])));
155
+ }),
117
156
  };
118
157
  };
119
158
  const hit = (e) => {
@@ -128,6 +167,82 @@ function probe({ boxes, find, masked, props, perSpot }) {
128
167
  const hidden = new Set();
129
168
  for (const m of masked)
130
169
  [m, ...Array.from(m.querySelectorAll("*"))].forEach((e) => hidden.add(e));
170
+ if (walk) {
171
+ // STILL_CSS stops CSS animations; this settles ones started from script.
172
+ for (const a of document.getAnimations()) {
173
+ try {
174
+ a.finish();
175
+ }
176
+ catch {
177
+ a.cancel();
178
+ }
179
+ }
180
+ const snap = {};
181
+ const SKIP = new Set(["script", "style", "link", "meta", "template", "noscript"]);
182
+ let n = 0;
183
+ const end = performance.now() + walk;
184
+ // Generated class names change with the CSS, so they aren't markup changes.
185
+ const html = (e) => {
186
+ const attrs = Array.from(e.attributes, (a) => {
187
+ const v = a.name === "class"
188
+ ? Array.from(e.classList)
189
+ .filter((c) => !HASHED.test(c))
190
+ .sort()
191
+ .join(" ")
192
+ : a.value;
193
+ return ` ${a.name}="${v.replace(/"/g, "&quot;")}"`;
194
+ }).join("");
195
+ const text = Array.from(e.childNodes, (c) => (c.nodeType === 3 ? c.textContent : ""))
196
+ .join("")
197
+ .replace(/\s+/g, " ")
198
+ .trim();
199
+ return `<${e.localName}${attrs}>${text}`;
200
+ };
201
+ // A display:none element is kept, so a rule that hid it is a style change; its subtree isn't.
202
+ const visit = (e, key) => {
203
+ if (++n > MAX_SCAN)
204
+ throw new Error(`more than ${MAX_SCAN} elements`);
205
+ if (performance.now() > end)
206
+ throw new Error(`took over ${walk}ms`);
207
+ const cs = getComputedStyle(e);
208
+ // Specified, not used: `auto`, `100%` or `200px` says which box sizes which.
209
+ const m = e.computedStyleMap?.();
210
+ snap[key] = {
211
+ html: html(e),
212
+ styles: props.map((p) => cs.getPropertyValue(p)),
213
+ ...(m ? { size: [String(m.get("width")), String(m.get("height"))] } : {}),
214
+ };
215
+ if (cs.display === "none")
216
+ return;
217
+ for (const pseudo of ["::before", "::after"]) {
218
+ const ps = generated(e, pseudo);
219
+ if (ps)
220
+ snap[key + pseudo] = { html: "", styles: props.map((p) => ps.getPropertyValue(p)) };
221
+ }
222
+ // Indexed among every child, as :nth-of-type counts, so the key works with querySelector.
223
+ const ofType = new Map();
224
+ const kids = Array.from(e.children, (c) => {
225
+ const k = (ofType.get(c.localName) ?? 0) + 1;
226
+ ofType.set(c.localName, k);
227
+ return { c, k };
228
+ }).filter(({ c }) => !hidden.has(c) && !SKIP.has(c.localName) && !c.ownerSVGElement);
229
+ // The id, or the tag with a naming attribute and classes; with the index where siblings share it.
230
+ const segs = kids.map(({ c }) => c.id && !HASHED.test(c.id)
231
+ ? `${CSS.escape(c.localName)}#${CSS.escape(c.id)}`
232
+ : base(c, true));
233
+ const count = new Map();
234
+ for (const g of segs)
235
+ count.set(g, (count.get(g) ?? 0) + 1);
236
+ kids.forEach(({ c, k }, i) => {
237
+ const g = segs[i];
238
+ visit(c, `${key} > ${count.get(g) > 1 ? `${g}:nth-of-type(${k})` : g}`);
239
+ });
240
+ };
241
+ const start = root ?? document.body;
242
+ if (start)
243
+ visit(start, root ? ":scope" : "body");
244
+ return { picks: [], found: [], snap };
245
+ }
131
246
  const els = document.body?.querySelectorAll("*") ?? [];
132
247
  for (let i = 0; i < els.length && i < MAX_SCAN; i++) {
133
248
  const e = els[i];
@@ -202,7 +317,7 @@ function probe({ boxes, find, masked, props, perSpot }) {
202
317
  }
203
318
  return e ? hit(e) : null;
204
319
  });
205
- return { picks, found };
320
+ return { picks, found, snap: null };
206
321
  }
207
322
  function element([l, r], origins) {
208
323
  const changed = {};
@@ -225,10 +340,53 @@ function element([l, r], origins) {
225
340
  ...(l && r && l.sel !== r.sel ? { rightSelector: r.sel } : {}),
226
341
  };
227
342
  }
343
+ /** `sel::before` / `sel::after` where the pseudo-element exists on one side only, or differs. */
344
+ function pseudos([l, r], origins) {
345
+ return ["::before", "::after"].flatMap((name, i) => {
346
+ const [p, q] = [l.pseudo[i], r.pseudo[i]];
347
+ if (!p && !q)
348
+ return [];
349
+ const changed = Object.fromEntries(p && q
350
+ ? Object.keys(p)
351
+ .filter((k) => p[k] !== q[k])
352
+ .map((k) => [k, [p[k], q[k]]])
353
+ : []);
354
+ if (p && q && !Object.keys(changed).length)
355
+ return [];
356
+ const host = element([p ? l : null, q ? r : null], origins);
357
+ return [
358
+ {
359
+ ...host,
360
+ selector: host.selector + name,
361
+ changed,
362
+ text: "",
363
+ ...(host.rightSelector ? { rightSelector: host.rightSelector + name } : {}),
364
+ },
365
+ ];
366
+ });
367
+ }
228
368
  /** Without text to compare, a selector naming both is only the same element if the box agrees. */
229
369
  const same = (a, b) => !!(a.text || b.text) ||
230
370
  (a.tag === b.tag && Math.abs(a.box.w - b.box.w) <= 4 && Math.abs(a.box.h - b.box.h) <= 4);
231
371
  const moved = (a, b) => a.x !== b.x || a.y !== b.y || a.w !== b.w || a.h !== b.h;
372
+ const handles = async (ls) => (await Promise.all(ls.map((l) => l.elementHandles()))).flat();
373
+ /**
374
+ * Every rendered element's computed `PROPS` and `content`, and its `::before`/`::after` when
375
+ * generated, keyed by a selector path; masked and `display: none` subtrees are skipped.
376
+ * Finishes the page's animations, so it runs after `locate`.
377
+ */
378
+ export async function snapshot(page, masks, budget, root) {
379
+ const { snap } = await page.evaluate(probe, {
380
+ root: root && (await root.elementHandle()),
381
+ boxes: [],
382
+ find: [],
383
+ masked: await handles(masks),
384
+ props: [...PROPS, "content"],
385
+ perSpot: 0,
386
+ walk: budget,
387
+ });
388
+ return snap;
389
+ }
232
390
  /**
233
391
  * The elements behind each of the first `MAX_SPOTS` spots, in spot order. Each side picks the
234
392
  * elements that best fill its box, then the other side looks for each by selector.
@@ -237,7 +395,7 @@ export async function locate(pages, shots, spots, masks) {
237
395
  const todo = spots.slice(0, MAX_SPOTS);
238
396
  if (!todo.length)
239
397
  return [];
240
- const masked = await Promise.all(masks.map(async (ls) => (await Promise.all(ls.map((l) => l.elementHandles()))).flat()));
398
+ const masked = await Promise.all(masks.map(handles));
241
399
  const boxes = (s) => todo.map((t) => {
242
400
  const b = s ? t.right : t.left;
243
401
  const o = shots[s].origin;
@@ -286,7 +444,11 @@ export async function locate(pages, shots, spots, masks) {
286
444
  const out = [];
287
445
  for (const [a, b] of pairs.slice(0, PER_SPOT)) {
288
446
  const el = element([a, b], [shots[0].origin, shots[1].origin]);
447
+ if (a && b && a.up !== b.up)
448
+ el.reparented = true;
289
449
  out.push(el);
450
+ if (a && b)
451
+ out.push(...pseudos([a, b], [shots[0].origin, shots[1].origin]).map((p) => el.reparented ? { ...p, reparented: el.reparented } : p));
290
452
  // ponytail: one level of cause; a deeper cascade search if agents ask for it
291
453
  if (el.left && el.right && !Object.keys(el.changed).length && moved(el.left, el.right)) {
292
454
  for (const [p, q] of [