@juxtapose/core 0.4.0 → 0.6.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 (153) hide show
  1. package/dist/agent/handoff.d.ts +8 -1
  2. package/dist/agent/handoff.js +75 -7
  3. package/dist/agent/handoff.js.map +1 -1
  4. package/dist/analysis/affected.d.ts +37 -0
  5. package/dist/analysis/affected.js +97 -22
  6. package/dist/analysis/affected.js.map +1 -1
  7. package/dist/analysis/cause.d.ts +32 -0
  8. package/dist/analysis/cause.js +187 -0
  9. package/dist/analysis/cause.js.map +1 -0
  10. package/dist/baseline/approve.d.ts +24 -0
  11. package/dist/baseline/approve.js +54 -0
  12. package/dist/baseline/approve.js.map +1 -0
  13. package/dist/baseline/git-store.d.ts +4 -0
  14. package/dist/baseline/git-store.js +22 -0
  15. package/dist/baseline/git-store.js.map +1 -1
  16. package/dist/browser/acquire.d.ts +15 -0
  17. package/dist/browser/acquire.js +26 -0
  18. package/dist/browser/acquire.js.map +1 -0
  19. package/dist/browser/browser.d.ts +53 -0
  20. package/dist/browser/browser.js +122 -0
  21. package/dist/browser/browser.js.map +1 -0
  22. package/dist/browser/cdp.d.ts +81 -0
  23. package/dist/browser/cdp.js +230 -0
  24. package/dist/browser/cdp.js.map +1 -0
  25. package/dist/browser/daemon/client.d.ts +145 -0
  26. package/dist/browser/daemon/client.js +764 -0
  27. package/dist/browser/daemon/client.js.map +1 -0
  28. package/dist/browser/daemon/state.d.ts +99 -0
  29. package/dist/browser/daemon/state.js +297 -0
  30. package/dist/browser/daemon/state.js.map +1 -0
  31. package/dist/browser/daemon/supervisor-main.d.ts +1 -0
  32. package/dist/browser/daemon/supervisor-main.js +54 -0
  33. package/dist/browser/daemon/supervisor-main.js.map +1 -0
  34. package/dist/browser/daemon/supervisor.d.ts +37 -0
  35. package/dist/browser/daemon/supervisor.js +777 -0
  36. package/dist/browser/daemon/supervisor.js.map +1 -0
  37. package/dist/{capture/launch.d.ts → browser/flags.d.ts} +19 -1
  38. package/dist/browser/flags.js +146 -0
  39. package/dist/browser/flags.js.map +1 -0
  40. package/dist/browser/index.d.ts +14 -0
  41. package/dist/browser/index.js +14 -0
  42. package/dist/browser/index.js.map +1 -0
  43. package/dist/browser/install.d.ts +33 -0
  44. package/dist/browser/install.js +167 -0
  45. package/dist/browser/install.js.map +1 -0
  46. package/dist/browser/launch.d.ts +37 -0
  47. package/dist/browser/launch.js +254 -0
  48. package/dist/browser/launch.js.map +1 -0
  49. package/dist/browser/page.d.ts +125 -0
  50. package/dist/browser/page.js +564 -0
  51. package/dist/browser/page.js.map +1 -0
  52. package/dist/browser/pins.d.ts +12 -0
  53. package/dist/browser/pins.js +57 -0
  54. package/dist/browser/pins.js.map +1 -0
  55. package/dist/browser/private-dir.d.ts +7 -0
  56. package/dist/browser/private-dir.js +24 -0
  57. package/dist/browser/private-dir.js.map +1 -0
  58. package/dist/browser/resolve.d.ts +31 -0
  59. package/dist/browser/resolve.js +126 -0
  60. package/dist/browser/resolve.js.map +1 -0
  61. package/dist/browser/selectors.d.ts +10 -0
  62. package/dist/browser/selectors.js +60 -0
  63. package/dist/browser/selectors.js.map +1 -0
  64. package/dist/browser/transport.d.ts +51 -0
  65. package/dist/browser/transport.js +124 -0
  66. package/dist/browser/transport.js.map +1 -0
  67. package/dist/browser/types.d.ts +4 -0
  68. package/dist/browser/types.js +2 -0
  69. package/dist/browser/types.js.map +1 -0
  70. package/dist/browser/zip.d.ts +27 -0
  71. package/dist/browser/zip.js +241 -0
  72. package/dist/browser/zip.js.map +1 -0
  73. package/dist/capture/capture.d.ts +7 -1
  74. package/dist/capture/capture.js +25 -8
  75. package/dist/capture/capture.js.map +1 -1
  76. package/dist/capture/env.d.ts +1 -1
  77. package/dist/capture/pool.d.ts +1 -1
  78. package/dist/capture/pool.js +41 -8
  79. package/dist/capture/pool.js.map +1 -1
  80. package/dist/capture/settle.d.ts +1 -1
  81. package/dist/capture/settle.js +2 -0
  82. package/dist/capture/settle.js.map +1 -1
  83. package/dist/capture/snap.d.ts +43 -0
  84. package/dist/capture/snap.js +103 -0
  85. package/dist/capture/snap.js.map +1 -0
  86. package/dist/capture/structure.d.ts +77 -0
  87. package/dist/capture/structure.js +498 -0
  88. package/dist/capture/structure.js.map +1 -0
  89. package/dist/diff/compare.d.ts +19 -0
  90. package/dist/diff/compare.js +19 -0
  91. package/dist/diff/compare.js.map +1 -0
  92. package/dist/diff/crops.d.ts +26 -0
  93. package/dist/diff/crops.js +92 -0
  94. package/dist/diff/crops.js.map +1 -0
  95. package/dist/diff/structural/classify.d.ts +29 -0
  96. package/dist/diff/structural/classify.js +113 -0
  97. package/dist/diff/structural/classify.js.map +1 -0
  98. package/dist/diff/structural/coverage.d.ts +11 -0
  99. package/dist/diff/structural/coverage.js +37 -0
  100. package/dist/diff/structural/coverage.js.map +1 -0
  101. package/dist/diff/structural/deltas.d.ts +29 -0
  102. package/dist/diff/structural/deltas.js +218 -0
  103. package/dist/diff/structural/deltas.js.map +1 -0
  104. package/dist/diff/structural/disambiguate.d.ts +3 -0
  105. package/dist/diff/structural/disambiguate.js +89 -0
  106. package/dist/diff/structural/disambiguate.js.map +1 -0
  107. package/dist/diff/structural/label.d.ts +15 -0
  108. package/dist/diff/structural/label.js +64 -0
  109. package/dist/diff/structural/label.js.map +1 -0
  110. package/dist/diff/structural/match.d.ts +13 -0
  111. package/dist/diff/structural/match.js +135 -0
  112. package/dist/diff/structural/match.js.map +1 -0
  113. package/dist/diff/structural/shift.d.ts +2 -0
  114. package/dist/diff/structural/shift.js +144 -0
  115. package/dist/diff/structural/shift.js.map +1 -0
  116. package/dist/diff/structural/summary.d.ts +31 -0
  117. package/dist/diff/structural/summary.js +420 -0
  118. package/dist/diff/structural/summary.js.map +1 -0
  119. package/dist/diff/structural.d.ts +40 -0
  120. package/dist/diff/structural.js +219 -0
  121. package/dist/diff/structural.js.map +1 -0
  122. package/dist/index.d.ts +28 -4
  123. package/dist/index.js +32 -3
  124. package/dist/index.js.map +1 -1
  125. package/dist/platform.d.ts +1 -1
  126. package/dist/platforms/urls.d.ts +3 -0
  127. package/dist/platforms/urls.js +89 -0
  128. package/dist/platforms/urls.js.map +1 -0
  129. package/dist/report/comment.js +9 -3
  130. package/dist/report/comment.js.map +1 -1
  131. package/dist/report/format.d.ts +18 -0
  132. package/dist/report/format.js +20 -0
  133. package/dist/report/format.js.map +1 -1
  134. package/dist/report/html.js +2 -2
  135. package/dist/report/html.js.map +1 -1
  136. package/dist/run/groups.d.ts +2 -0
  137. package/dist/run/groups.js +45 -0
  138. package/dist/run/groups.js.map +1 -0
  139. package/dist/run/run.d.ts +6 -2
  140. package/dist/run/run.js +74 -6
  141. package/dist/run/run.js.map +1 -1
  142. package/dist/shell-quote.d.ts +2 -0
  143. package/dist/shell-quote.js +10 -0
  144. package/dist/shell-quote.js.map +1 -0
  145. package/dist/types.d.ts +201 -5
  146. package/dist/types.js +0 -2
  147. package/dist/types.js.map +1 -1
  148. package/dist/url-platform.d.ts +2 -2
  149. package/dist/url-platform.js +2 -2
  150. package/dist/url-platform.js.map +1 -1
  151. package/package.json +6 -10
  152. package/dist/capture/launch.js +0 -56
  153. package/dist/capture/launch.js.map +0 -1
