@geometra/proxy 1.18.1
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/README.md +37 -0
- package/dist/a11y-enrich.d.ts +8 -0
- package/dist/a11y-enrich.d.ts.map +1 -0
- package/dist/a11y-enrich.js +94 -0
- package/dist/a11y-enrich.js.map +1 -0
- package/dist/diff-layout.d.ts +12 -0
- package/dist/diff-layout.d.ts.map +1 -0
- package/dist/diff-layout.js +77 -0
- package/dist/diff-layout.js.map +1 -0
- package/dist/dom-actions.d.ts +36 -0
- package/dist/dom-actions.d.ts.map +1 -0
- package/dist/dom-actions.js +172 -0
- package/dist/dom-actions.js.map +1 -0
- package/dist/extractor.d.ts +9 -0
- package/dist/extractor.d.ts.map +1 -0
- package/dist/extractor.js +386 -0
- package/dist/extractor.js.map +1 -0
- package/dist/frame-offset.d.ts +11 -0
- package/dist/frame-offset.d.ts.map +1 -0
- package/dist/frame-offset.js +29 -0
- package/dist/frame-offset.js.map +1 -0
- package/dist/geometry-ws.d.ts +18 -0
- package/dist/geometry-ws.d.ts.map +1 -0
- package/dist/geometry-ws.js +328 -0
- package/dist/geometry-ws.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +90 -0
- package/dist/index.js.map +1 -0
- package/dist/layout-offset.d.ts +4 -0
- package/dist/layout-offset.d.ts.map +1 -0
- package/dist/layout-offset.js +9 -0
- package/dist/layout-offset.js.map +1 -0
- package/dist/types.d.ts +109 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +30 -0
- package/dist/types.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
import { enrichSnapshotWithCdpAx } from './a11y-enrich.js';
|
|
2
|
+
import { frameOriginInRootPage } from './frame-offset.js';
|
|
3
|
+
import { offsetLayoutSubtree } from './layout-offset.js';
|
|
4
|
+
/**
|
|
5
|
+
* In-browser extraction (no closure over Node). Single-frame viewport coordinates.
|
|
6
|
+
*/
|
|
7
|
+
function browserExtractGeometry() {
|
|
8
|
+
const SKIP_TAGS = new Set(['script', 'style', 'noscript', 'template']);
|
|
9
|
+
const LEAF_FORM_TAGS = new Set(['input', 'textarea', 'select']);
|
|
10
|
+
function getAccessibleName(el) {
|
|
11
|
+
const aria = el.getAttribute('aria-label');
|
|
12
|
+
if (aria)
|
|
13
|
+
return aria.trim() || undefined;
|
|
14
|
+
const alt = el.getAttribute('alt');
|
|
15
|
+
if (alt)
|
|
16
|
+
return alt.trim() || undefined;
|
|
17
|
+
const title = el.getAttribute('title');
|
|
18
|
+
if (title)
|
|
19
|
+
return title.trim() || undefined;
|
|
20
|
+
const ph = el.getAttribute('placeholder');
|
|
21
|
+
if (ph)
|
|
22
|
+
return ph.trim() || undefined;
|
|
23
|
+
if (el instanceof HTMLInputElement && el.labels && el.labels.length > 0) {
|
|
24
|
+
const t = el.labels[0].textContent?.trim();
|
|
25
|
+
if (t)
|
|
26
|
+
return t;
|
|
27
|
+
}
|
|
28
|
+
const tc = el.textContent?.trim();
|
|
29
|
+
if (tc && tc.length > 0) {
|
|
30
|
+
return tc.length > 100 ? tc.slice(0, 100) : tc;
|
|
31
|
+
}
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
function isFocusable(el) {
|
|
35
|
+
const h = el;
|
|
36
|
+
if (h instanceof HTMLButtonElement && h.disabled)
|
|
37
|
+
return false;
|
|
38
|
+
if (h instanceof HTMLInputElement && h.disabled)
|
|
39
|
+
return false;
|
|
40
|
+
if (h instanceof HTMLSelectElement && h.disabled)
|
|
41
|
+
return false;
|
|
42
|
+
if (h instanceof HTMLTextAreaElement && h.disabled)
|
|
43
|
+
return false;
|
|
44
|
+
if (h.isContentEditable)
|
|
45
|
+
return true;
|
|
46
|
+
const tab = h.tabIndex;
|
|
47
|
+
if (typeof tab === 'number' && tab >= 0)
|
|
48
|
+
return true;
|
|
49
|
+
const tag = el.tagName.toLowerCase();
|
|
50
|
+
return ['a', 'button', 'input', 'select', 'textarea'].includes(tag);
|
|
51
|
+
}
|
|
52
|
+
function shouldSkip(el) {
|
|
53
|
+
const tag = el.tagName.toLowerCase();
|
|
54
|
+
if (SKIP_TAGS.has(tag))
|
|
55
|
+
return true;
|
|
56
|
+
const h = el;
|
|
57
|
+
const style = getComputedStyle(h);
|
|
58
|
+
if (style.display === 'none' || style.visibility === 'hidden')
|
|
59
|
+
return true;
|
|
60
|
+
const rect = h.getBoundingClientRect();
|
|
61
|
+
if (rect.width <= 0 || rect.height <= 0)
|
|
62
|
+
return true;
|
|
63
|
+
const op = parseFloat(style.opacity);
|
|
64
|
+
if (op === 0)
|
|
65
|
+
return true;
|
|
66
|
+
if (tag === 'input' && el.type === 'hidden')
|
|
67
|
+
return true;
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
function displayedElementChildren(container) {
|
|
71
|
+
const out = [];
|
|
72
|
+
for (const c of container.children) {
|
|
73
|
+
if (!shouldSkip(c))
|
|
74
|
+
out.push(c);
|
|
75
|
+
}
|
|
76
|
+
const sr = container.shadowRoot;
|
|
77
|
+
if (sr) {
|
|
78
|
+
for (const c of sr.children) {
|
|
79
|
+
if (!shouldSkip(c))
|
|
80
|
+
out.push(c);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return out;
|
|
84
|
+
}
|
|
85
|
+
function defaultRoleForTag(el, tag) {
|
|
86
|
+
const explicit = el.getAttribute('role');
|
|
87
|
+
if (explicit)
|
|
88
|
+
return explicit;
|
|
89
|
+
if (tag === 'nav')
|
|
90
|
+
return 'navigation';
|
|
91
|
+
if (tag === 'main')
|
|
92
|
+
return 'main';
|
|
93
|
+
if (tag === 'article')
|
|
94
|
+
return 'article';
|
|
95
|
+
if (tag === 'section')
|
|
96
|
+
return 'region';
|
|
97
|
+
if (tag === 'ul' || tag === 'ol')
|
|
98
|
+
return 'list';
|
|
99
|
+
if (tag === 'li')
|
|
100
|
+
return 'listitem';
|
|
101
|
+
if (tag === 'form')
|
|
102
|
+
return 'form';
|
|
103
|
+
if (tag === 'button')
|
|
104
|
+
return 'button';
|
|
105
|
+
if (tag === 'a')
|
|
106
|
+
return 'link';
|
|
107
|
+
if (tag === 'h1' || tag === 'h2' || tag === 'h3' || tag === 'h4' || tag === 'h5' || tag === 'h6') {
|
|
108
|
+
return 'heading';
|
|
109
|
+
}
|
|
110
|
+
if (tag === 'img')
|
|
111
|
+
return 'img';
|
|
112
|
+
if (tag === 'input') {
|
|
113
|
+
const t = el.type;
|
|
114
|
+
if (t === 'checkbox')
|
|
115
|
+
return 'checkbox';
|
|
116
|
+
if (t === 'radio')
|
|
117
|
+
return 'radio';
|
|
118
|
+
if (t === 'submit' || t === 'button' || t === 'reset')
|
|
119
|
+
return 'button';
|
|
120
|
+
return 'textbox';
|
|
121
|
+
}
|
|
122
|
+
if (tag === 'select')
|
|
123
|
+
return 'combobox';
|
|
124
|
+
if (tag === 'textarea')
|
|
125
|
+
return 'textbox';
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
function semanticFor(el, tag) {
|
|
129
|
+
const semantic = { tag };
|
|
130
|
+
const role = defaultRoleForTag(el, tag);
|
|
131
|
+
if (role)
|
|
132
|
+
semantic.role = role;
|
|
133
|
+
const al = el.getAttribute('aria-label');
|
|
134
|
+
if (al)
|
|
135
|
+
semantic.ariaLabel = al;
|
|
136
|
+
const h = el;
|
|
137
|
+
if (h instanceof HTMLInputElement && h.disabled)
|
|
138
|
+
semantic.ariaDisabled = true;
|
|
139
|
+
if (h instanceof HTMLButtonElement && h.disabled)
|
|
140
|
+
semantic.ariaDisabled = true;
|
|
141
|
+
if (h instanceof HTMLSelectElement && h.disabled)
|
|
142
|
+
semantic.ariaDisabled = true;
|
|
143
|
+
if (h instanceof HTMLTextAreaElement && h.disabled)
|
|
144
|
+
semantic.ariaDisabled = true;
|
|
145
|
+
const exp = el.getAttribute('aria-expanded');
|
|
146
|
+
if (exp !== null)
|
|
147
|
+
semantic.ariaExpanded = exp === 'true';
|
|
148
|
+
const sel = el.getAttribute('aria-selected');
|
|
149
|
+
if (sel !== null)
|
|
150
|
+
semantic.ariaSelected = sel === 'true';
|
|
151
|
+
if (tag === 'img') {
|
|
152
|
+
const alt = el.getAttribute('alt');
|
|
153
|
+
if (alt)
|
|
154
|
+
semantic.alt = alt;
|
|
155
|
+
}
|
|
156
|
+
if (h.isContentEditable)
|
|
157
|
+
semantic.role = 'textbox';
|
|
158
|
+
return semantic;
|
|
159
|
+
}
|
|
160
|
+
function handlersFor(focusable) {
|
|
161
|
+
if (!focusable)
|
|
162
|
+
return undefined;
|
|
163
|
+
return { onClick: true, onKeyDown: true, onKeyUp: true };
|
|
164
|
+
}
|
|
165
|
+
function extractFormControl(el, tag) {
|
|
166
|
+
const h = el;
|
|
167
|
+
const rect = h.getBoundingClientRect();
|
|
168
|
+
const layout = {
|
|
169
|
+
x: Math.round(rect.x),
|
|
170
|
+
y: Math.round(rect.y),
|
|
171
|
+
width: Math.round(rect.width),
|
|
172
|
+
height: Math.round(rect.height),
|
|
173
|
+
children: [],
|
|
174
|
+
};
|
|
175
|
+
const name = getAccessibleName(el);
|
|
176
|
+
const sem = semanticFor(el, tag);
|
|
177
|
+
if (h instanceof HTMLInputElement && h.type === 'file') {
|
|
178
|
+
sem.role = 'button';
|
|
179
|
+
sem.fileInput = true;
|
|
180
|
+
}
|
|
181
|
+
if (name && !sem.ariaLabel)
|
|
182
|
+
sem.ariaLabel = name;
|
|
183
|
+
const focusable = isFocusable(el);
|
|
184
|
+
const tree = {
|
|
185
|
+
kind: 'box',
|
|
186
|
+
props: {},
|
|
187
|
+
semantic: sem,
|
|
188
|
+
handlers: handlersFor(focusable),
|
|
189
|
+
};
|
|
190
|
+
return { layout, tree };
|
|
191
|
+
}
|
|
192
|
+
function extractImage(el) {
|
|
193
|
+
const rect = el.getBoundingClientRect();
|
|
194
|
+
const layout = {
|
|
195
|
+
x: Math.round(rect.x),
|
|
196
|
+
y: Math.round(rect.y),
|
|
197
|
+
width: Math.round(rect.width),
|
|
198
|
+
height: Math.round(rect.height),
|
|
199
|
+
children: [],
|
|
200
|
+
};
|
|
201
|
+
const tree = {
|
|
202
|
+
kind: 'image',
|
|
203
|
+
props: { src: el.currentSrc || el.src || '', alt: el.alt || '' },
|
|
204
|
+
semantic: { tag: 'img', alt: el.alt || undefined, role: 'img' },
|
|
205
|
+
};
|
|
206
|
+
return { layout, tree };
|
|
207
|
+
}
|
|
208
|
+
function extractElement(el) {
|
|
209
|
+
if (shouldSkip(el))
|
|
210
|
+
return null;
|
|
211
|
+
const tag = el.tagName.toLowerCase();
|
|
212
|
+
if (tag === 'img' && el instanceof HTMLImageElement)
|
|
213
|
+
return extractImage(el);
|
|
214
|
+
if (LEAF_FORM_TAGS.has(tag))
|
|
215
|
+
return extractFormControl(el, tag);
|
|
216
|
+
if (tag === 'iframe' && el instanceof HTMLIFrameElement) {
|
|
217
|
+
const iframe = el;
|
|
218
|
+
const rect = iframe.getBoundingClientRect();
|
|
219
|
+
const layout = {
|
|
220
|
+
x: Math.round(rect.x),
|
|
221
|
+
y: Math.round(rect.y),
|
|
222
|
+
width: Math.round(rect.width),
|
|
223
|
+
height: Math.round(rect.height),
|
|
224
|
+
children: [],
|
|
225
|
+
};
|
|
226
|
+
const sem = semanticFor(iframe, 'iframe');
|
|
227
|
+
sem.iframe = true;
|
|
228
|
+
sem.iframePlaceholder = true;
|
|
229
|
+
return {
|
|
230
|
+
layout,
|
|
231
|
+
tree: {
|
|
232
|
+
kind: 'box',
|
|
233
|
+
props: {},
|
|
234
|
+
semantic: sem,
|
|
235
|
+
handlers: handlersFor(isFocusable(iframe)),
|
|
236
|
+
children: [],
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
const h = el;
|
|
241
|
+
const rect = h.getBoundingClientRect();
|
|
242
|
+
const layout = {
|
|
243
|
+
x: Math.round(rect.x),
|
|
244
|
+
y: Math.round(rect.y),
|
|
245
|
+
width: Math.round(rect.width),
|
|
246
|
+
height: Math.round(rect.height),
|
|
247
|
+
children: [],
|
|
248
|
+
};
|
|
249
|
+
const elementChildren = displayedElementChildren(el);
|
|
250
|
+
if (elementChildren.length === 0) {
|
|
251
|
+
const text = (el.textContent || '').trim();
|
|
252
|
+
if (text.length > 0) {
|
|
253
|
+
const tree = {
|
|
254
|
+
kind: 'text',
|
|
255
|
+
props: { text, font: '16px system-ui', lineHeight: 1.2 },
|
|
256
|
+
semantic: { tag },
|
|
257
|
+
};
|
|
258
|
+
return { layout, tree };
|
|
259
|
+
}
|
|
260
|
+
const sem = semanticFor(el, tag);
|
|
261
|
+
const name = getAccessibleName(el);
|
|
262
|
+
if (name && !sem.ariaLabel)
|
|
263
|
+
sem.ariaLabel = name;
|
|
264
|
+
const focusable = isFocusable(el);
|
|
265
|
+
const tree = {
|
|
266
|
+
kind: 'box',
|
|
267
|
+
props: {},
|
|
268
|
+
semantic: sem,
|
|
269
|
+
handlers: handlersFor(focusable),
|
|
270
|
+
};
|
|
271
|
+
return { layout, tree };
|
|
272
|
+
}
|
|
273
|
+
const treeChildren = [];
|
|
274
|
+
for (const child of elementChildren) {
|
|
275
|
+
const sub = extractElement(child);
|
|
276
|
+
if (sub) {
|
|
277
|
+
layout.children.push(sub.layout);
|
|
278
|
+
treeChildren.push(sub.tree);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
const sem = semanticFor(el, tag);
|
|
282
|
+
const name = getAccessibleName(el);
|
|
283
|
+
if (name && !sem.ariaLabel)
|
|
284
|
+
sem.ariaLabel = name;
|
|
285
|
+
const focusable = isFocusable(el);
|
|
286
|
+
const tree = {
|
|
287
|
+
kind: 'box',
|
|
288
|
+
props: {},
|
|
289
|
+
semantic: sem,
|
|
290
|
+
handlers: handlersFor(focusable),
|
|
291
|
+
children: treeChildren,
|
|
292
|
+
};
|
|
293
|
+
return { layout, tree };
|
|
294
|
+
}
|
|
295
|
+
const body = document.body;
|
|
296
|
+
if (!body) {
|
|
297
|
+
const emptyLayout = { x: 0, y: 0, width: 0, height: 0, children: [] };
|
|
298
|
+
const emptyTree = { kind: 'box', props: {}, semantic: { tag: 'body' }, children: [] };
|
|
299
|
+
return { layout: emptyLayout, tree: emptyTree };
|
|
300
|
+
}
|
|
301
|
+
const elementChildren = displayedElementChildren(body);
|
|
302
|
+
const layout = {
|
|
303
|
+
x: 0,
|
|
304
|
+
y: 0,
|
|
305
|
+
width: Math.round(document.documentElement.clientWidth),
|
|
306
|
+
height: Math.round(document.documentElement.clientHeight),
|
|
307
|
+
children: [],
|
|
308
|
+
};
|
|
309
|
+
const treeChildren = [];
|
|
310
|
+
for (const child of elementChildren) {
|
|
311
|
+
const sub = extractElement(child);
|
|
312
|
+
if (sub) {
|
|
313
|
+
layout.children.push(sub.layout);
|
|
314
|
+
treeChildren.push(sub.tree);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
const tree = {
|
|
318
|
+
kind: 'box',
|
|
319
|
+
props: {},
|
|
320
|
+
semantic: { tag: 'body', role: 'group' },
|
|
321
|
+
children: treeChildren,
|
|
322
|
+
};
|
|
323
|
+
return { layout, tree };
|
|
324
|
+
}
|
|
325
|
+
function cloneLayout(layout) {
|
|
326
|
+
return structuredClone(layout);
|
|
327
|
+
}
|
|
328
|
+
function cloneTree(tree) {
|
|
329
|
+
return structuredClone(tree);
|
|
330
|
+
}
|
|
331
|
+
export async function extractFrameGeometry(frame) {
|
|
332
|
+
const raw = await frame.evaluate(browserExtractGeometry);
|
|
333
|
+
const tree = raw.tree;
|
|
334
|
+
const layout = raw.layout;
|
|
335
|
+
return {
|
|
336
|
+
layout,
|
|
337
|
+
tree,
|
|
338
|
+
treeJson: JSON.stringify(tree),
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
export async function mergeAllIframes(tree, layout, ownerFrame) {
|
|
342
|
+
async function dfs(t, l, f) {
|
|
343
|
+
const subFrames = f.childFrames();
|
|
344
|
+
let slot = 0;
|
|
345
|
+
const tch = t.children ?? [];
|
|
346
|
+
const lch = l.children;
|
|
347
|
+
for (let i = 0; i < tch.length; i++) {
|
|
348
|
+
const st = tch[i];
|
|
349
|
+
const sl = lch[i];
|
|
350
|
+
if (st.semantic?.tag === 'iframe') {
|
|
351
|
+
const cf = subFrames[slot++];
|
|
352
|
+
if (cf && !cf.isDetached()) {
|
|
353
|
+
const snap = await extractFrameGeometry(cf);
|
|
354
|
+
await mergeAllIframes(snap.tree, snap.layout, cf);
|
|
355
|
+
const { x: ox, y: oy } = await frameOriginInRootPage(cf);
|
|
356
|
+
sl.children = snap.layout.children.map(c => {
|
|
357
|
+
const copy = cloneLayout(c);
|
|
358
|
+
offsetLayoutSubtree(copy, ox, oy);
|
|
359
|
+
return copy;
|
|
360
|
+
});
|
|
361
|
+
st.children = (snap.tree.children ?? []).map(cloneTree);
|
|
362
|
+
st.semantic = { ...st.semantic, frameUrl: cf.url() };
|
|
363
|
+
await dfs(st, sl, cf);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
await dfs(st, sl, f);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
await dfs(tree, layout, ownerFrame);
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Full page: main frame + every nested iframe (any origin) + optional CDP AX name enrichment.
|
|
375
|
+
*/
|
|
376
|
+
export async function extractGeometry(page) {
|
|
377
|
+
const main = await extractFrameGeometry(page.mainFrame());
|
|
378
|
+
await mergeAllIframes(main.tree, main.layout, page.mainFrame());
|
|
379
|
+
await enrichSnapshotWithCdpAx(page, main);
|
|
380
|
+
return {
|
|
381
|
+
layout: main.layout,
|
|
382
|
+
tree: main.tree,
|
|
383
|
+
treeJson: JSON.stringify(main.tree),
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
//# sourceMappingURL=extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../src/extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Frame } from 'playwright';
|
|
2
|
+
/**
|
|
3
|
+
* Cumulative offset from this frame's top-left content origin to the **root page** viewport,
|
|
4
|
+
* by walking up the frame chain and summing each iframe element's `getBoundingClientRect()`
|
|
5
|
+
* in its parent document.
|
|
6
|
+
*/
|
|
7
|
+
export declare function frameOriginInRootPage(frame: Frame): Promise<{
|
|
8
|
+
x: number;
|
|
9
|
+
y: number;
|
|
10
|
+
}>;
|
|
11
|
+
//# sourceMappingURL=frame-offset.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame-offset.d.ts","sourceRoot":"","sources":["../src/frame-offset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAEvC;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmB3F"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cumulative offset from this frame's top-left content origin to the **root page** viewport,
|
|
3
|
+
* by walking up the frame chain and summing each iframe element's `getBoundingClientRect()`
|
|
4
|
+
* in its parent document.
|
|
5
|
+
*/
|
|
6
|
+
export async function frameOriginInRootPage(frame) {
|
|
7
|
+
let ox = 0;
|
|
8
|
+
let oy = 0;
|
|
9
|
+
let f = frame;
|
|
10
|
+
while (f) {
|
|
11
|
+
const parent = f.parentFrame();
|
|
12
|
+
if (!parent)
|
|
13
|
+
break;
|
|
14
|
+
const handle = await f.frameElement();
|
|
15
|
+
if (!handle)
|
|
16
|
+
break;
|
|
17
|
+
const pt = await parent.evaluate((el) => {
|
|
18
|
+
if (!(el instanceof Element))
|
|
19
|
+
return { x: 0, y: 0 };
|
|
20
|
+
const r = el.getBoundingClientRect();
|
|
21
|
+
return { x: r.left, y: r.top };
|
|
22
|
+
}, handle);
|
|
23
|
+
ox += pt.x;
|
|
24
|
+
oy += pt.y;
|
|
25
|
+
f = parent;
|
|
26
|
+
}
|
|
27
|
+
return { x: ox, y: oy };
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=frame-offset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame-offset.js","sourceRoot":"","sources":["../src/frame-offset.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAAY;IACtD,IAAI,EAAE,GAAG,CAAC,CAAA;IACV,IAAI,EAAE,GAAG,CAAC,CAAA;IACV,IAAI,CAAC,GAAiB,KAAK,CAAA;IAC3B,OAAO,CAAC,EAAE,CAAC;QACT,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;QAC9B,IAAI,CAAC,MAAM;YAAE,MAAK;QAClB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,YAAY,EAAE,CAAA;QACrC,IAAI,CAAC,MAAM;YAAE,MAAK;QAClB,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAQ,EAAE,EAAE;YAC5C,IAAI,CAAC,CAAC,EAAE,YAAY,OAAO,CAAC;gBAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;YACnD,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAA;YACpC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAA;QAChC,CAAC,EAAE,MAAM,CAAC,CAAA;QACV,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QACV,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QACV,CAAC,GAAG,MAAM,CAAA;IACZ,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAA;AACzB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Page } from 'playwright';
|
|
2
|
+
export interface GeometryWsHub {
|
|
3
|
+
/** Run extraction and broadcast (debounced observer calls this). */
|
|
4
|
+
scheduleExtract: () => void;
|
|
5
|
+
/** Wait until any in-flight extract + broadcast finishes. */
|
|
6
|
+
flushExtract: () => Promise<void>;
|
|
7
|
+
close: () => Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
export declare function startGeometryWebSocket(options: {
|
|
10
|
+
port: number;
|
|
11
|
+
page: Page;
|
|
12
|
+
/** DOM mutation debounce (ms). */
|
|
13
|
+
debounceMs?: number;
|
|
14
|
+
onListening?: (port: number) => void;
|
|
15
|
+
onError?: (err: unknown) => void;
|
|
16
|
+
}): GeometryWsHub;
|
|
17
|
+
export declare function installDomObserver(page: Page, scheduleExtract: () => void): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=geometry-ws.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry-ws.d.ts","sourceRoot":"","sources":["../src/geometry-ws.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AA0LtC,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,eAAe,EAAE,MAAM,IAAI,CAAA;IAC3B,6DAA6D;IAC7D,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACjC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAC9C,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,IAAI,CAAA;IACV,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;CACjC,GAAG,aAAa,CA+JhB;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB/F"}
|