@ticktockbent/charlotte 0.4.1 → 0.5.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/CHANGELOG.md +50 -0
- package/README.md +101 -27
- package/dist/browser/cdp-session.d.ts +9 -1
- package/dist/browser/cdp-session.d.ts.map +1 -1
- package/dist/browser/cdp-session.js +32 -10
- package/dist/browser/cdp-session.js.map +1 -1
- package/dist/browser/page-manager.d.ts.map +1 -1
- package/dist/browser/page-manager.js +2 -1
- package/dist/browser/page-manager.js.map +1 -1
- package/dist/cli.d.ts +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +14 -8
- package/dist/cli.js.map +1 -1
- package/dist/dev/auditor.d.ts.map +1 -1
- package/dist/dev/auditor.js +15 -36
- package/dist/dev/auditor.js.map +1 -1
- package/dist/dev/dev-mode-state.d.ts.map +1 -1
- package/dist/dev/dev-mode-state.js.map +1 -1
- package/dist/dev/static-server.d.ts.map +1 -1
- package/dist/dev/static-server.js +6 -2
- package/dist/dev/static-server.js.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/renderer/accessibility-extractor.d.ts +3 -1
- package/dist/renderer/accessibility-extractor.d.ts.map +1 -1
- package/dist/renderer/accessibility-extractor.js +6 -6
- package/dist/renderer/accessibility-extractor.js.map +1 -1
- package/dist/renderer/dom-path.d.ts.map +1 -1
- package/dist/renderer/dom-path.js.map +1 -1
- package/dist/renderer/element-id-generator.d.ts +4 -1
- package/dist/renderer/element-id-generator.d.ts.map +1 -1
- package/dist/renderer/element-id-generator.js +12 -1
- package/dist/renderer/element-id-generator.js.map +1 -1
- package/dist/renderer/frame-discovery.d.ts +23 -0
- package/dist/renderer/frame-discovery.d.ts.map +1 -0
- package/dist/renderer/frame-discovery.js +102 -0
- package/dist/renderer/frame-discovery.js.map +1 -0
- package/dist/renderer/interactive-extractor.d.ts +8 -1
- package/dist/renderer/interactive-extractor.d.ts.map +1 -1
- package/dist/renderer/interactive-extractor.js +36 -9
- package/dist/renderer/interactive-extractor.js.map +1 -1
- package/dist/renderer/layout-extractor.d.ts +4 -1
- package/dist/renderer/layout-extractor.d.ts.map +1 -1
- package/dist/renderer/layout-extractor.js +15 -2
- package/dist/renderer/layout-extractor.js.map +1 -1
- package/dist/renderer/renderer-pipeline.d.ts +26 -1
- package/dist/renderer/renderer-pipeline.d.ts.map +1 -1
- package/dist/renderer/renderer-pipeline.js +174 -18
- package/dist/renderer/renderer-pipeline.js.map +1 -1
- package/dist/renderer/structural-tree-extractor.d.ts +7 -0
- package/dist/renderer/structural-tree-extractor.d.ts.map +1 -0
- package/dist/renderer/structural-tree-extractor.js +245 -0
- package/dist/renderer/structural-tree-extractor.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +3 -4
- package/dist/server.js.map +1 -1
- package/dist/state/artifact-store.d.ts.map +1 -1
- package/dist/state/artifact-store.js +1 -2
- package/dist/state/artifact-store.js.map +1 -1
- package/dist/state/differ.d.ts.map +1 -1
- package/dist/state/differ.js.map +1 -1
- package/dist/tools/dev-mode.d.ts.map +1 -1
- package/dist/tools/dev-mode.js +4 -16
- package/dist/tools/dev-mode.js.map +1 -1
- package/dist/tools/dialog.d.ts.map +1 -1
- package/dist/tools/dialog.js +2 -4
- package/dist/tools/dialog.js.map +1 -1
- package/dist/tools/evaluate.d.ts.map +1 -1
- package/dist/tools/evaluate.js +1 -4
- package/dist/tools/evaluate.js.map +1 -1
- package/dist/tools/interaction.d.ts +17 -0
- package/dist/tools/interaction.d.ts.map +1 -1
- package/dist/tools/interaction.js +127 -69
- package/dist/tools/interaction.js.map +1 -1
- package/dist/tools/meta-tool.d.ts.map +1 -1
- package/dist/tools/meta-tool.js.map +1 -1
- package/dist/tools/monitoring.d.ts.map +1 -1
- package/dist/tools/monitoring.js +35 -19
- package/dist/tools/monitoring.js.map +1 -1
- package/dist/tools/navigation.d.ts.map +1 -1
- package/dist/tools/navigation.js +20 -16
- package/dist/tools/navigation.js.map +1 -1
- package/dist/tools/observation.d.ts.map +1 -1
- package/dist/tools/observation.js +50 -13
- package/dist/tools/observation.js.map +1 -1
- package/dist/tools/session.d.ts.map +1 -1
- package/dist/tools/session.js +38 -27
- package/dist/tools/session.js.map +1 -1
- package/dist/tools/tool-groups.d.ts +1 -1
- package/dist/tools/tool-groups.d.ts.map +1 -1
- package/dist/tools/tool-groups.js +9 -22
- package/dist/tools/tool-groups.js.map +1 -1
- package/dist/tools/tool-helpers.d.ts +50 -5
- package/dist/tools/tool-helpers.d.ts.map +1 -1
- package/dist/tools/tool-helpers.js +102 -2
- package/dist/tools/tool-helpers.js.map +1 -1
- package/dist/types/config.d.ts +6 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -1
- package/dist/types/page-representation.d.ts +14 -0
- package/dist/types/page-representation.d.ts.map +1 -1
- package/dist/utils/wait.js +1 -1
- package/dist/utils/wait.js.map +1 -1
- package/package.json +24 -8
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { logger } from "../utils/logger.js";
|
|
2
|
+
/**
|
|
3
|
+
* Discover all child frames in the page up to maxDepth levels.
|
|
4
|
+
* Returns frame metadata including CDP sessions and coordinate offsets.
|
|
5
|
+
*/
|
|
6
|
+
export async function discoverFrames(page, cdpSessionManager, maxDepth) {
|
|
7
|
+
const discovered = [];
|
|
8
|
+
const mainSession = await cdpSessionManager.getSession(page);
|
|
9
|
+
await traverseFrames(page.mainFrame(), mainSession, cdpSessionManager, { x: 0, y: 0 }, 0, maxDepth, discovered);
|
|
10
|
+
logger.debug(`Discovered ${discovered.length} child frame(s)`);
|
|
11
|
+
return discovered;
|
|
12
|
+
}
|
|
13
|
+
async function traverseFrames(parentFrame, parentSession, cdpSessionManager, parentOffset, currentDepth, maxDepth, discovered) {
|
|
14
|
+
if (currentDepth >= maxDepth)
|
|
15
|
+
return;
|
|
16
|
+
const childFrames = parentFrame.childFrames();
|
|
17
|
+
if (childFrames.length === 0)
|
|
18
|
+
return;
|
|
19
|
+
for (const childFrame of childFrames) {
|
|
20
|
+
// Skip frames without URLs or about:blank frames
|
|
21
|
+
const frameUrl = childFrame.url();
|
|
22
|
+
if (!frameUrl || frameUrl === "about:blank") {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const frameId = cdpSessionManager.getFrameId(childFrame);
|
|
27
|
+
// Get the iframe element's bounds in the parent frame's coordinate space
|
|
28
|
+
const iframeBoundsInParent = await getIframeBounds(parentSession, frameId);
|
|
29
|
+
// Compute page-level offset: parent's offset + iframe element position
|
|
30
|
+
const contentOffset = {
|
|
31
|
+
x: parentOffset.x + (iframeBoundsInParent?.x ?? 0),
|
|
32
|
+
y: parentOffset.y + (iframeBoundsInParent?.y ?? 0),
|
|
33
|
+
};
|
|
34
|
+
// Page-level bounds for the iframe element
|
|
35
|
+
const iframeBounds = iframeBoundsInParent
|
|
36
|
+
? {
|
|
37
|
+
x: contentOffset.x,
|
|
38
|
+
y: contentOffset.y,
|
|
39
|
+
w: iframeBoundsInParent.w,
|
|
40
|
+
h: iframeBoundsInParent.h,
|
|
41
|
+
}
|
|
42
|
+
: null;
|
|
43
|
+
// Get a CDP session for this frame
|
|
44
|
+
let frameSession;
|
|
45
|
+
try {
|
|
46
|
+
frameSession = await cdpSessionManager.getFrameSession(childFrame);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
logger.debug(`Could not get session for frame ${frameUrl}`, error);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
discovered.push({
|
|
53
|
+
frame: childFrame,
|
|
54
|
+
frameId,
|
|
55
|
+
url: frameUrl,
|
|
56
|
+
session: frameSession,
|
|
57
|
+
iframeBounds,
|
|
58
|
+
contentOffset,
|
|
59
|
+
});
|
|
60
|
+
// Recurse into nested iframes
|
|
61
|
+
await traverseFrames(childFrame, frameSession, cdpSessionManager, contentOffset, currentDepth + 1, maxDepth, discovered);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
logger.debug(`Failed to discover frame ${frameUrl}`, error);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get the bounds of the <iframe> element that hosts a child frame.
|
|
70
|
+
* Uses the parent frame's CDP session to find the frame owner node.
|
|
71
|
+
*/
|
|
72
|
+
async function getIframeBounds(parentSession, childFrameId) {
|
|
73
|
+
try {
|
|
74
|
+
// Get the frame owner (the <iframe> element in the parent DOM)
|
|
75
|
+
const { backendNodeId } = await parentSession.send("DOM.getFrameOwner", {
|
|
76
|
+
frameId: childFrameId,
|
|
77
|
+
});
|
|
78
|
+
if (!backendNodeId)
|
|
79
|
+
return null;
|
|
80
|
+
const { model } = await parentSession.send("DOM.getBoxModel", {
|
|
81
|
+
backendNodeId,
|
|
82
|
+
});
|
|
83
|
+
if (!model?.content)
|
|
84
|
+
return null;
|
|
85
|
+
const quad = model.content;
|
|
86
|
+
const minX = Math.min(quad[0], quad[2], quad[4], quad[6]);
|
|
87
|
+
const minY = Math.min(quad[1], quad[3], quad[5], quad[7]);
|
|
88
|
+
const maxX = Math.max(quad[0], quad[2], quad[4], quad[6]);
|
|
89
|
+
const maxY = Math.max(quad[1], quad[3], quad[5], quad[7]);
|
|
90
|
+
return {
|
|
91
|
+
x: Math.round(minX),
|
|
92
|
+
y: Math.round(minY),
|
|
93
|
+
w: Math.round(maxX - minX),
|
|
94
|
+
h: Math.round(maxY - minY),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
logger.debug(`Could not get iframe bounds for frame ${childFrameId}`, error);
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=frame-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame-discovery.js","sourceRoot":"","sources":["../../src/renderer/frame-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { CDPSession } from "puppeteer";
|
|
1
2
|
import type { ParsedAXNode } from "./accessibility-extractor.js";
|
|
2
3
|
import type { ElementIdGenerator } from "./element-id-generator.js";
|
|
3
4
|
import type { Bounds, InteractiveElement, InteractiveElementType, FormRepresentation } from "../types/page-representation.js";
|
|
@@ -7,8 +8,14 @@ interface ExtractionResult {
|
|
|
7
8
|
forms: FormRepresentation[];
|
|
8
9
|
}
|
|
9
10
|
export declare class InteractiveExtractor {
|
|
10
|
-
extractInteractiveElements(rootNodes: ParsedAXNode[], boundsMap: Map<number, Bounds>, idGenerator: ElementIdGenerator): ExtractionResult;
|
|
11
|
+
extractInteractiveElements(rootNodes: ParsedAXNode[], boundsMap: Map<number, Bounds>, idGenerator: ElementIdGenerator, frameId?: string): ExtractionResult;
|
|
11
12
|
private buildFormRepresentations;
|
|
12
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* Post-extraction step: reclassify button-typed elements that are actually
|
|
16
|
+
* `<input type="file">` in the DOM. The AX tree represents file inputs as
|
|
17
|
+
* buttons, so we check the underlying DOM node via CDP.
|
|
18
|
+
*/
|
|
19
|
+
export declare function reclassifyFileInputs(elements: InteractiveElement[], session: CDPSession, idGenerator: ElementIdGenerator): Promise<void>;
|
|
13
20
|
export {};
|
|
14
21
|
//# sourceMappingURL=interactive-extractor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-extractor.d.ts","sourceRoot":"","sources":["../../src/renderer/interactive-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"interactive-extractor.d.ts","sourceRoot":"","sources":["../../src/renderer/interactive-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,KAAK,EACV,MAAM,EACN,kBAAkB,EAClB,sBAAsB,EAEtB,kBAAkB,EACnB,MAAM,iCAAiC,CAAC;AAEzC,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAiBvE,CAAC;AAsCF,UAAU,gBAAgB;IACxB,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,KAAK,EAAE,kBAAkB,EAAE,CAAC;CAC7B;AAED,qBAAa,oBAAoB;IAC/B,0BAA0B,CACxB,SAAS,EAAE,YAAY,EAAE,EACzB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,WAAW,EAAE,kBAAkB,EAC/B,OAAO,CAAC,EAAE,MAAM,GACf,gBAAgB;IA4FnB,OAAO,CAAC,wBAAwB;CA+DjC;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,kBAAkB,EAAE,EAC9B,OAAO,EAAE,UAAU,EACnB,WAAW,EAAE,kBAAkB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAoBf"}
|
|
@@ -51,7 +51,7 @@ function extractElementState(node) {
|
|
|
51
51
|
return state;
|
|
52
52
|
}
|
|
53
53
|
export class InteractiveExtractor {
|
|
54
|
-
extractInteractiveElements(rootNodes, boundsMap, idGenerator) {
|
|
54
|
+
extractInteractiveElements(rootNodes, boundsMap, idGenerator, frameId) {
|
|
55
55
|
const elements = [];
|
|
56
56
|
const formNodes = [];
|
|
57
57
|
const traverse = (node) => {
|
|
@@ -61,7 +61,7 @@ export class InteractiveExtractor {
|
|
|
61
61
|
if (isInteractiveRole(node.role)) {
|
|
62
62
|
const elementType = mapRoleToElementType(node.role);
|
|
63
63
|
const domPath = computeDOMPathSignature(node);
|
|
64
|
-
const elementId = idGenerator.generateId(elementType, node.role, node.name, domPath, node.backendDOMNodeId);
|
|
64
|
+
const elementId = idGenerator.generateId(elementType, node.role, node.name, domPath, node.backendDOMNodeId, frameId);
|
|
65
65
|
let bounds = null;
|
|
66
66
|
if (node.backendDOMNodeId !== null) {
|
|
67
67
|
bounds = boundsMap.get(node.backendDOMNodeId) ?? null;
|
|
@@ -92,8 +92,7 @@ export class InteractiveExtractor {
|
|
|
92
92
|
if (elementType === "select") {
|
|
93
93
|
const options = [];
|
|
94
94
|
const collectOptions = (optionNode) => {
|
|
95
|
-
if (optionNode.role === "option" ||
|
|
96
|
-
optionNode.role === "listitem") {
|
|
95
|
+
if (optionNode.role === "option" || optionNode.role === "listitem") {
|
|
97
96
|
options.push(optionNode.name || optionNode.value || "");
|
|
98
97
|
}
|
|
99
98
|
for (const child of optionNode.children) {
|
|
@@ -117,14 +116,14 @@ export class InteractiveExtractor {
|
|
|
117
116
|
traverse(root);
|
|
118
117
|
}
|
|
119
118
|
// Build form representations
|
|
120
|
-
const forms = this.buildFormRepresentations(formNodes, elements, idGenerator, boundsMap);
|
|
119
|
+
const forms = this.buildFormRepresentations(formNodes, elements, idGenerator, boundsMap, frameId);
|
|
121
120
|
return { elements, forms };
|
|
122
121
|
}
|
|
123
|
-
buildFormRepresentations(formNodes, interactiveElements, idGenerator,
|
|
122
|
+
buildFormRepresentations(formNodes, interactiveElements, idGenerator, _boundsMap, frameId) {
|
|
124
123
|
const forms = [];
|
|
125
124
|
for (const formNode of formNodes) {
|
|
126
125
|
const domPath = computeDOMPathSignature(formNode);
|
|
127
|
-
const formId = idGenerator.generateId("form", formNode.role, formNode.name, domPath, formNode.backendDOMNodeId);
|
|
126
|
+
const formId = idGenerator.generateId("form", formNode.role, formNode.name, domPath, formNode.backendDOMNodeId, frameId);
|
|
128
127
|
// Collect IDs of interactive elements that are descendants of this form
|
|
129
128
|
const formFieldIds = [];
|
|
130
129
|
let submitButtonId = null;
|
|
@@ -139,8 +138,7 @@ export class InteractiveExtractor {
|
|
|
139
138
|
});
|
|
140
139
|
if (matchingElement) {
|
|
141
140
|
if (node.role === "button" &&
|
|
142
|
-
(node.properties["type"] === "submit" ||
|
|
143
|
-
node.name?.toLowerCase().includes("submit"))) {
|
|
141
|
+
(node.properties["type"] === "submit" || node.name?.toLowerCase().includes("submit"))) {
|
|
144
142
|
submitButtonId = matchingElement.id;
|
|
145
143
|
}
|
|
146
144
|
else {
|
|
@@ -164,4 +162,33 @@ export class InteractiveExtractor {
|
|
|
164
162
|
return forms;
|
|
165
163
|
}
|
|
166
164
|
}
|
|
165
|
+
/**
|
|
166
|
+
* Post-extraction step: reclassify button-typed elements that are actually
|
|
167
|
+
* `<input type="file">` in the DOM. The AX tree represents file inputs as
|
|
168
|
+
* buttons, so we check the underlying DOM node via CDP.
|
|
169
|
+
*/
|
|
170
|
+
export async function reclassifyFileInputs(elements, session, idGenerator) {
|
|
171
|
+
for (const element of elements) {
|
|
172
|
+
if (element.type !== "button")
|
|
173
|
+
continue;
|
|
174
|
+
const backendNodeId = idGenerator.resolveId(element.id);
|
|
175
|
+
if (backendNodeId === null)
|
|
176
|
+
continue;
|
|
177
|
+
try {
|
|
178
|
+
const { node } = await session.send("DOM.describeNode", { backendNodeId });
|
|
179
|
+
if (node.nodeName === "INPUT") {
|
|
180
|
+
const attrs = node.attributes ?? [];
|
|
181
|
+
for (let i = 0; i < attrs.length; i += 2) {
|
|
182
|
+
if (attrs[i] === "type" && attrs[i + 1] === "file") {
|
|
183
|
+
element.type = "file_input";
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// Node may have been detached — skip
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
167
194
|
//# sourceMappingURL=interactive-extractor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-extractor.js","sourceRoot":"","sources":["../../src/renderer/interactive-extractor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"interactive-extractor.js","sourceRoot":"","sources":["../../src/renderer/interactive-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,9 @@ import type { Bounds } from "../types/page-representation.js";
|
|
|
3
3
|
export declare const ZERO_BOUNDS: Bounds;
|
|
4
4
|
export declare class LayoutExtractor {
|
|
5
5
|
getBounds(session: CDPSession, backendNodeId: number): Promise<Bounds | null>;
|
|
6
|
-
getBoundsForNodes(session: CDPSession, backendNodeIds: number[]
|
|
6
|
+
getBoundsForNodes(session: CDPSession, backendNodeIds: number[], frameOffset?: {
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
}): Promise<Map<number, Bounds>>;
|
|
7
10
|
}
|
|
8
11
|
//# sourceMappingURL=layout-extractor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-extractor.d.ts","sourceRoot":"","sources":["../../src/renderer/layout-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAG9D,eAAO,MAAM,WAAW,EAAE,MAAmC,CAAC;AAE9D,qBAAa,eAAe;IACpB,SAAS,
|
|
1
|
+
{"version":3,"file":"layout-extractor.d.ts","sourceRoot":"","sources":["../../src/renderer/layout-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAG9D,eAAO,MAAM,WAAW,EAAE,MAAmC,CAAC;AAE9D,qBAAa,eAAe;IACpB,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA4B7E,iBAAiB,CACrB,OAAO,EAAE,UAAU,EACnB,cAAc,EAAE,MAAM,EAAE,EACxB,WAAW,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GACrC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAkChC"}
|
|
@@ -27,8 +27,10 @@ export class LayoutExtractor {
|
|
|
27
27
|
return null;
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
-
async getBoundsForNodes(session, backendNodeIds) {
|
|
30
|
+
async getBoundsForNodes(session, backendNodeIds, frameOffset) {
|
|
31
31
|
const boundsMap = new Map();
|
|
32
|
+
const offsetX = frameOffset?.x ?? 0;
|
|
33
|
+
const offsetY = frameOffset?.y ?? 0;
|
|
32
34
|
// Process in parallel for performance, but cap concurrency
|
|
33
35
|
const batchSize = 50;
|
|
34
36
|
for (let i = 0; i < backendNodeIds.length; i += batchSize) {
|
|
@@ -38,7 +40,18 @@ export class LayoutExtractor {
|
|
|
38
40
|
return { nodeId, bounds };
|
|
39
41
|
}));
|
|
40
42
|
for (const { nodeId, bounds } of results) {
|
|
41
|
-
|
|
43
|
+
if (bounds && (offsetX !== 0 || offsetY !== 0)) {
|
|
44
|
+
// Translate frame-local bounds to page-level coordinates
|
|
45
|
+
boundsMap.set(nodeId, {
|
|
46
|
+
x: bounds.x + offsetX,
|
|
47
|
+
y: bounds.y + offsetY,
|
|
48
|
+
w: bounds.w,
|
|
49
|
+
h: bounds.h,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
boundsMap.set(nodeId, bounds ?? ZERO_BOUNDS);
|
|
54
|
+
}
|
|
42
55
|
}
|
|
43
56
|
}
|
|
44
57
|
logger.debug(`Extracted bounds for ${boundsMap.size}/${backendNodeIds.length} nodes`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-extractor.js","sourceRoot":"","sources":["../../src/renderer/layout-extractor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,MAAM,WAAW,GAAW,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAE9D,MAAM,OAAO,eAAe;IAC1B,KAAK,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"layout-extractor.js","sourceRoot":"","sources":["../../src/renderer/layout-extractor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,MAAM,WAAW,GAAW,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAE9D,MAAM,OAAO,eAAe;IAC1B,KAAK,CAAC,SAAS,CAAC,OAAmB,EAAE,aAAqB;QACxD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,iBAAwB,EAAE;gBAC1D,aAAa;aACd,CAAC,CAAC;YAEH,MAAM,KAAK,GAAI,MAAc,CAAC,KAAK,CAAC;YACpC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO;gBAAE,OAAO,IAAI,CAAC;YAE1C,+CAA+C;YAC/C,MAAM,IAAI,GAAa,KAAK,CAAC,OAAO,CAAC;YACrC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAE1D,OAAO;gBACL,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBACnB,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBACnB,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;gBAC1B,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;aAC3B,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,mDAAmD;YACnD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,OAAmB,EACnB,cAAwB,EACxB,WAAsC;QAEtC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC5C,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC;QAEpC,2DAA2D;QAC3D,MAAM,SAAS,GAAG,EAAE,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1D,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;gBACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACrD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YAC5B,CAAC,CAAC,CACH,CAAC;YAEF,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;gBACzC,IAAI,MAAM,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;oBAC/C,yDAAyD;oBACzD,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE;wBACpB,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,OAAO;wBACrB,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,OAAO;wBACrB,CAAC,EAAE,MAAM,CAAC,CAAC;wBACX,CAAC,EAAE,MAAM,CAAC,CAAC;qBACZ,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,IAAI,WAAW,CAAC,CAAC;gBAC/C,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,wBAAwB,SAAS,CAAC,IAAI,IAAI,cAAc,CAAC,MAAM,QAAQ,CAAC,CAAC;QACtF,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { Page } from "puppeteer";
|
|
2
2
|
import type { CDPSessionManager } from "../browser/cdp-session.js";
|
|
3
3
|
import { ElementIdGenerator } from "./element-id-generator.js";
|
|
4
|
+
import type { StructuralTreeOptions } from "./structural-tree-extractor.js";
|
|
4
5
|
import type { PageRepresentation } from "../types/page-representation.js";
|
|
6
|
+
import type { CharlotteConfig } from "../types/config.js";
|
|
5
7
|
export type DetailLevel = "minimal" | "summary" | "full";
|
|
6
8
|
export interface RenderOptions {
|
|
7
9
|
detail: DetailLevel;
|
|
@@ -11,17 +13,40 @@ export interface RenderOptions {
|
|
|
11
13
|
export declare class RendererPipeline {
|
|
12
14
|
private cdpSessionManager;
|
|
13
15
|
private elementIdGenerator;
|
|
16
|
+
private config?;
|
|
14
17
|
private accessibilityExtractor;
|
|
15
18
|
private layoutExtractor;
|
|
16
19
|
private interactiveExtractor;
|
|
17
20
|
private contentExtractor;
|
|
18
|
-
constructor(cdpSessionManager: CDPSessionManager, elementIdGenerator: ElementIdGenerator);
|
|
21
|
+
constructor(cdpSessionManager: CDPSessionManager, elementIdGenerator: ElementIdGenerator, config?: CharlotteConfig | undefined);
|
|
19
22
|
render(page: Page, options: RenderOptions): Promise<PageRepresentation>;
|
|
23
|
+
/**
|
|
24
|
+
* Extract content from all discoverable child frames and merge into the
|
|
25
|
+
* main-frame arrays (landmarks, headings, elements, forms).
|
|
26
|
+
*/
|
|
27
|
+
private extractIframeContent;
|
|
28
|
+
/**
|
|
29
|
+
* Extract AX tree, layout, landmarks, headings, interactive elements, forms,
|
|
30
|
+
* and content from a single child frame. Merges results into the provided arrays.
|
|
31
|
+
*/
|
|
32
|
+
private extractSingleFrame;
|
|
33
|
+
/**
|
|
34
|
+
* Lightweight render that returns only the structural tree view.
|
|
35
|
+
* Extracts the AX tree and produces a compact tree string — skips
|
|
36
|
+
* layout extraction, interactive extraction, and content extraction.
|
|
37
|
+
*/
|
|
38
|
+
renderTree(page: Page, options?: StructuralTreeOptions): Promise<string>;
|
|
20
39
|
private collectNodesNeedingBounds;
|
|
21
40
|
private isInteractiveNode;
|
|
22
41
|
private extractLandmarks;
|
|
23
42
|
private extractHeadings;
|
|
24
43
|
private buildInteractiveSummary;
|
|
44
|
+
/**
|
|
45
|
+
* Build interactive summary from the already-extracted elements array.
|
|
46
|
+
* Used when iframe elements have been merged in and we need to rebuild
|
|
47
|
+
* the summary to include them.
|
|
48
|
+
*/
|
|
49
|
+
private buildInteractiveSummaryFromElements;
|
|
25
50
|
private getHeadingLevel;
|
|
26
51
|
}
|
|
27
52
|
//# sourceMappingURL=renderer-pipeline.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer-pipeline.d.ts","sourceRoot":"","sources":["../../src/renderer/renderer-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"renderer-pipeline.d.ts","sourceRoot":"","sources":["../../src/renderer/renderer-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAenE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAI5E,OAAO,KAAK,EACV,kBAAkB,EAMnB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,qBAAa,gBAAgB;IAOzB,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,MAAM,CAAC;IARjB,OAAO,CAAC,sBAAsB,CAAgC;IAC9D,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,oBAAoB,CAA8B;IAC1D,OAAO,CAAC,gBAAgB,CAA0B;gBAGxC,iBAAiB,EAAE,iBAAiB,EACpC,kBAAkB,EAAE,kBAAkB,EACtC,MAAM,CAAC,EAAE,eAAe,YAAA;IAG5B,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAiI7E;;;OAGG;YACW,oBAAoB;IAsDlC;;;OAGG;YACW,kBAAkB;IAqFhC;;;;OAIG;IACG,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;IAO9E,OAAO,CAAC,yBAAyB;IAoBjC,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,gBAAgB;IA6CxB,OAAO,CAAC,eAAe;IAuCvB,OAAO,CAAC,uBAAuB;IAmC/B;;;;OAIG;IACH,OAAO,CAAC,mCAAmC;IAqB3C,OAAO,CAAC,eAAe;CAOxB"}
|