@@ -0,0 +1,564 @@
1
+ // packages/core/src/browser/page.ts
2
+ //
3
+ // One target, one flattened session. The init sequence is exactly what the
4
+ // byte-identity spike sent (spec §Decisions 3) — no more: Target.setAutoAttach
5
+ // without its handler pauses every worker and cross-origin iframe forever,
6
+ // and the geolocation/file-chooser overrides are things Playwright only
7
+ // sends when asked. The screenshot is a verbatim port of
8
+ // Screenshotter.screenshotPage (coreBundle.js L21258–21370).
9
+ import { CdpConnection, CdpError, TargetClosedError } from './cdp.js';
10
+ import { assertCssSelector, QUERY_ALL_SOURCE, queryAllExpression } from './selectors.js';
11
+ export class TimeoutError extends Error {
12
+ constructor(message) {
13
+ super(message);
14
+ this.name = 'TimeoutError';
15
+ }
16
+ }
17
+ /** The renderer died (OOM, Page.crash, a GPU fault); the page cannot be used again. */
18
+ export class PageCrashedError extends Error {
19
+ constructor() {
20
+ super('jux: the page crashed (its renderer process is gone)');
21
+ this.name = 'PageCrashedError';
22
+ }
23
+ }
24
+ const DEFAULT_TIMEOUT_MS = 30_000;
25
+ // Page.setFontFamilies tables, playwright-core 1.62.0 `platformToFontFamilies`
26
+ // (coreBundle.js L36529+), copied verbatim: linux has no forScripts; mac has
27
+ // jpan/hang/hans/hant; win has seven. Generic families resolve through these
28
+ // in headless mode; without them a story that says `font-family: sans-serif`
29
+ // renders with Chromium's built-in defaults and the bytes differ from every
30
+ // existing baseline.
31
+ const FONT_FAMILIES = {
32
+ linux: {
33
+ fontFamilies: {
34
+ standard: 'Times New Roman',
35
+ fixed: 'Monospace',
36
+ serif: 'Times New Roman',
37
+ sansSerif: 'Arial',
38
+ cursive: 'Comic Sans MS',
39
+ fantasy: 'Impact',
40
+ },
41
+ },
42
+ mac: {
43
+ fontFamilies: {
44
+ standard: 'Times',
45
+ fixed: 'Courier',
46
+ serif: 'Times',
47
+ sansSerif: 'Helvetica',
48
+ cursive: 'Apple Chancery',
49
+ fantasy: 'Papyrus',
50
+ },
51
+ forScripts: [
52
+ {
53
+ script: 'jpan',
54
+ fontFamilies: {
55
+ standard: 'Hiragino Kaku Gothic ProN',
56
+ fixed: 'Osaka-Mono',
57
+ serif: 'Hiragino Mincho ProN',
58
+ sansSerif: 'Hiragino Kaku Gothic ProN',
59
+ },
60
+ },
61
+ {
62
+ script: 'hang',
63
+ fontFamilies: {
64
+ standard: 'Apple SD Gothic Neo',
65
+ serif: 'AppleMyungjo',
66
+ sansSerif: 'Apple SD Gothic Neo',
67
+ },
68
+ },
69
+ {
70
+ script: 'hans',
71
+ fontFamilies: {
72
+ standard: ',PingFang SC,STHeiti',
73
+ serif: 'Songti SC',
74
+ sansSerif: ',PingFang SC,STHeiti',
75
+ cursive: 'Kaiti SC',
76
+ },
77
+ },
78
+ {
79
+ script: 'hant',
80
+ fontFamilies: {
81
+ standard: ',PingFang TC,Heiti TC',
82
+ serif: 'Songti TC',
83
+ sansSerif: ',PingFang TC,Heiti TC',
84
+ cursive: 'Kaiti TC',
85
+ },
86
+ },
87
+ ],
88
+ },
89
+ win: {
90
+ fontFamilies: {
91
+ standard: 'Times New Roman',
92
+ fixed: 'Consolas',
93
+ serif: 'Times New Roman',
94
+ sansSerif: 'Arial',
95
+ cursive: 'Comic Sans MS',
96
+ fantasy: 'Impact',
97
+ },
98
+ forScripts: [
99
+ {
100
+ script: 'cyrl',
101
+ fontFamilies: {
102
+ standard: 'Times New Roman',
103
+ fixed: 'Courier New',
104
+ serif: 'Times New Roman',
105
+ sansSerif: 'Arial',
106
+ },
107
+ },
108
+ { script: 'arab', fontFamilies: { fixed: 'Courier New', sansSerif: 'Segoe UI' } },
109
+ {
110
+ script: 'grek',
111
+ fontFamilies: {
112
+ standard: 'Times New Roman',
113
+ fixed: 'Courier New',
114
+ serif: 'Times New Roman',
115
+ sansSerif: 'Arial',
116
+ },
117
+ },
118
+ {
119
+ script: 'jpan',
120
+ fontFamilies: {
121
+ standard: ',Meiryo,Yu Gothic',
122
+ fixed: 'MS Gothic',
123
+ serif: ',Yu Mincho,MS PMincho',
124
+ sansSerif: ',Meiryo,Yu Gothic',
125
+ },
126
+ },
127
+ {
128
+ script: 'hang',
129
+ fontFamilies: {
130
+ standard: 'Malgun Gothic',
131
+ fixed: 'Gulimche',
132
+ serif: 'Batang',
133
+ sansSerif: 'Malgun Gothic',
134
+ cursive: 'Gungsuh',
135
+ },
136
+ },
137
+ {
138
+ script: 'hans',
139
+ fontFamilies: {
140
+ standard: 'Microsoft YaHei',
141
+ fixed: 'NSimsun',
142
+ serif: 'Simsun',
143
+ sansSerif: 'Microsoft YaHei',
144
+ cursive: 'KaiTi',
145
+ },
146
+ },
147
+ {
148
+ script: 'hant',
149
+ fontFamilies: {
150
+ standard: 'Microsoft JhengHei',
151
+ fixed: 'MingLiU',
152
+ serif: 'PMingLiU',
153
+ sansSerif: 'Microsoft JhengHei',
154
+ cursive: 'DFKai-SB',
155
+ },
156
+ },
157
+ ],
158
+ },
159
+ };
160
+ // coreBundle.js L51296, verbatim (serviceWorkers: 'block').
161
+ const BLOCK_SERVICE_WORKERS_SCRIPT = `
162
+ if (navigator.serviceWorker) navigator.serviceWorker.register = async () => { console.warn('Service Worker registration blocked by Playwright'); };
163
+ `;
164
+ const metricsOverride = (v) => ({
165
+ mobile: false,
166
+ width: v.width,
167
+ height: v.height,
168
+ screenWidth: v.width,
169
+ screenHeight: v.height,
170
+ deviceScaleFactor: 1,
171
+ screenOrientation: { angle: 0, type: 'landscapePrimary' },
172
+ });
173
+ const EMULATED_MEDIA = {
174
+ media: '',
175
+ features: [
176
+ { name: 'prefers-color-scheme', value: 'light' },
177
+ { name: 'prefers-reduced-motion', value: 'no-preference' },
178
+ { name: 'forced-colors', value: 'none' },
179
+ { name: 'prefers-contrast', value: 'no-preference' },
180
+ ],
181
+ };
182
+ // Screenshotter._preparePageForScreenshots with caret:'hide', animations:'allow'.
183
+ const PREPARE_SCREENSHOT = `(function (hideCaret) {
184
+ const collectRoots = (root, roots = []) => {
185
+ roots.push(root);
186
+ const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);
187
+ do {
188
+ const node = walker.currentNode;
189
+ const shadowRoot = node instanceof Element ? node.shadowRoot : null;
190
+ if (shadowRoot) collectRoots(shadowRoot, roots);
191
+ } while (walker.nextNode());
192
+ return roots;
193
+ };
194
+ const roots = collectRoots(document);
195
+ const cleanupCallbacks = [];
196
+ if (hideCaret) {
197
+ const elements = new Map();
198
+ for (const root of roots) {
199
+ root.querySelectorAll('input,textarea,[contenteditable]').forEach((element) => {
200
+ elements.set(element, { value: element.style.getPropertyValue('caret-color'), priority: element.style.getPropertyPriority('caret-color') });
201
+ element.style.setProperty('caret-color', 'transparent', 'important');
202
+ });
203
+ }
204
+ cleanupCallbacks.push(() => { for (const [element, value] of elements) element.style.setProperty('caret-color', value.value, value.priority); });
205
+ }
206
+ window.__juxCleanupScreenshot = () => { for (const cb of cleanupCallbacks) cb(); delete window.__juxCleanupScreenshot; };
207
+ })(true)`;
208
+ // Playwright's mask overlay: injected highlight.css + Highlight.updateHighlight.
209
+ const HIGHLIGHT_CSS = ':host{font-size:13px;font-family:system-ui,Ubuntu,Droid Sans,sans-serif;color:#333;color-scheme:light}svg{position:absolute;height:0}x-pw-highlight{position:absolute;top:0;left:0;width:0;height:0}';
210
+ const MASK_BODY = `
211
+ const glass = document.createElement('x-pw-glass');
212
+ glass.setAttribute('popover', 'manual');
213
+ const s = glass.style;
214
+ s.inset = '0'; s.width = '100%'; s.height = '100%'; s.maxWidth = 'none'; s.maxHeight = 'none';
215
+ s.padding = '0'; s.margin = '0'; s.border = 'none'; s.overflow = 'visible';
216
+ s.pointerEvents = 'none'; s.display = 'flex'; s.backgroundColor = 'transparent';
217
+ const shadow = glass.attachShadow({ mode: 'open' });
218
+ const style = document.createElement('style');
219
+ style.textContent = ${JSON.stringify(HIGHLIGHT_CSS)};
220
+ shadow.appendChild(style);
221
+ document.documentElement.appendChild(glass);
222
+ glass.showPopover();
223
+ const entries = els.map((el) => { const h = document.createElement('x-pw-highlight'); shadow.appendChild(h); return { el, h }; });
224
+ for (const { el, h } of entries) {
225
+ const box = el.getBoundingClientRect();
226
+ h.style.backgroundColor = a0;
227
+ h.style.left = box.x + 'px'; h.style.top = box.y + 'px';
228
+ h.style.width = box.width + 'px'; h.style.height = box.height + 'px';
229
+ h.style.display = 'block';
230
+ }
231
+ window.__juxUnmask = () => { glass.remove(); delete window.__juxUnmask; };
232
+ return entries.length;`;
233
+ // Playwright's default waitForSelector state is 'visible': the first match
234
+ // has a non-empty box and is not visibility:hidden. Matches pierce open
235
+ // shadow roots, as Playwright's css engine does.
236
+ const SELECTOR_VISIBLE = `function (selector) {
237
+ const el = (${QUERY_ALL_SOURCE})(selector)[0];
238
+ if (!el) return false;
239
+ const r = el.getBoundingClientRect();
240
+ return r.width > 0 && r.height > 0 && getComputedStyle(el).visibility !== 'hidden';
241
+ }`;
242
+ /** CDP's Frame.url excludes the fragment; Playwright's page.url() includes it. */
243
+ const frameUrl = (f) => f.url + (f.urlFragment ?? '');
244
+ function serialize(arg) {
245
+ return arg === undefined ? 'undefined' : JSON.stringify(arg);
246
+ }
247
+ export class CdpPage {
248
+ connection;
249
+ targetId;
250
+ sessionId;
251
+ currentUrl = 'about:blank';
252
+ viewport;
253
+ closed = false;
254
+ /**
255
+ * Why the page is unusable, once it is. `goneP` rejects with it at that
256
+ * moment and every send, evaluate and goto races it, so work already in
257
+ * flight fails at once: Chrome never answers a command on a crashed or
258
+ * detached session, and a committed navigation whose `load` never comes
259
+ * would otherwise hold a pool worker for its full timeout.
260
+ */
261
+ goneError = null;
262
+ rejectGone;
263
+ goneP;
264
+ /** Every connection listener this page holds; dispose() removes them all. */
265
+ offs = [];
266
+ constructor(connection, targetId, sessionId, viewport) {
267
+ this.connection = connection;
268
+ this.targetId = targetId;
269
+ this.sessionId = sessionId;
270
+ this.viewport = viewport;
271
+ this.goneP = new Promise((_, reject) => (this.rejectGone = reject));
272
+ // A crash or close with nothing in flight rejects this with no racer
273
+ // attached; without the catch that is an unhandledRejection, which kills
274
+ // a host running with Node's default --unhandled-rejections=throw.
275
+ // Racers still see the rejection: each race attaches its own handler.
276
+ this.goneP.catch(() => { });
277
+ this.offs.push(connection.on('Page.frameNavigated', (p) => {
278
+ const f = p.frame;
279
+ if (!f.parentId)
280
+ this.currentUrl = frameUrl(f);
281
+ }, sessionId),
282
+ // Playwright's DialogManager with no handlers (coreBundle.js L12963,
283
+ // L37640): beforeunload is accepted so navigation proceeds, every other
284
+ // dialog is dismissed. A story that calls alert() would otherwise block
285
+ // every later evaluate on this page.
286
+ connection.on('Page.javascriptDialogOpening', (p) => {
287
+ const accept = p.type === 'beforeunload';
288
+ void this.send('Page.handleJavaScriptDialog', { accept }).catch(() => { });
289
+ }, sessionId),
290
+ // The earliest crash signal CDP has. RenderFrameDevToolsAgentHost::
291
+ // RenderProcessExited sends it first, then NotifyCrashed → the
292
+ // browser-level Target.targetCrashed in the same call (measured: same
293
+ // millisecond on macOS), so listening there too would gain nothing.
294
+ // Nothing can beat it: the browser learns of the death only when the
295
+ // renderer process is gone.
296
+ connection.on('Inspector.targetCrashed', () => this.fail(new PageCrashedError()), sessionId),
297
+ // The same function's other branch: a renderer that exits with a status
298
+ // Chromium does not class as a crash gets Inspector.detached("Render
299
+ // process gone.") instead, and no Target event at all while the target
300
+ // stays open. Without this, work in flight would wait out its timeout.
301
+ connection.on('Inspector.detached', (p) => {
302
+ const reason = p.reason ?? '';
303
+ this.fail(/render process gone/i.test(reason)
304
+ ? new PageCrashedError()
305
+ : new TargetClosedError(reason || 'inspector detached'));
306
+ }, sessionId),
307
+ // Browser-session event: the target closed under us (context disposed,
308
+ // window.close()). Drop our listeners with it.
309
+ connection.on('Target.detachedFromTarget', (p) => {
310
+ if (p.sessionId !== this.sessionId)
311
+ return;
312
+ this.fail(new TargetClosedError('target closed'));
313
+ this.dispose();
314
+ }), connection.onClosed((e) => this.fail(e)));
315
+ }
316
+ /** The spike's init list (spec §Decisions 3), plus Log.enable which Playwright also sends. */
317
+ static async create(connection, targetId, sessionId, opts) {
318
+ const page = new CdpPage(connection, targetId, sessionId, opts.viewport);
319
+ // Keyed on the host's process.platform, where Playwright keys on the
320
+ // browser's UA. The two agree for every supported setup: the pinned
321
+ // download is per-host, and a BYO binary (JUX_CHROME / --chrome) is
322
+ // necessarily same-OS because we spawn it locally.
323
+ const fonts = FONT_FAMILIES[opts.os === 'darwin' ? 'mac' : opts.os === 'win32' ? 'win' : 'linux'];
324
+ try {
325
+ await Promise.all([
326
+ page.send('Page.enable'),
327
+ page.send('Page.setLifecycleEventsEnabled', { enabled: true }),
328
+ page.send('Runtime.enable'),
329
+ page.send('Network.enable'),
330
+ page.send('Log.enable'),
331
+ page.send('Emulation.setFocusEmulationEnabled', { enabled: true }),
332
+ page.send('Emulation.setDeviceMetricsOverride', metricsOverride(opts.viewport)),
333
+ page.send('Page.setFontFamilies', fonts),
334
+ page.send('Emulation.setEmulatedMedia', EMULATED_MEDIA),
335
+ ...(opts.blockServiceWorkers
336
+ ? [
337
+ page.send('Page.addScriptToEvaluateOnNewDocument', {
338
+ source: BLOCK_SERVICE_WORKERS_SCRIPT,
339
+ runImmediately: true,
340
+ }),
341
+ ]
342
+ : []),
343
+ ]);
344
+ }
345
+ catch (e) {
346
+ page.dispose();
347
+ throw e;
348
+ }
349
+ return page;
350
+ }
351
+ send(method, params = {}) {
352
+ if (this.goneError)
353
+ return Promise.reject(this.goneError);
354
+ return this.guard(this.connection.send(method, params, this.sessionId));
355
+ }
356
+ url() {
357
+ return this.currentUrl;
358
+ }
359
+ onMainResponse(handler) {
360
+ if (this.closed)
361
+ return () => { };
362
+ const off = this.connection.on('Network.responseReceived', (p) => {
363
+ const r = p;
364
+ // The top frame's id is the target id in Chromium (verified 2026-10-13).
365
+ if (r.type === 'Document' && r.frameId === this.targetId)
366
+ handler(r.response.status);
367
+ }, this.sessionId);
368
+ this.offs.push(off);
369
+ return off;
370
+ }
371
+ /**
372
+ * Page.navigate, then the main frame's `load` for the document that
373
+ * navigation created. The timeout covers the whole thing: Chrome answers
374
+ * Page.navigate only at commit or failure, so a server that never responds
375
+ * never replies. A child frame's own `load` must not count (a same-process
376
+ * iframe fires one for itself), nor may a late `load` from the previous
377
+ * document: Playwright waits on the new document's loaderId.
378
+ */
379
+ async goto(url, opts = {}) {
380
+ const timeout = opts.timeout ?? DEFAULT_TIMEOUT_MS;
381
+ const early = []; // loaderIds that fired load before navigate replied
382
+ let wanted;
383
+ let onLoad;
384
+ const loaded = new Promise((r) => (onLoad = r));
385
+ const off = this.connection.on('Page.lifecycleEvent', (p) => {
386
+ const e = p;
387
+ if (e.name !== 'load' || e.frameId !== this.targetId)
388
+ return;
389
+ if (wanted === undefined)
390
+ early.push(e.loaderId);
391
+ else if (e.loaderId === wanted)
392
+ onLoad();
393
+ }, this.sessionId);
394
+ let timer;
395
+ const expired = new Promise((_, reject) => {
396
+ timer = setTimeout(() => reject(new TimeoutError(`jux: navigation to ${url} did not fire load within ${timeout} ms`)), timeout);
397
+ });
398
+ const navigated = (async () => {
399
+ if (this.goneError)
400
+ throw this.goneError;
401
+ // The send's own cap sits past the goto timeout so the TimeoutError
402
+ // naming the url is the one the caller sees.
403
+ const res = await this.connection.send('Page.navigate', { url }, this.sessionId, { timeout: timeout + 1000 });
404
+ if (res.errorText)
405
+ throw new Error(`jux: navigation to ${url} failed: ${res.errorText}`);
406
+ // No loaderId: a same-document navigation (fragment change); the
407
+ // document is already loaded and no new `load` will fire.
408
+ if (res.loaderId === undefined)
409
+ return;
410
+ wanted = res.loaderId;
411
+ if (early.includes(wanted))
412
+ return;
413
+ await loaded;
414
+ })();
415
+ try {
416
+ await Promise.race([navigated, expired, this.goneP]);
417
+ }
418
+ finally {
419
+ clearTimeout(timer);
420
+ off();
421
+ navigated.catch(() => { }); // the loser of the race is not an unhandled rejection
422
+ }
423
+ const { frameTree } = await this.send('Page.getFrameTree');
424
+ this.currentUrl = frameUrl(frameTree.frame);
425
+ }
426
+ async evaluate(fn, arg, opts = {}) {
427
+ const expression = typeof fn === 'string' ? fn : `(${fn.toString()})(${serialize(arg)})`;
428
+ if (this.goneError)
429
+ throw this.goneError;
430
+ const r = await this.guard(this.connection.send('Runtime.evaluate', { expression, awaitPromise: true, returnByValue: true }, this.sessionId, { timeout: opts.timeout ?? DEFAULT_TIMEOUT_MS }));
431
+ if (r.exceptionDetails) {
432
+ throw new Error(r.exceptionDetails.exception?.description ?? r.exceptionDetails.text);
433
+ }
434
+ return r.result.value;
435
+ }
436
+ /** Playwright polls on requestAnimationFrame by default (polling: 'raf'). */
437
+ waitForFunction(fn, arg, opts = {}) {
438
+ const timeout = opts.timeout ?? DEFAULT_TIMEOUT_MS;
439
+ return this.poll(fn.toString(), serialize(arg), timeout).then((ok) => {
440
+ if (!ok)
441
+ throw new TimeoutError(`jux: waitForFunction timed out after ${timeout} ms`);
442
+ });
443
+ }
444
+ waitForSelector(selector, opts = {}) {
445
+ assertCssSelector(selector); // throws synchronously: a non-CSS selector is a config error, not a slow page
446
+ const timeout = opts.timeout ?? DEFAULT_TIMEOUT_MS;
447
+ return this.poll(SELECTOR_VISIBLE, JSON.stringify(selector), timeout).then((ok) => {
448
+ if (!ok)
449
+ throw new TimeoutError(`jux: selector '${selector}' did not appear within ${timeout} ms`);
450
+ });
451
+ }
452
+ /** rAF-poll `predicate(arg)` in the page; true once truthy, false at the in-page cap. */
453
+ async poll(predicate, arg, timeout) {
454
+ const outcome = await this.evaluate(`new Promise((resolve) => {
455
+ const predicate = ${predicate};
456
+ const arg = ${arg};
457
+ const start = performance.now();
458
+ const tick = () => {
459
+ let value;
460
+ try { value = predicate(arg); } catch (e) { return resolve('error:' + (e && e.message)); }
461
+ if (value) return resolve('ok');
462
+ if (performance.now() - start > ${timeout}) return resolve('timeout');
463
+ requestAnimationFrame(tick);
464
+ };
465
+ tick();
466
+ })`, undefined,
467
+ // The in-page cap fires first; the node-side cap only matters if the page is wedged.
468
+ { timeout: timeout + 1000 });
469
+ if (outcome.startsWith('error:'))
470
+ throw new Error(outcome.slice(6));
471
+ return outcome === 'ok';
472
+ }
473
+ /** Frame._addStyleTag → addStyleContent, verbatim. */
474
+ async addStyleTag(opts) {
475
+ await this.evaluate((content) => {
476
+ const style = document.createElement('style');
477
+ style.type = 'text/css';
478
+ style.appendChild(document.createTextNode(content));
479
+ document.head.appendChild(style);
480
+ return true;
481
+ }, opts.content);
482
+ }
483
+ async setViewportSize(viewport) {
484
+ if (viewport.width === this.viewport.width &&
485
+ viewport.height === this.viewport.height)
486
+ return;
487
+ await this.send('Emulation.setDeviceMetricsOverride', metricsOverride(viewport));
488
+ this.viewport = viewport;
489
+ }
490
+ /** Screenshotter.screenshotPage: prepare → fonts.ready → mask → getLayoutMetrics → captureScreenshot → cleanup. */
491
+ async screenshot(opts = {}) {
492
+ const mask = opts.mask ?? [];
493
+ for (const sel of mask)
494
+ assertCssSelector(sel);
495
+ await this.evaluate(PREPARE_SCREENSHOT);
496
+ try {
497
+ await this.evaluate('document.fonts.ready').catch(() => { });
498
+ if (mask.length) {
499
+ // One glass pane for all selectors: Playwright adds every selector's
500
+ // matches to the same highlight list before painting.
501
+ await this.evaluate(queryAllExpression(mask.join(', '), MASK_BODY, '#F0F'));
502
+ }
503
+ try {
504
+ const { visualViewport } = await this.send('Page.getLayoutMetrics');
505
+ const clip = {
506
+ x: visualViewport.pageX,
507
+ y: visualViewport.pageY,
508
+ width: Math.ceil(this.viewport.width / visualViewport.scale),
509
+ height: Math.ceil(this.viewport.height / visualViewport.scale),
510
+ scale: visualViewport.scale,
511
+ };
512
+ const { data } = await this.send('Page.captureScreenshot', {
513
+ format: 'png',
514
+ clip,
515
+ captureBeyondViewport: false,
516
+ });
517
+ return Buffer.from(data, 'base64');
518
+ }
519
+ finally {
520
+ if (mask.length)
521
+ await this.evaluate('window.__juxUnmask && window.__juxUnmask()').catch(() => { });
522
+ }
523
+ }
524
+ finally {
525
+ await this.evaluate('window.__juxCleanupScreenshot && window.__juxCleanupScreenshot()').catch(() => { });
526
+ }
527
+ }
528
+ async clearOrigin(origin) {
529
+ await this.send('Storage.clearDataForOrigin', { origin, storageTypes: 'all' });
530
+ }
531
+ async close() {
532
+ if (this.closed)
533
+ return;
534
+ this.dispose();
535
+ await this.connection
536
+ .send('Target.closeTarget', { targetId: this.targetId })
537
+ .catch((e) => {
538
+ if (!(e instanceof CdpError) && !(e instanceof TargetClosedError))
539
+ throw e;
540
+ });
541
+ }
542
+ /** Mark closed and drop every listener; idempotent. BrowserContext.close calls it for its pages. */
543
+ dispose() {
544
+ if (this.closed)
545
+ return;
546
+ this.closed = true;
547
+ this.fail(new TargetClosedError('page closed'));
548
+ for (const off of this.offs.splice(0))
549
+ off();
550
+ }
551
+ /** First cause wins: a crash followed by the context closing still reports the crash. */
552
+ fail(e) {
553
+ if (this.goneError)
554
+ return;
555
+ this.goneError = e;
556
+ this.rejectGone(e);
557
+ }
558
+ /** `p`, unless the page goes first. */
559
+ guard(p) {
560
+ p.catch(() => { }); // the loser of the race is not an unhandled rejection
561
+ return Promise.race([p, this.goneP]);
562
+ }
563
+ }
564
+ //# sourceMappingURL=page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/browser/page.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare const CHROME_VERSION = "151.0.7922.34";
2
+ export declare const MS_PLAYWRIGHT_REVISION = "1234";
3
+ export type ChromePlatform = 'linux64' | 'mac-arm64' | 'mac-x64' | 'win64';
4
+ export interface ChromePin {
5
+ platform: ChromePlatform;
6
+ url: string;
7
+ sha256: string;
8
+ bytes: number;
9
+ }
10
+ export declare const CHROME_PINS: Record<ChromePlatform, ChromePin>;
11
+ /** CfT platform key for this machine. linux-arm64 has no 151.0.7922.34 build. */
12
+ export declare function chromePlatform(platform?: NodeJS.Platform, arch?: string): ChromePlatform;
@@ -0,0 +1,57 @@
1
+ // packages/core/src/browser/pins.ts
2
+ //
3
+ // The browser is pinned, not "latest": Chromium 149 -> 151 changed 2 of 18
4
+ // example baselines (see capture/env.ts), so moving the version is a
5
+ // deliberate PR with a migration note, never a side effect of an install.
6
+ //
7
+ // 151.0.7922.34 is the exact build playwright-core 1.62.0 ships as
8
+ // chromium-headless-shell r1234, so upgrading from the Playwright driver to
9
+ // this one changes no bytes. Verified 2026-10-13: the binary inside CfT's
10
+ // mac-arm64 zip and the one in ~/Library/Caches/ms-playwright/
11
+ // chromium_headless_shell-1234 share sha256 7687bff7cb2db075….
12
+ //
13
+ // Chrome for Testing publishes no checksums (known-good-versions-with-
14
+ // downloads.json carries only version, revision and urls), so the sha256 of
15
+ // each zip was measured from the published files and pinned here.
16
+ export const CHROME_VERSION = '151.0.7922.34';
17
+ export const MS_PLAYWRIGHT_REVISION = '1234';
18
+ const url = (p) => `https://storage.googleapis.com/chrome-for-testing-public/${CHROME_VERSION}/${p}/chrome-headless-shell-${p}.zip`;
19
+ export const CHROME_PINS = {
20
+ linux64: {
21
+ platform: 'linux64',
22
+ url: url('linux64'),
23
+ sha256: '3cfc2bd00d1bafcf8a68dc74c9c92bb7150ddc8d26ade948a776316e1cec4f14',
24
+ bytes: 120231126,
25
+ },
26
+ 'mac-arm64': {
27
+ platform: 'mac-arm64',
28
+ url: url('mac-arm64'),
29
+ sha256: 'cb46a336dbe3d6f1339c5039c3083e4e5dd8e4379710790e34f8f4a865e2452d',
30
+ bytes: 99275008,
31
+ },
32
+ 'mac-x64': {
33
+ platform: 'mac-x64',
34
+ url: url('mac-x64'),
35
+ sha256: '608e2b5b1815b45e8bf59c9a381412b62df3ce36f2c182bc04e22fcf04ad53ea',
36
+ bytes: 103580477,
37
+ },
38
+ win64: {
39
+ platform: 'win64',
40
+ url: url('win64'),
41
+ sha256: '46cc69ef55ba29268ffe32dda4192a9d2165be42c3f4e923241153d519493aea',
42
+ bytes: 120106945,
43
+ },
44
+ };
45
+ /** CfT platform key for this machine. linux-arm64 has no 151.0.7922.34 build. */
46
+ export function chromePlatform(platform = process.platform, arch = process.arch) {
47
+ if (platform === 'darwin')
48
+ return arch === 'arm64' ? 'mac-arm64' : 'mac-x64';
49
+ if (platform === 'linux' && arch === 'x64')
50
+ return 'linux64';
51
+ if (platform === 'win32' && arch === 'x64')
52
+ return 'win64';
53
+ const key = platform === 'linux' ? `linux-${arch}` : `${platform}-${arch}`;
54
+ throw new Error(`jux: Chrome for Testing publishes no chrome-headless-shell ${CHROME_VERSION} for ${key}. ` +
55
+ `Point JUX_CHROME at a Chromium ${CHROME_VERSION.split('.')[0]} headless shell.`);
56
+ }
57
+ //# sourceMappingURL=pins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pins.js","sourceRoot":"","sources":["../../src/browser/pins.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,EAAE;AACF,2EAA2E;AAC3E,qEAAqE;AACrE,0EAA0E;AAC1E,EAAE;AACF,mEAAmE;AACnE,4EAA4E;AAC5E,0EAA0E;AAC1E,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,uEAAuE;AACvE,4EAA4E;AAC5E,kEAAkE;AAElE,MAAM,CAAC,MAAM,cAAc,GAAG,eAAe,CAAC;AAC9C,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAW7C,MAAM,GAAG,GAAG,CAAC,CAAiB,EAAE,EAAE,CAChC,4DAA4D,cAAc,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC;AAEnH,MAAM,CAAC,MAAM,WAAW,GAAsC;IAC5D,OAAO,EAAE;QACP,QAAQ,EAAE,SAAS;QACnB,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC;QACnB,MAAM,EAAE,kEAAkE;QAC1E,KAAK,EAAE,SAAS;KACjB;IACD,WAAW,EAAE;QACX,QAAQ,EAAE,WAAW;QACrB,GAAG,EAAE,GAAG,CAAC,WAAW,CAAC;QACrB,MAAM,EAAE,kEAAkE;QAC1E,KAAK,EAAE,QAAQ;KAChB;IACD,SAAS,EAAE;QACT,QAAQ,EAAE,SAAS;QACnB,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC;QACnB,MAAM,EAAE,kEAAkE;QAC1E,KAAK,EAAE,SAAS;KACjB;IACD,KAAK,EAAE;QACL,QAAQ,EAAE,OAAO;QACjB,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC;QACjB,MAAM,EAAE,kEAAkE;QAC1E,KAAK,EAAE,SAAS;KACjB;CACF,CAAC;AAEF,iFAAiF;AACjF,MAAM,UAAU,cAAc,CAC5B,WAA4B,OAAO,CAAC,QAAQ,EAC5C,OAAe,OAAO,CAAC,IAAI;IAE3B,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,IAAI,QAAQ,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7D,IAAI,QAAQ,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,OAAO,CAAC;IAC3D,MAAM,GAAG,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC;IAC3E,MAAM,IAAI,KAAK,CACb,8DAA8D,cAAc,QAAQ,GAAG,IAAI;QACzF,kCAAkC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,CACnF,CAAC;AACJ,CAAC"}